Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "device/u2f/u2f_message.h" | |
| 6 #include "testing/gtest/include/gtest/gtest.h" | |
| 7 | |
| 8 class U2fMessageTest : public testing::Test {}; | |
| 9 | |
| 10 // Packets should be 64 bytes + 1 report ID byte | |
| 11 TEST_F(U2fMessageTest, TestPacketSize) { | |
| 12 uint8_t channel_id[4] = {5, 6, 7, 8}; | |
| 13 std::vector<uint8_t> data; | |
| 14 | |
| 15 scoped_refptr<device::U2fPacket> init_packet( | |
| 16 new device::U2fInitPacket(channel_id, 0, data, data.size())); | |
| 17 EXPECT_EQ(65, init_packet->GetBuffer()->size()); | |
| 18 | |
| 19 scoped_refptr<device::U2fPacket> continuation_packet( | |
| 20 new device::U2fContPacket(channel_id, 0, data)); | |
| 21 EXPECT_EQ(65, continuation_packet->GetBuffer()->size()); | |
| 22 } | |
| 23 | |
| 24 /* | |
| 25 * U2f Init Packets are of the format: | |
| 26 * Byte 0: 0 | |
| 27 * Byte 1-4: Channel ID | |
| 28 * Byte 5: Command byte | |
| 29 * Byte 6-7: Big Endian size of data | |
| 30 * Byte 8-n: Data block | |
| 31 * | |
| 32 * Remaining buffer is padded with 0 | |
| 33 */ | |
| 34 TEST_F(U2fMessageTest, TestPacketData) { | |
| 35 uint8_t channel_id[4] = {5, 6, 7, 8}; | |
| 36 std::vector<uint8_t> data{10, 11}; | |
| 37 uint8_t cmd = static_cast<uint8_t>(device::U2fMessage::Type::CMD_WINK); | |
| 38 scoped_refptr<device::U2fPacket> init_packet( | |
| 39 new device::U2fInitPacket(channel_id, cmd, data, data.size())); | |
| 40 int index = 0; | |
| 41 | |
| 42 EXPECT_EQ(0, init_packet->GetBuffer()->data()[index++]); | |
| 43 EXPECT_EQ(channel_id[0], init_packet->GetBuffer()->data()[index++]); | |
| 44 EXPECT_EQ(channel_id[1], init_packet->GetBuffer()->data()[index++]); | |
| 45 EXPECT_EQ(channel_id[2], init_packet->GetBuffer()->data()[index++]); | |
| 46 EXPECT_EQ(channel_id[3], init_packet->GetBuffer()->data()[index++]); | |
| 47 EXPECT_EQ((char)cmd, init_packet->GetBuffer()->data()[index++]); | |
| 48 | |
| 49 EXPECT_EQ((char)(data.size() >> 8), | |
| 50 init_packet->GetBuffer()->data()[index++]); | |
| 51 EXPECT_EQ((char)(data.size() & 0xff), | |
| 52 init_packet->GetBuffer()->data()[index++]); | |
| 53 EXPECT_EQ(data.at(0), init_packet->GetBuffer()->data()[index++]); | |
| 54 EXPECT_EQ(data.at(1), init_packet->GetBuffer()->data()[index++]); | |
| 55 for (; index < init_packet->GetBuffer()->size(); index++) { | |
| 56 EXPECT_EQ(0, init_packet->GetBuffer()->data()[index]) | |
| 57 << "mismatch at index " << index; | |
| 58 } | |
| 59 } | |
| 60 | |
| 61 TEST_F(U2fMessageTest, TestPacketConstructors) { | |
| 62 uint8_t channel_id[4] = {5, 6, 7, 8}; | |
| 63 std::vector<uint8_t> data{10, 11}; | |
| 64 uint8_t cmd = static_cast<uint8_t>(device::U2fMessage::Type::CMD_WINK); | |
| 65 scoped_refptr<device::U2fInitPacket> orig_packet( | |
| 66 new device::U2fInitPacket(channel_id, cmd, data, data.size())); | |
| 67 | |
| 68 size_t payload_length = static_cast<size_t>(orig_packet->GetPayloadLength()); | |
| 69 scoped_refptr<device::U2fInitPacket> reconstructed_packet = | |
| 70 device::U2fInitPacket::Create(orig_packet->GetBuffer(), &payload_length); | |
| 71 EXPECT_EQ(orig_packet->GetCommand(), reconstructed_packet->GetCommand()); | |
| 72 EXPECT_EQ(orig_packet->GetPayloadLength(), | |
| 73 reconstructed_packet->GetPayloadLength()); | |
| 74 EXPECT_TRUE(orig_packet->GetData() == reconstructed_packet->GetData()); | |
| 75 | |
| 76 for (size_t i = 0; i < device::U2fPacket::kChannelIdSize; ++i) | |
| 77 EXPECT_EQ(orig_packet->GetChannelId()[i], | |
| 78 reconstructed_packet->GetChannelId()[i]); | |
|
Reilly Grant (use Gerrit)
2016/12/07 22:33:48
nit: Braces around loop body when it is multiple l
Casey Piper
2016/12/09 00:15:54
Done.
| |
| 79 | |
| 80 ASSERT_EQ(orig_packet->GetBuffer()->size(), | |
| 81 reconstructed_packet->GetBuffer()->size()); | |
| 82 for (size_t i = 0; i < static_cast<size_t>(orig_packet->GetBuffer()->size()); | |
| 83 ++i) | |
| 84 EXPECT_EQ(orig_packet->GetBuffer()->data()[i], | |
| 85 reconstructed_packet->GetBuffer()->data()[i]); | |
|
Reilly Grant (use Gerrit)
2016/12/07 22:33:48
nit: Braces around loop body when it is multiple l
Casey Piper
2016/12/09 00:15:54
Done.
| |
| 86 } | |
| 87 | |
| 88 TEST_F(U2fMessageTest, TestMaxLengthPacketConstructors) { | |
| 89 uint8_t channel_id[4] = {0xAA, 0xAB, 0xAC, 0xAD}; | |
| 90 std::vector<uint8_t> data; | |
| 91 for (size_t i = 0; i < device::U2fMessage::kMaxMessageSize; ++i) | |
| 92 data.push_back(static_cast<uint8_t>(i % 0xff)); | |
| 93 | |
| 94 device::U2fMessage::Type cmd = device::U2fMessage::Type::CMD_MSG; | |
| 95 scoped_refptr<device::U2fMessage> orig_msg = | |
| 96 device::U2fMessage::Create(channel_id, cmd, data); | |
| 97 std::list<scoped_refptr<device::U2fPacket>>::const_iterator it = | |
| 98 orig_msg->begin(); | |
| 99 scoped_refptr<device::U2fMessage> new_msg = | |
| 100 device::U2fMessage::Create((*it)->GetBuffer()); | |
| 101 it++; | |
| 102 | |
| 103 for (; it != orig_msg->end(); ++it) | |
| 104 new_msg->AddContPacket((*it)->GetBuffer()); | |
| 105 | |
| 106 std::list<scoped_refptr<device::U2fPacket>>::const_iterator orig_it = | |
| 107 orig_msg->begin(); | |
| 108 std::list<scoped_refptr<device::U2fPacket>>::const_iterator new_it = | |
| 109 new_msg->begin(); | |
| 110 | |
| 111 for (; orig_it != orig_msg->end() && new_it != new_msg->end(); | |
| 112 ++orig_it, ++new_it) { | |
| 113 EXPECT_TRUE((*orig_it)->GetData() == (*new_it)->GetData()); | |
| 114 if ((*orig_it)->GetData() != (*new_it)->GetData()) { | |
| 115 printf("%d:%d \n", (int)(*orig_it)->GetData().size(), | |
|
Reilly Grant (use Gerrit)
2016/12/07 22:33:48
Please avoid printfs in tests. You can use EXPECT_
Casey Piper
2016/12/09 00:15:54
Done.
| |
| 116 (int)(*new_it)->GetData().size()); | |
| 117 for (size_t i = 0; i < static_cast<size_t>((*orig_it)->GetData().size()); | |
| 118 ++i) { | |
| 119 printf("%x:%x ", (*orig_it)->GetData().at(i), | |
| 120 (*orig_it)->GetData().at(i)); | |
| 121 } | |
| 122 } | |
| 123 | |
| 124 for (size_t i = 0; i < device::U2fPacket::kChannelIdSize; ++i) | |
| 125 EXPECT_EQ((*orig_it)->GetChannelId()[i], (*new_it)->GetChannelId()[i]); | |
| 126 | |
| 127 ASSERT_EQ((*orig_it)->GetBuffer()->size(), (*new_it)->GetBuffer()->size()); | |
| 128 for (size_t i = 0; i < static_cast<size_t>((*new_it)->GetBuffer()->size()); | |
| 129 ++i) { | |
| 130 EXPECT_EQ((*orig_it)->GetBuffer()->data()[i], | |
| 131 (*new_it)->GetBuffer()->data()[i]); | |
| 132 } | |
| 133 } | |
| 134 } | |
| 135 | |
| 136 TEST_F(U2fMessageTest, TestMessagePartioning) { | |
| 137 uint8_t channel_id[4] = {1, 1, 2, 3}; | |
| 138 std::vector<uint8_t> data(device::U2fMessage::kInitPacketDataSize + 1); | |
| 139 scoped_refptr<device::U2fMessage> two_packet_message = | |
| 140 device::U2fMessage::Create(channel_id, device::U2fMessage::Type::CMD_PING, | |
| 141 data); | |
| 142 EXPECT_EQ(2U, two_packet_message->NumPackets()); | |
| 143 | |
| 144 data.resize(device::U2fMessage::kInitPacketDataSize); | |
| 145 scoped_refptr<device::U2fMessage> one_packet_message = | |
| 146 device::U2fMessage::Create(channel_id, device::U2fMessage::Type::CMD_PING, | |
| 147 data); | |
| 148 EXPECT_EQ(1U, one_packet_message->NumPackets()); | |
| 149 | |
| 150 data.resize(device::U2fMessage::kInitPacketDataSize + | |
| 151 device::U2fMessage::kContPacketDataSize + 1); | |
| 152 scoped_refptr<device::U2fMessage> three_packet_message = | |
| 153 device::U2fMessage::Create(channel_id, device::U2fMessage::Type::CMD_PING, | |
| 154 data); | |
| 155 EXPECT_EQ(3U, three_packet_message->NumPackets()); | |
| 156 } | |
| 157 | |
| 158 TEST_F(U2fMessageTest, TestMaxSize) { | |
| 159 uint8_t channel_id[4] = {0, 1, 2, 3}; | |
| 160 std::vector<uint8_t> data(device::U2fMessage::kMaxMessageSize + 1); | |
| 161 scoped_refptr<device::U2fMessage> oversize_message = | |
| 162 device::U2fMessage::Create(channel_id, device::U2fMessage::Type::CMD_PING, | |
| 163 data); | |
| 164 EXPECT_EQ(nullptr, oversize_message); | |
| 165 } | |
| 166 | |
| 167 TEST_F(U2fMessageTest, TestDeconstruct) { | |
| 168 uint8_t channel_id[4] = {0xA, 0xB, 0xC, 0xD}; | |
| 169 std::vector<uint8_t> data(device::U2fMessage::kMaxMessageSize); | |
| 170 std::fill(std::begin(data), std::end(data), 0x7F); | |
| 171 scoped_refptr<device::U2fMessage> filled_message = device::U2fMessage::Create( | |
| 172 channel_id, device::U2fMessage::Type::CMD_PING, data); | |
| 173 | |
| 174 EXPECT_TRUE(data == filled_message->GetData()); | |
|
Reilly Grant (use Gerrit)
2016/12/07 22:33:48
You can use EXPECT_THAT(data, ContainerEq(filled_m
Casey Piper
2016/12/09 00:15:54
Done.
| |
| 175 } | |
| 176 | |
| 177 TEST_F(U2fMessageTest, TestDeserialize) { | |
| 178 uint8_t channel_id[4] = {0xA, 0xB, 0xC, 0xD}; | |
| 179 std::vector<uint8_t> data(device::U2fMessage::kMaxMessageSize); | |
| 180 | |
| 181 scoped_refptr<device::U2fMessage> orig_message = device::U2fMessage::Create( | |
| 182 channel_id, device::U2fMessage::Type::CMD_PING, data); | |
| 183 std::list<scoped_refptr<net::IOBufferWithSize>> orig_list; | |
| 184 scoped_refptr<net::IOBufferWithSize> buf = orig_message->PopNextPacket(); | |
| 185 orig_list.push_back(buf); | |
| 186 | |
| 187 scoped_refptr<device::U2fMessage> new_message = | |
| 188 device::U2fMessage::Create(buf); | |
| 189 while ((buf = orig_message->PopNextPacket())) { | |
| 190 orig_list.push_back(buf); | |
| 191 new_message->AddContPacket(buf); | |
| 192 } | |
| 193 | |
| 194 while ((buf = new_message->PopNextPacket())) { | |
| 195 EXPECT_TRUE(buf == orig_list.front()); | |
| 196 orig_list.pop_front(); | |
| 197 } | |
| 198 } | |
| OLD | NEW |