@@ -43,12 +43,11 @@ use std::sync::RwLock;
43
43
#[ derive( Debug ) ]
44
44
enum FunctionList {
45
45
/// 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 ) ,
47
47
/// 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 ) ,
52
51
}
53
52
54
53
// Implementation of Pkcs11 class that can be enclosed in a single Arc
@@ -69,10 +68,11 @@ impl fmt::Debug for Pkcs11Impl {
69
68
70
69
impl Pkcs11Impl {
71
70
#[ 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 {
73
72
match self . function_list {
74
73
FunctionList :: V2 ( l) => l,
75
74
FunctionList :: V3_0 ( l) => l,
75
+ FunctionList :: V3_2 ( l) => l,
76
76
}
77
77
}
78
78
@@ -132,8 +132,8 @@ impl Pkcs11 {
132
132
}
133
133
134
134
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 */
137
137
let mut interface: * mut cryptoki_sys:: CK_INTERFACE = ptr:: null_mut ( ) ;
138
138
if pkcs11_lib. C_GetInterface . is_ok ( ) {
139
139
Rv :: from ( pkcs11_lib. C_GetInterface (
@@ -150,12 +150,23 @@ impl Pkcs11 {
150
150
ifce. pFunctionList as * mut cryptoki_sys:: CK_FUNCTION_LIST ;
151
151
let list: cryptoki_sys:: CK_FUNCTION_LIST = * list_ptr;
152
152
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
+ }
153
164
let list30_ptr: * mut cryptoki_sys:: CK_FUNCTION_LIST_3_0 =
154
165
ifce. pFunctionList as * mut cryptoki_sys:: CK_FUNCTION_LIST_3_0 ;
155
166
return Ok ( Pkcs11 {
156
167
impl_ : Arc :: new ( Pkcs11Impl {
157
168
_pkcs11_lib : pkcs11_lib,
158
- function_list : FunctionList :: V3_0 ( * list30_ptr) ,
169
+ function_list : FunctionList :: V3_0 ( v30tov32 ( * list30_ptr) ) ,
159
170
} ) ,
160
171
initialized : Arc :: new ( RwLock :: new ( false ) ) ,
161
172
} ) ;
@@ -214,9 +225,9 @@ impl Pkcs11 {
214
225
}
215
226
}
216
227
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 {
220
231
version : f. version ,
221
232
C_Initialize : f. C_Initialize ,
222
233
C_Finalize : f. C_Finalize ,
@@ -310,5 +321,127 @@ fn v2tov3(f: cryptoki_sys::CK_FUNCTION_LIST) -> cryptoki_sys::CK_FUNCTION_LIST_3
310
321
C_VerifyMessageBegin : None ,
311
322
C_VerifyMessageNext : None ,
312
323
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 ,
313
446
}
314
447
}
0 commit comments