| OLD | NEW |
| 1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
| 2 <html> | 2 <html> |
| 3 <head> | 3 <head> |
| 4 <script src="../fast/js/resources/js-test-pre.js"></script> | 4 <script src="../fast/js/resources/js-test-pre.js"></script> |
| 5 </head> | 5 </head> |
| 6 <body> | 6 <body> |
| 7 <p id="description"></p> | 7 <p id="description"></p> |
| 8 <div id="console"></div> | 8 <div id="console"></div> |
| 9 | 9 |
| 10 <script> | 10 <script> |
| 11 description("Tests algorithm normalization."); | 11 description("Tests algorithm normalization."); |
| 12 | 12 |
| 13 jsTestIsAsync = true; |
| 14 |
| 13 // ------------------------------- | 15 // ------------------------------- |
| 14 // Helpers to return a normalized algorithm identifier. | 16 // Helpers to return a normalized algorithm identifier. |
| 15 // ------------------------------- | 17 // ------------------------------- |
| 16 | 18 |
| 17 function normalizeDigest(algorithmIdentifier) { | 19 key = null; |
| 20 |
| 21 function normalizeDigest(algorithmIdentifier) |
| 22 { |
| 18 return crypto.subtle.digest(algorithmIdentifier).algorithm; | 23 return crypto.subtle.digest(algorithmIdentifier).algorithm; |
| 19 } | 24 } |
| 20 | 25 |
| 21 function normalizeEncrypt(algorithmIdentifier) { | 26 function normalizeEncrypt(algorithmIdentifier) |
| 22 // TODO(eroman): Use a valid key. | 27 { |
| 23 var key; | |
| 24 return crypto.subtle.encrypt(algorithmIdentifier, key).algorithm; | 28 return crypto.subtle.encrypt(algorithmIdentifier, key).algorithm; |
| 25 } | 29 } |
| 26 | 30 |
| 27 function normalizeSign(algorithmIdentifier) { | 31 function normalizeSign(algorithmIdentifier) |
| 28 // TODO(eroman): Use a valid key. | 32 { |
| 29 var key; | |
| 30 return crypto.subtle.sign(algorithmIdentifier, key).algorithm; | 33 return crypto.subtle.sign(algorithmIdentifier, key).algorithm; |
| 31 } | 34 } |
| 32 | 35 |
| 33 // ------------------------------- | 36 function runTests() |
| 34 // Case insensitivity of "name" | 37 { |
| 35 // ------------------------------- | 38 // ------------------------------- |
| 36 algorithm = normalizeDigest({name: "SHA-1"}); | 39 // Case insensitivity of "name" |
| 37 shouldBe("algorithm.name", "'SHA-1'"); | 40 // ------------------------------- |
| 38 algorithm = normalizeDigest({name: "sHa-256"}); | 41 algorithm = normalizeDigest({name: "SHA-1"}); |
| 39 shouldBe("algorithm.name", "'SHA-256'"); | 42 shouldBe("algorithm.name", "'SHA-1'"); |
| 43 algorithm = normalizeDigest({name: "sHa-256"}); |
| 44 shouldBe("algorithm.name", "'SHA-256'"); |
| 40 | 45 |
| 41 // ------------------------------- | 46 // ------------------------------- |
| 42 // Failures if "name" is invalid | 47 // Failures if "name" is invalid |
| 43 // ------------------------------- | 48 // ------------------------------- |
| 44 shouldThrow("normalizeDigest({})"); | 49 shouldThrow("normalizeDigest({})"); |
| 45 shouldThrow("normalizeDigest({name: null})"); | 50 shouldThrow("normalizeDigest({name: null})"); |
| 46 shouldThrow("normalizeDigest({name: -1})"); | 51 shouldThrow("normalizeDigest({name: -1})"); |
| 47 shouldThrow("normalizeDigest({name: ''})"); | 52 shouldThrow("normalizeDigest({name: ''})"); |
| 48 shouldThrow("normalizeDigest({name: 'nosuchalgorithm'})"); | 53 shouldThrow("normalizeDigest({name: 'nosuchalgorithm'})"); |
| 49 shouldThrow("normalizeDigest({name: '\\u0189'})"); | 54 shouldThrow("normalizeDigest({name: '\\u0189'})"); |
| 50 | 55 |
| 51 // ------------------------------- | 56 // ------------------------------- |
| 52 // Failures if the algorithm identifier is not an object | 57 // Failures if the algorithm identifier is not an object |
| 53 // ------------------------------- | 58 // ------------------------------- |
| 54 shouldThrow("normalizeDigest(null)"); | 59 shouldThrow("normalizeDigest(null)"); |
| 55 shouldThrow("normalizeDigest(0)"); | 60 shouldThrow("normalizeDigest(0)"); |
| 56 shouldThrow("normalizeDigest(undefined)"); | 61 shouldThrow("normalizeDigest(undefined)"); |
| 57 shouldThrow("normalizeDigest('')"); | 62 shouldThrow("normalizeDigest('')"); |
| 58 | 63 |
| 59 // ------------------------------- | 64 // ------------------------------- |
| 60 // Skip unrecognized parameters. | 65 // Skip unrecognized parameters. |
| 61 // ------------------------------- | 66 // ------------------------------- |
| 62 algorithm = normalizeDigest({name: "sHa-1", noSuchParam: 3}); | 67 algorithm = normalizeDigest({name: "sHa-1", noSuchParam: 3}); |
| 63 shouldBeUndefined("algorithm.noSuchParam"); | 68 shouldBeUndefined("algorithm.noSuchParam"); |
| 64 | 69 |
| 65 // ------------------------------- | 70 // ------------------------------- |
| 66 // Normalized algorithm COPIES all data | 71 // Normalized algorithm COPIES all data |
| 67 // ------------------------------- | 72 // ------------------------------- |
| 68 originalIv = new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 1
5]); | 73 originalIv = new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1
4, 15]); |
| 69 algorithm = normalizeEncrypt({ name: "aes-cbc", iv: originalIv }); | 74 algorithm = normalizeEncrypt({ name: "aes-cbc", iv: originalIv }); |
| 70 | 75 |
| 71 // Make sure it constructed the normalized result. | 76 // Make sure it constructed the normalized result. |
| 72 shouldBe("algorithm.name", "'AES-CBC'"); | 77 shouldBe("algorithm.name", "'AES-CBC'"); |
| 73 shouldBe("algorithm.iv.length", "16"); | 78 shouldBe("algorithm.iv.length", "16"); |
| 74 shouldBe("algorithm.iv[3]", "3"); | 79 shouldBe("algorithm.iv[3]", "3"); |
| 75 | 80 |
| 76 // Mutate the original (un-normalized) algorithm. Verify that this doesn't affec
t the normalized output. | 81 // Mutate the original (un-normalized) algorithm. Verify that this doesn't a
ffect the normalized output. |
| 77 originalIv[3] = 0; | 82 originalIv[3] = 0; |
| 78 shouldBe("algorithm.iv[3]", "3"); | 83 shouldBe("algorithm.iv[3]", "3"); |
| 79 | 84 |
| 80 // ------------------------------- | 85 // ------------------------------- |
| 81 // AES-CBC normalization failures | 86 // AES-CBC normalization failures |
| 82 // ------------------------------- | 87 // ------------------------------- |
| 83 | 88 |
| 84 // The "iv" MUST be 16 bytes long. | 89 // The "iv" MUST be 16 bytes long. |
| 85 rawAlgorithm = { | 90 rawAlgorithm = { |
| 86 name: "AES-CBC", | 91 name: "AES-CBC", |
| 87 iv: new Uint8Array([1, 2, 3]) | 92 iv: new Uint8Array([1, 2, 3]) |
| 88 }; | 93 }; |
| 89 shouldThrow("normalizeEncrypt(rawAlgorithm)"); | 94 shouldThrow("normalizeEncrypt(rawAlgorithm)"); |
| 90 | 95 |
| 91 // ------------------------------- | 96 // ------------------------------- |
| 92 // Normalize a normalized algorithm (SHA-384) | 97 // Normalize a normalized algorithm (SHA-384) |
| 93 // ------------------------------- | 98 // ------------------------------- |
| 94 algorithm = normalizeDigest({name: "sHa-384"}); | 99 algorithm = normalizeDigest({name: "sHa-384"}); |
| 95 shouldBe("algorithm.name", "'SHA-384'"); | 100 shouldBe("algorithm.name", "'SHA-384'"); |
| 96 algorithm = normalizeDigest(algorithm); | 101 algorithm = normalizeDigest(algorithm); |
| 97 shouldBe("algorithm.name", "'SHA-384'"); | 102 shouldBe("algorithm.name", "'SHA-384'"); |
| 98 | 103 |
| 99 // ------------------------------- | 104 // ------------------------------- |
| 100 // Normalize a normalized algorithm (AES-CBC, encrypt) | 105 // Normalize a normalized algorithm (AES-CBC, encrypt) |
| 101 // ------------------------------- | 106 // ------------------------------- |
| 102 algorithm = normalizeEncrypt({ name: "aEs-cbc", iv: originalIv }); | 107 algorithm = normalizeEncrypt({ name: "aEs-cbc", iv: originalIv }); |
| 103 // Make sure it constructed the normalized result. | 108 // Make sure it constructed the normalized result. |
| 104 shouldBe("algorithm.name", "'AES-CBC'"); | 109 shouldBe("algorithm.name", "'AES-CBC'"); |
| 105 shouldBe("algorithm.iv.length", "16"); | 110 shouldBe("algorithm.iv.length", "16"); |
| 106 shouldBe("algorithm.iv[1]", "1"); | 111 shouldBe("algorithm.iv[1]", "1"); |
| 107 algorithm = normalizeEncrypt(algorithm); | 112 algorithm = normalizeEncrypt(algorithm); |
| 108 shouldBe("algorithm.name", "'AES-CBC'"); | 113 shouldBe("algorithm.name", "'AES-CBC'"); |
| 109 shouldBe("algorithm.iv.length", "16"); | 114 shouldBe("algorithm.iv.length", "16"); |
| 110 shouldBe("algorithm.iv[1]", "1"); | 115 shouldBe("algorithm.iv[1]", "1"); |
| 111 | 116 |
| 112 // ------------------------------- | 117 // ------------------------------- |
| 113 // Unsupported operation on algorithm | 118 // Unsupported operation on algorithm |
| 114 // ------------------------------- | 119 // ------------------------------- |
| 115 shouldThrow("normalizeEncrypt({ name: 'SHA-1' })"); | 120 shouldThrow("normalizeEncrypt({ name: 'SHA-1' })"); |
| 116 shouldThrow("normalizeDigest({ name: 'AES-CBC', iv: originalIv })"); | 121 shouldThrow("normalizeDigest({ name: 'AES-CBC', iv: originalIv })"); |
| 117 | 122 |
| 118 // ------------------------------- | 123 // ------------------------------- |
| 119 // Normalize HMAC | 124 // Normalize HMAC |
| 120 // ------------------------------- | 125 // ------------------------------- |
| 121 shouldThrow("normalizeSign({name: 'hmac'})"); // Missing "hash" | 126 shouldThrow("normalizeSign({name: 'hmac'})"); // Missing "hash" |
| 122 shouldThrow("normalizeSign({name: 'hmac', hash: 'foo'})"); // Not a valid "hash" | 127 shouldThrow("normalizeSign({name: 'hmac', hash: 'foo'})"); // Not a valid "h
ash" |
| 123 shouldThrow("normalizeSign({name: 'hmac', hash: { name: 'AES-CBC', iv: originalI
v }})"); // Not a valid "hash" | 128 shouldThrow("normalizeSign({name: 'hmac', hash: { name: 'AES-CBC', iv: origi
nalIv }})"); // Not a valid "hash" |
| 124 | 129 |
| 125 validHmacSha1 = {name: 'hmac', hash: {name: 'Sha-1'}}; | 130 validHmacSha1 = {name: 'hmac', hash: {name: 'Sha-1'}}; |
| 126 algorithm = normalizeSign(validHmacSha1); | 131 algorithm = normalizeSign(validHmacSha1); |
| 127 shouldBe("algorithm.name", "'HMAC'"); | 132 shouldBe("algorithm.name", "'HMAC'"); |
| 128 shouldBe("algorithm.hash.name", "'SHA-1'"); | 133 shouldBe("algorithm.hash.name", "'SHA-1'"); |
| 129 | 134 |
| 130 shouldThrow("normalizeEncrypt(validHmacSha1)"); // Not defined for encrypt() | 135 shouldThrow("normalizeEncrypt(validHmacSha1)"); // Not defined for encrypt() |
| 136 } |
| 137 |
| 138 function keyImported(newKey) |
| 139 { |
| 140 key = newKey; |
| 141 runTests(); |
| 142 finishJSTest(); |
| 143 } |
| 144 |
| 145 function failedKeyImport(value) |
| 146 { |
| 147 debug("Failed importing key: " + value); |
| 148 finishJSTest(); |
| 149 } |
| 150 |
| 151 // This is a bogus key import, however the mock constructs something usable. |
| 152 keyFormat = "spki"; |
| 153 data = new Uint8Array([]); |
| 154 algorithm = {name: "Sha-256"}; |
| 155 extractable = false; |
| 156 keyUsages = []; |
| 157 |
| 158 crypto.subtle.importKey(keyFormat, data, algorithm, extractable, keyUsages).then
(keyImported, failedKeyImport); |
| 131 | 159 |
| 132 </script> | 160 </script> |
| 133 | 161 |
| 134 <script src="../fast/js/resources/js-test-post.js"></script> | 162 <script src="../fast/js/resources/js-test-post.js"></script> |
| 135 </body> | 163 </body> |
| 136 </html> | 164 </html> |
| OLD | NEW |