5 <title>WebCrypto Test Suite
</title>
6 <meta http-equiv=
"Content-Type" content=
"text/html;charset=utf-8" />
7 <link rel=
"stylesheet" href=
"./test_WebCrypto.css"/>
8 <script src=
"/tests/SimpleTest/SimpleTest.js"></script>
10 <!-- Utilities for manipulating ABVs -->
11 <script src=
"util.js"></script>
13 <!-- A simple wrapper around IndexedDB -->
14 <script src=
"simpledb.js"></script>
16 <!-- Test vectors drawn from the literature -->
17 <script src=
"./test-vectors.js"></script>
19 <!-- General testing framework -->
20 <script src=
"./test-array.js"></script>
22 <script>/* <![CDATA[*/
25 // -----------------------------------------------------------------------------
27 "Import raw PBKDF2 key",
31 var key
= new TextEncoder().encode("password");
33 crypto
.subtle
.importKey("raw", key
, alg
, false, ["deriveKey"]).then(
34 complete(that
, hasKeyFields
),
40 // -----------------------------------------------------------------------------
42 "Unwrapping a PBKDF2 key in PKCS8 format should fail",
45 var pbkdf2Key
= new TextEncoder().encode("password");
46 var alg
= {name
: "AES-GCM", length
: 256, iv
: new Uint8Array(16)};
51 return crypto
.subtle
.encrypt(alg
, wrappingKey
, pbkdf2Key
);
55 return crypto
.subtle
.unwrapKey(
56 "pkcs8", x
, wrappingKey
, alg
, "PBKDF2", false, ["deriveBits"]);
59 crypto
.subtle
.generateKey(alg
, false, ["encrypt", "unwrapKey"])
60 .then(wrap
, error(that
))
61 .then(unwrap
, error(that
))
62 .then(error(that
), complete(that
));
66 // -----------------------------------------------------------------------------
68 "Import raw PBKDF2 key and derive bits using HMAC-SHA-1",
72 var key
= tv
.pbkdf2_sha1
.password
;
74 function doDerive(x
) {
75 if (!hasKeyFields(x
)) {
76 throw new Error("Invalid key; missing field(s)");
82 salt
: tv
.pbkdf2_sha1
.salt
,
83 iterations
: tv
.pbkdf2_sha1
.iterations
,
85 return crypto
.subtle
.deriveBits(algo
, x
, tv
.pbkdf2_sha1
.length
);
87 function fail(x
) { console
.log("failing"); error(that
)(x
); }
89 crypto
.subtle
.importKey("raw", key
, alg
, false, ["deriveBits"])
90 .then( doDerive
, fail
)
91 .then( memcmp_complete(that
, tv
.pbkdf2_sha1
.derived
), fail
);
95 // -----------------------------------------------------------------------------
97 "Import a PBKDF2 key in JWK format and derive bits using HMAC-SHA-1",
102 function doDerive(x
) {
103 if (!hasKeyFields(x
)) {
104 throw new Error("Invalid key; missing field(s)");
110 salt
: tv
.pbkdf2_sha1
.salt
,
111 iterations
: tv
.pbkdf2_sha1
.iterations
,
113 return crypto
.subtle
.deriveBits(algo
, x
, tv
.pbkdf2_sha1
.length
);
115 function fail(x
) { console
.log("failing"); error(that
)(x
); }
117 crypto
.subtle
.importKey("jwk", tv
.pbkdf2_sha1
.jwk
, alg
, false, ["deriveBits"])
118 .then( doDerive
, fail
)
119 .then( memcmp_complete(that
, tv
.pbkdf2_sha1
.derived
), fail
);
123 // -----------------------------------------------------------------------------
125 "Import raw PBKDF2 key and derive a new key using HMAC-SHA-1",
129 var key
= tv
.pbkdf2_sha1
.password
;
131 function doDerive(x
) {
132 if (!hasKeyFields(x
)) {
133 throw new Error("Invalid key; missing field(s)");
139 salt
: tv
.pbkdf2_sha1
.salt
,
140 iterations
: tv
.pbkdf2_sha1
.iterations
,
145 hash
: {name
: "SHA-1"},
148 return crypto
.subtle
.deriveKey(algo
, x
, algDerived
, false, ["sign", "verify"])
150 if (!hasKeyFields(y
)) {
151 throw new Error("Invalid key; missing field(s)");
154 if (y
.algorithm
.length
!= 512) {
155 throw new Error("Invalid key; incorrect length");
162 function doSignAndVerify(x
) {
163 var data
= new Uint8Array(1024);
165 return crypto
.subtle
.sign("HMAC", x
, data
)
166 .then(function(sig
) {
167 return crypto
.subtle
.verify("HMAC", x
, sig
, data
);
171 function fail(x
) { console
.log("failing"); error(that
)(x
); }
173 crypto
.subtle
.importKey("raw", key
, alg
, false, ["deriveKey"])
174 .then( doDerive
, fail
)
175 .then( doSignAndVerify
, fail
)
176 .then( complete(that
, x
=> x
), fail
);
180 // -----------------------------------------------------------------------------
182 "Import raw PBKDF2 key and derive a new key using HMAC-SHA-1 with custom length",
186 function doDerive(x
) {
190 salt
: tv
.pbkdf2_sha1
.salt
,
191 iterations
: tv
.pbkdf2_sha1
.iterations
,
194 var algDerived
= {name
: "HMAC", hash
: "SHA-1", length
: 128};
195 return crypto
.subtle
.deriveKey(alg
, x
, algDerived
, false, ["sign"]);
198 var password
= crypto
.getRandomValues(new Uint8Array(8));
199 crypto
.subtle
.importKey("raw", password
, "PBKDF2", false, ["deriveKey"])
201 .then(complete(that
, function(x
) {
202 return hasKeyFields(x
) && x
.algorithm
.length
== 128;
207 // -----------------------------------------------------------------------------
209 "Import raw PBKDF2 key and derive bits using HMAC-SHA-256",
213 var key
= tv
.pbkdf2_sha256
.password
;
215 function doDerive(x
) {
216 if (!hasKeyFields(x
)) {
217 throw new Error("Invalid key; missing field(s)");
223 salt
: tv
.pbkdf2_sha256
.salt
,
224 iterations
: tv
.pbkdf2_sha256
.iterations
,
226 return crypto
.subtle
.deriveBits(algo
, x
, tv
.pbkdf2_sha256
.length
);
228 function fail(x
) { console
.log("failing"); error(that
)(x
); }
230 crypto
.subtle
.importKey("raw", key
, alg
, false, ["deriveBits"])
231 .then( doDerive
, fail
)
232 .then( memcmp_complete(that
, tv
.pbkdf2_sha256
.derived
), fail
);
236 // -----------------------------------------------------------------------------
238 "Import raw PBKDF2 zero-length key and derive bits using HMAC-SHA-256",
242 var key
= tv
.pbkdf2_sha256_no_pwd
.password
;
244 function doDerive(x
) {
245 if (!hasKeyFields(x
)) {
246 throw new Error("Invalid key; missing field(s)");
252 salt
: tv
.pbkdf2_sha256_no_pwd
.salt
,
253 iterations
: tv
.pbkdf2_sha256_no_pwd
.iterations
,
255 return crypto
.subtle
.deriveBits(algo
, x
, tv
.pbkdf2_sha256_no_pwd
.length
);
257 function fail(x
) { console
.log("failing"); error(that
)(x
); }
259 crypto
.subtle
.importKey("raw", key
, alg
, false, ["deriveBits"])
260 .then( doDerive
, fail
)
261 .then( memcmp_complete(that
, tv
.pbkdf2_sha256_no_pwd
.derived
), fail
);
265 // -----------------------------------------------------------------------------
267 "Import raw PBKDF2 key and derive bits using HMAC-SHA-256 with zero-length salt",
270 var importAlg
= { name
: "PBKDF2", hash
: "SHA-256" };
271 var key
= tv
.pbkdf2_sha256_no_salt
.password
;
273 function doDerive(x
) {
274 if (!hasKeyFields(x
)) {
275 throw new Error("Invalid key; missing field(s)");
281 salt
: new Uint8Array(0),
282 iterations
: tv
.pbkdf2_sha256_no_salt
.iterations
,
284 return crypto
.subtle
.deriveBits(deriveAlg
, x
, tv
.pbkdf2_sha256_no_salt
.length
);
286 function fail(x
) { console
.log("failing"); error(that
)(x
); }
288 crypto
.subtle
.importKey("raw", key
, importAlg
, false, ["deriveBits"])
289 .then( doDerive
, fail
)
290 .then( memcmp_complete(that
, tv
.pbkdf2_sha256_no_salt
.derived
), fail
);
294 // -----------------------------------------------------------------------------
296 "Fail while deriving key with bad hash name",
300 var key
= tv
.pbkdf2_sha256
.password
;
302 function doDerive(x
) {
303 if (!hasKeyFields(x
)) {
304 throw new Error("Invalid key; missing field(s)");
310 salt
: tv
.pbkdf2_sha256
.salt
,
311 iterations
: tv
.pbkdf2_sha256
.iterations
,
313 return crypto
.subtle
.deriveBits(algo
, x
, 32).then(
315 complete(that
, function(e
) {
316 return e
.name
== "NotSupportedError";
320 function fail(x
) { console
.log("failing"); error(that
)(x
); }
322 crypto
.subtle
.importKey("raw", key
, alg
, false, ["deriveKey", "deriveBits"])
323 .then( doDerive
, fail
);
327 // -----------------------------------------------------------------------------
329 "Fail while deriving bits given null length",
333 var key
= tv
.pbkdf2_sha256
.password
;
335 function doDerive(x
) {
336 if (!hasKeyFields(x
)) {
337 throw new Error("Invalid key; missing field(s)");
343 salt
: tv
.pbkdf2_sha256
.salt
,
344 iterations
: tv
.pbkdf2_sha256
.iterations
,
346 return crypto
.subtle
.deriveBits(algo
, x
, null).then(
348 complete(that
, function(e
) {
349 return e
.name
== "OperationError";
353 function fail(x
) { console
.log("failing"); error(that
)(x
); }
355 crypto
.subtle
.importKey("raw", key
, alg
, false, ["deriveBits"])
356 .then( doDerive
, fail
);
360 // -----------------------------------------------------------------------------
362 "Fail while deriving key of null length",
366 var key
= tv
.pbkdf2_sha256
.password
;
368 function doDerive(x
) {
369 if (!hasKeyFields(x
)) {
370 throw new Error("Invalid key; missing field(s)");
376 salt
: tv
.pbkdf2_sha256
.salt
,
377 iterations
: tv
.pbkdf2_sha256
.iterations
,
379 return crypto
.subtle
.deriveKey(algo
, x
, {name
: "AES-GCM", length
: null}, true, ["encrypt"]).then(
381 complete(that
, function(e
) {
382 return e
.name
== "OperationError";
386 function fail(x
) { console
.log("failing"); error(that
)(x
); }
388 crypto
.subtle
.importKey("raw", key
, alg
, false, ["deriveKey", "deriveBits"])
389 .then( doDerive
, fail
);
402 <div id=
"start" onclick=
"start();">RUN ALL
</div>
404 <div id=
"resultDiv" class=
"content">
406 <span class=
"pass"><span id=
"passN">0</span> passed,
</span>
407 <span class=
"fail"><span id=
"failN">0</span> failed,
</span>
408 <span class=
"pending"><span id=
"pendingN">0</span> pending.
</span>
422 <div id=
"foot"></div>