Skip to content

Commit 7c0eadb

Browse files
committed
Add PKCS#11 3.2 functions to the function list
Signed-off-by: Jakub Jelen <jjelen@redhat.com>
1 parent 64d25b5 commit 7c0eadb

File tree

2 files changed

+171
-12
lines changed

2 files changed

+171
-12
lines changed

cryptoki/src/context/general_purpose.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,19 @@ pub enum Function {
141141
VerifyMessageBegin,
142142
VerifyMessageNext,
143143
MessageVerifyFinal,
144+
/* PKCS #11 3.2 */
145+
EncapsulateKey,
146+
DecapsulateKey,
147+
VerifySignatureInit,
148+
VerifySignature,
149+
VerifySignatureUpdate,
150+
VerifySignatureFinal,
151+
GetSessionValidationFlags,
152+
AsyncComplete,
153+
AsyncGetID,
154+
AsyncJoin,
155+
WrapKeyAuthenticated,
156+
UnwrapKeyAuthenticated,
144157
}
145158

146159
impl Display for Function {
@@ -245,5 +258,18 @@ pub(super) fn is_fn_supported(ctx: &Pkcs11, function: Function) -> bool {
245258
Function::VerifyMessageBegin => check_fn!(ctx, VerifyMessageBegin),
246259
Function::VerifyMessageNext => check_fn!(ctx, VerifyMessageNext),
247260
Function::MessageVerifyFinal => check_fn!(ctx, MessageVerifyFinal),
261+
/* PKCS #11 3.0 */
262+
Function::EncapsulateKey => check_fn!(ctx, EncapsulateKey),
263+
Function::DecapsulateKey => check_fn!(ctx, DecapsulateKey),
264+
Function::VerifySignatureInit => check_fn!(ctx, VerifySignatureInit),
265+
Function::VerifySignature => check_fn!(ctx, VerifySignature),
266+
Function::VerifySignatureUpdate => check_fn!(ctx, VerifySignatureUpdate),
267+
Function::VerifySignatureFinal => check_fn!(ctx, VerifySignatureFinal),
268+
Function::GetSessionValidationFlags => check_fn!(ctx, GetSessionValidationFlags),
269+
Function::AsyncComplete => check_fn!(ctx, AsyncComplete),
270+
Function::AsyncGetID => check_fn!(ctx, AsyncGetID),
271+
Function::AsyncJoin => check_fn!(ctx, AsyncJoin),
272+
Function::WrapKeyAuthenticated => check_fn!(ctx, WrapKeyAuthenticated),
273+
Function::UnwrapKeyAuthenticated => check_fn!(ctx, UnwrapKeyAuthenticated),
248274
}
249275
}

cryptoki/src/context/mod.rs

Lines changed: 145 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,11 @@ use std::sync::RwLock;
4444
#[derive(Debug)]
4545
enum FunctionList {
4646
/// PKCS #11 2.40 CK_FUNCTION_LIST
47-
V2(cryptoki_sys::CK_FUNCTION_LIST_3_0),
47+
V2(cryptoki_sys::CK_FUNCTION_LIST_3_2),
4848
/// PKCS #11 3.0 CK_FUNCTION_LIST_3_0
49-
V3_0(cryptoki_sys::CK_FUNCTION_LIST_3_0),
50-
// TODO when PKCS #11 3.2 will be imported, change the above to 3_2 too!
51-
// PKCS #11 3.2 CK_FUNCTION_LIST_3_2
52-
//V3_2(cryptoki_sys::CK_FUNCTION_LIST_3_2),
49+
V3_0(cryptoki_sys::CK_FUNCTION_LIST_3_2),
50+
/// PKCS #11 3.2 CK_FUNCTION_LIST_3_2
51+
V3_2(cryptoki_sys::CK_FUNCTION_LIST_3_2),
5352
}
5453

5554
// Implementation of Pkcs11 class that can be enclosed in a single Arc
@@ -70,10 +69,11 @@ impl fmt::Debug for Pkcs11Impl {
7069

7170
impl Pkcs11Impl {
7271
#[inline(always)]
73-
pub(crate) fn get_function_list(&self) -> cryptoki_sys::CK_FUNCTION_LIST_3_0 {
72+
pub(crate) fn get_function_list(&self) -> cryptoki_sys::CK_FUNCTION_LIST_3_2 {
7473
match self.function_list {
7574
FunctionList::V2(l) => l,
7675
FunctionList::V3_0(l) => l,
76+
FunctionList::V3_2(l) => l,
7777
}
7878
}
7979

@@ -133,8 +133,8 @@ impl Pkcs11 {
133133
}
134134

135135
unsafe fn _new(pkcs11_lib: cryptoki_sys::Pkcs11) -> Result<Self> {
136-
/* First try the 3.0 API to get default interface. It might have some more functions than
137-
* the 2.4 API */
136+
/* First try the 3.* API to get default interface. It might have some more functions than
137+
* the 2.40 API */
138138
let mut interface = mem::MaybeUninit::uninit();
139139
if pkcs11_lib.C_GetInterface.is_ok() {
140140
Rv::from(pkcs11_lib.C_GetInterface(
@@ -152,12 +152,23 @@ impl Pkcs11 {
152152
ifce.pFunctionList as *mut cryptoki_sys::CK_FUNCTION_LIST;
153153
let list: cryptoki_sys::CK_FUNCTION_LIST = *list_ptr;
154154
if list.version.major >= 3 {
155+
if list.version.minor >= 2 {
156+
let list32_ptr: *mut cryptoki_sys::CK_FUNCTION_LIST_3_2 =
157+
ifce.pFunctionList as *mut cryptoki_sys::CK_FUNCTION_LIST_3_2;
158+
return Ok(Pkcs11 {
159+
impl_: Arc::new(Pkcs11Impl {
160+
_pkcs11_lib: pkcs11_lib,
161+
function_list: FunctionList::V3_2(*list32_ptr),
162+
}),
163+
initialized: Arc::new(RwLock::new(false)),
164+
});
165+
}
155166
let list30_ptr: *mut cryptoki_sys::CK_FUNCTION_LIST_3_0 =
156167
ifce.pFunctionList as *mut cryptoki_sys::CK_FUNCTION_LIST_3_0;
157168
return Ok(Pkcs11 {
158169
impl_: Arc::new(Pkcs11Impl {
159170
_pkcs11_lib: pkcs11_lib,
160-
function_list: FunctionList::V3_0(*list30_ptr),
171+
function_list: FunctionList::V3_0(v30tov32(*list30_ptr)),
161172
}),
162173
initialized: Arc::new(RwLock::new(false)),
163174
});
@@ -219,9 +230,9 @@ impl Pkcs11 {
219230
}
220231
}
221232

222-
/// This would be great to be From/Into, but it would have to live inside of the cryptoki-sys
223-
fn v2tov3(f: cryptoki_sys::CK_FUNCTION_LIST) -> cryptoki_sys::CK_FUNCTION_LIST_3_0 {
224-
cryptoki_sys::CK_FUNCTION_LIST_3_0 {
233+
// This would be great to be From/Into, but it would have to live inside of the cryptoki-sys
234+
fn v2tov3(f: cryptoki_sys::CK_FUNCTION_LIST) -> cryptoki_sys::CK_FUNCTION_LIST_3_2 {
235+
cryptoki_sys::CK_FUNCTION_LIST_3_2 {
225236
version: f.version,
226237
C_Initialize: f.C_Initialize,
227238
C_Finalize: f.C_Finalize,
@@ -315,5 +326,127 @@ fn v2tov3(f: cryptoki_sys::CK_FUNCTION_LIST) -> cryptoki_sys::CK_FUNCTION_LIST_3
315326
C_VerifyMessageBegin: None,
316327
C_VerifyMessageNext: None,
317328
C_MessageVerifyFinal: None,
329+
C_EncapsulateKey: None,
330+
C_DecapsulateKey: None,
331+
C_VerifySignatureInit: None,
332+
C_VerifySignature: None,
333+
C_VerifySignatureUpdate: None,
334+
C_VerifySignatureFinal: None,
335+
C_GetSessionValidationFlags: None,
336+
C_AsyncComplete: None,
337+
C_AsyncGetID: None,
338+
C_AsyncJoin: None,
339+
C_WrapKeyAuthenticated: None,
340+
C_UnwrapKeyAuthenticated: None,
341+
}
342+
}
343+
344+
fn v30tov32(f: cryptoki_sys::CK_FUNCTION_LIST_3_0) -> cryptoki_sys::CK_FUNCTION_LIST_3_2 {
345+
cryptoki_sys::CK_FUNCTION_LIST_3_2 {
346+
version: f.version,
347+
C_Initialize: f.C_Initialize,
348+
C_Finalize: f.C_Finalize,
349+
C_GetInfo: f.C_GetInfo,
350+
C_GetFunctionList: f.C_GetFunctionList,
351+
C_GetSlotList: f.C_GetSlotList,
352+
C_GetSlotInfo: f.C_GetSlotInfo,
353+
C_GetTokenInfo: f.C_GetTokenInfo,
354+
C_GetMechanismList: f.C_GetMechanismList,
355+
C_GetMechanismInfo: f.C_GetMechanismInfo,
356+
C_InitToken: f.C_InitToken,
357+
C_InitPIN: f.C_InitPIN,
358+
C_SetPIN: f.C_SetPIN,
359+
C_OpenSession: f.C_OpenSession,
360+
C_CloseSession: f.C_CloseSession,
361+
C_CloseAllSessions: f.C_CloseAllSessions,
362+
C_GetSessionInfo: f.C_GetSessionInfo,
363+
C_GetOperationState: f.C_GetOperationState,
364+
C_SetOperationState: f.C_SetOperationState,
365+
C_Login: f.C_Login,
366+
C_Logout: f.C_Logout,
367+
C_CreateObject: f.C_CreateObject,
368+
C_CopyObject: f.C_CopyObject,
369+
C_DestroyObject: f.C_DestroyObject,
370+
C_GetObjectSize: f.C_GetObjectSize,
371+
C_GetAttributeValue: f.C_GetAttributeValue,
372+
C_SetAttributeValue: f.C_SetAttributeValue,
373+
C_FindObjectsInit: f.C_FindObjectsInit,
374+
C_FindObjects: f.C_FindObjects,
375+
C_FindObjectsFinal: f.C_FindObjectsFinal,
376+
C_EncryptInit: f.C_EncryptInit,
377+
C_Encrypt: f.C_Encrypt,
378+
C_EncryptUpdate: f.C_EncryptUpdate,
379+
C_EncryptFinal: f.C_EncryptFinal,
380+
C_DecryptInit: f.C_DecryptInit,
381+
C_Decrypt: f.C_Decrypt,
382+
C_DecryptUpdate: f.C_DecryptUpdate,
383+
C_DecryptFinal: f.C_DecryptFinal,
384+
C_DigestInit: f.C_DigestInit,
385+
C_Digest: f.C_Digest,
386+
C_DigestUpdate: f.C_DigestUpdate,
387+
C_DigestKey: f.C_DigestKey,
388+
C_DigestFinal: f.C_DigestFinal,
389+
C_SignInit: f.C_SignInit,
390+
C_Sign: f.C_Sign,
391+
C_SignUpdate: f.C_SignUpdate,
392+
C_SignFinal: f.C_SignFinal,
393+
C_SignRecoverInit: f.C_SignRecoverInit,
394+
C_SignRecover: f.C_SignRecover,
395+
C_VerifyInit: f.C_VerifyInit,
396+
C_Verify: f.C_Verify,
397+
C_VerifyUpdate: f.C_VerifyUpdate,
398+
C_VerifyFinal: f.C_VerifyFinal,
399+
C_VerifyRecoverInit: f.C_VerifyRecoverInit,
400+
C_VerifyRecover: f.C_VerifyRecover,
401+
C_DigestEncryptUpdate: f.C_DigestEncryptUpdate,
402+
C_DecryptDigestUpdate: f.C_DecryptDigestUpdate,
403+
C_SignEncryptUpdate: f.C_SignEncryptUpdate,
404+
C_DecryptVerifyUpdate: f.C_DecryptVerifyUpdate,
405+
C_GenerateKey: f.C_GenerateKey,
406+
C_GenerateKeyPair: f.C_GenerateKeyPair,
407+
C_WrapKey: f.C_WrapKey,
408+
C_UnwrapKey: f.C_UnwrapKey,
409+
C_DeriveKey: f.C_DeriveKey,
410+
C_SeedRandom: f.C_SeedRandom,
411+
C_GenerateRandom: f.C_GenerateRandom,
412+
C_GetFunctionStatus: f.C_GetFunctionStatus,
413+
C_CancelFunction: f.C_CancelFunction,
414+
C_WaitForSlotEvent: f.C_WaitForSlotEvent,
415+
C_GetInterfaceList: f.C_GetInterfaceList,
416+
C_GetInterface: f.C_GetInterface,
417+
C_LoginUser: f.C_LoginUser,
418+
C_SessionCancel: f.C_SessionCancel,
419+
C_MessageEncryptInit: f.C_MessageEncryptInit,
420+
C_EncryptMessage: f.C_EncryptMessage,
421+
C_EncryptMessageBegin: f.C_EncryptMessageBegin,
422+
C_EncryptMessageNext: f.C_EncryptMessageNext,
423+
C_MessageEncryptFinal: f.C_MessageEncryptFinal,
424+
C_MessageDecryptInit: f.C_MessageDecryptInit,
425+
C_DecryptMessage: f.C_DecryptMessage,
426+
C_DecryptMessageBegin: f.C_DecryptMessageBegin,
427+
C_DecryptMessageNext: f.C_DecryptMessageNext,
428+
C_MessageDecryptFinal: f.C_MessageDecryptFinal,
429+
C_MessageSignInit: f.C_MessageSignInit,
430+
C_SignMessage: f.C_SignMessage,
431+
C_SignMessageBegin: f.C_SignMessageBegin,
432+
C_SignMessageNext: f.C_SignMessageNext,
433+
C_MessageSignFinal: f.C_MessageSignFinal,
434+
C_MessageVerifyInit: f.C_MessageVerifyInit,
435+
C_VerifyMessage: f.C_VerifyMessage,
436+
C_VerifyMessageBegin: f.C_VerifyMessageBegin,
437+
C_VerifyMessageNext: f.C_VerifyMessageNext,
438+
C_MessageVerifyFinal: f.C_MessageVerifyFinal,
439+
C_EncapsulateKey: None,
440+
C_DecapsulateKey: None,
441+
C_VerifySignatureInit: None,
442+
C_VerifySignature: None,
443+
C_VerifySignatureUpdate: None,
444+
C_VerifySignatureFinal: None,
445+
C_GetSessionValidationFlags: None,
446+
C_AsyncComplete: None,
447+
C_AsyncGetID: None,
448+
C_AsyncJoin: None,
449+
C_WrapKeyAuthenticated: None,
450+
C_UnwrapKeyAuthenticated: None,
318451
}
319452
}

0 commit comments

Comments
 (0)