@@ -44,12 +44,11 @@ use std::sync::RwLock;
4444#[ derive( Debug ) ]
4545enum 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
7170impl 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