| <!DOCTYPE html> |
| <html> |
| <head> |
| <script src="../fast/js/resources/js-test-pre.js"></script> |
| <script src="resources/common.js"></script> |
| </head> |
| <body> |
| <p id="description"></p> |
| <div id="console"></div> |
| |
| <script> |
| description("Tests cypto.subtle.generateKey."); |
| |
| jsTestIsAsync = true; |
| |
| extractable = true; |
| keyUsages = ['encrypt', 'decrypt']; |
| |
| // Invalid keyUsages |
| aesCbc = { name: 'aes-cbc', length: 1024 }; |
| shouldThrow("crypto.subtle.generateKey(aesCbc, extractable, -1)"); |
| shouldThrow("crypto.subtle.generateKey(aesCbc, extractable, null)"); |
| shouldThrow("crypto.subtle.generateKey(aesCbc, extractable, ['boo'])"); |
| |
| // --------------------------------------------------- |
| // AES-CBC normalization failures (AesKeyGenParams) |
| // --------------------------------------------------- |
| |
| shouldThrow("crypto.subtle.generateKey({ name: 'aes-cbc' }, extractable, keyUsages)"); |
| shouldThrow("crypto.subtle.generateKey({ name: 'aes-cbc', length: 70000 }, extractable, keyUsages)"); |
| shouldThrow("crypto.subtle.generateKey({ name: 'aes-cbc', length: -3 }, extractable, keyUsages)"); |
| shouldThrow("crypto.subtle.generateKey({ name: 'aes-cbc', length: -Infinity }, extractable, keyUsages)"); |
| |
| // --------------------------------------------------- |
| // HMAC normalization failures (HmacKeyParams) |
| // --------------------------------------------------- |
| |
| shouldThrow("crypto.subtle.generateKey({name: 'hmac', hash: {name: 'sha-256'}, length: -3}, extractable , keyUsages)"); |
| shouldThrow("crypto.subtle.generateKey({name: 'hmac', hash: {name: ''}, length: 48}, extractable , keyUsages)"); |
| shouldThrow("crypto.subtle.generateKey({name: 'hmac', hash: {name: 'sha-256'}, length: 5000000000}, extractable , keyUsages)"); |
| shouldThrow("crypto.subtle.generateKey({name: 'hmac', hash: {name: 'sha-256'}, length: NaN}, extractable , keyUsages)"); |
| shouldThrow("crypto.subtle.generateKey({name: 'hmac', hash: {name: 'sha-256'}, length: Infinity}, extractable , keyUsages)"); |
| shouldThrow("crypto.subtle.generateKey({name: 'hmac', hash: {name: 'sha-256'}, length: -Infinity}, extractable , keyUsages)"); |
| shouldThrow("crypto.subtle.generateKey({name: 'hmac', hash: {name: 'sha-256'}, length: crypto}, extractable , keyUsages)"); |
| shouldThrow("crypto.subtle.generateKey({name: 'hmac', hash: {name: 'sha-256'}, length: undefined}, extractable , keyUsages)"); |
| |
| // The length property doesn't strictly need to be a number according to WebIDL. |
| // It just has to be convertable with ToNumber(). |
| shouldNotThrow("crypto.subtle.generateKey({name: 'hmac', hash: {name: 'sha-256'}, length: '48'}, extractable , keyUsages)"); |
| shouldNotThrow("crypto.subtle.generateKey({name: 'hmac', hash: {name: 'sha-256'}, length: null}, extractable , keyUsages)"); |
| shouldNotThrow("crypto.subtle.generateKey({name: 'hmac', hash: {name: 'sha-256'}, length: true}, extractable , keyUsages)"); |
| |
| // --------------------------------------------------- |
| // RSASSA-PKCS1-v1_5 normalization failures (RsaKeyGenParams) |
| // --------------------------------------------------- |
| |
| shouldThrow("crypto.subtle.generateKey({name: 'RSASSA-PKCS1-v1_5', modulusLength: -30}, extractable , keyUsages)"); |
| shouldThrow("crypto.subtle.generateKey({name: 'RSASSA-PKCS1-v1_5', modulusLength: NaN}, extractable , keyUsages)"); |
| shouldThrow("crypto.subtle.generateKey({name: 'RSASSA-PKCS1-v1_5'}, extractable , keyUsages)"); |
| shouldThrow("crypto.subtle.generateKey({name: 'RSASSA-PKCS1-v1_5', modulusLength: 10}, extractable , keyUsages)"); |
| shouldThrow("crypto.subtle.generateKey({name: 'RSASSA-PKCS1-v1_5', modulusLength: 10, publicExponent: 10}, extractable , keyUsages)"); |
| shouldThrow("crypto.subtle.generateKey({name: 'RSASSA-PKCS1-v1_5', modulusLength: 10, publicExponent: null}, extractable , keyUsages)"); |
| |
| // --------------------------------------------------- |
| // RSAES-PKCS1-v1_5 normalization failures (RsaKeyGenParams) |
| // --------------------------------------------------- |
| |
| // Note: these are the same tests as for RSASSA-PKCS1-v1_5 above. |
| |
| shouldThrow("crypto.subtle.generateKey({name: 'RSAES-PKCS1-v1_5', modulusLength: -30}, extractable , keyUsages)"); |
| shouldThrow("crypto.subtle.generateKey({name: 'RSAES-PKCS1-v1_5', modulusLength: NaN}, extractable , keyUsages)"); |
| shouldThrow("crypto.subtle.generateKey({name: 'RSAES-PKCS1-v1_5'}, extractable , keyUsages)"); |
| shouldThrow("crypto.subtle.generateKey({name: 'RSAES-PKCS1-v1_5', modulusLength: 10}, extractable , keyUsages)"); |
| shouldThrow("crypto.subtle.generateKey({name: 'RSAES-PKCS1-v1_5', modulusLength: 10, publicExponent: 10}, extractable , keyUsages)"); |
| shouldThrow("crypto.subtle.generateKey({name: 'RSAES-PKCS1-v1_5', modulusLength: 10, publicExponent: null}, extractable , keyUsages)"); |
| |
| // Note that fractional numbers are truncated, so this length should be |
| // interpreted as 1024. |
| crypto.subtle.generateKey({name: 'aes-cbc', length: 1024.9}, extractable, ['decrypt', 'encrypt']).then(function(result) { |
| key = result; |
| shouldBe("key.type", "'private'") |
| shouldBe("key.extractable", "true") |
| shouldBe("key.algorithm.name", "'AES-CBC'") |
| shouldBe("key.algorithm.length", "1024") |
| shouldBe("key.usages.join(',')", "'encrypt,decrypt'") |
| |
| return crypto.subtle.generateKey({name: 'hmac', hash: {name: 'sha-256' }}, false, ['sign']); |
| }).then(function(result) { |
| key = result; |
| shouldBe("key.type", "'private'") |
| shouldBe("key.extractable", "false") |
| shouldBe("key.algorithm.name", "'HMAC'") |
| shouldBe("key.algorithm.hash.name", "'SHA-256'") |
| shouldBe("key.algorithm.length", "null") |
| shouldBe("key.usages.join(',')", "'sign'") |
| |
| return crypto.subtle.generateKey({name: 'hmac', hash: {name: 'sha-256' }, length:48 }, false, ['sign']); |
| }).then(function(result) { |
| key = result; |
| shouldBe("key.type", "'private'") |
| shouldBe("key.extractable", "false") |
| shouldBe("key.algorithm.name", "'HMAC'") |
| shouldBe("key.algorithm.hash.name", "'SHA-256'") |
| shouldBe("key.algorithm.length", "48") |
| shouldBe("key.usages.join(',')", "'sign'") |
| |
| return crypto.subtle.generateKey({name: 'RSASSA-PKCS1-v1_5', modulusLength: 10, publicExponent: new Uint8Array([0])}, false, ['sign']); |
| }).then(function(result) { |
| keyPair = result; |
| |
| shouldBeDefined("keyPair.publicKey"); |
| shouldBeDefined("keyPair.privateKey"); |
| |
| shouldBe("keyPair.publicKey.type", "'public'"); |
| shouldBe("keyPair.publicKey.algorithm.name", "'RSASSA-PKCS1-v1_5'"); |
| |
| shouldBe("keyPair.privateKey.type", "'private'"); |
| shouldBe("keyPair.privateKey.algorithm.name", "'RSASSA-PKCS1-v1_5'"); |
| |
| // KeyPair should return the same Key wrapper |
| keyPair.publicKey.foo = "bar"; |
| shouldBe("keyPair.publicKey.foo", "'bar'"); |
| if (window.gc) { |
| window.gc(); |
| window.gc(); |
| } |
| shouldBe("keyPair.publicKey.foo", "'bar'"); |
| |
| }).then(finishJSTest, failAndFinishJSTest); |
| |
| </script> |
| |
| <script src="../fast/js/resources/js-test-post.js"></script> |
| </body> |
| </html> |