WebCrypto Key.usages should be ordered alphabetically
authorap@apple.com <ap@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 13 Dec 2013 19:10:54 +0000 (19:10 +0000)
committerap@apple.com <ap@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 13 Dec 2013 19:10:54 +0000 (19:10 +0000)
https://bugs.webkit.org/show_bug.cgi?id=125696

Reviewed by Darin Adler.

Source/WebCore:

* crypto/CryptoKey.cpp: (WebCore::CryptoKey::usages): Do it.

LayoutTests:

* crypto/subtle/aes-cbc-192-encrypt-decrypt-expected.txt:
* crypto/subtle/aes-cbc-192-encrypt-decrypt.html:
* crypto/subtle/aes-cbc-256-encrypt-decrypt-expected.txt:
* crypto/subtle/aes-cbc-256-encrypt-decrypt.html:
* crypto/subtle/aes-cbc-encrypt-decrypt-expected.txt:
* crypto/subtle/aes-cbc-encrypt-decrypt-with-padding-expected.txt:
* crypto/subtle/aes-cbc-encrypt-decrypt-with-padding.html:
* crypto/subtle/aes-cbc-encrypt-decrypt.html:
* crypto/subtle/aes-cbc-generate-key-expected.txt:
* crypto/subtle/aes-cbc-generate-key.html:
* crypto/subtle/aes-cbc-invalid-length-expected.txt:
* crypto/subtle/aes-cbc-invalid-length.html:
* crypto/subtle/aes-kw-wrap-unwrap-aes-expected.txt:
* crypto/subtle/aes-kw-wrap-unwrap-aes.html:
* crypto/subtle/aes-postMessage-expected.txt:
* crypto/subtle/aes-postMessage.html:
* crypto/subtle/hmac-postMessage-expected.txt:
* crypto/subtle/hmac-postMessage.html:
* crypto/subtle/jwk-import-use-values-expected.txt:
* crypto/subtle/jwk-import-use-values.html:
* crypto/subtle/postMessage-worker-expected.txt:
* crypto/subtle/postMessage-worker.html:
* crypto/subtle/resources/postMessage-worker.js:
(onmessage):
* crypto/subtle/rsa-oaep-key-manipulation-expected.txt:
* crypto/subtle/rsa-oaep-key-manipulation.html:
* crypto/subtle/rsa-oaep-wrap-unwrap-aes-expected.txt:
* crypto/subtle/rsa-oaep-wrap-unwrap-aes.html:
* crypto/subtle/rsaes-pkcs1-v1_5-wrap-unwrap-aes-expected.txt:
* crypto/subtle/rsaes-pkcs1-v1_5-wrap-unwrap-aes.html:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@160547 268f45cc-cd09-0410-ab3c-d52691b4dbfc

32 files changed:
LayoutTests/ChangeLog
LayoutTests/crypto/subtle/aes-cbc-192-encrypt-decrypt-expected.txt
LayoutTests/crypto/subtle/aes-cbc-192-encrypt-decrypt.html
LayoutTests/crypto/subtle/aes-cbc-256-encrypt-decrypt-expected.txt
LayoutTests/crypto/subtle/aes-cbc-256-encrypt-decrypt.html
LayoutTests/crypto/subtle/aes-cbc-encrypt-decrypt-expected.txt
LayoutTests/crypto/subtle/aes-cbc-encrypt-decrypt-with-padding-expected.txt
LayoutTests/crypto/subtle/aes-cbc-encrypt-decrypt-with-padding.html
LayoutTests/crypto/subtle/aes-cbc-encrypt-decrypt.html
LayoutTests/crypto/subtle/aes-cbc-generate-key-expected.txt
LayoutTests/crypto/subtle/aes-cbc-generate-key.html
LayoutTests/crypto/subtle/aes-cbc-invalid-length-expected.txt
LayoutTests/crypto/subtle/aes-cbc-invalid-length.html
LayoutTests/crypto/subtle/aes-kw-wrap-unwrap-aes-expected.txt
LayoutTests/crypto/subtle/aes-kw-wrap-unwrap-aes.html
LayoutTests/crypto/subtle/aes-postMessage-expected.txt
LayoutTests/crypto/subtle/aes-postMessage.html
LayoutTests/crypto/subtle/hmac-postMessage-expected.txt
LayoutTests/crypto/subtle/hmac-postMessage.html
LayoutTests/crypto/subtle/jwk-import-use-values-expected.txt
LayoutTests/crypto/subtle/jwk-import-use-values.html
LayoutTests/crypto/subtle/postMessage-worker-expected.txt
LayoutTests/crypto/subtle/postMessage-worker.html
LayoutTests/crypto/subtle/resources/postMessage-worker.js
LayoutTests/crypto/subtle/rsa-oaep-key-manipulation-expected.txt
LayoutTests/crypto/subtle/rsa-oaep-key-manipulation.html
LayoutTests/crypto/subtle/rsa-oaep-wrap-unwrap-aes-expected.txt
LayoutTests/crypto/subtle/rsa-oaep-wrap-unwrap-aes.html
LayoutTests/crypto/subtle/rsaes-pkcs1-v1_5-wrap-unwrap-aes-expected.txt
LayoutTests/crypto/subtle/rsaes-pkcs1-v1_5-wrap-unwrap-aes.html
Source/WebCore/ChangeLog
Source/WebCore/crypto/CryptoKey.cpp

index 6906db2..4d43a4c 100644 (file)
@@ -1,3 +1,41 @@
+2013-12-13  Alexey Proskuryakov  <ap@apple.com>
+
+        WebCrypto Key.usages should be ordered alphabetically
+        https://bugs.webkit.org/show_bug.cgi?id=125696
+
+        Reviewed by Darin Adler.
+
+        * crypto/subtle/aes-cbc-192-encrypt-decrypt-expected.txt:
+        * crypto/subtle/aes-cbc-192-encrypt-decrypt.html:
+        * crypto/subtle/aes-cbc-256-encrypt-decrypt-expected.txt:
+        * crypto/subtle/aes-cbc-256-encrypt-decrypt.html:
+        * crypto/subtle/aes-cbc-encrypt-decrypt-expected.txt:
+        * crypto/subtle/aes-cbc-encrypt-decrypt-with-padding-expected.txt:
+        * crypto/subtle/aes-cbc-encrypt-decrypt-with-padding.html:
+        * crypto/subtle/aes-cbc-encrypt-decrypt.html:
+        * crypto/subtle/aes-cbc-generate-key-expected.txt:
+        * crypto/subtle/aes-cbc-generate-key.html:
+        * crypto/subtle/aes-cbc-invalid-length-expected.txt:
+        * crypto/subtle/aes-cbc-invalid-length.html:
+        * crypto/subtle/aes-kw-wrap-unwrap-aes-expected.txt:
+        * crypto/subtle/aes-kw-wrap-unwrap-aes.html:
+        * crypto/subtle/aes-postMessage-expected.txt:
+        * crypto/subtle/aes-postMessage.html:
+        * crypto/subtle/hmac-postMessage-expected.txt:
+        * crypto/subtle/hmac-postMessage.html:
+        * crypto/subtle/jwk-import-use-values-expected.txt:
+        * crypto/subtle/jwk-import-use-values.html:
+        * crypto/subtle/postMessage-worker-expected.txt:
+        * crypto/subtle/postMessage-worker.html:
+        * crypto/subtle/resources/postMessage-worker.js:
+        (onmessage):
+        * crypto/subtle/rsa-oaep-key-manipulation-expected.txt:
+        * crypto/subtle/rsa-oaep-key-manipulation.html:
+        * crypto/subtle/rsa-oaep-wrap-unwrap-aes-expected.txt:
+        * crypto/subtle/rsa-oaep-wrap-unwrap-aes.html:
+        * crypto/subtle/rsaes-pkcs1-v1_5-wrap-unwrap-aes-expected.txt:
+        * crypto/subtle/rsaes-pkcs1-v1_5-wrap-unwrap-aes.html:
+
 2013-12-13  Rob Buis  <rob.buis@samsung.com>
 
         Clean up SVGScriptElement
 2013-12-13  Rob Buis  <rob.buis@samsung.com>
 
         Clean up SVGScriptElement
index 6d778b6..177f27d 100644 (file)
@@ -8,7 +8,7 @@ PASS key.type is 'secret'
 PASS key.extractable is true
 PASS key.algorithm.name is 'AES-CBC'
 PASS key.algorithm.length is 192
 PASS key.extractable is true
 PASS key.algorithm.name is 'AES-CBC'
 PASS key.algorithm.length is 192
-PASS key.usages is ['encrypt', 'decrypt']
+PASS key.usages is ['decrypt', 'encrypt']
 Using the key to encrypt plaintext...
 PASS bytesToHexString(new Uint8Array(encryptionResult)) is '4f021db243bc633d7178183a9fa071e8b4d9ada9ad7dedf4e5e738763f69145a571b242012fb7ae07fa9baac3df102e008b0e27988598881d920a9e64f5615cd612ccd79224b350935d45dd6a98f8176'
 Decrypting it back...
 Using the key to encrypt plaintext...
 PASS bytesToHexString(new Uint8Array(encryptionResult)) is '4f021db243bc633d7178183a9fa071e8b4d9ada9ad7dedf4e5e738763f69145a571b242012fb7ae07fa9baac3df102e008b0e27988598881d920a9e64f5615cd612ccd79224b350935d45dd6a98f8176'
 Decrypting it back...
index f517585..eeae2a4 100644 (file)
@@ -25,7 +25,7 @@ crypto.subtle.importKey("raw", keyData, "aes-cbc", extractable, ["encrypt", "dec
     shouldBe("key.extractable", "true");
     shouldBe("key.algorithm.name", "'AES-CBC'");
     shouldBe("key.algorithm.length", "192");
     shouldBe("key.extractable", "true");
     shouldBe("key.algorithm.name", "'AES-CBC'");
     shouldBe("key.algorithm.length", "192");
-    shouldBe("key.usages", "['encrypt', 'decrypt']");
+    shouldBe("key.usages", "['decrypt', 'encrypt']");
 
     debug("Using the key to encrypt plaintext...");
     return crypto.subtle.encrypt({name: "aes-cbc", iv: iv}, key, plaintext);
 
     debug("Using the key to encrypt plaintext...");
     return crypto.subtle.encrypt({name: "aes-cbc", iv: iv}, key, plaintext);
index 813ab99..d08b55b 100644 (file)
@@ -8,7 +8,7 @@ PASS key.type is 'secret'
 PASS key.extractable is true
 PASS key.algorithm.name is 'AES-CBC'
 PASS key.algorithm.length is 256
 PASS key.extractable is true
 PASS key.algorithm.name is 'AES-CBC'
 PASS key.algorithm.length is 256
-PASS key.usages is ['encrypt', 'decrypt']
+PASS key.usages is ['decrypt', 'encrypt']
 Using the key to encrypt plaintext...
 PASS bytesToHexString(new Uint8Array(encryptionResult)) is 'f58c4c04d6e5f1ba779eabfb5f7bfbd69cfc4e967edb808d679f777bc6702c7d39f23369a9d9bacfa530e26304231461b2eb05e2c39be9fcda6c19078c6a9d1b3f461796d6b0d6b2e0c2a72b4d80e644'
 Decrypting it back...
 Using the key to encrypt plaintext...
 PASS bytesToHexString(new Uint8Array(encryptionResult)) is 'f58c4c04d6e5f1ba779eabfb5f7bfbd69cfc4e967edb808d679f777bc6702c7d39f23369a9d9bacfa530e26304231461b2eb05e2c39be9fcda6c19078c6a9d1b3f461796d6b0d6b2e0c2a72b4d80e644'
 Decrypting it back...
index 5ce879d..5947bd4 100644 (file)
@@ -25,7 +25,7 @@ crypto.subtle.importKey("raw", keyData, "aes-cbc", extractable, ["encrypt", "dec
     shouldBe("key.extractable", "true");
     shouldBe("key.algorithm.name", "'AES-CBC'");
     shouldBe("key.algorithm.length", "256");
     shouldBe("key.extractable", "true");
     shouldBe("key.algorithm.name", "'AES-CBC'");
     shouldBe("key.algorithm.length", "256");
-    shouldBe("key.usages", "['encrypt', 'decrypt']");
+    shouldBe("key.usages", "['decrypt', 'encrypt']");
 
     debug("Using the key to encrypt plaintext...");
     return crypto.subtle.encrypt({name: "aes-cbc", iv: iv}, key, plaintext);
 
     debug("Using the key to encrypt plaintext...");
     return crypto.subtle.encrypt({name: "aes-cbc", iv: iv}, key, plaintext);
index 71fa665..66b3150 100644 (file)
@@ -8,7 +8,7 @@ PASS key.type is 'secret'
 PASS key.extractable is true
 PASS key.algorithm.name is 'AES-CBC'
 PASS key.algorithm.length is 128
 PASS key.extractable is true
 PASS key.algorithm.name is 'AES-CBC'
 PASS key.algorithm.length is 128
-PASS key.usages is ['encrypt', 'decrypt']
+PASS key.usages is ['decrypt', 'encrypt']
 Using the key to encrypt plaintext...
 PASS bytesToHexString(new Uint8Array(encryptionResult)) is '7649abac8119b246cee98e9b12e9197d5086cb9b507219ee95db113a917678b273bed6b8e3c1743b7116e69e222295163ff1caa1681fac09120eca307586e1a78cb82807230e1321d3fae00d18cc2012'
 Decrypting it back...
 Using the key to encrypt plaintext...
 PASS bytesToHexString(new Uint8Array(encryptionResult)) is '7649abac8119b246cee98e9b12e9197d5086cb9b507219ee95db113a917678b273bed6b8e3c1743b7116e69e222295163ff1caa1681fac09120eca307586e1a78cb82807230e1321d3fae00d18cc2012'
 Decrypting it back...
index 9f6915c..32fdfba 100644 (file)
@@ -8,7 +8,7 @@ PASS key.type is 'secret'
 PASS key.extractable is true
 PASS key.algorithm.name is 'AES-CBC'
 PASS key.algorithm.length is 128
 PASS key.extractable is true
 PASS key.algorithm.name is 'AES-CBC'
 PASS key.algorithm.length is 128
-PASS key.usages is ['encrypt', 'decrypt']
+PASS key.usages is ['decrypt', 'encrypt']
 Using the key to encrypt plaintext...
 PASS bytesToHexString(new Uint8Array(cyphertext)) is '630199c5f202cc7167bb84c6c72b349d'
 Decrypting it back...
 Using the key to encrypt plaintext...
 PASS bytesToHexString(new Uint8Array(cyphertext)) is '630199c5f202cc7167bb84c6c72b349d'
 Decrypting it back...
index 2b5ce2e..bab6460 100644 (file)
@@ -25,7 +25,7 @@ crypto.subtle.importKey("raw", keyData, "aes-cbc", extractable, ["encrypt", "dec
     shouldBe("key.extractable", "true");
     shouldBe("key.algorithm.name", "'AES-CBC'");
     shouldBe("key.algorithm.length", "128");
     shouldBe("key.extractable", "true");
     shouldBe("key.algorithm.name", "'AES-CBC'");
     shouldBe("key.algorithm.length", "128");
-    shouldBe("key.usages", "['encrypt', 'decrypt']");
+    shouldBe("key.usages", "['decrypt', 'encrypt']");
 
     debug("Using the key to encrypt plaintext...");
     return crypto.subtle.encrypt({name: "aes-cbc", iv: iv}, key, plaintext);
 
     debug("Using the key to encrypt plaintext...");
     return crypto.subtle.encrypt({name: "aes-cbc", iv: iv}, key, plaintext);
index 6ac07d8..e67f427 100644 (file)
@@ -25,7 +25,7 @@ crypto.subtle.importKey("raw", keyData, "aes-cbc", extractable, ["encrypt", "dec
     shouldBe("key.extractable", "true");
     shouldBe("key.algorithm.name", "'AES-CBC'");
     shouldBe("key.algorithm.length", "128");
     shouldBe("key.extractable", "true");
     shouldBe("key.algorithm.name", "'AES-CBC'");
     shouldBe("key.algorithm.length", "128");
-    shouldBe("key.usages", "['encrypt', 'decrypt']");
+    shouldBe("key.usages", "['decrypt', 'encrypt']");
 
     debug("Using the key to encrypt plaintext...");
     return crypto.subtle.encrypt({name: "aes-cbc", iv: iv}, key, plaintext);
 
     debug("Using the key to encrypt plaintext...");
     return crypto.subtle.encrypt({name: "aes-cbc", iv: iv}, key, plaintext);
index 3a0d987..6740b8e 100644 (file)
@@ -12,7 +12,7 @@ PASS key.type is 'secret'
 PASS key.extractable is true
 PASS key.algorithm.name is 'AES-CBC'
 PASS key.algorithm.length is 128
 PASS key.extractable is true
 PASS key.algorithm.name is 'AES-CBC'
 PASS key.algorithm.length is 128
-PASS key.usages is ['encrypt', 'decrypt']
+PASS key.usages is ['decrypt', 'encrypt']
 PASS successfullyParsed is true
 
 TEST COMPLETE
 PASS successfullyParsed is true
 
 TEST COMPLETE
index be66fee..e362c8f 100644 (file)
@@ -28,7 +28,7 @@ crypto.subtle.generateKey({name: "aes-cbc", length: 128}, extractable, ["encrypt
     shouldBe("key.extractable", "true");
     shouldBe("key.algorithm.name", "'AES-CBC'");
     shouldBe("key.algorithm.length", "128");
     shouldBe("key.extractable", "true");
     shouldBe("key.algorithm.name", "'AES-CBC'");
     shouldBe("key.algorithm.length", "128");
-    shouldBe("key.usages", "['encrypt', 'decrypt']");
+    shouldBe("key.usages", "['decrypt', 'encrypt']");
 
     finishJSTest();
 });
 
     finishJSTest();
 });
index ec7d695..a02a5f2 100644 (file)
@@ -8,7 +8,7 @@ PASS key.type is 'secret'
 PASS key.extractable is true
 PASS key.algorithm.name is 'AES-CBC'
 PASS key.algorithm.length is 176
 PASS key.extractable is true
 PASS key.algorithm.name is 'AES-CBC'
 PASS key.algorithm.length is 176
-PASS key.usages is ['encrypt', 'decrypt']
+PASS key.usages is ['decrypt', 'encrypt']
 Using the key to encrypt plaintext...
 Failed, as expected. Note that the spec doesn't appear to clearly define which step should fail.
 PASS successfullyParsed is true
 Using the key to encrypt plaintext...
 Failed, as expected. Note that the spec doesn't appear to clearly define which step should fail.
 PASS successfullyParsed is true
index e29ccb5..9d7a89c 100644 (file)
@@ -25,7 +25,7 @@ crypto.subtle.importKey("raw", keyData, "aes-cbc", extractable, ["encrypt", "dec
     shouldBe("key.extractable", "true");
     shouldBe("key.algorithm.name", "'AES-CBC'");
     shouldBe("key.algorithm.length", "176");
     shouldBe("key.extractable", "true");
     shouldBe("key.algorithm.name", "'AES-CBC'");
     shouldBe("key.algorithm.length", "176");
-    shouldBe("key.usages", "['encrypt', 'decrypt']");
+    shouldBe("key.usages", "['decrypt', 'encrypt']");
 
     debug("Using the key to encrypt plaintext...");
     return crypto.subtle.encrypt({name: "aes-cbc", iv: iv}, key, [plaintext]);
 
     debug("Using the key to encrypt plaintext...");
     return crypto.subtle.encrypt({name: "aes-cbc", iv: iv}, key, [plaintext]);
index e6a428a..596e165 100644 (file)
@@ -13,7 +13,7 @@ PASS unwrappedKey.type is 'secret'
 PASS unwrappedKey.extractable is true
 PASS unwrappedKey.algorithm.name is 'AES-CBC'
 PASS unwrappedKey.algorithm.length is 128
 PASS unwrappedKey.extractable is true
 PASS unwrappedKey.algorithm.name is 'AES-CBC'
 PASS unwrappedKey.algorithm.length is 128
-PASS unwrappedKey.usages is ['encrypt', 'decrypt', 'wrapKey', 'unwrapKey']
+PASS unwrappedKey.usages is ['decrypt', 'encrypt', 'unwrapKey', 'wrapKey']
 Exporting it...
 PASS bytesToHexString(unwrappedKeyData) is bytesToHexString(keyData)
 
 Exporting it...
 PASS bytesToHexString(unwrappedKeyData) is bytesToHexString(keyData)
 
@@ -24,7 +24,7 @@ PASS unwrappedKey.type is 'secret'
 PASS unwrappedKey.extractable is true
 PASS unwrappedKey.algorithm.name is 'AES-CBC'
 PASS unwrappedKey.algorithm.length is 128
 PASS unwrappedKey.extractable is true
 PASS unwrappedKey.algorithm.name is 'AES-CBC'
 PASS unwrappedKey.algorithm.length is 128
-PASS unwrappedKey.usages is ['encrypt', 'decrypt', 'wrapKey', 'unwrapKey']
+PASS unwrappedKey.usages is ['decrypt', 'encrypt', 'unwrapKey', 'wrapKey']
 Exporting it...
 PASS bytesToHexString(unwrappedKeyData) is bytesToHexString(keyData)
 PASS successfullyParsed is true
 Exporting it...
 PASS bytesToHexString(unwrappedKeyData) is bytesToHexString(keyData)
 PASS successfullyParsed is true
index 3a48e79..fdba139 100644 (file)
@@ -41,7 +41,7 @@ crypto.subtle.importKey("raw", kekData, "aes-kw", extractable, ["wrapKey", "unwr
     shouldBe("unwrappedKey.extractable", "true");
     shouldBe("unwrappedKey.algorithm.name", "'AES-CBC'");
     shouldBe("unwrappedKey.algorithm.length", "128");
     shouldBe("unwrappedKey.extractable", "true");
     shouldBe("unwrappedKey.algorithm.name", "'AES-CBC'");
     shouldBe("unwrappedKey.algorithm.length", "128");
-    shouldBe("unwrappedKey.usages", "['encrypt', 'decrypt', 'wrapKey', 'unwrapKey']");
+    shouldBe("unwrappedKey.usages", "['decrypt', 'encrypt', 'unwrapKey', 'wrapKey']");
 
     debug("Exporting it...");
     return crypto.subtle.exportKey("raw", unwrappedKey);
 
     debug("Exporting it...");
     return crypto.subtle.exportKey("raw", unwrappedKey);
@@ -63,7 +63,7 @@ crypto.subtle.importKey("raw", kekData, "aes-kw", extractable, ["wrapKey", "unwr
     shouldBe("unwrappedKey.extractable", "true");
     shouldBe("unwrappedKey.algorithm.name", "'AES-CBC'");
     shouldBe("unwrappedKey.algorithm.length", "128");
     shouldBe("unwrappedKey.extractable", "true");
     shouldBe("unwrappedKey.algorithm.name", "'AES-CBC'");
     shouldBe("unwrappedKey.algorithm.length", "128");
-    shouldBe("unwrappedKey.usages", "['encrypt', 'decrypt', 'wrapKey', 'unwrapKey']");
+    shouldBe("unwrappedKey.usages", "['decrypt', 'encrypt', 'unwrapKey', 'wrapKey']");
 
     debug("Exporting it...");
     return crypto.subtle.exportKey("raw", unwrappedKey);
 
     debug("Exporting it...");
     return crypto.subtle.exportKey("raw", unwrappedKey);
index 408e074..f0d059b 100644 (file)
@@ -7,7 +7,7 @@ PASS key.type is 'secret'
 PASS key.extractable is true
 PASS key.algorithm.name is 'AES-CBC'
 PASS key.algorithm.length is 128
 PASS key.extractable is true
 PASS key.algorithm.name is 'AES-CBC'
 PASS key.algorithm.length is 128
-PASS key.usages is ["encrypt", "decrypt", "sign", "verify"]
+PASS key.usages is ["decrypt", "encrypt", "sign", "verify"]
 PASS successfullyParsed is true
 
 TEST COMPLETE
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 6404fb0..c308f89 100644 (file)
@@ -18,7 +18,7 @@ window.addEventListener("message", function(evt) {
     shouldBe("key.extractable", "true");
     shouldBe("key.algorithm.name", "'AES-CBC'");
     shouldBe("key.algorithm.length", "128");
     shouldBe("key.extractable", "true");
     shouldBe("key.algorithm.name", "'AES-CBC'");
     shouldBe("key.algorithm.length", "128");
-    shouldBe("key.usages", '["encrypt", "decrypt", "sign", "verify"]');
+    shouldBe("key.usages", '["decrypt", "encrypt", "sign", "verify"]');
 
     finishJSTest();
 }, false);
 
     finishJSTest();
 }, false);
index 4657f4a..cecaeb9 100644 (file)
@@ -7,7 +7,7 @@ PASS key.type is 'secret'
 PASS key.extractable is true
 PASS key.algorithm.name is 'HMAC'
 PASS key.algorithm.length is 16
 PASS key.extractable is true
 PASS key.algorithm.name is 'HMAC'
 PASS key.algorithm.length is 16
-PASS key.usages is ["encrypt", "decrypt", "sign", "verify"]
+PASS key.usages is ["decrypt", "encrypt", "sign", "verify"]
 PASS successfullyParsed is true
 
 TEST COMPLETE
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 53bd2c5..0088c1b 100644 (file)
@@ -18,7 +18,7 @@ window.addEventListener("message", function(evt) {
     shouldBe("key.extractable", "true");
     shouldBe("key.algorithm.name", "'HMAC'");
     shouldBe("key.algorithm.length", "16");
     shouldBe("key.extractable", "true");
     shouldBe("key.algorithm.name", "'HMAC'");
     shouldBe("key.algorithm.length", "16");
-    shouldBe("key.usages", '["encrypt", "decrypt", "sign", "verify"]');
+    shouldBe("key.usages", '["decrypt", "encrypt", "sign", "verify"]');
 
     finishJSTest();
 }, false);
 
     finishJSTest();
 }, false);
index 664a125..24982e0 100644 (file)
@@ -10,7 +10,7 @@ deconly:
 PASS key.usages is ["decrypt"]
 
 enconly,deconly:
 PASS key.usages is ["decrypt"]
 
 enconly,deconly:
-PASS key.usages is ["encrypt","decrypt"]
+PASS key.usages is ["decrypt","encrypt"]
 
 wrap:
 PASS key.usages is ["wrapKey"]
 
 wrap:
 PASS key.usages is ["wrapKey"]
@@ -19,13 +19,13 @@ unwrap:
 PASS key.usages is ["unwrapKey"]
 
 wrap,unwrap:
 PASS key.usages is ["unwrapKey"]
 
 wrap,unwrap:
-PASS key.usages is ["wrapKey","unwrapKey"]
+PASS key.usages is ["unwrapKey","wrapKey"]
 
 enconly,deconly,wrap:
 
 enconly,deconly,wrap:
-PASS key.usages is ["encrypt","decrypt","wrapKey"]
+PASS key.usages is ["decrypt","encrypt","wrapKey"]
 
 enc:
 
 enc:
-PASS key.usages is ["encrypt","decrypt","wrapKey","unwrapKey"]
+PASS key.usages is ["decrypt","encrypt","unwrapKey","wrapKey"]
 
 sigonly:
 PASS key.usages is ["sign"]
 
 sigonly:
 PASS key.usages is ["sign"]
@@ -49,7 +49,7 @@ enconly, deconly:
 PASS key.usages is ["encrypt"]
 
 enconly,,deconly:
 PASS key.usages is ["encrypt"]
 
 enconly,,deconly:
-PASS key.usages is ["encrypt","decrypt"]
+PASS key.usages is ["decrypt","encrypt"]
 
 PASS successfullyParsed is true
 
 
 PASS successfullyParsed is true
 
index e8002a7..555d5aa 100644 (file)
@@ -54,12 +54,12 @@ function testWithHMAC(expectedUsages, use)
 Promise.all([
     testWithAESCBC(["encrypt"], "enconly"),
     testWithAESCBC(["decrypt"], "deconly"),
 Promise.all([
     testWithAESCBC(["encrypt"], "enconly"),
     testWithAESCBC(["decrypt"], "deconly"),
-    testWithAESCBC(["encrypt", "decrypt"], "enconly,deconly"),
+    testWithAESCBC(["decrypt", "encrypt"], "enconly,deconly"),
     testWithAESCBC(["wrapKey"], "wrap"),
     testWithAESCBC(["unwrapKey"], "unwrap"),
     testWithAESCBC(["wrapKey"], "wrap"),
     testWithAESCBC(["unwrapKey"], "unwrap"),
-    testWithAESCBC(["wrapKey", "unwrapKey"], "wrap,unwrap"),
-    testWithAESCBC(["encrypt", "decrypt", "wrapKey"], "enconly,deconly,wrap"),
-    testWithAESCBC(["encrypt", "decrypt", "wrapKey", "unwrapKey"], "enc"),
+    testWithAESCBC(["unwrapKey", "wrapKey"], "wrap,unwrap"),
+    testWithAESCBC(["decrypt", "encrypt", "wrapKey"], "enconly,deconly,wrap"),
+    testWithAESCBC(["decrypt", "encrypt", "unwrapKey", "wrapKey"], "enc"),
     testWithHMAC(["sign"], "sigonly"),
     testWithHMAC(["verify"], "vfyonly"),
     testWithHMAC(["sign", "verify"], "sig"),
     testWithHMAC(["sign"], "sigonly"),
     testWithHMAC(["verify"], "vfyonly"),
     testWithHMAC(["sign", "verify"], "sig"),
@@ -69,7 +69,7 @@ Promise.all([
     testWithAESCBC([], "enconly "),
     testWithAESCBC([], "EncOnly"),
     testWithAESCBC(["encrypt"], "enconly, deconly"),
     testWithAESCBC([], "enconly "),
     testWithAESCBC([], "EncOnly"),
     testWithAESCBC(["encrypt"], "enconly, deconly"),
-    testWithAESCBC(["encrypt", "decrypt"], "enconly,,deconly"),
+    testWithAESCBC(["decrypt","encrypt"], "enconly,,deconly"),
 
 ]).then(function() { finishJSTest(); } );
 </script>
 
 ]).then(function() { finishJSTest(); } );
 </script>
index aece8f7..a218fe5 100644 (file)
@@ -8,7 +8,7 @@ PASS key.type is 'secret'
 PASS key.extractable is true
 PASS key.algorithm.name is 'HMAC'
 PASS key.algorithm.length is 16
 PASS key.extractable is true
 PASS key.algorithm.name is 'HMAC'
 PASS key.algorithm.length is 16
-PASS key.usages is ["encrypt", "decrypt", "sign", "verify"]
+PASS key.usages is ["decrypt", "encrypt", "sign", "verify"]
 PASS successfullyParsed is true
 
 TEST COMPLETE
 PASS successfullyParsed is true
 
 TEST COMPLETE
index afab6fc..d75ebf3 100644 (file)
@@ -24,7 +24,7 @@ importTestKeys().then(function(keys) {
             shouldBe("key.extractable", "true");
             shouldBe("key.algorithm.name", "'HMAC'");
             shouldBe("key.algorithm.length", "16");
             shouldBe("key.extractable", "true");
             shouldBe("key.algorithm.name", "'HMAC'");
             shouldBe("key.algorithm.length", "16");
-            shouldBe("key.usages", '["encrypt", "decrypt", "sign", "verify"]');
+            shouldBe("key.usages", '["decrypt", "encrypt", "sign", "verify"]');
         }
         finishJSTest();
     }
         }
         finishJSTest();
     }
index e73dce6..7249061 100644 (file)
@@ -7,8 +7,8 @@ onmessage = function(evt)
         postMessage({ result:false, message:'key.extractable should be true' });
     else if (key.algorithm.name != "HMAC")
         postMessage({ result:false, message:'key.algorithm.name should be "HMAC"' });
         postMessage({ result:false, message:'key.extractable should be true' });
     else if (key.algorithm.name != "HMAC")
         postMessage({ result:false, message:'key.algorithm.name should be "HMAC"' });
-    else if (key.usages.toString() != "encrypt,decrypt,sign,verify")
-        postMessage({ result:false, message:'key.usages should be ["encrypt", "decrypt", "sign", "verify"]' });
+    else if (key.usages.toString() != "decrypt,encrypt,sign,verify")
+        postMessage({ result:false, message:'key.usages should be ["decrypt", "encrypt", "sign", "verify"]' });
     else
         postMessage({ result:true, key:key });
 }
     else
         postMessage({ result:true, key:key });
 }
index 72770e5..a701ac8 100644 (file)
@@ -38,7 +38,7 @@ PASS exportedPublicKey.algorithm.modulusLength is 2048
 PASS bytesToHexString(exportedPublicKey.algorithm.publicExponent) is '010001'
 PASS exportedPublicKey.algorithm.hash.name is 'SHA-1'
 PASS exportedPublicKey.extractable is true
 PASS bytesToHexString(exportedPublicKey.algorithm.publicExponent) is '010001'
 PASS exportedPublicKey.algorithm.hash.name is 'SHA-1'
 PASS exportedPublicKey.extractable is true
-PASS exportedPublicKey.usages is ['encrypt','decrypt','wrapKey','unwrapKey']
+PASS exportedPublicKey.usages is ['decrypt','encrypt','unwrapKey','wrapKey']
 PASS successfullyParsed is true
 
 TEST COMPLETE
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 93b16aa..29655cc 100644 (file)
@@ -70,7 +70,7 @@ crypto.subtle.generateKey(algorithmKeyGen, extractable, ["encrypt", "decrypt", "
     shouldBe("bytesToHexString(exportedPublicKey.algorithm.publicExponent)", "'010001'");
     shouldBe("exportedPublicKey.algorithm.hash.name", "'SHA-1'");
     shouldBe("exportedPublicKey.extractable", "true");
     shouldBe("bytesToHexString(exportedPublicKey.algorithm.publicExponent)", "'010001'");
     shouldBe("exportedPublicKey.algorithm.hash.name", "'SHA-1'");
     shouldBe("exportedPublicKey.extractable", "true");
-    shouldBe("exportedPublicKey.usages", "['encrypt','decrypt','wrapKey','unwrapKey']");
+    shouldBe("exportedPublicKey.usages", "['decrypt','encrypt','unwrapKey','wrapKey']");
 
     finishJSTest();
 });
 
     finishJSTest();
 });
index 69286de..3f958d6 100644 (file)
@@ -13,7 +13,7 @@ PASS unwrappedKey.type is 'secret'
 PASS unwrappedKey.extractable is true
 PASS unwrappedKey.algorithm.name is 'AES-CBC'
 PASS unwrappedKey.algorithm.length is 256
 PASS unwrappedKey.extractable is true
 PASS unwrappedKey.algorithm.name is 'AES-CBC'
 PASS unwrappedKey.algorithm.length is 256
-PASS unwrappedKey.usages is ['encrypt', 'decrypt']
+PASS unwrappedKey.usages is ['decrypt', 'encrypt']
 Exporting it...
 PASS bytesToHexString(unwrappedKeyData) is bytesToHexString(aesKeyData)
 
 Exporting it...
 PASS bytesToHexString(unwrappedKeyData) is bytesToHexString(aesKeyData)
 
@@ -25,7 +25,7 @@ PASS unwrappedKey.type is 'secret'
 PASS unwrappedKey.extractable is true
 PASS unwrappedKey.algorithm.name is 'AES-CBC'
 PASS unwrappedKey.algorithm.length is 256
 PASS unwrappedKey.extractable is true
 PASS unwrappedKey.algorithm.name is 'AES-CBC'
 PASS unwrappedKey.algorithm.length is 256
-PASS unwrappedKey.usages is ['encrypt', 'decrypt']
+PASS unwrappedKey.usages is ['decrypt', 'encrypt']
 Exporting it...
 PASS bytesToHexString(unwrappedKeyData) is bytesToHexString(aesKeyData)
 PASS successfullyParsed is true
 Exporting it...
 PASS bytesToHexString(unwrappedKeyData) is bytesToHexString(aesKeyData)
 PASS successfullyParsed is true
index 332dd31..13e65c5 100644 (file)
@@ -64,7 +64,7 @@ crypto.subtle.importKey("jwk", asciiToUint8Array(JSON.stringify(publicKeyJSON)),
     shouldBe("unwrappedKey.extractable", "true");
     shouldBe("unwrappedKey.algorithm.name", "'AES-CBC'");
     shouldBe("unwrappedKey.algorithm.length", "256");
     shouldBe("unwrappedKey.extractable", "true");
     shouldBe("unwrappedKey.algorithm.name", "'AES-CBC'");
     shouldBe("unwrappedKey.algorithm.length", "256");
-    shouldBe("unwrappedKey.usages", "['encrypt', 'decrypt']");
+    shouldBe("unwrappedKey.usages", "['decrypt', 'encrypt']");
 
     debug("Exporting it...");
     return crypto.subtle.exportKey("raw", unwrappedKey);
 
     debug("Exporting it...");
     return crypto.subtle.exportKey("raw", unwrappedKey);
@@ -87,7 +87,7 @@ crypto.subtle.importKey("jwk", asciiToUint8Array(JSON.stringify(publicKeyJSON)),
     shouldBe("unwrappedKey.extractable", "true");
     shouldBe("unwrappedKey.algorithm.name", "'AES-CBC'");
     shouldBe("unwrappedKey.algorithm.length", "256");
     shouldBe("unwrappedKey.extractable", "true");
     shouldBe("unwrappedKey.algorithm.name", "'AES-CBC'");
     shouldBe("unwrappedKey.algorithm.length", "256");
-    shouldBe("unwrappedKey.usages", "['encrypt', 'decrypt']");
+    shouldBe("unwrappedKey.usages", "['decrypt', 'encrypt']");
 
     debug("Exporting it...");
     return crypto.subtle.exportKey("raw", unwrappedKey);
 
     debug("Exporting it...");
     return crypto.subtle.exportKey("raw", unwrappedKey);
index 403cac9..26b4416 100644 (file)
@@ -13,7 +13,7 @@ PASS unwrappedKey.type is 'secret'
 PASS unwrappedKey.extractable is true
 PASS unwrappedKey.algorithm.name is 'AES-CBC'
 PASS unwrappedKey.algorithm.length is 256
 PASS unwrappedKey.extractable is true
 PASS unwrappedKey.algorithm.name is 'AES-CBC'
 PASS unwrappedKey.algorithm.length is 256
-PASS unwrappedKey.usages is ['encrypt', 'decrypt']
+PASS unwrappedKey.usages is ['decrypt', 'encrypt']
 Exporting it...
 PASS bytesToHexString(unwrappedKeyData) is bytesToHexString(aesKeyData)
 
 Exporting it...
 PASS bytesToHexString(unwrappedKeyData) is bytesToHexString(aesKeyData)
 
@@ -25,7 +25,7 @@ PASS unwrappedKey.type is 'secret'
 PASS unwrappedKey.extractable is true
 PASS unwrappedKey.algorithm.name is 'AES-CBC'
 PASS unwrappedKey.algorithm.length is 256
 PASS unwrappedKey.extractable is true
 PASS unwrappedKey.algorithm.name is 'AES-CBC'
 PASS unwrappedKey.algorithm.length is 256
-PASS unwrappedKey.usages is ['encrypt', 'decrypt']
+PASS unwrappedKey.usages is ['decrypt', 'encrypt']
 Exporting it...
 PASS bytesToHexString(unwrappedKeyData) is bytesToHexString(aesKeyData)
 PASS successfullyParsed is true
 Exporting it...
 PASS bytesToHexString(unwrappedKeyData) is bytesToHexString(aesKeyData)
 PASS successfullyParsed is true
index 6d07801..8ffa81c 100644 (file)
@@ -64,7 +64,7 @@ crypto.subtle.importKey("jwk", asciiToUint8Array(JSON.stringify(publicKeyJSON)),
     shouldBe("unwrappedKey.extractable", "true");
     shouldBe("unwrappedKey.algorithm.name", "'AES-CBC'");
     shouldBe("unwrappedKey.algorithm.length", "256");
     shouldBe("unwrappedKey.extractable", "true");
     shouldBe("unwrappedKey.algorithm.name", "'AES-CBC'");
     shouldBe("unwrappedKey.algorithm.length", "256");
-    shouldBe("unwrappedKey.usages", "['encrypt', 'decrypt']");
+    shouldBe("unwrappedKey.usages", "['decrypt', 'encrypt']");
 
     debug("Exporting it...");
     return crypto.subtle.exportKey("raw", unwrappedKey);
 
     debug("Exporting it...");
     return crypto.subtle.exportKey("raw", unwrappedKey);
@@ -87,7 +87,7 @@ crypto.subtle.importKey("jwk", asciiToUint8Array(JSON.stringify(publicKeyJSON)),
     shouldBe("unwrappedKey.extractable", "true");
     shouldBe("unwrappedKey.algorithm.name", "'AES-CBC'");
     shouldBe("unwrappedKey.algorithm.length", "256");
     shouldBe("unwrappedKey.extractable", "true");
     shouldBe("unwrappedKey.algorithm.name", "'AES-CBC'");
     shouldBe("unwrappedKey.algorithm.length", "256");
-    shouldBe("unwrappedKey.usages", "['encrypt', 'decrypt']");
+    shouldBe("unwrappedKey.usages", "['decrypt', 'encrypt']");
 
     debug("Exporting it...");
     return crypto.subtle.exportKey("raw", unwrappedKey);
 
     debug("Exporting it...");
     return crypto.subtle.exportKey("raw", unwrappedKey);
index e9b63d5..9d32e5b 100644 (file)
@@ -1,3 +1,12 @@
+2013-12-13  Alexey Proskuryakov  <ap@apple.com>
+
+        WebCrypto Key.usages should be ordered alphabetically
+        https://bugs.webkit.org/show_bug.cgi?id=125696
+
+        Reviewed by Darin Adler.
+
+        * crypto/CryptoKey.cpp: (WebCore::CryptoKey::usages): Do it.
+
 2013-12-13  Darin Adler  <darin@apple.com>
 
         Make some optimizations for DOM bindings involving vectors
 2013-12-13  Darin Adler  <darin@apple.com>
 
         Make some optimizations for DOM bindings involving vectors
index 678b433..5db0e4e 100644 (file)
@@ -67,23 +67,24 @@ void CryptoKey::buildAlgorithmDescription(CryptoAlgorithmDescriptionBuilder& bui
 
 Vector<String> CryptoKey::usages() const
 {
 
 Vector<String> CryptoKey::usages() const
 {
+    // The result is ordered alphabetically.
     Vector<String> result;
     Vector<String> result;
-    if (m_usages & CryptoKeyUsageEncrypt)
-        result.append(ASCIILiteral("encrypt"));
     if (m_usages & CryptoKeyUsageDecrypt)
         result.append(ASCIILiteral("decrypt"));
     if (m_usages & CryptoKeyUsageDecrypt)
         result.append(ASCIILiteral("decrypt"));
+    if (m_usages & CryptoKeyUsageDeriveBits)
+        result.append(ASCIILiteral("deriveBits"));
+    if (m_usages & CryptoKeyUsageDeriveKey)
+        result.append(ASCIILiteral("deriveKey"));
+    if (m_usages & CryptoKeyUsageEncrypt)
+        result.append(ASCIILiteral("encrypt"));
     if (m_usages & CryptoKeyUsageSign)
         result.append(ASCIILiteral("sign"));
     if (m_usages & CryptoKeyUsageSign)
         result.append(ASCIILiteral("sign"));
+    if (m_usages & CryptoKeyUsageUnwrapKey)
+        result.append(ASCIILiteral("unwrapKey"));
     if (m_usages & CryptoKeyUsageVerify)
         result.append(ASCIILiteral("verify"));
     if (m_usages & CryptoKeyUsageVerify)
         result.append(ASCIILiteral("verify"));
-    if (m_usages & CryptoKeyUsageDeriveKey)
-        result.append(ASCIILiteral("deriveKey"));
-    if (m_usages & CryptoKeyUsageDeriveBits)
-        result.append(ASCIILiteral("deriveBits"));
     if (m_usages & CryptoKeyUsageWrapKey)
         result.append(ASCIILiteral("wrapKey"));
     if (m_usages & CryptoKeyUsageWrapKey)
         result.append(ASCIILiteral("wrapKey"));
-    if (m_usages & CryptoKeyUsageUnwrapKey)
-        result.append(ASCIILiteral("unwrapKey"));
 
     return result;
 }
 
     return result;
 }