Add WebCrypto LayoutTests to check if PKCS#7 padding is correctly implemented in...
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 12 Feb 2020 05:41:20 +0000 (05:41 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 12 Feb 2020 05:41:20 +0000 (05:41 +0000)
https://bugs.webkit.org/show_bug.cgi?id=207174

Patch by Tomoki Imai <Tomoki.Imai@sony.com> on 2020-02-11
Reviewed by Jiewen Tan.

WebCrypto AES-CBC specification requires PKCS#7 padding,

Add decrypt/encrypt test cases for 0 ~ 33 bytes data.
It covers the boundary values where the padding size are changed, namely, 0, 1, 15, 16, 17, 31, 32, and 33.

* crypto/subtle/aes-cbc-import-key-decrypt-expected.txt:
* crypto/subtle/aes-cbc-import-key-decrypt.html:
* crypto/subtle/aes-cbc-import-key-encrypt-expected.txt:
* crypto/subtle/aes-cbc-import-key-encrypt.html:

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

LayoutTests/ChangeLog
LayoutTests/crypto/subtle/aes-cbc-import-key-decrypt-expected.txt
LayoutTests/crypto/subtle/aes-cbc-import-key-decrypt.html
LayoutTests/crypto/subtle/aes-cbc-import-key-encrypt-expected.txt
LayoutTests/crypto/subtle/aes-cbc-import-key-encrypt.html

index ab3a261..5d24726 100644 (file)
@@ -1,3 +1,20 @@
+2020-02-11  Tomoki Imai  <Tomoki.Imai@sony.com>
+
+        Add WebCrypto LayoutTests to check if PKCS#7 padding is correctly implemented in AES-CBC
+        https://bugs.webkit.org/show_bug.cgi?id=207174
+
+        Reviewed by Jiewen Tan.
+
+        WebCrypto AES-CBC specification requires PKCS#7 padding,
+
+        Add decrypt/encrypt test cases for 0 ~ 33 bytes data.
+        It covers the boundary values where the padding size are changed, namely, 0, 1, 15, 16, 17, 31, 32, and 33.
+
+        * crypto/subtle/aes-cbc-import-key-decrypt-expected.txt:
+        * crypto/subtle/aes-cbc-import-key-decrypt.html:
+        * crypto/subtle/aes-cbc-import-key-encrypt-expected.txt:
+        * crypto/subtle/aes-cbc-import-key-encrypt.html:
+
 2020-02-11  Lauro Moura  <lmoura@igalia.com>
 
         [GTK][WPE] Gardening some tests crashing in debug builds
index 13f43ce..7837d65 100644 (file)
@@ -3,6 +3,73 @@ Test decrypting using AES-CBC with an imported 128bit key
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
+Expected plain text: 
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: A
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: AB
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABC
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCD
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDE
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEF
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFG
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFGH
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFGHI
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFGHIJ
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFGHIJK
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFGHIJKL
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFGHIJKLM
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFGHIJKLMN
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFGHIJKLMNO
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFGHIJKLMNOP
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFGHIJKLMNOPQ
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFGHIJKLMNOPQR
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFGHIJKLMNOPQRS
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFGHIJKLMNOPQRST
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFGHIJKLMNOPQRSTU
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFGHIJKLMNOPQRSTUV
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFGHIJKLMNOPQRSTUVW
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFGHIJKLMNOPQRSTUVWX
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFGHIJKLMNOPQRSTUVWXY
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFGHIJKLMNOPQRSTUVWXYZ
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFGHIJKLMNOPQRSTUVWXYZA
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFGHIJKLMNOPQRSTUVWXYZAB
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFGHIJKLMNOPQRSTUVWXYZABC
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFGHIJKLMNOPQRSTUVWXYZABCD
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDE
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF
+PASS bytesToASCIIString(plainText) is expectedPlainText
+Expected plain text: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFG
 PASS bytesToASCIIString(plainText) is expectedPlainText
 PASS successfullyParsed is true
 
index 51565f1..444b9b2 100644 (file)
@@ -14,21 +14,177 @@ description("Test decrypting using AES-CBC with an imported 128bit key");
 jsTestIsAsync = true;
 
 var extractable = false;
-var cipherText = hexStringToUint8Array("2ffa4618784dfd414b22c40c6330d022");
 var aesCbcParams = {
     name: "aes-cbc",
     iv: asciiToUint8Array("jnOw99oOZFLIEPMr"),
 }
 var rawKey = asciiToUint8Array("jnOw99oOZFLIEPMr");
-var expectedPlainText = "Hello, World!";
 
-crypto.subtle.importKey("raw", rawKey, "aes-cbc", extractable, ["decrypt"]).then(function(key) {
-    return crypto.subtle.decrypt(aesCbcParams, key, cipherText);
-}).then(function(result) {
-    plainText = result;
 
-    shouldBe("bytesToASCIIString(plainText)", "expectedPlainText");
+// Test 0 ~ 33 bytes plain text data.
+// It covers the boundary values where the padding size are changed, namely, 0, 1, 15, 16, 17, 31, 32, and 33.
+// 16 comes from the AES-CBC block size, which is 128bit = 16 bytes.
 
+// Pair of expected plain text and cipher text
+var testCases = [
+  [
+    "",
+    "54695f2b49d2c35b5f4675c59669c7d5"
+  ],
+  [
+    "A",
+    "7f3224da4b207bd3b55a3ba55f95c8dd"
+  ],
+  [
+    "AB",
+    "05b7b4caa28897ff5fa0b8cac9821070"
+  ],
+  [
+    "ABC",
+    "c5fcd82c93ca70630e77871408cb60a5"
+  ],
+  [
+    "ABCD",
+    "8c68b0ba2952761877f30e26eb43e98b"
+  ],
+  [
+    "ABCDE",
+    "6e5845ce085801492ecdb3da47e54e0d"
+  ],
+  [
+    "ABCDEF",
+    "a2bf7011f0560504fd2d3f6f4fa85179"
+  ],
+  [
+    "ABCDEFG",
+    "bfbe3717d97b8e8dbb362aa32a5d6715"
+  ],
+  [
+    "ABCDEFGH",
+    "ac55dadf6d3d1be1fede0e33e9de021a"
+  ],
+  [
+    "ABCDEFGHI",
+    "f5adfd70b6a907441aa1e1b8d03138b8"
+  ],
+  [
+    "ABCDEFGHIJ",
+    "b4a2d688f3a9bd307efe62643d80ead0"
+  ],
+  [
+    "ABCDEFGHIJK",
+    "d5cce76a9416b3c00c4d2e0bb2879134"
+  ],
+  [
+    "ABCDEFGHIJKL",
+    "7b87f2b55433d595ed02cd3417c510a4"
+  ],
+  [
+    "ABCDEFGHIJKLM",
+    "29f5af157bda78fdde9550aaadfc467d"
+  ],
+  [
+    "ABCDEFGHIJKLMN",
+    "bd86ff3b780b56d4faf98bd7f818de59"
+  ],
+  [
+    "ABCDEFGHIJKLMNO",
+    "8f7d4ffd08155e67b2f936aa7eedd918"
+  ],
+  [
+    "ABCDEFGHIJKLMNOP",
+    "bb57e6bd078639a31e3762035652ddba8b641840a083e33027a0aea305e95a64"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQ",
+    "bb57e6bd078639a31e3762035652ddbaad705f7fda061c4486fbce2b3a470b59"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQR",
+    "bb57e6bd078639a31e3762035652ddbad5c1de41aa0a5d2f03dd129e419b99b9"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRS",
+    "bb57e6bd078639a31e3762035652ddba9ca7c65d2137e0e4e1b752d7d5a7619a"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRST",
+    "bb57e6bd078639a31e3762035652ddba946ca5063ae30b7b068b7a0ddb573143"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRSTU",
+    "bb57e6bd078639a31e3762035652ddba3e53d6b22634ba2d0033aa1f74984017"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRSTUV",
+    "bb57e6bd078639a31e3762035652ddba9be121a85ec7b87d14d069821f241817"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRSTUVW",
+    "bb57e6bd078639a31e3762035652ddbaeb91126c4649fbf256d2698a8b3cd108"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRSTUVWX",
+    "bb57e6bd078639a31e3762035652ddba5fda70f10d9c190691a58c8014226b09"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRSTUVWXY",
+    "bb57e6bd078639a31e3762035652ddbaca22ea606b337f0e549bd6c8134026c2"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
+    "bb57e6bd078639a31e3762035652ddbac5883abd9ff470ad8d5aefe0726131b8"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZA",
+    "bb57e6bd078639a31e3762035652ddba0ba1680b7ca9ca18f9bdc30a2213e138"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZAB",
+    "bb57e6bd078639a31e3762035652ddba34795f08b688add2ac28d579c1e4a735"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZABC",
+    "bb57e6bd078639a31e3762035652ddba5e6174bbd7d9848e19dadc7316a51905"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZABCD",
+    "bb57e6bd078639a31e3762035652ddba758897c9b84584efaf7bba27e80e2971"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDE",
+    "bb57e6bd078639a31e3762035652ddba23aecf5b5981c3a0b9967c6d5faf2f44"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF",
+    "bb57e6bd078639a31e3762035652ddbace7c8364cc84b579dbb16765cba58de65123694ddc958e0c9436f6687338fc6e"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFG",
+    "bb57e6bd078639a31e3762035652ddbace7c8364cc84b579dbb16765cba58de659650a237cd9a2764e9b92749843fd22"
+  ]
+];
+
+Promise.all(testCases.map(function(testCase){
+    var expectedPlainText = testCase[0];
+    var cipherText = testCase[1];
+    return crypto.subtle.importKey("raw", rawKey, "aes-cbc", extractable, ["decrypt"]).then(function(key) {
+        return crypto.subtle.decrypt(aesCbcParams, key, hexStringToUint8Array(cipherText));
+    }).then(function(plainText) {
+        return {
+            plainText: plainText,
+            cipherText: cipherText,
+            expectedPlainText: expectedPlainText
+        };
+    });
+})).then(function(results) {
+    for (var result of results) {
+        plainText = result.plainText;
+        cipherText = result.cipherText;
+        expectedPlainText = result.expectedPlainText;
+        debug("Expected plain text: " + expectedPlainText);
+        shouldBe("bytesToASCIIString(plainText)", "expectedPlainText");
+    }
     finishJSTest();
 });
 
index 322e1aa..bac3d2e 100644 (file)
@@ -3,6 +3,73 @@ Test encrypting using AES-CBC with an imported 128bit key
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
+Plain text: 
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: A
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: AB
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABC
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCD
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDE
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEF
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFG
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFGH
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFGHI
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFGHIJ
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFGHIJK
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFGHIJKL
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFGHIJKLM
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFGHIJKLMN
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFGHIJKLMNO
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFGHIJKLMNOP
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFGHIJKLMNOPQ
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFGHIJKLMNOPQR
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFGHIJKLMNOPQRS
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFGHIJKLMNOPQRST
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFGHIJKLMNOPQRSTU
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFGHIJKLMNOPQRSTUV
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFGHIJKLMNOPQRSTUVW
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFGHIJKLMNOPQRSTUVWX
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFGHIJKLMNOPQRSTUVWXY
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFGHIJKLMNOPQRSTUVWXYZ
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFGHIJKLMNOPQRSTUVWXYZA
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFGHIJKLMNOPQRSTUVWXYZAB
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFGHIJKLMNOPQRSTUVWXYZABC
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFGHIJKLMNOPQRSTUVWXYZABCD
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDE
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF
+PASS bytesToHexString(cipherText) is expectedCipherText
+Plain text: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFG
 PASS bytesToHexString(cipherText) is expectedCipherText
 PASS successfullyParsed is true
 
index f4a14e6..595ca3a 100644 (file)
@@ -14,21 +14,177 @@ description("Test encrypting using AES-CBC with an imported 128bit key");
 jsTestIsAsync = true;
 
 var extractable = false;
-var plainText = asciiToUint8Array("Hello, World!");
+
 var aesCbcParams = {
     name: "aes-cbc",
     iv: asciiToUint8Array("jnOw99oOZFLIEPMr"),
 }
 var rawKey = asciiToUint8Array("jnOw99oOZFLIEPMr");
-var expectedCipherText = "2ffa4618784dfd414b22c40c6330d022";
 
-crypto.subtle.importKey("raw", rawKey, "aes-cbc", extractable, ["encrypt"]).then(function(key) {
-    return crypto.subtle.encrypt(aesCbcParams, key, plainText);
-}).then(function(result) {
-    cipherText = result;
+// Test 0 ~ 33 bytes plain text data.
+// It covers the boundary values where the padding size are changed, namely, 0, 1, 15, 16, 17, 31, 32, and 33.
+// 16 comes from the AES-CBC block size, which is 128bit = 16 bytes.
 
-    shouldBe("bytesToHexString(cipherText)", "expectedCipherText");
+// Pair of plain text and expected cipher text
+var testCases = [
+  [
+    "",
+    "54695f2b49d2c35b5f4675c59669c7d5"
+  ],
+  [
+    "A",
+    "7f3224da4b207bd3b55a3ba55f95c8dd"
+  ],
+  [
+    "AB",
+    "05b7b4caa28897ff5fa0b8cac9821070"
+  ],
+  [
+    "ABC",
+    "c5fcd82c93ca70630e77871408cb60a5"
+  ],
+  [
+    "ABCD",
+    "8c68b0ba2952761877f30e26eb43e98b"
+  ],
+  [
+    "ABCDE",
+    "6e5845ce085801492ecdb3da47e54e0d"
+  ],
+  [
+    "ABCDEF",
+    "a2bf7011f0560504fd2d3f6f4fa85179"
+  ],
+  [
+    "ABCDEFG",
+    "bfbe3717d97b8e8dbb362aa32a5d6715"
+  ],
+  [
+    "ABCDEFGH",
+    "ac55dadf6d3d1be1fede0e33e9de021a"
+  ],
+  [
+    "ABCDEFGHI",
+    "f5adfd70b6a907441aa1e1b8d03138b8"
+  ],
+  [
+    "ABCDEFGHIJ",
+    "b4a2d688f3a9bd307efe62643d80ead0"
+  ],
+  [
+    "ABCDEFGHIJK",
+    "d5cce76a9416b3c00c4d2e0bb2879134"
+  ],
+  [
+    "ABCDEFGHIJKL",
+    "7b87f2b55433d595ed02cd3417c510a4"
+  ],
+  [
+    "ABCDEFGHIJKLM",
+    "29f5af157bda78fdde9550aaadfc467d"
+  ],
+  [
+    "ABCDEFGHIJKLMN",
+    "bd86ff3b780b56d4faf98bd7f818de59"
+  ],
+  [
+    "ABCDEFGHIJKLMNO",
+    "8f7d4ffd08155e67b2f936aa7eedd918"
+  ],
+  [
+    "ABCDEFGHIJKLMNOP",
+    "bb57e6bd078639a31e3762035652ddba8b641840a083e33027a0aea305e95a64"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQ",
+    "bb57e6bd078639a31e3762035652ddbaad705f7fda061c4486fbce2b3a470b59"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQR",
+    "bb57e6bd078639a31e3762035652ddbad5c1de41aa0a5d2f03dd129e419b99b9"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRS",
+    "bb57e6bd078639a31e3762035652ddba9ca7c65d2137e0e4e1b752d7d5a7619a"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRST",
+    "bb57e6bd078639a31e3762035652ddba946ca5063ae30b7b068b7a0ddb573143"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRSTU",
+    "bb57e6bd078639a31e3762035652ddba3e53d6b22634ba2d0033aa1f74984017"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRSTUV",
+    "bb57e6bd078639a31e3762035652ddba9be121a85ec7b87d14d069821f241817"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRSTUVW",
+    "bb57e6bd078639a31e3762035652ddbaeb91126c4649fbf256d2698a8b3cd108"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRSTUVWX",
+    "bb57e6bd078639a31e3762035652ddba5fda70f10d9c190691a58c8014226b09"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRSTUVWXY",
+    "bb57e6bd078639a31e3762035652ddbaca22ea606b337f0e549bd6c8134026c2"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
+    "bb57e6bd078639a31e3762035652ddbac5883abd9ff470ad8d5aefe0726131b8"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZA",
+    "bb57e6bd078639a31e3762035652ddba0ba1680b7ca9ca18f9bdc30a2213e138"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZAB",
+    "bb57e6bd078639a31e3762035652ddba34795f08b688add2ac28d579c1e4a735"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZABC",
+    "bb57e6bd078639a31e3762035652ddba5e6174bbd7d9848e19dadc7316a51905"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZABCD",
+    "bb57e6bd078639a31e3762035652ddba758897c9b84584efaf7bba27e80e2971"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDE",
+    "bb57e6bd078639a31e3762035652ddba23aecf5b5981c3a0b9967c6d5faf2f44"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEF",
+    "bb57e6bd078639a31e3762035652ddbace7c8364cc84b579dbb16765cba58de65123694ddc958e0c9436f6687338fc6e"
+  ],
+  [
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFG",
+    "bb57e6bd078639a31e3762035652ddbace7c8364cc84b579dbb16765cba58de659650a237cd9a2764e9b92749843fd22"
+  ]
+];
 
+Promise.all(testCases.map(function(testCase){
+    var plainText = testCase[0];
+    var expectedCipherText = testCase[1];
+    return crypto.subtle.importKey("raw", rawKey, "aes-cbc", extractable, ["encrypt"]).then(function(key) {
+        return crypto.subtle.encrypt(aesCbcParams, key, asciiToUint8Array(plainText));
+    }).then(function(cipherText) {
+        return {
+            plainText: plainText,
+            cipherText: cipherText,
+            expectedCipherText: expectedCipherText
+        };
+    });
+})).then(function(results) {
+    for (var result of results) {
+        plainText = result.plainText;
+        cipherText = result.cipherText;
+        expectedCipherText = result.expectedCipherText;
+        debug("Plain text: " + plainText);
+        shouldBe("bytesToHexString(cipherText)", "expectedCipherText");
+    }
     finishJSTest();
 });