| OLD | NEW |
| (Empty) |
| 1 <!DOCTYPE html> | |
| 2 <html> | |
| 3 <head> | |
| 4 <script src="../fast/js/resources/js-test-pre.js"></script> | |
| 5 <script src="resources/common.js"></script> | |
| 6 </head> | |
| 7 <body> | |
| 8 <p id="description"></p> | |
| 9 <div id="console"></div> | |
| 10 | |
| 11 <script> | |
| 12 description("Tests algorithm normalization."); | |
| 13 | |
| 14 jsTestIsAsync = true; | |
| 15 | |
| 16 // FIXME: Rename this to crypto-operation.html, since it tests the basic | |
| 17 // construction of CryptoOperations. | |
| 18 | |
| 19 // ------------------------------- | |
| 20 // Helpers to return a normalized algorithm identifier. | |
| 21 // ------------------------------- | |
| 22 | |
| 23 aesCbcKey = null; | |
| 24 hmacSha1Key = null; | |
| 25 rsaSsaKey = null; | |
| 26 | |
| 27 function normalizeDigest(algorithmIdentifier) | |
| 28 { | |
| 29 return crypto.subtle.digest(algorithmIdentifier).algorithm; | |
| 30 } | |
| 31 | |
| 32 function normalizeEncrypt(algorithmIdentifier, key) | |
| 33 { | |
| 34 return crypto.subtle.encrypt(algorithmIdentifier, key).algorithm; | |
| 35 } | |
| 36 | |
| 37 function normalizeSign(algorithmIdentifier, key) | |
| 38 { | |
| 39 return crypto.subtle.sign(algorithmIdentifier, key).algorithm; | |
| 40 } | |
| 41 | |
| 42 function runTests() | |
| 43 { | |
| 44 // ------------------------------- | |
| 45 // Case insensitivity of "name" | |
| 46 // ------------------------------- | |
| 47 algorithm = normalizeDigest({name: "SHA-1"}); | |
| 48 shouldBe("algorithm.name", "'SHA-1'"); | |
| 49 algorithm = normalizeDigest({name: "sHa-256"}); | |
| 50 shouldBe("algorithm.name", "'SHA-256'"); | |
| 51 | |
| 52 // ------------------------------- | |
| 53 // Failures if "name" is invalid | |
| 54 // ------------------------------- | |
| 55 shouldThrow("normalizeDigest({})"); | |
| 56 shouldThrow("normalizeDigest({name: null})"); | |
| 57 shouldThrow("normalizeDigest({name: -1})"); | |
| 58 shouldThrow("normalizeDigest({name: ''})"); | |
| 59 shouldThrow("normalizeDigest({name: 'nosuchalgorithm'})"); | |
| 60 shouldThrow("normalizeDigest({name: '\\u0189'})"); | |
| 61 | |
| 62 // ------------------------------- | |
| 63 // Failures if the algorithm identifier is not an object | |
| 64 // ------------------------------- | |
| 65 shouldThrow("normalizeDigest(null)"); | |
| 66 shouldThrow("normalizeDigest(0)"); | |
| 67 shouldThrow("normalizeDigest(undefined)"); | |
| 68 shouldThrow("normalizeDigest('')"); | |
| 69 | |
| 70 // ------------------------------- | |
| 71 // Skip unrecognized parameters. | |
| 72 // ------------------------------- | |
| 73 algorithm = normalizeDigest({name: "sHa-1", noSuchParam: 3}); | |
| 74 shouldBeUndefined("algorithm.noSuchParam"); | |
| 75 | |
| 76 // ------------------------------- | |
| 77 // Normalized algorithm COPIES all data | |
| 78 // ------------------------------- | |
| 79 originalIv = new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1
4, 15]); | |
| 80 algorithm = normalizeEncrypt({ name: "aes-cbc", iv: originalIv }, aesCbcKey)
; | |
| 81 | |
| 82 // Make sure it constructed the normalized result. | |
| 83 shouldBe("algorithm.name", "'AES-CBC'"); | |
| 84 shouldBe("algorithm.iv.length", "16"); | |
| 85 shouldBe("algorithm.iv[3]", "3"); | |
| 86 | |
| 87 // Mutate the original (un-normalized) algorithm. Verify that this doesn't a
ffect the normalized output. | |
| 88 originalIv[3] = 0; | |
| 89 shouldBe("algorithm.iv[3]", "3"); | |
| 90 | |
| 91 // ------------------------------- | |
| 92 // AES-CBC normalization failures | |
| 93 // ------------------------------- | |
| 94 | |
| 95 // The "iv" MUST be 16 bytes long. | |
| 96 rawAlgorithm = { | |
| 97 name: "AES-CBC", | |
| 98 iv: new Uint8Array([1, 2, 3]) | |
| 99 }; | |
| 100 shouldThrow("normalizeEncrypt(rawAlgorithm, aesCbcKey)"); | |
| 101 | |
| 102 // ------------------------------- | |
| 103 // Normalize a normalized algorithm (SHA-384) | |
| 104 // ------------------------------- | |
| 105 algorithm = normalizeDigest({name: "sHa-384"}); | |
| 106 shouldBe("algorithm.name", "'SHA-384'"); | |
| 107 algorithm = normalizeDigest(algorithm); | |
| 108 shouldBe("algorithm.name", "'SHA-384'"); | |
| 109 | |
| 110 // ------------------------------- | |
| 111 // Normalize a normalized algorithm (AES-CBC, encrypt) | |
| 112 // ------------------------------- | |
| 113 algorithm = normalizeEncrypt({ name: "aEs-cbc", iv: originalIv }, aesCbcKey)
; | |
| 114 // Make sure it constructed the normalized result. | |
| 115 shouldBe("algorithm.name", "'AES-CBC'"); | |
| 116 shouldBe("algorithm.iv.length", "16"); | |
| 117 shouldBe("algorithm.iv[1]", "1"); | |
| 118 algorithm = normalizeEncrypt(algorithm, aesCbcKey); | |
| 119 shouldBe("algorithm.name", "'AES-CBC'"); | |
| 120 shouldBe("algorithm.iv.length", "16"); | |
| 121 shouldBe("algorithm.iv[1]", "1"); | |
| 122 | |
| 123 // ------------------------------- | |
| 124 // Unsupported operation on algorithm | |
| 125 // ------------------------------- | |
| 126 shouldThrow("normalizeEncrypt({ name: 'SHA-1' }, aesCbcKey)"); | |
| 127 shouldThrow("normalizeDigest({ name: 'AES-CBC', iv: originalIv })"); | |
| 128 | |
| 129 // ------------------------------- | |
| 130 // Normalize HMAC | |
| 131 // ------------------------------- | |
| 132 shouldThrow("normalizeSign({name: 'hmac'}, hmacSha1Key)"); // Missing "hash" | |
| 133 shouldThrow("normalizeSign({name: 'hmac', hash: 'foo'}, hmacSha1Key)"); // N
ot a valid "hash" | |
| 134 shouldThrow("normalizeSign({name: 'hmac', hash: { name: 'AES-CBC', iv: origi
nalIv }}, hmacSha1Key)"); // Not a valid "hash" | |
| 135 | |
| 136 validHmacSha1 = {name: 'hmac', hash: {name: 'Sha-1'}}; | |
| 137 algorithm = normalizeSign(validHmacSha1, hmacSha1Key); | |
| 138 shouldBe("algorithm.name", "'HMAC'"); | |
| 139 shouldBe("algorithm.hash.name", "'SHA-1'"); | |
| 140 | |
| 141 shouldThrow("normalizeEncrypt(validHmacSha1, hmacSha1Key)"); // Not defined
for encrypt() | |
| 142 | |
| 143 // ------------------------------- | |
| 144 // Normalize RSASSA-PKCS1-v1_5 | |
| 145 // ------------------------------- | |
| 146 shouldThrow("normalizeSign({name: 'RSASSA-PKCS1-v1_5'}, rsaSsaKey)"); // Mis
sing "hash" | |
| 147 shouldThrow("normalizeSign({name: 'RSASSA-PKCS1-v1_5', hash: 'foo'}, rsaSsaK
ey)"); // Not a valid "hash" | |
| 148 shouldThrow("normalizeSign({name: 'RSASSA-PKCS1-v1_5', hash: { name: 'AES-CB
C', iv: originalIv }}, rsaSsaKey)"); // Not a valid "hash" | |
| 149 | |
| 150 validRsaSsa = {name: 'RsaSsa-PKCS1-v1_5', hash: {name: 'Sha-256'}}; | |
| 151 algorithm = normalizeSign(validRsaSsa, rsaSsaKey); | |
| 152 shouldBe("algorithm.name", "'RSASSA-PKCS1-v1_5'"); | |
| 153 shouldBe("algorithm.hash.name", "'SHA-256'"); | |
| 154 | |
| 155 shouldThrow("normalizeEncrypt(validRsaSsa, rsaSsaKey)"); // Not defined for
encrypt() | |
| 156 | |
| 157 // FIXME: Test the normalization of RsaSsaKeyGen parameters. | |
| 158 | |
| 159 // ------------------------------- | |
| 160 // Try using a key for an unsupported operation. | |
| 161 // ------------------------------- | |
| 162 algorithmIdentifier = { name: "aes-cbc", iv: originalIv }; | |
| 163 shouldThrow("crypto.subtle.encrypt(algorithmIdentifier, aesCbcKeyNoEncrypt)"
); | |
| 164 | |
| 165 // ------------------------------- | |
| 166 // Try using an HMAC-SHA1 key for encrypting AES-CBC | |
| 167 // ------------------------------- | |
| 168 algorithmIdentifier = { name: "aes-cbc", iv: originalIv }; | |
| 169 shouldThrow("crypto.subtle.encrypt(algorithmIdentifier, hmacSha1Key)"); | |
| 170 | |
| 171 // ------------------------------- | |
| 172 // Try using an HMAC-SHA1 key for signing HMAC-SHA256 | |
| 173 // ------------------------------- | |
| 174 algorithmIdentifier = {name: 'hmac', hash: {name: 'sha-256'}}; | |
| 175 shouldThrow("crypto.subtle.sign(algorithmIdentifier, hmacSha1Key)"); | |
| 176 } | |
| 177 | |
| 178 function importAesCbcKey(keyUsages) | |
| 179 { | |
| 180 var keyFormat = "spki"; | |
| 181 var data = new Uint8Array([]); | |
| 182 var algorithm = {name: "aes-cbc"}; | |
| 183 var extractable = false; | |
| 184 | |
| 185 return crypto.subtle.importKey(keyFormat, data, algorithm, extractable, keyU
sages); | |
| 186 } | |
| 187 | |
| 188 function importRsaSsaKey() | |
| 189 { | |
| 190 var keyFormat = "spki"; | |
| 191 var data = new Uint8Array([]); | |
| 192 var algorithm = {name: "RSASSA-PKCS1-v1_5"}; | |
| 193 var extractable = false; | |
| 194 var keyUsages = ["encrypt", "decrypt", "verify", "sign"]; | |
| 195 | |
| 196 return crypto.subtle.importKey(keyFormat, data, algorithm, extractable, keyU
sages); | |
| 197 } | |
| 198 | |
| 199 function failedKeyImport(value) | |
| 200 { | |
| 201 debug("Failed importing key: " + value); | |
| 202 finishJSTest(); | |
| 203 } | |
| 204 | |
| 205 // Import two keys before starting the tests: one for AES-CBC, and one for | |
| 206 // HMAC SHA1. | |
| 207 Promise.every(importAesCbcKey(['encrypt', 'decrypt', 'sign', 'verify']), importA
esCbcKey(['decrypt', 'sign', 'verify']), importHmacSha1Key(), importRsaSsaKey())
.then(function(keys) | |
| 208 { | |
| 209 aesCbcKey = keys[0]; | |
| 210 aesCbcKeyNoEncrypt = keys[1]; | |
| 211 hmacSha1Key = keys[2]; | |
| 212 rsaSsaKey = keys[3]; | |
| 213 | |
| 214 runTests(); | |
| 215 finishJSTest(); | |
| 216 | |
| 217 }, failedKeyImport); | |
| 218 | |
| 219 </script> | |
| 220 | |
| 221 <script src="../fast/js/resources/js-test-post.js"></script> | |
| 222 </body> | |
| 223 </html> | |
| OLD | NEW |