| Index: content/child/webcrypto/shared_crypto_unittest.cc
 | 
| diff --git a/content/child/webcrypto/shared_crypto_unittest.cc b/content/child/webcrypto/shared_crypto_unittest.cc
 | 
| index 43ff8d8f3009655582535864e8995db62f26c63d..3beadc476170cd9b88ad1d7204d2ec19bf300580 100644
 | 
| --- a/content/child/webcrypto/shared_crypto_unittest.cc
 | 
| +++ b/content/child/webcrypto/shared_crypto_unittest.cc
 | 
| @@ -23,7 +23,6 @@
 | 
|  #include "content/child/webcrypto/webcrypto_util.h"
 | 
|  #include "content/public/common/content_paths.h"
 | 
|  #include "testing/gtest/include/gtest/gtest.h"
 | 
| -#include "third_party/WebKit/public/platform/WebArrayBuffer.h"
 | 
|  #include "third_party/WebKit/public/platform/WebCryptoAlgorithm.h"
 | 
|  #include "third_party/WebKit/public/platform/WebCryptoAlgorithmParams.h"
 | 
|  #include "third_party/WebKit/public/platform/WebCryptoKey.h"
 | 
| @@ -38,10 +37,19 @@
 | 
|  #define MAYBE(test_name) test_name
 | 
|  #endif
 | 
|  
 | 
| +#define EXPECT_BYTES_EQ(expected, actual) \
 | 
| +  EXPECT_EQ(CryptoData(expected), CryptoData(actual))
 | 
| +
 | 
| +#define EXPECT_BYTES_EQ_HEX(expected_hex, actual_bytes) \
 | 
| +  EXPECT_BYTES_EQ(HexStringToBytes(expected_hex), actual_bytes)
 | 
| +
 | 
|  namespace content {
 | 
|  
 | 
|  namespace webcrypto {
 | 
|  
 | 
| +// These functions are used by GTEST to support EXPECT_EQ() for
 | 
| +// webcrypto::Status and webcrypto::CryptoData
 | 
| +
 | 
|  void PrintTo(const Status& status, ::std::ostream* os) {
 | 
|    if (status.IsSuccess())
 | 
|      *os << "Success";
 | 
| @@ -65,88 +73,17 @@ bool operator!=(const content::webcrypto::Status& a,
 | 
|    return !(a == b);
 | 
|  }
 | 
|  
 | 
| -namespace {
 | 
| -
 | 
| -// -----------------------------------------------------------------------------
 | 
| -// TODO(eroman): Remove these helpers and convert all of the tests to using the
 | 
| -//               std::vector<> flavor of functions directly.
 | 
| -// -----------------------------------------------------------------------------
 | 
| -
 | 
| -blink::WebArrayBuffer CreateArrayBuffer(const uint8* data,
 | 
| -                                        unsigned int data_size) {
 | 
| -  blink::WebArrayBuffer buffer = blink::WebArrayBuffer::create(data_size, 1);
 | 
| -  DCHECK(!buffer.isNull());
 | 
| -  if (data_size)  // data_size == 0 might mean the data pointer is invalid
 | 
| -    memcpy(buffer.data(), data, data_size);
 | 
| -  return buffer;
 | 
| +void PrintTo(const CryptoData& data, ::std::ostream* os) {
 | 
| +  *os << "[" << base::HexEncode(data.bytes(), data.byte_length()) << "]";
 | 
|  }
 | 
|  
 | 
| -void AssignWebArrayBuffer(const std::vector<uint8>& in,
 | 
| -                          blink::WebArrayBuffer* out) {
 | 
| -  *out = CreateArrayBuffer(Uint8VectorStart(in), in.size());
 | 
| +bool operator==(const content::webcrypto::CryptoData& a,
 | 
| +                const content::webcrypto::CryptoData& b) {
 | 
| +  return a.byte_length() == b.byte_length() &&
 | 
| +         memcmp(a.bytes(), b.bytes(), a.byte_length()) == 0;
 | 
|  }
 | 
|  
 | 
| -Status Encrypt(const blink::WebCryptoAlgorithm& algorithm,
 | 
| -               const blink::WebCryptoKey& key,
 | 
| -               const CryptoData& data,
 | 
| -               blink::WebArrayBuffer* web_buffer) {
 | 
| -  std::vector<uint8> buffer;
 | 
| -  Status status = Encrypt(algorithm, key, data, &buffer);
 | 
| -  AssignWebArrayBuffer(buffer, web_buffer);
 | 
| -  return status;
 | 
| -}
 | 
| -
 | 
| -Status Decrypt(const blink::WebCryptoAlgorithm& algorithm,
 | 
| -               const blink::WebCryptoKey& key,
 | 
| -               const CryptoData& data,
 | 
| -               blink::WebArrayBuffer* web_buffer) {
 | 
| -  std::vector<uint8> buffer;
 | 
| -  Status status = Decrypt(algorithm, key, data, &buffer);
 | 
| -  AssignWebArrayBuffer(buffer, web_buffer);
 | 
| -  return status;
 | 
| -}
 | 
| -
 | 
| -Status Digest(const blink::WebCryptoAlgorithm& algorithm,
 | 
| -              const CryptoData& data,
 | 
| -              blink::WebArrayBuffer* web_buffer) {
 | 
| -  std::vector<uint8> buffer;
 | 
| -  Status status = Digest(algorithm, data, &buffer);
 | 
| -  AssignWebArrayBuffer(buffer, web_buffer);
 | 
| -  return status;
 | 
| -}
 | 
| -
 | 
| -Status ExportKey(blink::WebCryptoKeyFormat format,
 | 
| -                 const blink::WebCryptoKey& key,
 | 
| -                 blink::WebArrayBuffer* web_buffer) {
 | 
| -  std::vector<uint8> buffer;
 | 
| -  Status status = webcrypto::ExportKey(format, key, &buffer);
 | 
| -  AssignWebArrayBuffer(buffer, web_buffer);
 | 
| -  return status;
 | 
| -}
 | 
| -
 | 
| -Status Sign(const blink::WebCryptoAlgorithm& algorithm,
 | 
| -            const blink::WebCryptoKey& key,
 | 
| -            const CryptoData& data,
 | 
| -            blink::WebArrayBuffer* web_buffer) {
 | 
| -  std::vector<uint8> buffer;
 | 
| -
 | 
| -  Status status = Sign(algorithm, key, data, &buffer);
 | 
| -  AssignWebArrayBuffer(buffer, web_buffer);
 | 
| -  return status;
 | 
| -}
 | 
| -
 | 
| -Status WrapKey(blink::WebCryptoKeyFormat format,
 | 
| -               const blink::WebCryptoKey& wrapping_key,
 | 
| -               const blink::WebCryptoKey& key_to_wrap,
 | 
| -               const blink::WebCryptoAlgorithm& wrapping_algorithm,
 | 
| -               blink::WebArrayBuffer* web_buffer) {
 | 
| -  std::vector<uint8> buffer;
 | 
| -
 | 
| -  Status status = webcrypto::WrapKey(
 | 
| -      format, wrapping_key, key_to_wrap, wrapping_algorithm, &buffer);
 | 
| -  AssignWebArrayBuffer(buffer, web_buffer);
 | 
| -  return status;
 | 
| -}
 | 
| +namespace {
 | 
|  
 | 
|  // -----------------------------------------------------------------------------
 | 
|  
 | 
| @@ -255,34 +192,6 @@ std::vector<uint8> HexStringToBytes(const std::string& hex) {
 | 
|    return bytes;
 | 
|  }
 | 
|  
 | 
| -::testing::AssertionResult ArrayBufferMatches(
 | 
| -    const std::vector<uint8>& expected,
 | 
| -    const blink::WebArrayBuffer& actual) {
 | 
| -  if (base::HexEncode(webcrypto::Uint8VectorStart(expected), expected.size()) ==
 | 
| -      base::HexEncode(actual.data(), actual.byteLength()))
 | 
| -    return ::testing::AssertionSuccess();
 | 
| -  return ::testing::AssertionFailure();
 | 
| -}
 | 
| -
 | 
| -void ExpectCryptoDataMatchesHex(const std::string& expected_hex,
 | 
| -                                const CryptoData& actual) {
 | 
| -  EXPECT_STRCASEEQ(
 | 
| -      expected_hex.c_str(),
 | 
| -      base::HexEncode(actual.bytes(), actual.byte_length()).c_str());
 | 
| -}
 | 
| -
 | 
| -void ExpectArrayBufferMatchesHex(const std::string& expected_hex,
 | 
| -                                 const blink::WebArrayBuffer& array_buffer) {
 | 
| -  ExpectCryptoDataMatchesHex(expected_hex, CryptoData(array_buffer));
 | 
| -}
 | 
| -
 | 
| -void ExpectVectorMatches(const std::vector<uint8>& expected,
 | 
| -                         const std::vector<uint8>& actual) {
 | 
| -  EXPECT_EQ(
 | 
| -      base::HexEncode(webcrypto::Uint8VectorStart(expected), expected.size()),
 | 
| -      base::HexEncode(webcrypto::Uint8VectorStart(actual), actual.size()));
 | 
| -}
 | 
| -
 | 
|  std::vector<uint8> MakeJsonVector(const std::string& json_string) {
 | 
|    return std::vector<uint8>(json_string.begin(), json_string.end());
 | 
|  }
 | 
| @@ -378,10 +287,12 @@ blink::WebCryptoAlgorithm GetDigestAlgorithm(base::DictionaryValue* dict,
 | 
|    struct {
 | 
|      const char* name;
 | 
|      blink::WebCryptoAlgorithmId id;
 | 
| -  } kDigestNameToId[] = {{"sha-1", blink::WebCryptoAlgorithmIdSha1},
 | 
| -                         {"sha-256", blink::WebCryptoAlgorithmIdSha256},
 | 
| -                         {"sha-384", blink::WebCryptoAlgorithmIdSha384},
 | 
| -                         {"sha-512", blink::WebCryptoAlgorithmIdSha512}, };
 | 
| +  } kDigestNameToId[] = {
 | 
| +        {"sha-1", blink::WebCryptoAlgorithmIdSha1},
 | 
| +        {"sha-256", blink::WebCryptoAlgorithmIdSha256},
 | 
| +        {"sha-384", blink::WebCryptoAlgorithmIdSha384},
 | 
| +        {"sha-512", blink::WebCryptoAlgorithmIdSha512},
 | 
| +    };
 | 
|  
 | 
|    for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kDigestNameToId); ++i) {
 | 
|      if (kDigestNameToId[i].name == algorithm_name)
 | 
| @@ -418,18 +329,13 @@ void RestoreJwkRsaDictionary(base::DictionaryValue* dict) {
 | 
|    dict->SetString("e", "AQAB");
 | 
|  }
 | 
|  
 | 
| -// Determines if two ArrayBuffers have identical content.
 | 
| -bool ArrayBuffersEqual(const blink::WebArrayBuffer& a,
 | 
| -                       const blink::WebArrayBuffer& b) {
 | 
| -  return a.byteLength() == b.byteLength() &&
 | 
| -         memcmp(a.data(), b.data(), a.byteLength()) == 0;
 | 
| -}
 | 
| -
 | 
| -// Given a vector of WebArrayBuffers, determines if there are any copies.
 | 
| -bool CopiesExist(std::vector<blink::WebArrayBuffer> bufs) {
 | 
| +// Returns true if any of the vectors in the input list have identical content.
 | 
| +// Dumb O(n^2) implementation but should be fast enough for the input sizes that
 | 
| +// are used.
 | 
| +bool CopiesExist(const std::vector<std::vector<uint8> >& bufs) {
 | 
|    for (size_t i = 0; i < bufs.size(); ++i) {
 | 
|      for (size_t j = i + 1; j < bufs.size(); ++j) {
 | 
| -      if (ArrayBuffersEqual(bufs[i], bufs[j]))
 | 
| +      if (CryptoData(bufs[i]) == CryptoData(bufs[j]))
 | 
|          return true;
 | 
|      }
 | 
|    }
 | 
| @@ -573,23 +479,28 @@ Status AesGcmEncrypt(const blink::WebCryptoKey& key,
 | 
|    blink::WebCryptoAlgorithm algorithm =
 | 
|        CreateAesGcmAlgorithm(iv, additional_data, tag_length_bits);
 | 
|  
 | 
| -  blink::WebArrayBuffer output;
 | 
| +  std::vector<uint8> output;
 | 
|    Status status = Encrypt(algorithm, key, CryptoData(plain_text), &output);
 | 
|    if (status.IsError())
 | 
|      return status;
 | 
|  
 | 
| -  if (output.byteLength() * 8 < tag_length_bits) {
 | 
| -    EXPECT_TRUE(false);
 | 
| +  if ((tag_length_bits % 8) != 0) {
 | 
| +    EXPECT_TRUE(false) << "Encrypt should have failed.";
 | 
| +    return Status::OperationError();
 | 
| +  }
 | 
| +
 | 
| +  size_t tag_length_bytes = tag_length_bits / 8;
 | 
| +
 | 
| +  if (tag_length_bytes > output.size()) {
 | 
| +    EXPECT_TRUE(false) << "tag length is larger than output";
 | 
|      return Status::OperationError();
 | 
|    }
 | 
|  
 | 
|    // The encryption result is cipher text with authentication tag appended.
 | 
| -  cipher_text->assign(static_cast<uint8*>(output.data()),
 | 
| -                      static_cast<uint8*>(output.data()) +
 | 
| -                          (output.byteLength() - tag_length_bits / 8));
 | 
| -  authentication_tag->assign(
 | 
| -      static_cast<uint8*>(output.data()) + cipher_text->size(),
 | 
| -      static_cast<uint8*>(output.data()) + output.byteLength());
 | 
| +  cipher_text->assign(output.begin(),
 | 
| +                      output.begin() + (output.size() - tag_length_bytes));
 | 
| +  authentication_tag->assign(output.begin() + cipher_text->size(),
 | 
| +                             output.end());
 | 
|  
 | 
|    return Status::Success();
 | 
|  }
 | 
| @@ -600,7 +511,7 @@ Status AesGcmDecrypt(const blink::WebCryptoKey& key,
 | 
|                       unsigned int tag_length_bits,
 | 
|                       const std::vector<uint8>& cipher_text,
 | 
|                       const std::vector<uint8>& authentication_tag,
 | 
| -                     blink::WebArrayBuffer* plain_text) {
 | 
| +                     std::vector<uint8>* plain_text) {
 | 
|    EXPECT_TRUE(SupportsAesGcm());
 | 
|    blink::WebCryptoAlgorithm algorithm =
 | 
|        CreateAesGcmAlgorithm(iv, additional_data, tag_length_bits);
 | 
| @@ -642,11 +553,11 @@ Status ImportKeyJwkFromDict(const base::DictionaryValue& dict,
 | 
|                        key);
 | 
|  }
 | 
|  
 | 
| -// Parses an ArrayBuffer of JSON into a dictionary.
 | 
| +// Parses a vector of JSON into a dictionary.
 | 
|  scoped_ptr<base::DictionaryValue> GetJwkDictionary(
 | 
| -    const blink::WebArrayBuffer& json) {
 | 
| -  base::StringPiece json_string(reinterpret_cast<const char*>(json.data()),
 | 
| -                                json.byteLength());
 | 
| +    const std::vector<uint8>& json) {
 | 
| +  base::StringPiece json_string(
 | 
| +      reinterpret_cast<const char*>(Uint8VectorStart(json)), json.size());
 | 
|    base::Value* value = base::JSONReader::Read(json_string);
 | 
|    EXPECT_TRUE(value);
 | 
|    base::DictionaryValue* dict_value = NULL;
 | 
| @@ -703,10 +614,10 @@ scoped_ptr<base::DictionaryValue> GetJwkDictionary(
 | 
|    return ::testing::AssertionSuccess();
 | 
|  }
 | 
|  
 | 
| -// Verifies that the JSON in the input ArrayBuffer contains the provided
 | 
| +// Verifies that the JSON in the input vector contains the provided
 | 
|  // expected values. Exact matches are required on the fields examined.
 | 
|  ::testing::AssertionResult VerifySecretJwk(
 | 
| -    const blink::WebArrayBuffer& json,
 | 
| +    const std::vector<uint8>& json,
 | 
|      const std::string& alg_expected,
 | 
|      const std::string& k_expected_hex,
 | 
|      blink::WebCryptoKeyUsageMask use_mask_expected) {
 | 
| @@ -731,10 +642,10 @@ scoped_ptr<base::DictionaryValue> GetJwkDictionary(
 | 
|    return VerifyJwk(dict, "oct", alg_expected, use_mask_expected);
 | 
|  }
 | 
|  
 | 
| -// Verifies that the JSON in the input ArrayBuffer contains the provided
 | 
| +// Verifies that the JSON in the input vector contains the provided
 | 
|  // expected values. Exact matches are required on the fields examined.
 | 
|  ::testing::AssertionResult VerifyPublicJwk(
 | 
| -    const blink::WebArrayBuffer& json,
 | 
| +    const std::vector<uint8>& json,
 | 
|      const std::string& alg_expected,
 | 
|      const std::string& n_expected_hex,
 | 
|      const std::string& e_expected_hex,
 | 
| @@ -849,10 +760,10 @@ TEST_F(SharedCryptoTest, DigestSampleSets) {
 | 
|      std::vector<uint8> test_input = GetBytesFromHexString(test, "input");
 | 
|      std::vector<uint8> test_output = GetBytesFromHexString(test, "output");
 | 
|  
 | 
| -    blink::WebArrayBuffer output;
 | 
| +    std::vector<uint8> output;
 | 
|      ASSERT_EQ(Status::Success(),
 | 
|                Digest(test_algorithm, CryptoData(test_input), &output));
 | 
| -    EXPECT_TRUE(ArrayBufferMatches(test_output, output));
 | 
| +    EXPECT_BYTES_EQ(test_output, output);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -889,8 +800,7 @@ TEST_F(SharedCryptoTest, DigestSampleSetsInChunks) {
 | 
|        begin = begin + chunk_length;
 | 
|      }
 | 
|      EXPECT_TRUE(digestor->finish(output, output_length));
 | 
| -    ExpectVectorMatches(test_output,
 | 
| -                        std::vector<uint8>(output, output + output_length));
 | 
| +    EXPECT_BYTES_EQ(test_output, CryptoData(output, output_length));
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -924,17 +834,17 @@ TEST_F(SharedCryptoTest, HMACSampleSets) {
 | 
|      EXPECT_EQ(test_key.size() * 8, key.algorithm().hmacParams()->lengthBits());
 | 
|  
 | 
|      // Verify exported raw key is identical to the imported data
 | 
| -    blink::WebArrayBuffer raw_key;
 | 
| +    std::vector<uint8> raw_key;
 | 
|      EXPECT_EQ(Status::Success(),
 | 
|                ExportKey(blink::WebCryptoKeyFormatRaw, key, &raw_key));
 | 
| -    EXPECT_TRUE(ArrayBufferMatches(test_key, raw_key));
 | 
| +    EXPECT_BYTES_EQ(test_key, raw_key);
 | 
|  
 | 
| -    blink::WebArrayBuffer output;
 | 
| +    std::vector<uint8> output;
 | 
|  
 | 
|      ASSERT_EQ(Status::Success(),
 | 
|                Sign(algorithm, key, CryptoData(test_message), &output));
 | 
|  
 | 
| -    EXPECT_TRUE(ArrayBufferMatches(test_mac, output));
 | 
| +    EXPECT_BYTES_EQ(test_mac, output);
 | 
|  
 | 
|      bool signature_match = false;
 | 
|      EXPECT_EQ(Status::Success(),
 | 
| @@ -946,14 +856,13 @@ TEST_F(SharedCryptoTest, HMACSampleSets) {
 | 
|      EXPECT_TRUE(signature_match);
 | 
|  
 | 
|      // Ensure truncated signature does not verify by passing one less byte.
 | 
| -    EXPECT_EQ(Status::Success(),
 | 
| -              VerifySignature(
 | 
| -                  algorithm,
 | 
| -                  key,
 | 
| -                  CryptoData(static_cast<const unsigned char*>(output.data()),
 | 
| -                             output.byteLength() - 1),
 | 
| -                  CryptoData(test_message),
 | 
| -                  &signature_match));
 | 
| +    EXPECT_EQ(
 | 
| +        Status::Success(),
 | 
| +        VerifySignature(algorithm,
 | 
| +                        key,
 | 
| +                        CryptoData(Uint8VectorStart(output), output.size() - 1),
 | 
| +                        CryptoData(test_message),
 | 
| +                        &signature_match));
 | 
|      EXPECT_FALSE(signature_match);
 | 
|  
 | 
|      // Ensure truncated signature does not verify by passing no bytes.
 | 
| @@ -986,12 +895,12 @@ TEST_F(SharedCryptoTest, AesCbcFailures) {
 | 
|        blink::WebCryptoKeyUsageEncrypt | blink::WebCryptoKeyUsageDecrypt);
 | 
|  
 | 
|    // Verify exported raw key is identical to the imported data
 | 
| -  blink::WebArrayBuffer raw_key;
 | 
| +  std::vector<uint8> raw_key;
 | 
|    EXPECT_EQ(Status::Success(),
 | 
|              ExportKey(blink::WebCryptoKeyFormatRaw, key, &raw_key));
 | 
| -  ExpectArrayBufferMatchesHex(key_hex, raw_key);
 | 
| +  EXPECT_BYTES_EQ_HEX(key_hex, raw_key);
 | 
|  
 | 
| -  blink::WebArrayBuffer output;
 | 
| +  std::vector<uint8> output;
 | 
|  
 | 
|    // Use an invalid |iv| (fewer than 16 bytes)
 | 
|    {
 | 
| @@ -1088,12 +997,12 @@ TEST_F(SharedCryptoTest, MAYBE(AesCbcSampleSets)) {
 | 
|      EXPECT_EQ(test_key.size() * 8, key.algorithm().aesParams()->lengthBits());
 | 
|  
 | 
|      // Verify exported raw key is identical to the imported data
 | 
| -    blink::WebArrayBuffer raw_key;
 | 
| +    std::vector<uint8> raw_key;
 | 
|      EXPECT_EQ(Status::Success(),
 | 
|                ExportKey(blink::WebCryptoKeyFormatRaw, key, &raw_key));
 | 
| -    EXPECT_TRUE(ArrayBufferMatches(test_key, raw_key));
 | 
| +    EXPECT_BYTES_EQ(test_key, raw_key);
 | 
|  
 | 
| -    blink::WebArrayBuffer output;
 | 
| +    std::vector<uint8> output;
 | 
|  
 | 
|      // Test encryption.
 | 
|      EXPECT_EQ(Status::Success(),
 | 
| @@ -1101,7 +1010,7 @@ TEST_F(SharedCryptoTest, MAYBE(AesCbcSampleSets)) {
 | 
|                        key,
 | 
|                        CryptoData(test_plain_text),
 | 
|                        &output));
 | 
| -    EXPECT_TRUE(ArrayBufferMatches(test_cipher_text, output));
 | 
| +    EXPECT_BYTES_EQ(test_cipher_text, output);
 | 
|  
 | 
|      // Test decryption.
 | 
|      EXPECT_EQ(Status::Success(),
 | 
| @@ -1109,7 +1018,7 @@ TEST_F(SharedCryptoTest, MAYBE(AesCbcSampleSets)) {
 | 
|                        key,
 | 
|                        CryptoData(test_cipher_text),
 | 
|                        &output));
 | 
| -    EXPECT_TRUE(ArrayBufferMatches(test_plain_text, output));
 | 
| +    EXPECT_BYTES_EQ(test_plain_text, output);
 | 
|  
 | 
|      const unsigned int kAesCbcBlockSize = 16;
 | 
|  
 | 
| @@ -1149,8 +1058,8 @@ TEST_F(SharedCryptoTest, MAYBE(GenerateKeyAes)) {
 | 
|        algorithm.push_back(CreateAesGcmKeyGenAlgorithm(kKeyLength[i]));
 | 
|    }
 | 
|    blink::WebCryptoKey key = blink::WebCryptoKey::createNull();
 | 
| -  std::vector<blink::WebArrayBuffer> keys;
 | 
| -  blink::WebArrayBuffer key_bytes;
 | 
| +  std::vector<std::vector<uint8> > keys;
 | 
| +  std::vector<uint8> key_bytes;
 | 
|    for (size_t i = 0; i < algorithm.size(); ++i) {
 | 
|      SCOPED_TRACE(i);
 | 
|      // Generate a small sample of keys.
 | 
| @@ -1162,7 +1071,7 @@ TEST_F(SharedCryptoTest, MAYBE(GenerateKeyAes)) {
 | 
|        EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type());
 | 
|        ASSERT_EQ(Status::Success(),
 | 
|                  ExportKey(blink::WebCryptoKeyFormatRaw, key, &key_bytes));
 | 
| -      EXPECT_EQ(key_bytes.byteLength() * 8,
 | 
| +      EXPECT_EQ(key_bytes.size() * 8,
 | 
|                  key.algorithm().aesParams()->lengthBits());
 | 
|        keys.push_back(key_bytes);
 | 
|      }
 | 
| @@ -1193,9 +1102,9 @@ TEST_F(SharedCryptoTest, MAYBE(GenerateKeyAesBadLength)) {
 | 
|  
 | 
|  TEST_F(SharedCryptoTest, MAYBE(GenerateKeyHmac)) {
 | 
|    // Generate a small sample of HMAC keys.
 | 
| -  std::vector<blink::WebArrayBuffer> keys;
 | 
| +  std::vector<std::vector<uint8> > keys;
 | 
|    for (int i = 0; i < 16; ++i) {
 | 
| -    blink::WebArrayBuffer key_bytes;
 | 
| +    std::vector<uint8> key_bytes;
 | 
|      blink::WebCryptoKey key = blink::WebCryptoKey::createNull();
 | 
|      blink::WebCryptoAlgorithm algorithm =
 | 
|          CreateHmacKeyGenAlgorithm(blink::WebCryptoAlgorithmIdSha1, 512);
 | 
| @@ -1208,10 +1117,10 @@ TEST_F(SharedCryptoTest, MAYBE(GenerateKeyHmac)) {
 | 
|                key.algorithm().hmacParams()->hash().id());
 | 
|      EXPECT_EQ(512u, key.algorithm().hmacParams()->lengthBits());
 | 
|  
 | 
| -    blink::WebArrayBuffer raw_key;
 | 
| +    std::vector<uint8> raw_key;
 | 
|      ASSERT_EQ(Status::Success(),
 | 
|                ExportKey(blink::WebCryptoKeyFormatRaw, key, &raw_key));
 | 
| -    EXPECT_EQ(64U, raw_key.byteLength());
 | 
| +    EXPECT_EQ(64U, raw_key.size());
 | 
|      keys.push_back(raw_key);
 | 
|    }
 | 
|    // Ensure all entries in the key sample set are unique. This is a simplistic
 | 
| @@ -1231,10 +1140,10 @@ TEST_F(SharedCryptoTest, MAYBE(GenerateKeyHmacNoLength)) {
 | 
|    EXPECT_EQ(blink::WebCryptoAlgorithmIdSha1,
 | 
|              key.algorithm().hmacParams()->hash().id());
 | 
|    EXPECT_EQ(512u, key.algorithm().hmacParams()->lengthBits());
 | 
| -  blink::WebArrayBuffer raw_key;
 | 
| +  std::vector<uint8> raw_key;
 | 
|    ASSERT_EQ(Status::Success(),
 | 
|              ExportKey(blink::WebCryptoKeyFormatRaw, key, &raw_key));
 | 
| -  EXPECT_EQ(64U, raw_key.byteLength());
 | 
| +  EXPECT_EQ(64U, raw_key.size());
 | 
|  
 | 
|    // The block size for HMAC SHA-512 is larger.
 | 
|    algorithm = CreateHmacKeyGenAlgorithm(blink::WebCryptoAlgorithmIdSha512, 0);
 | 
| @@ -1245,7 +1154,7 @@ TEST_F(SharedCryptoTest, MAYBE(GenerateKeyHmacNoLength)) {
 | 
|    EXPECT_EQ(1024u, key.algorithm().hmacParams()->lengthBits());
 | 
|    ASSERT_EQ(Status::Success(),
 | 
|              ExportKey(blink::WebCryptoKeyFormatRaw, key, &raw_key));
 | 
| -  EXPECT_EQ(128U, raw_key.byteLength());
 | 
| +  EXPECT_EQ(128U, raw_key.size());
 | 
|  }
 | 
|  
 | 
|  TEST_F(SharedCryptoTest, ImportJwkKeyUsage) {
 | 
| @@ -1586,7 +1495,7 @@ TEST_F(SharedCryptoTest, MAYBE(ImportExportJwkRsaPublicKey)) {
 | 
|                          &public_key));
 | 
|  
 | 
|      // Export the public key as JWK and verify its contents
 | 
| -    blink::WebArrayBuffer jwk;
 | 
| +    std::vector<uint8> jwk;
 | 
|      ASSERT_EQ(Status::Success(),
 | 
|                ExportKey(blink::WebCryptoKeyFormatJwk, public_key, &jwk));
 | 
|      EXPECT_TRUE(VerifyPublicJwk(jwk, test.jwk_alg, n_hex, e_hex, test.usage));
 | 
| @@ -1603,10 +1512,10 @@ TEST_F(SharedCryptoTest, MAYBE(ImportExportJwkRsaPublicKey)) {
 | 
|      EXPECT_EQ(test.algorithm.id(), public_key2.algorithm().id());
 | 
|  
 | 
|      // Export the new key as spki and compare to the original.
 | 
| -    blink::WebArrayBuffer spki;
 | 
| +    std::vector<uint8> spki;
 | 
|      ASSERT_EQ(Status::Success(),
 | 
|                ExportKey(blink::WebCryptoKeyFormatSpki, public_key2, &spki));
 | 
| -    ExpectCryptoDataMatchesHex(kPublicKeySpkiDerHex, CryptoData(spki));
 | 
| +    EXPECT_BYTES_EQ_HEX(kPublicKeySpkiDerHex, CryptoData(spki));
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -1818,7 +1727,7 @@ TEST_F(SharedCryptoTest, MAYBE(ImportJwkHappy)) {
 | 
|        "d1b0ae933c65eb06a03c9c935c2bad0459810241347ab87e9f11adb30415424c6c7f5f"
 | 
|        "22a003b8ab8de54f6ded0e3ab9245fa79568451dfa258e");
 | 
|  
 | 
| -  blink::WebArrayBuffer output;
 | 
| +  std::vector<uint8> output;
 | 
|  
 | 
|    ASSERT_EQ(Status::Success(),
 | 
|              Sign(CreateAlgorithm(blink::WebCryptoAlgorithmIdHmac),
 | 
| @@ -1829,7 +1738,7 @@ TEST_F(SharedCryptoTest, MAYBE(ImportJwkHappy)) {
 | 
|    const std::string mac_raw =
 | 
|        "769f00d3e6a6cc1fb426a14a4f76c6462e6149726e0dee0ec0cf97a16605ac8b";
 | 
|  
 | 
| -  ExpectArrayBufferMatchesHex(mac_raw, output);
 | 
| +  EXPECT_BYTES_EQ_HEX(mac_raw, output);
 | 
|  
 | 
|    // TODO(padolph): Import an RSA public key JWK and use it
 | 
|  }
 | 
| @@ -1919,7 +1828,7 @@ TEST_F(SharedCryptoTest, MAYBE(ImportExportJwkSymmetricKey)) {
 | 
|    // Round-trip import/export each key.
 | 
|  
 | 
|    blink::WebCryptoKey key = blink::WebCryptoKey::createNull();
 | 
| -  blink::WebArrayBuffer json;
 | 
| +  std::vector<uint8> json;
 | 
|    for (size_t test_index = 0; test_index < ARRAYSIZE_UNSAFE(kTests);
 | 
|         ++test_index) {
 | 
|      SCOPED_TRACE(test_index);
 | 
| @@ -1951,10 +1860,10 @@ TEST_F(SharedCryptoTest, MAYBE(ImportExportJwkSymmetricKey)) {
 | 
|      EXPECT_EQ(test.usage, key.usages());
 | 
|  
 | 
|      // Export the key in raw format and compare to the original.
 | 
| -    blink::WebArrayBuffer key_raw_out;
 | 
| +    std::vector<uint8> key_raw_out;
 | 
|      ASSERT_EQ(Status::Success(),
 | 
|                ExportKey(blink::WebCryptoKeyFormatRaw, key, &key_raw_out));
 | 
| -    ExpectArrayBufferMatchesHex(test.key_hex, key_raw_out);
 | 
| +    EXPECT_BYTES_EQ_HEX(test.key_hex, key_raw_out);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -1972,7 +1881,7 @@ TEST_F(SharedCryptoTest, MAYBE(ExportJwkEmptySymmetricKey)) {
 | 
|    EXPECT_EQ(0u, key.algorithm().hmacParams()->lengthBits());
 | 
|  
 | 
|    // Export the key in JWK format and validate.
 | 
| -  blink::WebArrayBuffer json;
 | 
| +  std::vector<uint8> json;
 | 
|    ASSERT_EQ(Status::Success(),
 | 
|              ExportKey(blink::WebCryptoKeyFormatJwk, key, &json));
 | 
|    EXPECT_TRUE(VerifySecretJwk(json, "HS1", key_data_hex, usages));
 | 
| @@ -1990,11 +1899,11 @@ TEST_F(SharedCryptoTest, MAYBE(ExportJwkEmptySymmetricKey)) {
 | 
|    EXPECT_EQ(blink::WebCryptoKeyTypeSecret, key.type());
 | 
|    EXPECT_EQ(0u, key.algorithm().hmacParams()->lengthBits());
 | 
|  
 | 
| -  blink::WebArrayBuffer exported_key_data;
 | 
| +  std::vector<uint8> exported_key_data;
 | 
|    EXPECT_EQ(Status::Success(),
 | 
|              ExportKey(blink::WebCryptoKeyFormatRaw, key, &exported_key_data));
 | 
|  
 | 
| -  EXPECT_EQ(0u, exported_key_data.byteLength());
 | 
| +  EXPECT_EQ(0u, exported_key_data.size());
 | 
|  }
 | 
|  
 | 
|  TEST_F(SharedCryptoTest, MAYBE(ImportExportSpki)) {
 | 
| @@ -2014,7 +1923,7 @@ TEST_F(SharedCryptoTest, MAYBE(ImportExportSpki)) {
 | 
|    EXPECT_EQ(blink::WebCryptoKeyUsageEncrypt, key.usages());
 | 
|    EXPECT_EQ(kModulusLengthBits,
 | 
|              key.algorithm().rsaParams()->modulusLengthBits());
 | 
| -  ExpectCryptoDataMatchesHex(
 | 
| +  EXPECT_BYTES_EQ_HEX(
 | 
|        "010001", CryptoData(key.algorithm().rsaParams()->publicExponent()));
 | 
|  
 | 
|    // Failing case: Empty SPKI data
 | 
| @@ -2048,10 +1957,10 @@ TEST_F(SharedCryptoTest, MAYBE(ImportExportSpki)) {
 | 
|  
 | 
|    // Passing case: Export a previously imported RSA public key in SPKI format
 | 
|    // and compare to original data.
 | 
| -  blink::WebArrayBuffer output;
 | 
| +  std::vector<uint8> output;
 | 
|    ASSERT_EQ(Status::Success(),
 | 
|              ExportKey(blink::WebCryptoKeyFormatSpki, key, &output));
 | 
| -  ExpectArrayBufferMatchesHex(kPublicKeySpkiDerHex, output);
 | 
| +  EXPECT_BYTES_EQ_HEX(kPublicKeySpkiDerHex, output);
 | 
|  
 | 
|    // Failing case: Try to export a previously imported RSA public key in raw
 | 
|    // format (not allowed for a public key).
 | 
| @@ -2093,14 +2002,14 @@ TEST_F(SharedCryptoTest, MAYBE(ImportExportPkcs8)) {
 | 
|              key.algorithm().rsaHashedParams()->hash().id());
 | 
|    EXPECT_EQ(kModulusLengthBits,
 | 
|              key.algorithm().rsaHashedParams()->modulusLengthBits());
 | 
| -  ExpectCryptoDataMatchesHex(
 | 
| +  EXPECT_BYTES_EQ_HEX(
 | 
|        "010001",
 | 
|        CryptoData(key.algorithm().rsaHashedParams()->publicExponent()));
 | 
|  
 | 
| -  blink::WebArrayBuffer exported_key;
 | 
| +  std::vector<uint8> exported_key;
 | 
|    ASSERT_EQ(Status::Success(),
 | 
|              ExportKey(blink::WebCryptoKeyFormatPkcs8, key, &exported_key));
 | 
| -  ExpectArrayBufferMatchesHex(kPrivateKeyPkcs8DerHex, exported_key);
 | 
| +  EXPECT_BYTES_EQ_HEX(kPrivateKeyPkcs8DerHex, exported_key);
 | 
|  
 | 
|    // Failing case: Empty PKCS#8 data
 | 
|    EXPECT_EQ(Status::ErrorImportEmptyKeyData(),
 | 
| @@ -2161,7 +2070,7 @@ TEST_F(SharedCryptoTest, MAYBE(GenerateKeyPairRsa)) {
 | 
|  
 | 
|    // Try exporting the generated key pair, and then re-importing to verify that
 | 
|    // the exported data was valid.
 | 
| -  blink::WebArrayBuffer public_key_spki;
 | 
| +  std::vector<uint8> public_key_spki;
 | 
|    EXPECT_EQ(
 | 
|        Status::Success(),
 | 
|        ExportKey(blink::WebCryptoKeyFormatSpki, public_key, &public_key_spki));
 | 
| @@ -2177,7 +2086,7 @@ TEST_F(SharedCryptoTest, MAYBE(GenerateKeyPairRsa)) {
 | 
|    EXPECT_EQ(modulus_length,
 | 
|              public_key.algorithm().rsaParams()->modulusLengthBits());
 | 
|  
 | 
| -  blink::WebArrayBuffer private_key_pkcs8;
 | 
| +  std::vector<uint8> private_key_pkcs8;
 | 
|    EXPECT_EQ(
 | 
|        Status::Success(),
 | 
|        ExportKey(
 | 
| @@ -2306,7 +2215,7 @@ TEST_F(SharedCryptoTest, MAYBE(GenerateKeyPairRsa)) {
 | 
|  
 | 
|    // Exporting a private key as SPKI format doesn't make sense. However this
 | 
|    // will first fail because the key is not extractable.
 | 
| -  blink::WebArrayBuffer output;
 | 
| +  std::vector<uint8> output;
 | 
|    EXPECT_EQ(Status::ErrorKeyNotExtractable(),
 | 
|              ExportKey(blink::WebCryptoKeyFormatSpki, private_key, &output));
 | 
|  
 | 
| @@ -2348,8 +2257,8 @@ TEST_F(SharedCryptoTest, MAYBE(RsaEsRoundTrip)) {
 | 
|    algorithm = CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5);
 | 
|    const char* const kTestDataHex[] = {"ff", "0102030405060708090a0b0c0d0e0f",
 | 
|                                        max_data_hex};
 | 
| -  blink::WebArrayBuffer encrypted_data;
 | 
| -  blink::WebArrayBuffer decrypted_data;
 | 
| +  std::vector<uint8> encrypted_data;
 | 
| +  std::vector<uint8> decrypted_data;
 | 
|    for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestDataHex); ++i) {
 | 
|      SCOPED_TRACE(i);
 | 
|      EXPECT_EQ(Status::Success(),
 | 
| @@ -2357,13 +2266,13 @@ TEST_F(SharedCryptoTest, MAYBE(RsaEsRoundTrip)) {
 | 
|                        public_key,
 | 
|                        CryptoData(HexStringToBytes(kTestDataHex[i])),
 | 
|                        &encrypted_data));
 | 
| -    EXPECT_EQ(kModulusLengthBits / 8, encrypted_data.byteLength());
 | 
| +    EXPECT_EQ(kModulusLengthBits / 8, encrypted_data.size());
 | 
|      ASSERT_EQ(Status::Success(),
 | 
|                Decrypt(algorithm,
 | 
|                        private_key,
 | 
|                        CryptoData(encrypted_data),
 | 
|                        &decrypted_data));
 | 
| -    ExpectArrayBufferMatchesHex(kTestDataHex[i], decrypted_data);
 | 
| +    EXPECT_BYTES_EQ_HEX(kTestDataHex[i], decrypted_data);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -2404,30 +2313,28 @@ TEST_F(SharedCryptoTest, MAYBE(RsaEsKnownAnswer)) {
 | 
|  
 | 
|    // Decrypt the known-good ciphertext with the private key. As a check we must
 | 
|    // get the known original cleartext.
 | 
| -  blink::WebArrayBuffer decrypted_data;
 | 
| +  std::vector<uint8> decrypted_data;
 | 
|    ASSERT_EQ(
 | 
|        Status::Success(),
 | 
|        Decrypt(algorithm, private_key, CryptoData(ciphertext), &decrypted_data));
 | 
| -  EXPECT_FALSE(decrypted_data.isNull());
 | 
| -  EXPECT_TRUE(ArrayBufferMatches(cleartext, decrypted_data));
 | 
| +  EXPECT_BYTES_EQ(cleartext, decrypted_data);
 | 
|  
 | 
|    // Encrypt this decrypted data with the public key.
 | 
| -  blink::WebArrayBuffer encrypted_data;
 | 
| +  std::vector<uint8> encrypted_data;
 | 
|    ASSERT_EQ(
 | 
|        Status::Success(),
 | 
|        Encrypt(
 | 
|            algorithm, public_key, CryptoData(decrypted_data), &encrypted_data));
 | 
| -  EXPECT_EQ(128u, encrypted_data.byteLength());
 | 
| +  EXPECT_EQ(128u, encrypted_data.size());
 | 
|  
 | 
|    // Finally, decrypt the newly encrypted result with the private key, and
 | 
|    // compare to the known original cleartext.
 | 
| -  decrypted_data.reset();
 | 
| +  decrypted_data.clear();
 | 
|    ASSERT_EQ(
 | 
|        Status::Success(),
 | 
|        Decrypt(
 | 
|            algorithm, private_key, CryptoData(encrypted_data), &decrypted_data));
 | 
| -  EXPECT_FALSE(decrypted_data.isNull());
 | 
| -  EXPECT_TRUE(ArrayBufferMatches(cleartext, decrypted_data));
 | 
| +  EXPECT_EQ(cleartext, decrypted_data);
 | 
|  }
 | 
|  
 | 
|  TEST_F(SharedCryptoTest, MAYBE(RsaEsFailures)) {
 | 
| @@ -2446,7 +2353,7 @@ TEST_F(SharedCryptoTest, MAYBE(RsaEsFailures)) {
 | 
|        &private_key);
 | 
|  
 | 
|    // Fail encrypt with a private key.
 | 
| -  blink::WebArrayBuffer encrypted_data;
 | 
| +  std::vector<uint8> encrypted_data;
 | 
|    const std::string message_hex_str("0102030405060708090a0b0c0d0e0f");
 | 
|    const std::vector<uint8> message_hex(HexStringToBytes(message_hex_str));
 | 
|    EXPECT_EQ(
 | 
| @@ -2476,21 +2383,18 @@ TEST_F(SharedCryptoTest, MAYBE(RsaEsFailures)) {
 | 
|        Encrypt(algorithm, public_key, CryptoData(message_hex), &encrypted_data));
 | 
|  
 | 
|    // Fail decrypt with a public key.
 | 
| -  blink::WebArrayBuffer decrypted_data;
 | 
| +  std::vector<uint8> decrypted_data;
 | 
|    EXPECT_EQ(
 | 
|        Status::ErrorUnexpectedKeyType(),
 | 
|        Decrypt(
 | 
|            algorithm, public_key, CryptoData(encrypted_data), &decrypted_data));
 | 
|  
 | 
|    // Corrupt encrypted data; ensure decrypt fails because padding was disrupted.
 | 
| -  std::vector<uint8> corrupted_data(
 | 
| -      static_cast<uint8*>(encrypted_data.data()),
 | 
| -      static_cast<uint8*>(encrypted_data.data()) + encrypted_data.byteLength());
 | 
| -  corrupted_data[corrupted_data.size() / 2] ^= 0x01;
 | 
| -  EXPECT_EQ(
 | 
| -      Status::OperationError(),
 | 
| -      Decrypt(
 | 
| -          algorithm, private_key, CryptoData(corrupted_data), &decrypted_data));
 | 
| +  EXPECT_EQ(Status::OperationError(),
 | 
| +            Decrypt(algorithm,
 | 
| +                    private_key,
 | 
| +                    CryptoData(Corrupted(encrypted_data)),
 | 
| +                    &decrypted_data));
 | 
|  
 | 
|    // TODO(padolph): Are there other specific data corruption scenarios to
 | 
|    // consider?
 | 
| @@ -2500,7 +2404,7 @@ TEST_F(SharedCryptoTest, MAYBE(RsaEsFailures)) {
 | 
|        Status::Success(),
 | 
|        Decrypt(
 | 
|            algorithm, private_key, CryptoData(encrypted_data), &decrypted_data));
 | 
| -  ExpectArrayBufferMatchesHex(message_hex_str, decrypted_data);
 | 
| +  EXPECT_BYTES_EQ_HEX(message_hex_str, decrypted_data);
 | 
|  }
 | 
|  
 | 
|  TEST_F(SharedCryptoTest, MAYBE(RsaSsaSignVerifyFailures)) {
 | 
| @@ -2523,7 +2427,7 @@ TEST_F(SharedCryptoTest, MAYBE(RsaSsaSignVerifyFailures)) {
 | 
|    blink::WebCryptoAlgorithm algorithm =
 | 
|        CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5);
 | 
|  
 | 
| -  blink::WebArrayBuffer signature;
 | 
| +  std::vector<uint8> signature;
 | 
|    bool signature_match;
 | 
|  
 | 
|    // Compute a signature.
 | 
| @@ -2532,15 +2436,13 @@ TEST_F(SharedCryptoTest, MAYBE(RsaSsaSignVerifyFailures)) {
 | 
|              Sign(algorithm, private_key, CryptoData(data), &signature));
 | 
|  
 | 
|    // Ensure truncated signature does not verify by passing one less byte.
 | 
| -  EXPECT_EQ(
 | 
| -      Status::Success(),
 | 
| -      VerifySignature(
 | 
| -          algorithm,
 | 
| -          public_key,
 | 
| -          CryptoData(reinterpret_cast<const unsigned char*>(signature.data()),
 | 
| -                     signature.byteLength() - 1),
 | 
| -          CryptoData(data),
 | 
| -          &signature_match));
 | 
| +  EXPECT_EQ(Status::Success(),
 | 
| +            VerifySignature(
 | 
| +                algorithm,
 | 
| +                public_key,
 | 
| +                CryptoData(Uint8VectorStart(signature), signature.size() - 1),
 | 
| +                CryptoData(data),
 | 
| +                &signature_match));
 | 
|    EXPECT_FALSE(signature_match);
 | 
|  
 | 
|    // Ensure truncated signature does not verify by passing no bytes.
 | 
| @@ -2553,9 +2455,7 @@ TEST_F(SharedCryptoTest, MAYBE(RsaSsaSignVerifyFailures)) {
 | 
|    EXPECT_FALSE(signature_match);
 | 
|  
 | 
|    // Ensure corrupted signature does not verify.
 | 
| -  std::vector<uint8> corrupt_sig(
 | 
| -      static_cast<uint8*>(signature.data()),
 | 
| -      static_cast<uint8*>(signature.data()) + signature.byteLength());
 | 
| +  std::vector<uint8> corrupt_sig = signature;
 | 
|    corrupt_sig[corrupt_sig.size() / 2] ^= 0x1;
 | 
|    EXPECT_EQ(Status::Success(),
 | 
|              VerifySignature(algorithm,
 | 
| @@ -2672,7 +2572,7 @@ TEST_F(SharedCryptoTest, MAYBE(RsaSignVerifyKnownAnswer)) {
 | 
|        CreateAlgorithm(blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5);
 | 
|  
 | 
|    // Validate the signatures are computed and verified as expected.
 | 
| -  blink::WebArrayBuffer signature;
 | 
| +  std::vector<uint8> signature;
 | 
|    for (size_t test_index = 0; test_index < tests->GetSize(); ++test_index) {
 | 
|      SCOPED_TRACE(test_index);
 | 
|  
 | 
| @@ -2684,11 +2584,11 @@ TEST_F(SharedCryptoTest, MAYBE(RsaSignVerifyKnownAnswer)) {
 | 
|      std::vector<uint8> test_signature =
 | 
|          GetBytesFromHexString(test, "signature_hex");
 | 
|  
 | 
| -    signature.reset();
 | 
| +    signature.clear();
 | 
|      ASSERT_EQ(
 | 
|          Status::Success(),
 | 
|          Sign(algorithm, private_key, CryptoData(test_message), &signature));
 | 
| -    EXPECT_TRUE(ArrayBufferMatches(test_signature, signature));
 | 
| +    EXPECT_BYTES_EQ(test_signature, signature);
 | 
|  
 | 
|      bool is_match = false;
 | 
|      ASSERT_EQ(Status::Success(),
 | 
| @@ -2715,10 +2615,10 @@ TEST_F(SharedCryptoTest, MAYBE(AesKwKeyImport)) {
 | 
|                        true,
 | 
|                        blink::WebCryptoKeyUsageWrapKey,
 | 
|                        &key));
 | 
| -  blink::WebArrayBuffer key_raw_out;
 | 
| +  std::vector<uint8> key_raw_out;
 | 
|    EXPECT_EQ(Status::Success(),
 | 
|              ExportKey(blink::WebCryptoKeyFormatRaw, key, &key_raw_out));
 | 
| -  ExpectArrayBufferMatchesHex(key_raw_hex_in, key_raw_out);
 | 
| +  EXPECT_BYTES_EQ_HEX(key_raw_hex_in, key_raw_out);
 | 
|  
 | 
|    // Import a 192-bit KEK
 | 
|    key_raw_hex_in = "c0192c6466b2370decbb62b2cfef4384544ffeb4d2fbc103";
 | 
| @@ -2731,7 +2631,7 @@ TEST_F(SharedCryptoTest, MAYBE(AesKwKeyImport)) {
 | 
|                        &key));
 | 
|    EXPECT_EQ(Status::Success(),
 | 
|              ExportKey(blink::WebCryptoKeyFormatRaw, key, &key_raw_out));
 | 
| -  ExpectArrayBufferMatchesHex(key_raw_hex_in, key_raw_out);
 | 
| +  EXPECT_BYTES_EQ_HEX(key_raw_hex_in, key_raw_out);
 | 
|  
 | 
|    // Import a 256-bit Key Encryption Key (KEK)
 | 
|    key_raw_hex_in =
 | 
| @@ -2745,7 +2645,7 @@ TEST_F(SharedCryptoTest, MAYBE(AesKwKeyImport)) {
 | 
|                        &key));
 | 
|    EXPECT_EQ(Status::Success(),
 | 
|              ExportKey(blink::WebCryptoKeyFormatRaw, key, &key_raw_out));
 | 
| -  ExpectArrayBufferMatchesHex(key_raw_hex_in, key_raw_out);
 | 
| +  EXPECT_BYTES_EQ_HEX(key_raw_hex_in, key_raw_out);
 | 
|  
 | 
|    // Fail import of 0 length key
 | 
|    EXPECT_EQ(Status::ErrorImportAesKeyLength(),
 | 
| @@ -2861,14 +2761,14 @@ TEST_F(SharedCryptoTest, MAYBE(AesKwRawSymkeyWrapUnwrapKnownAnswer)) {
 | 
|          blink::WebCryptoKeyUsageEncrypt);
 | 
|  
 | 
|      // Wrap the key and verify the ciphertext result against the known answer.
 | 
| -    blink::WebArrayBuffer wrapped_key;
 | 
| +    std::vector<uint8> wrapped_key;
 | 
|      ASSERT_EQ(Status::Success(),
 | 
|                WrapKey(blink::WebCryptoKeyFormatRaw,
 | 
|                        wrapping_key,
 | 
|                        key,
 | 
|                        wrapping_algorithm,
 | 
|                        &wrapped_key));
 | 
| -    EXPECT_TRUE(ArrayBufferMatches(test_ciphertext, wrapped_key));
 | 
| +    EXPECT_BYTES_EQ(test_ciphertext, wrapped_key);
 | 
|  
 | 
|      // Unwrap the known ciphertext to get a new test_key.
 | 
|      blink::WebCryptoKey unwrapped_key = blink::WebCryptoKey::createNull();
 | 
| @@ -2892,10 +2792,10 @@ TEST_F(SharedCryptoTest, MAYBE(AesKwRawSymkeyWrapUnwrapKnownAnswer)) {
 | 
|      EXPECT_EQ(blink::WebCryptoKeyUsageEncrypt, key.usages());
 | 
|  
 | 
|      // Export the new key and compare its raw bytes with the original known key.
 | 
| -    blink::WebArrayBuffer raw_key;
 | 
| +    std::vector<uint8> raw_key;
 | 
|      EXPECT_EQ(Status::Success(),
 | 
|                ExportKey(blink::WebCryptoKeyFormatRaw, unwrapped_key, &raw_key));
 | 
| -    EXPECT_TRUE(ArrayBufferMatches(test_key, raw_key));
 | 
| +    EXPECT_BYTES_EQ(test_key, raw_key);
 | 
|    }
 | 
|  }
 | 
|  
 | 
| @@ -3035,10 +2935,10 @@ TEST_F(SharedCryptoTest, MAYBE(AesKwJwkSymkeyUnwrapKnownData)) {
 | 
|    EXPECT_EQ(blink::WebCryptoKeyUsageVerify, unwrapped_key.usages());
 | 
|  
 | 
|    // Export the new key's raw data and compare to the known original.
 | 
| -  blink::WebArrayBuffer raw_key;
 | 
| +  std::vector<uint8> raw_key;
 | 
|    EXPECT_EQ(Status::Success(),
 | 
|              ExportKey(blink::WebCryptoKeyFormatRaw, unwrapped_key, &raw_key));
 | 
| -  EXPECT_TRUE(ArrayBufferMatches(key_data, raw_key));
 | 
| +  EXPECT_BYTES_EQ(key_data, raw_key);
 | 
|  }
 | 
|  
 | 
|  // TODO(eroman):
 | 
| @@ -3079,11 +2979,11 @@ TEST_F(SharedCryptoTest, MAYBE(AesGcmSampleSets)) {
 | 
|          blink::WebCryptoKeyUsageEncrypt | blink::WebCryptoKeyUsageDecrypt);
 | 
|  
 | 
|      // Verify exported raw key is identical to the imported data
 | 
| -    blink::WebArrayBuffer raw_key;
 | 
| +    std::vector<uint8> raw_key;
 | 
|      EXPECT_EQ(Status::Success(),
 | 
|                ExportKey(blink::WebCryptoKeyFormatRaw, key, &raw_key));
 | 
|  
 | 
| -    EXPECT_TRUE(ArrayBufferMatches(test_key, raw_key));
 | 
| +    EXPECT_BYTES_EQ(test_key, raw_key);
 | 
|  
 | 
|      // Test encryption.
 | 
|      std::vector<uint8> cipher_text;
 | 
| @@ -3097,11 +2997,11 @@ TEST_F(SharedCryptoTest, MAYBE(AesGcmSampleSets)) {
 | 
|                              &cipher_text,
 | 
|                              &authentication_tag));
 | 
|  
 | 
| -    ExpectVectorMatches(test_cipher_text, cipher_text);
 | 
| -    ExpectVectorMatches(test_authentication_tag, authentication_tag);
 | 
| +    EXPECT_BYTES_EQ(test_cipher_text, cipher_text);
 | 
| +    EXPECT_BYTES_EQ(test_authentication_tag, authentication_tag);
 | 
|  
 | 
|      // Test decryption.
 | 
| -    blink::WebArrayBuffer plain_text;
 | 
| +    std::vector<uint8> plain_text;
 | 
|      EXPECT_EQ(Status::Success(),
 | 
|                AesGcmDecrypt(key,
 | 
|                              test_iv,
 | 
| @@ -3110,7 +3010,7 @@ TEST_F(SharedCryptoTest, MAYBE(AesGcmSampleSets)) {
 | 
|                              test_cipher_text,
 | 
|                              test_authentication_tag,
 | 
|                              &plain_text));
 | 
| -    EXPECT_TRUE(ArrayBufferMatches(test_plain_text, plain_text));
 | 
| +    EXPECT_BYTES_EQ(test_plain_text, plain_text);
 | 
|  
 | 
|      // Decryption should fail if any of the inputs are tampered with.
 | 
|      EXPECT_EQ(Status::OperationError(),
 | 
| @@ -3204,7 +3104,7 @@ TEST_F(SharedCryptoTest, MAYBE(RsaEsRawSymkeyWrapUnwrapKnownAnswer)) {
 | 
|                        &key));
 | 
|  
 | 
|    // Wrap the symmetric key with raw format.
 | 
| -  blink::WebArrayBuffer wrapped_key;
 | 
| +  std::vector<uint8> wrapped_key;
 | 
|    ASSERT_EQ(Status::Success(),
 | 
|              WrapKey(blink::WebCryptoKeyFormatRaw,
 | 
|                      public_key,
 | 
| @@ -3231,10 +3131,10 @@ TEST_F(SharedCryptoTest, MAYBE(RsaEsRawSymkeyWrapUnwrapKnownAnswer)) {
 | 
|    EXPECT_EQ(blink::WebCryptoKeyUsageSign, key.usages());
 | 
|  
 | 
|    // Export the new key and compare its raw bytes with the original known data.
 | 
| -  blink::WebArrayBuffer raw_key;
 | 
| +  std::vector<uint8> raw_key;
 | 
|    EXPECT_EQ(Status::Success(),
 | 
|              ExportKey(blink::WebCryptoKeyFormatRaw, unwrapped_key, &raw_key));
 | 
| -  EXPECT_TRUE(ArrayBufferMatches(cleartext, raw_key));
 | 
| +  EXPECT_BYTES_EQ(cleartext, raw_key);
 | 
|  
 | 
|    // Unwrap the known wrapped key and compare to the known cleartext.
 | 
|    ASSERT_EQ(Status::Success(),
 | 
| @@ -3248,7 +3148,7 @@ TEST_F(SharedCryptoTest, MAYBE(RsaEsRawSymkeyWrapUnwrapKnownAnswer)) {
 | 
|                        &unwrapped_key));
 | 
|    EXPECT_EQ(Status::Success(),
 | 
|              ExportKey(blink::WebCryptoKeyFormatRaw, unwrapped_key, &raw_key));
 | 
| -  EXPECT_TRUE(ArrayBufferMatches(cleartext, raw_key));
 | 
| +  EXPECT_BYTES_EQ(cleartext, raw_key);
 | 
|  }
 | 
|  
 | 
|  TEST_F(SharedCryptoTest, MAYBE(RsaEsRawSymkeyWrapUnwrapErrors)) {
 | 
| @@ -3281,7 +3181,7 @@ TEST_F(SharedCryptoTest, MAYBE(RsaEsRawSymkeyWrapUnwrapErrors)) {
 | 
|                        &key));
 | 
|  
 | 
|    // Wrapping with a private key should fail.
 | 
| -  blink::WebArrayBuffer wrapped_key;
 | 
| +  std::vector<uint8> wrapped_key;
 | 
|    EXPECT_EQ(Status::ErrorUnexpectedKeyType(),
 | 
|              WrapKey(blink::WebCryptoKeyFormatRaw,
 | 
|                      private_key,
 | 
| @@ -3393,10 +3293,10 @@ TEST_F(SharedCryptoTest, MAYBE(RsaEsJwkSymkeyUnwrapKnownAnswer)) {
 | 
|    EXPECT_EQ(blink::WebCryptoKeyUsageEncrypt, unwrapped_key.usages());
 | 
|  
 | 
|    // Export the unwrapped key and compare to the original.
 | 
| -  blink::WebArrayBuffer raw_key;
 | 
| +  std::vector<uint8> raw_key;
 | 
|    EXPECT_EQ(Status::Success(),
 | 
|              ExportKey(blink::WebCryptoKeyFormatRaw, unwrapped_key, &raw_key));
 | 
| -  EXPECT_TRUE(ArrayBufferMatches(key_data, raw_key));
 | 
| +  EXPECT_BYTES_EQ(key_data, raw_key);
 | 
|  }
 | 
|  
 | 
|  TEST_F(SharedCryptoTest, MAYBE(RsaEsJwkSymkeyWrapUnwrapRoundTrip)) {
 | 
| @@ -3424,7 +3324,7 @@ TEST_F(SharedCryptoTest, MAYBE(RsaEsJwkSymkeyWrapUnwrapRoundTrip)) {
 | 
|        &private_wrapping_key);
 | 
|  
 | 
|    // Wrap the symkey in JWK format, using the public wrapping key.
 | 
| -  blink::WebArrayBuffer wrapped_data;
 | 
| +  std::vector<uint8> wrapped_data;
 | 
|    ASSERT_EQ(Status::Success(),
 | 
|              WrapKey(blink::WebCryptoKeyFormatJwk,
 | 
|                      public_wrapping_key,
 | 
| @@ -3445,12 +3345,12 @@ TEST_F(SharedCryptoTest, MAYBE(RsaEsJwkSymkeyWrapUnwrapRoundTrip)) {
 | 
|                        &unwrapped_key));
 | 
|  
 | 
|    // Export the original symkey and the unwrapped key and compare.
 | 
| -  blink::WebArrayBuffer raw_key1, raw_key2;
 | 
| +  std::vector<uint8> raw_key1, raw_key2;
 | 
|    EXPECT_EQ(Status::Success(),
 | 
|              ExportKey(blink::WebCryptoKeyFormatRaw, key_to_wrap, &raw_key1));
 | 
|    EXPECT_EQ(Status::Success(),
 | 
|              ExportKey(blink::WebCryptoKeyFormatRaw, unwrapped_key, &raw_key2));
 | 
| -  EXPECT_TRUE(ArrayBuffersEqual(raw_key1, raw_key2));
 | 
| +  EXPECT_BYTES_EQ(raw_key1, raw_key2);
 | 
|  }
 | 
|  
 | 
|  TEST_F(SharedCryptoTest, MAYBE(RsaEsJwkSymkeyWrapUnwrapErrors)) {
 | 
| @@ -3489,15 +3389,13 @@ TEST_F(SharedCryptoTest, MAYBE(RsaEsJwkSymkeyWrapUnwrapErrors)) {
 | 
|  
 | 
|    // Decrypt the ciphertext and validate the result, to prove that decryption is
 | 
|    // successful.
 | 
| -  blink::WebArrayBuffer decrypted_data;
 | 
| +  std::vector<uint8> decrypted_data;
 | 
|    ASSERT_EQ(Status::Success(),
 | 
|              Decrypt(algorithm,
 | 
|                      private_decryption_key,
 | 
|                      CryptoData(ciphertext),
 | 
|                      &decrypted_data));
 | 
| -  const std::string decrypted(static_cast<const char*>(decrypted_data.data()),
 | 
| -                              decrypted_data.byteLength());
 | 
| -  EXPECT_EQ(cleartext, decrypted);
 | 
| +  EXPECT_BYTES_EQ(cleartext, decrypted_data);
 | 
|  
 | 
|    // Import the private wrapping key. Note this is the same underlying keying
 | 
|    // material used for private_decryption_key above. The only difference is that
 | 
| 
 |