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 encrypt/decrypt for AES-CBC");
16 // -------------------------------------------------
17 // Successful password import and key derivation
18 // -------------------------------------------------
20 // Test vectors were copied from:
21 // https://tools.ietf.org/html/rfc6070
24 var kPbkdf2SuccessVectors
= [
31 derived_key_full_length
: "0c60c80f961f0e71f3a9b524af6012062fe037a6"
40 derived_key_full_length
: "ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957"
49 derived_key_full_length
: "4b007901b765489abead49d926f721d065a429c1"
53 password
: "passwordPASSWORDpassword",
54 salt
: "saltSALTsaltSALTsaltSALTsaltSALTsalt",
58 derived_key_full_length
: "3d2eec4fe41c849b80c8d83662c0e44a8b291a964cf2f07038"
62 password
: "pass\0word",
67 derived_key_full_length
: "56fa6aa75548099dcc37d7f03425e0c3"
74 function runPbkdf2SuccessTestCase(testCase
)
76 var algorithm
= {name
: 'PBKDF2'};
78 var password
= asciiToUint8Array(testCase
.password
);
79 var usages
= ['deriveBits', 'deriveKey'];
80 var extractable
= false;
84 salt
: asciiToUint8Array(testCase
.salt
),
85 iterations
: testCase
.c
,
86 hash
: {name
: testCase
.hash
}
88 // (1) Import the password
89 return crypto
.subtle
.importKey('raw', password
, algorithm
, extractable
, usages
).then(function(result
) {
91 // shouldBe() can only resolve variables in global context.
93 shouldEvaluateAs("tmpKey.type", "secret");
94 shouldEvaluateAs("tmpKey.extractable", false);
95 shouldEvaluateAs("tmpKey.algorithm.name", "PBKDF2");
96 shouldEvaluateAs("tmpKey.usages.join(',')", "deriveKey,deriveBits");
98 var derivedAlgorithm
= {name
: 'aes-cbc', length
: 128};
99 // (2) Derive key for aes-cbc
100 return crypto
.subtle
.deriveKey(params
, key
, derivedAlgorithm
, true, ['encrypt']);
101 }).then(function(result
) {
104 // Verify the key's properties.
105 shouldEvaluateAs("dkey.type", "secret");
106 shouldEvaluateAs("dkey.extractable", true);
107 shouldEvaluateAs("dkey.algorithm.name", "AES-CBC");
108 shouldEvaluateAs("dkey.algorithm.length", 128);
109 shouldEvaluateAs("dkey.usages.join(',')", "encrypt");
111 // Export the key and check its bytes.
112 return crypto
.subtle
.exportKey("raw",dkey
);
113 }).then(function(result
) {
114 bytesShouldMatchHexString("Derivedkey", testCase
.derived_key_full_length
.substring(0, 32), result
);
118 var lastPromise
= Promise
.resolve(null);
120 kPbkdf2SuccessVectors
.forEach(function(test
) {
121 lastPromise
= lastPromise
.then(runPbkdf2SuccessTestCase
.bind(null, test
));
124 lastPromise
.then(finishJSTest
, failAndFinishJSTest
);