3
3
//! Mechanisms of NIST key-based key derive functions (SP 800-108, informally KBKDF)
4
4
//! See: <https://docs.oasis-open.org/pkcs11/pkcs11-curr/v3.0/os/pkcs11-curr-v3.0-os.html#_Toc30061446>
5
5
6
- use std :: { convert:: TryInto , marker:: PhantomData , ptr} ;
6
+ use core :: { convert:: TryInto , marker:: PhantomData , ptr, slice } ;
7
7
8
8
use cryptoki_sys:: {
9
9
CK_ATTRIBUTE , CK_ATTRIBUTE_PTR , CK_DERIVED_KEY , CK_DERIVED_KEY_PTR , CK_OBJECT_HANDLE ,
@@ -158,14 +158,12 @@ impl<'a> KbkdfCounterParams<'a> {
158
158
pub fn new (
159
159
prf_mechanism : MechanismType ,
160
160
prf_data_params : Vec < PrfDataParam < ' a > > ,
161
- additional_derived_keys : Vec < DerivedKey < ' a > > ,
161
+ mut additional_derived_keys : Vec < DerivedKey < ' a > > ,
162
162
) -> Self {
163
163
let prf_data_params: Vec < CK_PRF_DATA_PARAM > =
164
- prf_data_params. into_iter ( ) . map ( Into :: into) . collect ( ) ;
165
- let additional_derived_keys: Vec < CK_DERIVED_KEY > = additional_derived_keys
166
- . into_iter ( )
167
- . map ( Into :: into)
168
- . collect ( ) ;
164
+ prf_data_params. iter ( ) . map ( Into :: into) . collect ( ) ;
165
+ let additional_derived_keys: Vec < CK_DERIVED_KEY > =
166
+ additional_derived_keys. iter_mut ( ) . map ( Into :: into) . collect ( ) ;
169
167
170
168
Self {
171
169
inner : cryptoki_sys:: CK_SP800_108_KDF_PARAMS {
@@ -184,6 +182,23 @@ impl<'a> KbkdfCounterParams<'a> {
184
182
_marker : PhantomData ,
185
183
}
186
184
}
185
+
186
+ /// The additional keys derived by the KDF, as per the params
187
+ pub fn additional_derived_keys ( & self ) -> Vec < CK_OBJECT_HANDLE > {
188
+ let derived_keys = unsafe {
189
+ slice:: from_raw_parts (
190
+ self . inner . pAdditionalDerivedKeys ,
191
+ self . inner . ulAdditionalDerivedKeys as _ ,
192
+ )
193
+ } ;
194
+
195
+ unsafe {
196
+ derived_keys
197
+ . iter ( )
198
+ . map ( |derived_key| * derived_key. phKey )
199
+ . collect ( )
200
+ }
201
+ }
187
202
}
188
203
189
204
/// NIST SP 800-108 (aka KBKDF) feedback-mode parameters.
@@ -214,14 +229,12 @@ impl<'a> KbkdfFeedbackParams<'a> {
214
229
prf_mechanism : MechanismType ,
215
230
prf_data_params : Vec < PrfDataParam < ' a > > ,
216
231
iv : Option < & ' a [ u8 ] > ,
217
- additional_derived_keys : Vec < DerivedKey < ' a > > ,
232
+ mut additional_derived_keys : Vec < DerivedKey < ' a > > ,
218
233
) -> Self {
219
234
let prf_data_params: Vec < CK_PRF_DATA_PARAM > =
220
- prf_data_params. into_iter ( ) . map ( Into :: into) . collect ( ) ;
221
- let additional_derived_keys: Vec < CK_DERIVED_KEY > = additional_derived_keys
222
- . into_iter ( )
223
- . map ( Into :: into)
224
- . collect ( ) ;
235
+ prf_data_params. iter ( ) . map ( Into :: into) . collect ( ) ;
236
+ let additional_derived_keys: Vec < CK_DERIVED_KEY > =
237
+ additional_derived_keys. iter_mut ( ) . map ( Into :: into) . collect ( ) ;
225
238
226
239
Self {
227
240
inner : cryptoki_sys:: CK_SP800_108_FEEDBACK_KDF_PARAMS {
@@ -246,6 +259,23 @@ impl<'a> KbkdfFeedbackParams<'a> {
246
259
_marker : PhantomData ,
247
260
}
248
261
}
262
+
263
+ /// The additional keys derived by the KDF, as per the params
264
+ pub fn additional_derived_keys ( & self ) -> Vec < CK_OBJECT_HANDLE > {
265
+ let derived_keys = unsafe {
266
+ slice:: from_raw_parts (
267
+ self . inner . pAdditionalDerivedKeys ,
268
+ self . inner . ulAdditionalDerivedKeys as _ ,
269
+ )
270
+ } ;
271
+
272
+ unsafe {
273
+ derived_keys
274
+ . iter ( )
275
+ . map ( |derived_key| * derived_key. phKey )
276
+ . collect ( )
277
+ }
278
+ }
249
279
}
250
280
251
281
/// NIST SP 800-108 (aka KBKDF) double pipeline-mode parameters.
@@ -273,14 +303,12 @@ impl<'a> KbkdfDoublePipelineParams<'a> {
273
303
pub fn new (
274
304
prf_mechanism : MechanismType ,
275
305
prf_data_params : Vec < PrfDataParam < ' a > > ,
276
- additional_derived_keys : Vec < DerivedKey < ' a > > ,
306
+ mut additional_derived_keys : Vec < DerivedKey < ' a > > ,
277
307
) -> Self {
278
308
let prf_data_params: Vec < CK_PRF_DATA_PARAM > =
279
- prf_data_params. into_iter ( ) . map ( Into :: into) . collect ( ) ;
280
- let additional_derived_keys: Vec < CK_DERIVED_KEY > = additional_derived_keys
281
- . into_iter ( )
282
- . map ( Into :: into)
283
- . collect ( ) ;
309
+ prf_data_params. iter ( ) . map ( Into :: into) . collect ( ) ;
310
+ let additional_derived_keys: Vec < CK_DERIVED_KEY > =
311
+ additional_derived_keys. iter_mut ( ) . map ( Into :: into) . collect ( ) ;
284
312
285
313
Self {
286
314
inner : cryptoki_sys:: CK_SP800_108_KDF_PARAMS {
@@ -299,10 +327,27 @@ impl<'a> KbkdfDoublePipelineParams<'a> {
299
327
_marker : PhantomData ,
300
328
}
301
329
}
330
+
331
+ /// The additional keys derived by the KDF, as per the params
332
+ pub fn additional_derived_keys ( & self ) -> Vec < CK_OBJECT_HANDLE > {
333
+ let derived_keys = unsafe {
334
+ slice:: from_raw_parts (
335
+ self . inner . pAdditionalDerivedKeys ,
336
+ self . inner . ulAdditionalDerivedKeys as _ ,
337
+ )
338
+ } ;
339
+
340
+ unsafe {
341
+ derived_keys
342
+ . iter ( )
343
+ . map ( |derived_key| * derived_key. phKey )
344
+ . collect ( )
345
+ }
346
+ }
302
347
}
303
348
304
- impl < ' a > From < PrfDataParam < ' a > > for CK_PRF_DATA_PARAM {
305
- fn from ( value : PrfDataParam < ' a > ) -> Self {
349
+ impl < ' a > From < & PrfDataParam < ' a > > for CK_PRF_DATA_PARAM {
350
+ fn from ( value : & PrfDataParam < ' a > ) -> Self {
306
351
Self {
307
352
type_ : match value {
308
353
PrfDataParam :: IterationVariable => CK_SP800_108_ITERATION_VARIABLE ,
@@ -312,8 +357,8 @@ impl<'a> From<PrfDataParam<'a>> for CK_PRF_DATA_PARAM {
312
357
} ,
313
358
pValue : match value {
314
359
PrfDataParam :: IterationVariable => ptr:: null_mut ( ) ,
315
- PrfDataParam :: Counter ( inner) => & inner as * const _ as * mut _ ,
316
- PrfDataParam :: DkmLength ( inner) => & inner as * const _ as * mut _ ,
360
+ PrfDataParam :: Counter ( inner) => inner as * const _ as * mut _ ,
361
+ PrfDataParam :: DkmLength ( inner) => inner as * const _ as * mut _ ,
317
362
PrfDataParam :: ByteArray ( data) => data. as_ptr ( ) as * mut _ ,
318
363
} ,
319
364
ulValueLen : match value {
@@ -331,17 +376,17 @@ impl<'a> From<PrfDataParam<'a>> for CK_PRF_DATA_PARAM {
331
376
}
332
377
}
333
378
334
- impl < ' a > From < PrfCounterDataParam < ' a > > for CK_PRF_DATA_PARAM {
335
- fn from ( value : PrfCounterDataParam < ' a > ) -> Self {
379
+ impl < ' a > From < & PrfCounterDataParam < ' a > > for CK_PRF_DATA_PARAM {
380
+ fn from ( value : & PrfCounterDataParam < ' a > ) -> Self {
336
381
Self {
337
382
type_ : match value {
338
383
PrfCounterDataParam :: IterationVariable ( _) => CK_SP800_108_ITERATION_VARIABLE ,
339
384
PrfCounterDataParam :: DkmLength ( _) => CK_SP800_108_DKM_LENGTH ,
340
385
PrfCounterDataParam :: ByteArray ( _) => CK_SP800_108_BYTE_ARRAY ,
341
386
} ,
342
387
pValue : match value {
343
- PrfCounterDataParam :: IterationVariable ( inner) => & inner as * const _ as * mut _ ,
344
- PrfCounterDataParam :: DkmLength ( inner) => & inner as * const _ as * mut _ ,
388
+ PrfCounterDataParam :: IterationVariable ( inner) => inner as * const _ as * mut _ ,
389
+ PrfCounterDataParam :: DkmLength ( inner) => inner as * const _ as * mut _ ,
345
390
PrfCounterDataParam :: ByteArray ( data) => data. as_ptr ( ) as * mut _ ,
346
391
} ,
347
392
ulValueLen : match value {
@@ -360,9 +405,9 @@ impl<'a> From<PrfCounterDataParam<'a>> for CK_PRF_DATA_PARAM {
360
405
}
361
406
}
362
407
363
- impl < ' a > From < DerivedKey < ' a > > for CK_DERIVED_KEY {
364
- fn from ( mut value : DerivedKey < ' a > ) -> Self {
365
- let template: Vec < CK_ATTRIBUTE > = value. template . iter ( ) . map ( |attr| attr . into ( ) ) . collect ( ) ;
408
+ impl < ' a > From < & mut DerivedKey < ' a > > for CK_DERIVED_KEY {
409
+ fn from ( value : & mut DerivedKey < ' a > ) -> Self {
410
+ let template: Vec < CK_ATTRIBUTE > = value. template . iter ( ) . map ( Into :: into) . collect ( ) ;
366
411
367
412
Self {
368
413
pTemplate : template. as_ptr ( ) as CK_ATTRIBUTE_PTR ,
0 commit comments