<!DOCTYPE html>
<html>
<head>
<script src="../../../resources/js-test.js"></script>
<script src="../resources/common.js"></script>
</head>
<body>
<p id="description"></p>
<div id="console"></div>

<script>
description("Tests encrypt/decrypt for AES-CBC");

jsTestIsAsync = true;

// -------------------------------------------------
// Successful encryption/decryption
// -------------------------------------------------

// Test vectors marked with [1] were copied from:
//   http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
//
// The NIST tests do not have a padding block. To match the WebCrypto
// expectations, a PKCS#5 padding block has been added.

var kAesCbcSuccessVectors = [
  // 128-bit key with plaintext that is an exact multiple of block size.
  // Derived from [1] F.2.1 (CBC-AES128.Encrypt), by adding padding block.
  {
    key: "2b7e151628aed2a6abf7158809cf4f3c",
    iv: "000102030405060708090a0b0c0d0e0f",
    plainText: "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710",
    cipherText: "7649abac8119b246cee98e9b12e9197d5086cb9b507219ee95db113a917678b273bed6b8e3c1743b7116e69e222295163ff1caa1681fac09120eca307586e1a7" +
                // Padding block.
                "8cb82807230e1321d3fae00d18cc2012"
  },

  // 256-bit key, where final block of plaintext has to pad by 3.
  // Derived from [1] F.2.6 CBC-AES256.Decrypt, by stripping 3 bytes off
  // plaintext and adding padding block.
  {
    key: "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4",
    iv: "000102030405060708090a0b0c0d0e0f",
    plainText: "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be6",
    cipherText: "f58c4c04d6e5f1ba779eabfb5f7bfbd69cfc4e967edb808d679f777bc6702c7d39f23369a9d9bacfa530e26304231461c9aaf02a6a54e9e242ccbf48c59daca6"
  },

  // 128-bit key, with empty plaintext.
  // Derived from Chromium's EncryptorTest.EmptyEncrypt() (encryptor_unittest.cc)
  {
    key: "3132383d5369787465656e4279746573",
    iv: "5377656574205369787465656e204956",
    plainText: "",
    cipherText: "8518b8878d34e7185e300d0fcc426396"
  },
];

function runAesCbcSuccessTestCase(testCase)
{
    var algorithm = {name: 'aes-cbc', iv: hexStringToUint8Array(testCase.iv)};

    var key = null;
    var keyData = hexStringToUint8Array(testCase.key);
    var usages = ['encrypt', 'decrypt'];
    var extractable = false;

    // (1) Import the key
    return crypto.subtle.importKey('raw', keyData, algorithm, extractable, usages).then(function(result) {
        key = result;
        
        // shouldBe() can only resolve variables in global context.
        tmpKey = key;
        shouldEvaluateAs("tmpKey.type", "secret");
        shouldEvaluateAs("tmpKey.extractable", false);
        shouldEvaluateAs("tmpKey.algorithm.name", "AES-CBC");
        shouldEvaluateAs("tmpKey.algorithm.length", keyData.byteLength * 8);
        shouldEvaluateAs("tmpKey.usages.join(',')", "encrypt,decrypt");

        // (2) Encrypt.
        return crypto.subtle.encrypt(algorithm, key, hexStringToUint8Array(testCase.plainText));
    }).then(function(result) {
        bytesShouldMatchHexString("Encryption", testCase.cipherText, result);

        // (3) Decrypt
        return crypto.subtle.decrypt(algorithm, key, hexStringToUint8Array(testCase.cipherText));
    }).then(function(result) {
        bytesShouldMatchHexString("Decryption", testCase.plainText, result);
    });
}

var lastPromise = Promise.resolve(null);

kAesCbcSuccessVectors.forEach(function(test) {
    lastPromise = lastPromise.then(runAesCbcSuccessTestCase.bind(null, test));
});

lastPromise.then(finishJSTest, failAndFinishJSTest);

</script>

</body>
</html>
