| Index: components/gcm_driver/crypto/message_payload_parser_unittest.cc
|
| diff --git a/components/gcm_driver/crypto/message_payload_parser_unittest.cc b/components/gcm_driver/crypto/message_payload_parser_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e0fdb822124ea641e602a5d9c98ecc83d5fac4e8
|
| --- /dev/null
|
| +++ b/components/gcm_driver/crypto/message_payload_parser_unittest.cc
|
| @@ -0,0 +1,103 @@
|
| +// Copyright 2017 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "components/gcm_driver/crypto/message_payload_parser.h"
|
| +
|
| +#include "base/big_endian.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace gcm {
|
| +
|
| +namespace {
|
| +
|
| +constexpr size_t kSaltSize = 16;
|
| +constexpr size_t kPublicKeySize = 65;
|
| +constexpr size_t kCiphertextSize = 18;
|
| +
|
| +const uint8_t kValidMessage[] = {
|
| + // salt (16 bytes, kSaltSize)
|
| + 0x59, 0xFD, 0x35, 0x97, 0x3B, 0xF3, 0x66, 0xA7, 0xEB, 0x8D, 0x44, 0x1E,
|
| + 0xCB, 0x4D, 0xFC, 0xD8,
|
| + // rs (4 bytes, in network byte order)
|
| + 0x00, 0x00, 0x00, 0x12,
|
| + // idlen (1 byte)
|
| + 0x41,
|
| + // public key (65 bytes, kPublicKeySize)
|
| + 0x04, 0x35, 0x02, 0x67, 0xB9, 0x10, 0x8F, 0x9B, 0xF1, 0x85, 0xF5, 0x1B,
|
| + 0xD7, 0xA4, 0xEF, 0xBD, 0x28, 0xB3, 0x11, 0x40, 0xBA, 0xD0, 0xEE, 0xB2,
|
| + 0x97, 0xDA, 0x6A, 0x93, 0x2D, 0x26, 0x45, 0xBD, 0xB2, 0x9A, 0x9F, 0xB8,
|
| + 0x19, 0xD8, 0x21, 0x6F, 0x66, 0xE3, 0xF6, 0x0B, 0x74, 0xB2, 0x28, 0x38,
|
| + 0xDC, 0xA7, 0x8A, 0x58, 0x0D, 0x56, 0x47, 0x3E, 0xD0, 0x5B, 0x5C, 0x93,
|
| + 0x4E, 0xB3, 0x89, 0x87, 0x64,
|
| + // payload (18 bytes, kCiphertextSize)
|
| + 0x3F, 0xD8, 0x95, 0x2C, 0xA2, 0x11, 0xBD, 0x7B, 0x57, 0xB2, 0x00, 0xBD,
|
| + 0x57, 0x68, 0x3F, 0xF0, 0x14, 0x57};
|
| +
|
| +static_assert(arraysize(kValidMessage) == 104,
|
| + "The smallest valid message is 104 bytes in size.");
|
| +
|
| +// Creates an std::string for the |kValidMessage| constant.
|
| +std::string CreateMessageString() {
|
| + return std::string(reinterpret_cast<const char*>(kValidMessage),
|
| + arraysize(kValidMessage));
|
| +}
|
| +
|
| +TEST(MessagePayloadParserTest, ValidMessage) {
|
| + MessagePayloadParser parser(CreateMessageString());
|
| + ASSERT_TRUE(parser.IsValid());
|
| +
|
| + const uint8_t* salt = kValidMessage;
|
| +
|
| + ASSERT_EQ(parser.salt().size(), kSaltSize);
|
| + EXPECT_EQ(parser.salt(), std::string(salt, salt + kSaltSize));
|
| +
|
| + ASSERT_EQ(parser.record_size(), 18u);
|
| +
|
| + const uint8_t* public_key =
|
| + kValidMessage + kSaltSize + sizeof(uint32_t) + sizeof(uint8_t);
|
| +
|
| + ASSERT_EQ(parser.public_key().size(), kPublicKeySize);
|
| + EXPECT_EQ(parser.public_key(),
|
| + std::string(public_key, public_key + kPublicKeySize));
|
| +
|
| + const uint8_t* ciphertext = kValidMessage + kSaltSize + sizeof(uint32_t) +
|
| + sizeof(uint8_t) + kPublicKeySize;
|
| +
|
| + ASSERT_EQ(parser.ciphertext().size(), kCiphertextSize);
|
| + EXPECT_EQ(parser.ciphertext(),
|
| + std::string(ciphertext, ciphertext + kCiphertextSize));
|
| +}
|
| +
|
| +TEST(MessagePayloadParserTest, MinimumMessageSize) {
|
| + std::string message = CreateMessageString();
|
| + message.resize(arraysize(kValidMessage) / 2);
|
| +
|
| + MessagePayloadParser parser(message);
|
| + EXPECT_FALSE(parser.IsValid());
|
| +}
|
| +
|
| +TEST(MessagePayloadParserTest, MinimumRecordSize) {
|
| + std::string message = CreateMessageString();
|
| +
|
| + uint32_t invalid_record_size = 11;
|
| + base::WriteBigEndian(&message[0] + 16 /* salt */, invalid_record_size);
|
| +
|
| + MessagePayloadParser parser(message);
|
| + EXPECT_FALSE(parser.IsValid());
|
| +}
|
| +
|
| +TEST(MessagePayloadParserTest, InvalidPublicKey) {
|
| + std::string message = CreateMessageString();
|
| +
|
| + uint8_t invalid_public_key_size = 42;
|
| + base::WriteBigEndian(&message[0] + 16 /* salt */ + 4 /* rs */,
|
| + invalid_public_key_size);
|
| +
|
| + MessagePayloadParser parser(message);
|
| + EXPECT_FALSE(parser.IsValid());
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +} // namespace gcm
|
|
|