Skip to content

Commit 7fddd06

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

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
@@ -43,12 +43,11 @@ use std::sync::RwLock;
4343
#[derive(Debug)]
4444
enum FunctionList {
4545
/// PKCS #11 2.40 CK_FUNCTION_LIST
46-
V2(cryptoki_sys::CK_FUNCTION_LIST_3_0),
46+
V2(cryptoki_sys::CK_FUNCTION_LIST_3_2),
4747
/// PKCS #11 3.0 CK_FUNCTION_LIST_3_0
48-
V3_0(cryptoki_sys::CK_FUNCTION_LIST_3_0),
49-
// TODO when PKCS #11 3.2 will be imported, change the above to 3_2 too!
50-
// PKCS #11 3.2 CK_FUNCTION_LIST_3_2
51-
//V3_2(cryptoki_sys::CK_FUNCTION_LIST_3_2),
48+
V3_0(cryptoki_sys::CK_FUNCTION_LIST_3_2),
49+
/// PKCS #11 3.2 CK_FUNCTION_LIST_3_2
50+
V3_2(cryptoki_sys::CK_FUNCTION_LIST_3_2),
5251
}
5352

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

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

@@ -132,8 +132,8 @@ impl Pkcs11 {
132132
}
133133

134134
unsafe fn _new(pkcs11_lib: cryptoki_sys::Pkcs11) -> Result<Self> {
135-
/* First try the 3.0 API to get default interface. It might have some more functions than
136-
* the 2.4 API */
135+
/* First try the 3.* API to get default interface. It might have some more functions than
136+
* the 2.40 API */
137137
let mut interface: *mut cryptoki_sys::CK_INTERFACE = ptr::null_mut();
138138
if pkcs11_lib.C_GetInterface.is_ok() {
139139
Rv::from(pkcs11_lib.C_GetInterface(
@@ -150,12 +150,23 @@ impl Pkcs11 {
150150
ifce.pFunctionList as *mut cryptoki_sys::CK_FUNCTION_LIST;
151151
let list: cryptoki_sys::CK_FUNCTION_LIST = *list_ptr;
152152
if list.version.major >= 3 {
153+
if list.version.minor >= 2 {
154+
let list32_ptr: *mut cryptoki_sys::CK_FUNCTION_LIST_3_2 =
155+
ifce.pFunctionList as *mut cryptoki_sys::CK_FUNCTION_LIST_3_2;
156+
return Ok(Pkcs11 {
157+
impl_: Arc::new(Pkcs11Impl {
158+
_pkcs11_lib: pkcs11_lib,
159+
function_list: FunctionList::V3_2(*list32_ptr),
160+
}),
161+
initialized: Arc::new(RwLock::new(false)),
162+
});
163+
}
153164
let list30_ptr: *mut cryptoki_sys::CK_FUNCTION_LIST_3_0 =
154165
ifce.pFunctionList as *mut cryptoki_sys::CK_FUNCTION_LIST_3_0;
155166
return Ok(Pkcs11 {
156167
impl_: Arc::new(Pkcs11Impl {
157168
_pkcs11_lib: pkcs11_lib,
158-
function_list: FunctionList::V3_0(*list30_ptr),
169+
function_list: FunctionList::V3_0(v30tov32(*list30_ptr)),
159170
}),
160171
initialized: Arc::new(RwLock::new(false)),
161172
});
@@ -214,9 +225,9 @@ impl Pkcs11 {
214225
}
215226
}
216227

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

0 commit comments

Comments
 (0)