77use std:: { os:: raw:: c_int, ptr:: null_mut} ;
88
99use crate :: {
10- Error , SECItemBorrowed , hmac:: { HmacAlgorithm , hmac_alg_to_prf_oid} , p11:: {
10+ Error , SECItemBorrowed ,
11+ hmac:: { HmacAlgorithm , hmac_alg_to_prf_oid} ,
12+ p11:: {
1113 PK11_CreatePBEV2AlgorithmID , PK11_PBEKeyGen , PRBool , SECOID_DestroyAlgorithmID , SECOidTag ,
1214 Slot , SymKey ,
13- }
15+ } ,
1416} ;
1517
1618/// Derive a key using PBKDF2.
@@ -34,6 +36,9 @@ pub fn pbkdf2(
3436
3537 let mut salt_item = SECItemBorrowed :: wrap ( salt) ?;
3638
39+ let slot = Slot :: internal ( ) ?;
40+ let mut pw_item = SECItemBorrowed :: wrap ( password) ?;
41+
3742 let algid = unsafe {
3843 PK11_CreatePBEV2AlgorithmID (
3944 SECOidTag :: SEC_OID_PKCS5_PBKDF2 ,
@@ -48,8 +53,6 @@ pub fn pbkdf2(
4853 return Err ( Error :: last_nss_error ( ) ) ;
4954 }
5055
51- let slot = Slot :: internal ( ) ?;
52- let mut pw_item = SECItemBorrowed :: wrap ( password) ?;
5356 let key_ptr = unsafe {
5457 PK11_PBEKeyGen (
5558 * slot,
@@ -73,9 +76,8 @@ mod tests {
7376 use super :: * ;
7477
7578 #[ test]
76- fn rfc_6070_vector_1 ( ) {
77- // RFC 6070 defines PBKDF2-HMAC-SHA1 test vectors; RFC 7914 §11 / many
78- // references provide PBKDF2-HMAC-SHA256 vectors. Using a common one:
79+ fn rfc_7914_vector_1 ( ) {
80+ // RFC 7914 §11 provides PBKDF2-HMAC-SHA256 vectors. Using a common one:
7981 // password="password", salt="salt", iter=1, dkLen=32.
8082 let dk = pbkdf2 ( & HmacAlgorithm :: HMAC_SHA2_256 , b"password" , b"salt" , 1 , 32 ) . unwrap ( ) ;
8183 let expected = [
@@ -99,15 +101,43 @@ mod tests {
99101
100102 #[ test]
101103 fn deterministic_across_calls ( ) {
102- let a = pbkdf2 ( & HmacAlgorithm :: HMAC_SHA2_256 , b"hello" , b"saltysalt0000000" , 10_000 , 32 ) . unwrap ( ) ;
103- let b = pbkdf2 ( & HmacAlgorithm :: HMAC_SHA2_256 , b"hello" , b"saltysalt0000000" , 10_000 , 32 ) . unwrap ( ) ;
104+ let a = pbkdf2 (
105+ & HmacAlgorithm :: HMAC_SHA2_256 ,
106+ b"hello" ,
107+ b"saltysalt0000000" ,
108+ 10_000 ,
109+ 32 ,
110+ )
111+ . unwrap ( ) ;
112+ let b = pbkdf2 (
113+ & HmacAlgorithm :: HMAC_SHA2_256 ,
114+ b"hello" ,
115+ b"saltysalt0000000" ,
116+ 10_000 ,
117+ 32 ,
118+ )
119+ . unwrap ( ) ;
104120 assert_eq ! ( a, b) ;
105121 }
106122
107123 #[ test]
108124 fn different_salt_different_key ( ) {
109- let a = pbkdf2 ( & HmacAlgorithm :: HMAC_SHA2_256 , b"hello" , b"saltysalt0000000" , 10_000 , 32 ) . unwrap ( ) ;
110- let b = pbkdf2 ( & HmacAlgorithm :: HMAC_SHA2_256 , b"hello" , b"saltysalt0000001" , 10_000 , 32 ) . unwrap ( ) ;
125+ let a = pbkdf2 (
126+ & HmacAlgorithm :: HMAC_SHA2_256 ,
127+ b"hello" ,
128+ b"saltysalt0000000" ,
129+ 10_000 ,
130+ 32 ,
131+ )
132+ . unwrap ( ) ;
133+ let b = pbkdf2 (
134+ & HmacAlgorithm :: HMAC_SHA2_256 ,
135+ b"hello" ,
136+ b"saltysalt0000001" ,
137+ 10_000 ,
138+ 32 ,
139+ )
140+ . unwrap ( ) ;
111141 assert_ne ! ( a, b) ;
112142 }
113143}
0 commit comments