@@ -545,6 +545,88 @@ def hash_in_chunks(chunk_size, event):
545545
546546 self .assertEqual (expected_hash , hasher .hexdigest ())
547547
548+ pbkdf2_test_vectors = [
549+ (b'password' , b'salt' , 1 , None ),
550+ (b'password' , b'salt' , 2 , None ),
551+ (b'password' , b'salt' , 4096 , None ),
552+ # too slow, it takes over a minute on a fast CPU.
553+ #(b'password', b'salt', 16777216, None),
554+ (b'passwordPASSWORDpassword' , b'saltSALTsaltSALTsaltSALTsaltSALTsalt' ,
555+ 4096 , - 1 ),
556+ (b'pass\0 word' , b'sa\0 lt' , 4096 , 16 ),
557+ ]
558+
559+ pbkdf2_results = {
560+ "sha1" : [
561+ # offical test vectors from RFC 6070
562+ (bytes .fromhex ('0c60c80f961f0e71f3a9b524af6012062fe037a6' ), None ),
563+ (bytes .fromhex ('ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957' ), None ),
564+ (bytes .fromhex ('4b007901b765489abead49d926f721d065a429c1' ), None ),
565+ #(bytes.fromhex('eefe3d61cd4da4e4e9945b3d6ba2158c2634e984'), None),
566+ (bytes .fromhex ('3d2eec4fe41c849b80c8d83662c0e44a8b291a964c'
567+ 'f2f07038' ), 25 ),
568+ (bytes .fromhex ('56fa6aa75548099dcc37d7f03425e0c3' ), None ),],
569+ "sha256" : [
570+ (bytes .fromhex ('120fb6cffcf8b32c43e7225256c4f837'
571+ 'a86548c92ccc35480805987cb70be17b' ), None ),
572+ (bytes .fromhex ('ae4d0c95af6b46d32d0adff928f06dd0'
573+ '2a303f8ef3c251dfd6e2d85a95474c43' ), None ),
574+ (bytes .fromhex ('c5e478d59288c841aa530db6845c4c8d'
575+ '962893a001ce4e11a4963873aa98134a' ), None ),
576+ #(bytes.fromhex('cf81c66fe8cfc04d1f31ecb65dab4089'
577+ # 'f7f179e89b3b0bcb17ad10e3ac6eba46'), None),
578+ (bytes .fromhex ('348c89dbcbd32b2f32d814b8116e84cf2b17'
579+ '347ebc1800181c4e2a1fb8dd53e1c635518c7dac47e9' ), 40 ),
580+ (bytes .fromhex ('89b69d0516f829893c696226650a8687' ), None ),],
581+ "sha512" : [
582+ (bytes .fromhex ('867f70cf1ade02cff3752599a3a53dc4af34c7a669815ae5'
583+ 'd513554e1c8cf252c02d470a285a0501bad999bfe943c08f'
584+ '050235d7d68b1da55e63f73b60a57fce' ), None ),
585+ (bytes .fromhex ('e1d9c16aa681708a45f5c7c4e215ceb66e011a2e9f004071'
586+ '3f18aefdb866d53cf76cab2868a39b9f7840edce4fef5a82'
587+ 'be67335c77a6068e04112754f27ccf4e' ), None ),
588+ (bytes .fromhex ('d197b1b33db0143e018b12f3d1d1479e6cdebdcc97c5c0f8'
589+ '7f6902e072f457b5143f30602641b3d55cd335988cb36b84'
590+ '376060ecd532e039b742a239434af2d5' ), None ),
591+ (bytes .fromhex ('8c0511f4c6e597c6ac6315d8f0362e225f3c501495ba23b8'
592+ '68c005174dc4ee71115b59f9e60cd9532fa33e0f75aefe30'
593+ '225c583a186cd82bd4daea9724a3d3b8' ), 64 ),
594+ (bytes .fromhex ('9d9e9c4cd21fe4be24d5b8244c759665' ), None ),],
595+ }
596+
597+ @unittest .skipUnless (hasattr (hashlib , 'pbkdf2_hmac' ),
598+ 'pbkdf2_hmac required for this test.' )
599+ def test_pbkdf2_hmac (self ):
600+ pbkdf2 = hashlib .pbkdf2_hmac
601+
602+ for digest_name , results in self .pbkdf2_results .items ():
603+ for i , vector in enumerate (self .pbkdf2_test_vectors ):
604+ password , salt , rounds , dklen = vector
605+ expected , overwrite_dklen = results [i ]
606+ if overwrite_dklen :
607+ dklen = overwrite_dklen
608+ out = pbkdf2 (digest_name , password , salt , rounds , dklen )
609+ self .assertEqual (out , expected ,
610+ (digest_name , password , salt , rounds , dklen ))
611+ out = pbkdf2 (digest_name , memoryview (password ),
612+ memoryview (salt ), rounds , dklen )
613+ out = pbkdf2 (digest_name , bytearray (password ),
614+ bytearray (salt ), rounds , dklen )
615+ self .assertEqual (out , expected )
616+ if dklen is None :
617+ out = pbkdf2 (digest_name , password , salt , rounds )
618+ self .assertEqual (out , expected ,
619+ (digest_name , password , salt , rounds ))
620+
621+ self .assertRaises (TypeError , pbkdf2 , b'sha1' , b'pass' , b'salt' , 1 )
622+ self .assertRaises (TypeError , pbkdf2 , 'sha1' , 'pass' , 'salt' , 1 )
623+ self .assertRaises (ValueError , pbkdf2 , 'sha1' , b'pass' , b'salt' , 0 )
624+ self .assertRaises (ValueError , pbkdf2 , 'sha1' , b'pass' , b'salt' , - 1 )
625+ self .assertRaises (ValueError , pbkdf2 , 'sha1' , b'pass' , b'salt' , 1 , 0 )
626+ self .assertRaises (ValueError , pbkdf2 , 'sha1' , b'pass' , b'salt' , 1 , - 1 )
627+ with self .assertRaisesRegex (ValueError , 'unsupported hash type' ):
628+ pbkdf2 ('unknown' , b'pass' , b'salt' , 1 )
629+
548630
549631if __name__ == "__main__" :
550632 unittest .main ()
0 commit comments