5
5
6
6
use core:: { convert:: TryInto , marker:: PhantomData , ptr, slice} ;
7
7
8
- use crate :: object:: Attribute ;
8
+ use crate :: object:: { Attribute , ObjectHandle } ;
9
9
10
10
use super :: MechanismType ;
11
11
@@ -273,7 +273,7 @@ impl<'a> KbkdfCounterParams<'a> {
273
273
pub fn new (
274
274
prf_mechanism : MechanismType ,
275
275
prf_data_params : & ' a [ PrfCounterDataParam < ' a > ] ,
276
- additional_derived_keys : & ' a mut [ DerivedKey < ' a > ] ,
276
+ additional_derived_keys : Option < & ' a mut [ DerivedKey < ' a > ] > ,
277
277
) -> Self {
278
278
Self {
279
279
inner : cryptoki_sys:: CK_SP800_108_KDF_PARAMS {
@@ -283,31 +283,41 @@ impl<'a> KbkdfCounterParams<'a> {
283
283
. try_into ( )
284
284
. expect ( "number of data parameters does not fit in CK_ULONG" ) ,
285
285
pDataParams : prf_data_params. as_ptr ( ) as cryptoki_sys:: CK_PRF_DATA_PARAM_PTR ,
286
- ulAdditionalDerivedKeys : additional_derived_keys
287
- . len ( )
288
- . try_into ( )
289
- . expect ( "number of additional derived keys does not fit in CK_ULONG" ) ,
290
- pAdditionalDerivedKeys : additional_derived_keys. as_mut_ptr ( )
291
- as cryptoki_sys:: CK_DERIVED_KEY_PTR ,
286
+ ulAdditionalDerivedKeys : additional_derived_keys. as_ref ( ) . map_or ( 0 , |keys| {
287
+ keys. len ( )
288
+ . try_into ( )
289
+ . expect ( "number of additional derived keys does not fit in CK_ULONG" )
290
+ } ) ,
291
+ pAdditionalDerivedKeys : additional_derived_keys. map_or ( ptr:: null_mut ( ) , |keys| {
292
+ keys. as_mut_ptr ( ) as cryptoki_sys:: CK_DERIVED_KEY_PTR
293
+ } ) ,
292
294
} ,
293
295
_marker : PhantomData ,
294
296
}
295
297
}
296
298
297
299
/// The additional keys derived by the KDF, as per the params
298
- pub fn additional_derived_keys ( & self ) -> Vec < cryptoki_sys:: CK_OBJECT_HANDLE > {
299
- let derived_keys = unsafe {
300
- slice:: from_raw_parts (
301
- self . inner . pAdditionalDerivedKeys ,
302
- self . inner . ulAdditionalDerivedKeys as _ ,
303
- )
304
- } ;
300
+ pub ( crate ) fn additional_derived_keys ( & self ) -> Option < Vec < ObjectHandle > > {
301
+ if self . inner . ulAdditionalDerivedKeys == 0 {
302
+ None
303
+ } else {
304
+ // SAFETY: if the number of derived keys > 0, then at least one was explicitly provided during construction
305
+ let derived_keys = unsafe {
306
+ slice:: from_raw_parts (
307
+ self . inner . pAdditionalDerivedKeys ,
308
+ self . inner . ulAdditionalDerivedKeys as _ ,
309
+ )
310
+ } ;
305
311
306
- unsafe {
307
- derived_keys
308
- . iter ( )
309
- . map ( |derived_key| * derived_key. phKey )
310
- . collect ( )
312
+ Some (
313
+ derived_keys
314
+ . iter ( )
315
+ . map ( |derived_key| {
316
+ // SAFETY: a value is always provided during construction
317
+ ObjectHandle :: new ( unsafe { * derived_key. phKey } )
318
+ } )
319
+ . collect ( ) ,
320
+ )
311
321
}
312
322
}
313
323
}
@@ -340,7 +350,7 @@ impl<'a> KbkdfFeedbackParams<'a> {
340
350
prf_mechanism : MechanismType ,
341
351
prf_data_params : & ' a [ PrfDataParam < ' a > ] ,
342
352
iv : Option < & ' a [ u8 ] > ,
343
- additional_derived_keys : & ' a mut [ DerivedKey < ' a > ] ,
353
+ additional_derived_keys : Option < & ' a mut [ DerivedKey < ' a > ] > ,
344
354
) -> Self {
345
355
Self {
346
356
inner : cryptoki_sys:: CK_SP800_108_FEEDBACK_KDF_PARAMS {
@@ -356,31 +366,41 @@ impl<'a> KbkdfFeedbackParams<'a> {
356
366
. expect ( "IV length does not fit in CK_ULONG" )
357
367
} ) ,
358
368
pIV : iv. map_or ( ptr:: null_mut ( ) , |iv| iv. as_ptr ( ) as * mut _ ) ,
359
- ulAdditionalDerivedKeys : additional_derived_keys
360
- . len ( )
361
- . try_into ( )
362
- . expect ( "number of additional derived keys does not fit in CK_ULONG" ) ,
363
- pAdditionalDerivedKeys : additional_derived_keys. as_mut_ptr ( )
364
- as cryptoki_sys:: CK_DERIVED_KEY_PTR ,
369
+ ulAdditionalDerivedKeys : additional_derived_keys. as_ref ( ) . map_or ( 0 , |keys| {
370
+ keys. len ( )
371
+ . try_into ( )
372
+ . expect ( "number of additional derived keys does not fit in CK_ULONG" )
373
+ } ) ,
374
+ pAdditionalDerivedKeys : additional_derived_keys. map_or ( ptr:: null_mut ( ) , |keys| {
375
+ keys. as_mut_ptr ( ) as cryptoki_sys:: CK_DERIVED_KEY_PTR
376
+ } ) ,
365
377
} ,
366
378
_marker : PhantomData ,
367
379
}
368
380
}
369
381
370
382
/// The additional keys derived by the KDF, as per the params
371
- pub fn additional_derived_keys ( & self ) -> Vec < cryptoki_sys:: CK_OBJECT_HANDLE > {
372
- let derived_keys = unsafe {
373
- slice:: from_raw_parts (
374
- self . inner . pAdditionalDerivedKeys ,
375
- self . inner . ulAdditionalDerivedKeys as _ ,
376
- )
377
- } ;
383
+ pub ( crate ) fn additional_derived_keys ( & self ) -> Option < Vec < ObjectHandle > > {
384
+ if self . inner . ulAdditionalDerivedKeys == 0 {
385
+ None
386
+ } else {
387
+ // SAFETY: if the number of derived keys > 0, then at least one was explicitly provided during construction
388
+ let derived_keys = unsafe {
389
+ slice:: from_raw_parts (
390
+ self . inner . pAdditionalDerivedKeys ,
391
+ self . inner . ulAdditionalDerivedKeys as _ ,
392
+ )
393
+ } ;
378
394
379
- unsafe {
380
- derived_keys
381
- . iter ( )
382
- . map ( |derived_key| * derived_key. phKey )
383
- . collect ( )
395
+ Some (
396
+ derived_keys
397
+ . iter ( )
398
+ . map ( |derived_key| {
399
+ // SAFETY: a value is always provided during construction
400
+ ObjectHandle :: new ( unsafe { * derived_key. phKey } )
401
+ } )
402
+ . collect ( ) ,
403
+ )
384
404
}
385
405
}
386
406
}
@@ -410,7 +430,7 @@ impl<'a> KbkdfDoublePipelineParams<'a> {
410
430
pub fn new (
411
431
prf_mechanism : MechanismType ,
412
432
prf_data_params : & ' a [ PrfDataParam < ' a > ] ,
413
- additional_derived_keys : & ' a mut [ DerivedKey < ' a > ] ,
433
+ additional_derived_keys : Option < & ' a mut [ DerivedKey < ' a > ] > ,
414
434
) -> Self {
415
435
Self {
416
436
inner : cryptoki_sys:: CK_SP800_108_KDF_PARAMS {
@@ -420,31 +440,41 @@ impl<'a> KbkdfDoublePipelineParams<'a> {
420
440
. try_into ( )
421
441
. expect ( "number of data parameters does not fit in CK_ULONG" ) ,
422
442
pDataParams : prf_data_params. as_ptr ( ) as cryptoki_sys:: CK_PRF_DATA_PARAM_PTR ,
423
- ulAdditionalDerivedKeys : additional_derived_keys
424
- . len ( )
425
- . try_into ( )
426
- . expect ( "number of additional derived keys does not fit in CK_ULONG" ) ,
427
- pAdditionalDerivedKeys : additional_derived_keys. as_mut_ptr ( )
428
- as cryptoki_sys:: CK_DERIVED_KEY_PTR ,
443
+ ulAdditionalDerivedKeys : additional_derived_keys. as_ref ( ) . map_or ( 0 , |keys| {
444
+ keys. len ( )
445
+ . try_into ( )
446
+ . expect ( "number of additional derived keys does not fit in CK_ULONG" )
447
+ } ) ,
448
+ pAdditionalDerivedKeys : additional_derived_keys. map_or ( ptr:: null_mut ( ) , |keys| {
449
+ keys. as_mut_ptr ( ) as cryptoki_sys:: CK_DERIVED_KEY_PTR
450
+ } ) ,
429
451
} ,
430
452
_marker : PhantomData ,
431
453
}
432
454
}
433
455
434
456
/// The additional keys derived by the KDF, as per the params
435
- pub fn additional_derived_keys ( & self ) -> Vec < cryptoki_sys:: CK_OBJECT_HANDLE > {
436
- let derived_keys = unsafe {
437
- slice:: from_raw_parts (
438
- self . inner . pAdditionalDerivedKeys ,
439
- self . inner . ulAdditionalDerivedKeys as _ ,
440
- )
441
- } ;
457
+ pub ( crate ) fn additional_derived_keys ( & self ) -> Option < Vec < ObjectHandle > > {
458
+ if self . inner . ulAdditionalDerivedKeys == 0 {
459
+ None
460
+ } else {
461
+ // SAFETY: if the number of derived keys > 0, then at least one was explicitly provided during construction
462
+ let derived_keys = unsafe {
463
+ slice:: from_raw_parts (
464
+ self . inner . pAdditionalDerivedKeys ,
465
+ self . inner . ulAdditionalDerivedKeys as _ ,
466
+ )
467
+ } ;
442
468
443
- unsafe {
444
- derived_keys
445
- . iter ( )
446
- . map ( |derived_key| * derived_key. phKey )
447
- . collect ( )
469
+ Some (
470
+ derived_keys
471
+ . iter ( )
472
+ . map ( |derived_key| {
473
+ // SAFETY: a value is always provided during construction
474
+ ObjectHandle :: new ( unsafe { * derived_key. phKey } )
475
+ } )
476
+ . collect ( ) ,
477
+ )
448
478
}
449
479
}
450
480
}
0 commit comments