| 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 "components/proximity_auth/ble/bluetooth_low_energy_weave_packet_receiv
er.h" |
| 6 |
| 7 #include <algorithm> |
| 8 #include <string> |
| 9 |
| 10 #include "base/logging.h" |
| 11 #include "components/proximity_auth/ble/bluetooth_low_energy_weave_packet_genera
tor.h" |
| 12 #include "testing/gmock/include/gmock/gmock.h" |
| 13 #include "testing/gtest/include/gtest/gtest.h" |
| 14 |
| 15 using proximity_auth::BluetoothLowEnergyWeavePacketGenerator; |
| 16 using proximity_auth::BluetoothLowEnergyWeavePacketReceiver; |
| 17 |
| 18 namespace { |
| 19 typedef BluetoothLowEnergyWeavePacketReceiver::State State; |
| 20 typedef BluetoothLowEnergyWeavePacketReceiver::ReceiverType ReceiverType; |
| 21 typedef BluetoothLowEnergyWeavePacketGenerator::ReasonForClose ReasonForClose; |
| 22 |
| 23 } // namespace |
| 24 |
| 25 namespace proximity_auth { |
| 26 |
| 27 class ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest |
| 28 : public testing::Test { |
| 29 protected: |
| 30 ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest() {} |
| 31 |
| 32 private: |
| 33 DISALLOW_COPY_AND_ASSIGN( |
| 34 ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest); |
| 35 }; |
| 36 |
| 37 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest, |
| 38 WellBehavingServerPacketsNoControlDataTest) { |
| 39 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver = |
| 40 (new BluetoothLowEnergyWeavePacketReceiver::Factory()) |
| 41 ->NewInstance(ReceiverType::SERVER); |
| 42 |
| 43 std::vector<uint8_t> p0{0x80, 1, 0, 1, 0, 0, 0}; |
| 44 receiver->ReceivePacket(p0); |
| 45 EXPECT_EQ(State::WAITING, receiver->GetState()); |
| 46 |
| 47 std::vector<uint8_t> p1{0x18, 'a', 'b'}; |
| 48 receiver->ReceivePacket(p1); |
| 49 EXPECT_EQ(State::RECEIVING_DATA, receiver->GetState()); |
| 50 |
| 51 std::vector<uint8_t> p2{0x24, 'c', 'd'}; |
| 52 receiver->ReceivePacket(p2); |
| 53 EXPECT_EQ(State::DATA_READY, receiver->GetState()); |
| 54 EXPECT_EQ("abcd", receiver->GetDataMessage()); |
| 55 |
| 56 std::vector<uint8_t> p3{0x3C, 'g', 'o', 'o', 'g', 'l', 'e'}; |
| 57 receiver->ReceivePacket(p3); |
| 58 EXPECT_EQ(State::DATA_READY, receiver->GetState()); |
| 59 EXPECT_EQ("google", receiver->GetDataMessage()); |
| 60 |
| 61 std::vector<uint8_t> p4{0xC2, 0x80, 0x00}; |
| 62 receiver->ReceivePacket(p4); |
| 63 EXPECT_EQ(State::CONNECTION_CLOSED, receiver->GetState()); |
| 64 EXPECT_EQ(ReasonForClose::APPLICATION_ERROR, receiver->GetReasonForClose()); |
| 65 } |
| 66 |
| 67 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest, |
| 68 WellBehavingServerPacketsWithControlDataTest) { |
| 69 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver = |
| 70 (new BluetoothLowEnergyWeavePacketReceiver::Factory()) |
| 71 ->NewInstance(ReceiverType::SERVER); |
| 72 |
| 73 std::vector<uint8_t> p0{0x80, 1, 0, 1, 0, 0, 0, 'a', 'b', 'c', 'd'}; |
| 74 receiver->ReceivePacket(p0); |
| 75 EXPECT_EQ(State::DATA_READY, receiver->GetState()); |
| 76 EXPECT_EQ("abcd", receiver->GetDataMessage()); |
| 77 |
| 78 std::vector<uint8_t> p1{0x18, 'e', 'f'}; |
| 79 receiver->ReceivePacket(p1); |
| 80 EXPECT_EQ(State::RECEIVING_DATA, receiver->GetState()); |
| 81 |
| 82 std::vector<uint8_t> p2{0x24, 'g', 'h'}; |
| 83 receiver->ReceivePacket(p2); |
| 84 EXPECT_EQ(State::DATA_READY, receiver->GetState()); |
| 85 EXPECT_EQ("efgh", receiver->GetDataMessage()); |
| 86 |
| 87 std::vector<uint8_t> p3{0xB2, 0x00, 0x00}; |
| 88 receiver->ReceivePacket(p3); |
| 89 EXPECT_EQ(State::CONNECTION_CLOSED, receiver->GetState()); |
| 90 EXPECT_EQ(ReasonForClose::CLOSE_WITHOUT_ERROR, receiver->GetReasonForClose()); |
| 91 } |
| 92 |
| 93 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest, |
| 94 WellBehavingClientPacketsNoControlDataTest) { |
| 95 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver = |
| 96 (new BluetoothLowEnergyWeavePacketReceiver::Factory()) |
| 97 ->NewInstance(ReceiverType::CLIENT); |
| 98 |
| 99 std::vector<uint8_t> p0{0x81, 1, 0, 30, 0}; |
| 100 receiver->ReceivePacket(p0); |
| 101 EXPECT_EQ(State::WAITING, receiver->GetState()); |
| 102 EXPECT_EQ((uint32_t)30, receiver->GetMaxPacketSize()); |
| 103 |
| 104 std::vector<uint8_t> p1{0x1C, 'g', 'o', 'o', 'g', 'l', 'e'}; |
| 105 receiver->ReceivePacket(p1); |
| 106 EXPECT_EQ(State::DATA_READY, receiver->GetState()); |
| 107 EXPECT_EQ("google", receiver->GetDataMessage()); |
| 108 |
| 109 std::vector<uint8_t> p2{0xA2, 0x80, 0x00}; |
| 110 receiver->ReceivePacket(p2); |
| 111 EXPECT_EQ(State::CONNECTION_CLOSED, receiver->GetState()); |
| 112 EXPECT_EQ(ReasonForClose::APPLICATION_ERROR, receiver->GetReasonForClose()); |
| 113 } |
| 114 |
| 115 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest, |
| 116 WellBehavingClientPacketsWithControlDataTest) { |
| 117 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver = |
| 118 (new BluetoothLowEnergyWeavePacketReceiver::Factory()) |
| 119 ->NewInstance(ReceiverType::CLIENT); |
| 120 |
| 121 std::vector<uint8_t> p0{0x81, 1, 0, 20, 0, 'a', 'b', 'c', 'd'}; |
| 122 receiver->ReceivePacket(p0); |
| 123 EXPECT_EQ(State::DATA_READY, receiver->GetState()); |
| 124 EXPECT_EQ("abcd", receiver->GetDataMessage()); |
| 125 |
| 126 std::vector<uint8_t> p1{0x1C, 'g', 'o', 'o', 'g', 'l', 'e'}; |
| 127 receiver->ReceivePacket(p1); |
| 128 EXPECT_EQ(State::DATA_READY, receiver->GetState()); |
| 129 EXPECT_EQ("google", receiver->GetDataMessage()); |
| 130 |
| 131 std::vector<uint8_t> p2{0xA2, 0x00, 0x00}; |
| 132 receiver->ReceivePacket(p2); |
| 133 EXPECT_EQ(State::CONNECTION_CLOSED, receiver->GetState()); |
| 134 EXPECT_EQ(ReasonForClose::CLOSE_WITHOUT_ERROR, receiver->GetReasonForClose()); |
| 135 } |
| 136 |
| 137 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest, |
| 138 ShortPacketTest) { |
| 139 BluetoothLowEnergyWeavePacketReceiver::Factory factory = |
| 140 BluetoothLowEnergyWeavePacketReceiver::Factory(); |
| 141 |
| 142 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver = |
| 143 factory.NewInstance(ReceiverType::CLIENT); |
| 144 |
| 145 std::vector<uint8_t> p0{0x81, 1, 0, 20, 0}; |
| 146 receiver->ReceivePacket(p0); |
| 147 EXPECT_EQ(State::WAITING, receiver->GetState()); |
| 148 |
| 149 std::vector<uint8_t> p1{0x1C}; |
| 150 receiver->ReceivePacket(p1); |
| 151 EXPECT_EQ(State::DATA_READY, receiver->GetState()); |
| 152 EXPECT_EQ("", receiver->GetDataMessage()); |
| 153 |
| 154 std::vector<uint8_t> p2; |
| 155 receiver->ReceivePacket(p2); |
| 156 EXPECT_EQ(State::ERROR, receiver->GetState()); |
| 157 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose()); |
| 158 } |
| 159 |
| 160 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest, |
| 161 InappropriateConnectingTypeTest) { |
| 162 BluetoothLowEnergyWeavePacketReceiver::Factory factory = |
| 163 BluetoothLowEnergyWeavePacketReceiver::Factory(); |
| 164 |
| 165 // Server receives connection response. |
| 166 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver = |
| 167 factory.NewInstance(ReceiverType::SERVER); |
| 168 std::vector<uint8_t> p0{0x81, 1, 0, 20, 0}; |
| 169 receiver->ReceivePacket(p0); |
| 170 EXPECT_EQ(State::ERROR, receiver->GetState()); |
| 171 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose()); |
| 172 |
| 173 // Client receives connection request. |
| 174 receiver = factory.NewInstance(ReceiverType::CLIENT); |
| 175 std::vector<uint8_t> p1{0x80, 1, 0, 1, 0, 0, 0}; |
| 176 receiver->ReceivePacket(p1); |
| 177 EXPECT_EQ(State::ERROR, receiver->GetState()); |
| 178 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose()); |
| 179 |
| 180 // Receiving connection close as the first packet. |
| 181 receiver = factory.NewInstance(ReceiverType::SERVER); |
| 182 std::vector<uint8_t> p2{0x82, 0, 0}; |
| 183 receiver->ReceivePacket(p2); |
| 184 EXPECT_EQ(State::ERROR, receiver->GetState()); |
| 185 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose()); |
| 186 |
| 187 // Receiving data packet as the first packet. |
| 188 receiver = factory.NewInstance(ReceiverType::SERVER); |
| 189 std::vector<uint8_t> p3{0x08, 'a', 'b', 'c', 'd'}; |
| 190 receiver->ReceivePacket(p3); |
| 191 EXPECT_EQ(State::ERROR, receiver->GetState()); |
| 192 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose()); |
| 193 } |
| 194 |
| 195 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest, |
| 196 ControlPacketSizeTest) { |
| 197 BluetoothLowEnergyWeavePacketReceiver::Factory factory = |
| 198 BluetoothLowEnergyWeavePacketReceiver::Factory(); |
| 199 |
| 200 // Connection request missing a byte. |
| 201 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver = |
| 202 factory.NewInstance(ReceiverType::SERVER); |
| 203 std::vector<uint8_t> p0{0x80, 1, 0, 1, 0, 0}; |
| 204 receiver->ReceivePacket(p0); |
| 205 EXPECT_EQ(State::ERROR, receiver->GetState()); |
| 206 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose()); |
| 207 |
| 208 // Connection response missing a byte. |
| 209 receiver = factory.NewInstance(ReceiverType::CLIENT); |
| 210 std::vector<uint8_t> p1{0x81, 1, 0, 20}; |
| 211 receiver->ReceivePacket(p1); |
| 212 EXPECT_EQ(State::ERROR, receiver->GetState()); |
| 213 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose()); |
| 214 |
| 215 // Max length connection request is accepted. |
| 216 receiver = factory.NewInstance(ReceiverType::SERVER); |
| 217 std::vector<uint8_t> p2(20, 0); |
| 218 p2[0] = 0x80; |
| 219 p2[1] = 1; |
| 220 p2[3] = 1; |
| 221 receiver->ReceivePacket(p2); |
| 222 EXPECT_EQ(State::DATA_READY, receiver->GetState()); |
| 223 |
| 224 // Connection request that's a byte too long. |
| 225 receiver = factory.NewInstance(ReceiverType::SERVER); |
| 226 p2.push_back(0); |
| 227 receiver->ReceivePacket(p2); |
| 228 EXPECT_EQ(State::ERROR, receiver->GetState()); |
| 229 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose()); |
| 230 |
| 231 // Max length connection response is accepted. |
| 232 receiver = factory.NewInstance(ReceiverType::CLIENT); |
| 233 std::vector<uint8_t> p3(20, 0); |
| 234 p3[0] = 0x81; |
| 235 p3[1] = 1; |
| 236 p3[3] = 20; |
| 237 receiver->ReceivePacket(p3); |
| 238 EXPECT_EQ(State::DATA_READY, receiver->GetState()); |
| 239 |
| 240 // Connection response that's a byte too long. |
| 241 receiver = factory.NewInstance(ReceiverType::CLIENT); |
| 242 p3.push_back(0); |
| 243 receiver->ReceivePacket(p3); |
| 244 EXPECT_EQ(State::ERROR, receiver->GetState()); |
| 245 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose()); |
| 246 } |
| 247 |
| 248 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest, |
| 249 WrongFirstLastBitTest) { |
| 250 BluetoothLowEnergyWeavePacketReceiver::Factory factory = |
| 251 BluetoothLowEnergyWeavePacketReceiver::Factory(); |
| 252 |
| 253 // First bit is not set when it's supposed to be with last bit not set. |
| 254 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver = |
| 255 factory.NewInstance(ReceiverType::SERVER); |
| 256 std::vector<uint8_t> p0{0x80, 1, 0, 1, 0, 0, 0}; |
| 257 receiver->ReceivePacket(p0); |
| 258 EXPECT_EQ(State::WAITING, receiver->GetState()); |
| 259 |
| 260 std::vector<uint8_t> p1{0x10}; |
| 261 receiver->ReceivePacket(p1); |
| 262 EXPECT_EQ(State::ERROR, receiver->GetState()); |
| 263 EXPECT_EQ(ReasonForClose::RECEIVED_PACKET_OUT_OF_SEQUENCE, |
| 264 receiver->GetReasonToClose()); |
| 265 |
| 266 // First bit is not set when it's supposed to be when last bit is set. |
| 267 receiver = factory.NewInstance(ReceiverType::SERVER); |
| 268 receiver->ReceivePacket(p0); |
| 269 EXPECT_EQ(State::WAITING, receiver->GetState()); |
| 270 |
| 271 std::vector<uint8_t> p2{0x14}; |
| 272 receiver->ReceivePacket(p1); |
| 273 EXPECT_EQ(State::ERROR, receiver->GetState()); |
| 274 EXPECT_EQ(ReasonForClose::RECEIVED_PACKET_OUT_OF_SEQUENCE, |
| 275 receiver->GetReasonToClose()); |
| 276 } |
| 277 |
| 278 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest, |
| 279 OutOfOrderPacketTest) { |
| 280 BluetoothLowEnergyWeavePacketReceiver::Factory factory = |
| 281 BluetoothLowEnergyWeavePacketReceiver::Factory(); |
| 282 |
| 283 // Skip a packet in number. |
| 284 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver = |
| 285 factory.NewInstance(ReceiverType::SERVER); |
| 286 std::vector<uint8_t> p0{0x80, 1, 0, 1, 0, 0, 0}; |
| 287 receiver->ReceivePacket(p0); |
| 288 EXPECT_EQ(State::WAITING, receiver->GetState()); |
| 289 |
| 290 std::vector<uint8_t> p1{0x20}; |
| 291 receiver->ReceivePacket(p1); |
| 292 EXPECT_EQ(State::ERROR, receiver->GetState()); |
| 293 EXPECT_EQ(ReasonForClose::RECEIVED_PACKET_OUT_OF_SEQUENCE, |
| 294 receiver->GetReasonToClose()); |
| 295 } |
| 296 |
| 297 TEST_F(ProximityAuthBluetoothLowEnergyWeavePacketReceiverTest, |
| 298 IncorrectValuesInControlPacketTest) { |
| 299 BluetoothLowEnergyWeavePacketReceiver::Factory factory = |
| 300 BluetoothLowEnergyWeavePacketReceiver::Factory(); |
| 301 |
| 302 // Invalid version in request. |
| 303 std::unique_ptr<BluetoothLowEnergyWeavePacketReceiver> receiver = |
| 304 factory.NewInstance(ReceiverType::SERVER); |
| 305 std::vector<uint8_t> p0{0x80, 2, 0, 1, 0, 0, 0}; |
| 306 receiver->ReceivePacket(p0); |
| 307 EXPECT_EQ(State::ERROR, receiver->GetState()); |
| 308 EXPECT_EQ(ReasonForClose::NO_COMMON_VERSION_SUPPORTED, |
| 309 receiver->GetReasonToClose()); |
| 310 |
| 311 // Invalid max packet size in request. |
| 312 receiver = factory.NewInstance(ReceiverType::SERVER); |
| 313 std::vector<uint8_t> p1{0x80, 1, 0, 1, 0, 19, 0}; |
| 314 receiver->ReceivePacket(p1); |
| 315 EXPECT_EQ(State::ERROR, receiver->GetState()); |
| 316 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose()); |
| 317 |
| 318 // Invalid selected version in response. |
| 319 receiver = factory.NewInstance(ReceiverType::CLIENT); |
| 320 std::vector<uint8_t> p2{0x81, 0, 1, 20, 0}; |
| 321 receiver->ReceivePacket(p2); |
| 322 EXPECT_EQ(State::ERROR, receiver->GetState()); |
| 323 EXPECT_EQ(ReasonForClose::NO_COMMON_VERSION_SUPPORTED, |
| 324 receiver->GetReasonToClose()); |
| 325 |
| 326 // Invalid selected max packet size in response. |
| 327 receiver = factory.NewInstance(ReceiverType::CLIENT); |
| 328 std::vector<uint8_t> p3{0x81, 1, 0, 19, 0}; |
| 329 receiver->ReceivePacket(p3); |
| 330 EXPECT_EQ(State::ERROR, receiver->GetState()); |
| 331 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose()); |
| 332 |
| 333 // Invalid reason for close. |
| 334 receiver = factory.NewInstance(ReceiverType::CLIENT); |
| 335 std::vector<uint8_t> p4{0x81, 1, 0, 20, 0}; |
| 336 receiver->ReceivePacket(p4); |
| 337 EXPECT_EQ(State::WAITING, receiver->GetState()); |
| 338 |
| 339 std::vector<uint8_t> p5{0x92, 0x05, 0x00}; |
| 340 receiver->ReceivePacket(p5); |
| 341 EXPECT_EQ(State::ERROR, receiver->GetState()); |
| 342 EXPECT_EQ(ReasonForClose::UNKNOWN_ERROR, receiver->GetReasonToClose()); |
| 343 } |
| 344 |
| 345 // TODO(jingxuy): test for other malicious headers |
| 346 |
| 347 } // namespace proximity_auth |
| OLD | NEW |