4 <script src=
"../../../resources/js-test.js"></script>
5 <script src=
"../resources/common.js"></script>
8 <p id=
"description"></p>
9 <div id=
"console"></div>
12 description("Tests importKey/deriveBits for PBKDF2");
16 // -------------------------------------------------
17 // Successful password import and bits derivation
18 // -------------------------------------------------
20 // Test vectors were copied from:
21 // https://tools.ietf.org/html/rfc6070
24 var kPbkdf2SuccessVectors
= [
31 derived_key
: "0c60c80f961f0e71f3a9b524af6012062fe037a6"
40 derived_key
: "ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957"
49 derived_key
: "4b007901b765489abead49d926f721d065a429c1"
53 password
: "passwordPASSWORDpassword",
54 salt
: "saltSALTsaltSALTsaltSALTsaltSALTsalt",
58 derived_key
: "3d2eec4fe41c849b80c8d83662c0e44a8b291a964cf2f07038"
62 password
: "pass\0word",
67 derived_key
: "56fa6aa75548099dcc37d7f03425e0c3"
71 function runPbkdf2SuccessTestCase(testCase
)
73 var algorithm
= {name
: 'PBKDF2'};
77 if (typeof testCase
.password
=== 'string')
78 password
= asciiToUint8Array(testCase
.password
);
79 else if (Array
.isArray(testCase
.password
))
80 password
= new Uint8Array(testCase
.password
);
82 var usages
= ['deriveBits', 'deriveKey'];
83 var extractable
= false;
87 salt
: asciiToUint8Array(testCase
.salt
),
88 iterations
: testCase
.c
,
89 hash
: {name
: testCase
.hash
}
91 // (1) Import the password
92 return crypto
.subtle
.importKey('raw', password
, algorithm
, extractable
, usages
).then(function(result
) {
94 // shouldBe() can only resolve variables in global context.
96 shouldEvaluateAs("tmpKey.type", "secret");
97 shouldEvaluateAs("tmpKey.extractable", false);
98 shouldEvaluateAs("tmpKey.algorithm.name", "PBKDF2");
99 shouldEvaluateAs("tmpKey.usages.join(',')", "deriveKey,deriveBits");
102 return crypto
.subtle
.deriveBits(params
, key
, testCase
.dkLen
*8);
103 }).then(function(result
) {
104 bytesShouldMatchHexString("deriveBits", testCase
.derived_key
, result
);
105 return crypto
.subtle
.deriveBits(params
, key
, 0);
106 }).then(function(result
) {
107 derivedBits
= result
;
108 shouldBe("derivedBits.byteLength", "0");
112 var lastPromise
= Promise
.resolve(null);
114 kPbkdf2SuccessVectors
.forEach(function(test
) {
115 lastPromise
= lastPromise
.then(runPbkdf2SuccessTestCase
.bind(null, test
));
118 lastPromise
.then(finishJSTest
, failAndFinishJSTest
);