| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <map> | 5 #include <map> |
| 6 #include <vector> | 6 #include <vector> |
| 7 | 7 |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "net/quic/crypto/crypto_framer.h" | 10 #include "net/quic/crypto/crypto_framer.h" |
| 11 #include "net/quic/crypto/crypto_handshake.h" | 11 #include "net/quic/crypto/crypto_handshake.h" |
| 12 #include "net/quic/crypto/crypto_protocol.h" | 12 #include "net/quic/crypto/crypto_protocol.h" |
| 13 #include "net/quic/quic_protocol.h" | 13 #include "net/quic/quic_protocol.h" |
| 14 #include "net/quic/test_tools/crypto_test_utils.h" | 14 #include "net/quic/test_tools/crypto_test_utils.h" |
| 15 #include "net/quic/test_tools/quic_test_utils.h" | 15 #include "net/quic/test_tools/quic_test_utils.h" |
| 16 | 16 |
| 17 using base::StringPiece; | 17 using base::StringPiece; |
| 18 using std::map; | 18 using std::map; |
| 19 using std::string; | 19 using std::string; |
| 20 using std::vector; | 20 using std::vector; |
| 21 | 21 |
| 22 namespace net { | 22 namespace net { |
| 23 | 23 |
| 24 namespace { | 24 namespace { |
| 25 | 25 |
| 26 char* AsChars(unsigned char* data) { return reinterpret_cast<char*>(data); } | 26 char* AsChars(unsigned char* data) { |
| 27 return reinterpret_cast<char*>(data); |
| 28 } |
| 27 | 29 |
| 28 } // namespace | 30 } // namespace |
| 29 | 31 |
| 30 namespace test { | 32 namespace test { |
| 31 | 33 |
| 32 class TestCryptoVisitor : public ::net::CryptoFramerVisitorInterface { | 34 class TestCryptoVisitor : public ::net::CryptoFramerVisitorInterface { |
| 33 public: | 35 public: |
| 34 TestCryptoVisitor() : error_count_(0) {} | 36 TestCryptoVisitor() : error_count_(0) {} |
| 35 | 37 |
| 36 virtual void OnError(CryptoFramer* framer) OVERRIDE { | 38 virtual void OnError(CryptoFramer* framer) OVERRIDE { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 49 vector<CryptoHandshakeMessage> messages_; | 51 vector<CryptoHandshakeMessage> messages_; |
| 50 }; | 52 }; |
| 51 | 53 |
| 52 TEST(CryptoFramerTest, ConstructHandshakeMessage) { | 54 TEST(CryptoFramerTest, ConstructHandshakeMessage) { |
| 53 CryptoHandshakeMessage message; | 55 CryptoHandshakeMessage message; |
| 54 message.set_tag(0xFFAA7733); | 56 message.set_tag(0xFFAA7733); |
| 55 message.SetStringPiece(0x12345678, "abcdef"); | 57 message.SetStringPiece(0x12345678, "abcdef"); |
| 56 message.SetStringPiece(0x12345679, "ghijk"); | 58 message.SetStringPiece(0x12345679, "ghijk"); |
| 57 message.SetStringPiece(0x1234567A, "lmnopqr"); | 59 message.SetStringPiece(0x1234567A, "lmnopqr"); |
| 58 | 60 |
| 59 unsigned char packet[] = { | 61 unsigned char packet[] = {// tag |
| 60 // tag | 62 0x33, 0x77, 0xAA, 0xFF, |
| 61 0x33, 0x77, 0xAA, 0xFF, | 63 // num entries |
| 62 // num entries | 64 0x03, 0x00, |
| 63 0x03, 0x00, | 65 // padding |
| 64 // padding | 66 0x00, 0x00, |
| 65 0x00, 0x00, | 67 // tag 1 |
| 66 // tag 1 | 68 0x78, 0x56, 0x34, 0x12, |
| 67 0x78, 0x56, 0x34, 0x12, | 69 // end offset 1 |
| 68 // end offset 1 | 70 0x06, 0x00, 0x00, 0x00, |
| 69 0x06, 0x00, 0x00, 0x00, | 71 // tag 2 |
| 70 // tag 2 | 72 0x79, 0x56, 0x34, 0x12, |
| 71 0x79, 0x56, 0x34, 0x12, | 73 // end offset 2 |
| 72 // end offset 2 | 74 0x0b, 0x00, 0x00, 0x00, |
| 73 0x0b, 0x00, 0x00, 0x00, | 75 // tag 3 |
| 74 // tag 3 | 76 0x7A, 0x56, 0x34, 0x12, |
| 75 0x7A, 0x56, 0x34, 0x12, | 77 // end offset 3 |
| 76 // end offset 3 | 78 0x12, 0x00, 0x00, 0x00, |
| 77 0x12, 0x00, 0x00, 0x00, | 79 // value 1 |
| 78 // value 1 | 80 'a', 'b', 'c', 'd', 'e', 'f', |
| 79 'a', 'b', 'c', 'd', | 81 // value 2 |
| 80 'e', 'f', | 82 'g', 'h', 'i', 'j', 'k', |
| 81 // value 2 | 83 // value 3 |
| 82 'g', 'h', 'i', 'j', | 84 'l', 'm', 'n', 'o', 'p', 'q', 'r', |
| 83 'k', | |
| 84 // value 3 | |
| 85 'l', 'm', 'n', 'o', | |
| 86 'p', 'q', 'r', | |
| 87 }; | 85 }; |
| 88 | 86 |
| 89 CryptoFramer framer; | 87 CryptoFramer framer; |
| 90 scoped_ptr<QuicData> data(framer.ConstructHandshakeMessage(message)); | 88 scoped_ptr<QuicData> data(framer.ConstructHandshakeMessage(message)); |
| 91 ASSERT_TRUE(data.get() != NULL); | 89 ASSERT_TRUE(data.get() != NULL); |
| 92 test::CompareCharArraysWithHexError("constructed packet", data->data(), | 90 test::CompareCharArraysWithHexError("constructed packet", |
| 93 data->length(), AsChars(packet), | 91 data->data(), |
| 92 data->length(), |
| 93 AsChars(packet), |
| 94 arraysize(packet)); | 94 arraysize(packet)); |
| 95 } | 95 } |
| 96 | 96 |
| 97 TEST(CryptoFramerTest, ConstructHandshakeMessageWithTwoKeys) { | 97 TEST(CryptoFramerTest, ConstructHandshakeMessageWithTwoKeys) { |
| 98 CryptoHandshakeMessage message; | 98 CryptoHandshakeMessage message; |
| 99 message.set_tag(0xFFAA7733); | 99 message.set_tag(0xFFAA7733); |
| 100 message.SetStringPiece(0x12345678, "abcdef"); | 100 message.SetStringPiece(0x12345678, "abcdef"); |
| 101 message.SetStringPiece(0x12345679, "ghijk"); | 101 message.SetStringPiece(0x12345679, "ghijk"); |
| 102 | 102 |
| 103 unsigned char packet[] = { | 103 unsigned char packet[] = {// tag |
| 104 // tag | 104 0x33, 0x77, 0xAA, 0xFF, |
| 105 0x33, 0x77, 0xAA, 0xFF, | 105 // num entries |
| 106 // num entries | 106 0x02, 0x00, |
| 107 0x02, 0x00, | 107 // padding |
| 108 // padding | 108 0x00, 0x00, |
| 109 0x00, 0x00, | 109 // tag 1 |
| 110 // tag 1 | 110 0x78, 0x56, 0x34, 0x12, |
| 111 0x78, 0x56, 0x34, 0x12, | 111 // end offset 1 |
| 112 // end offset 1 | 112 0x06, 0x00, 0x00, 0x00, |
| 113 0x06, 0x00, 0x00, 0x00, | 113 // tag 2 |
| 114 // tag 2 | 114 0x79, 0x56, 0x34, 0x12, |
| 115 0x79, 0x56, 0x34, 0x12, | 115 // end offset 2 |
| 116 // end offset 2 | 116 0x0b, 0x00, 0x00, 0x00, |
| 117 0x0b, 0x00, 0x00, 0x00, | 117 // value 1 |
| 118 // value 1 | 118 'a', 'b', 'c', 'd', 'e', 'f', |
| 119 'a', 'b', 'c', 'd', | 119 // value 2 |
| 120 'e', 'f', | 120 'g', 'h', 'i', 'j', 'k', |
| 121 // value 2 | |
| 122 'g', 'h', 'i', 'j', | |
| 123 'k', | |
| 124 }; | 121 }; |
| 125 | 122 |
| 126 CryptoFramer framer; | 123 CryptoFramer framer; |
| 127 scoped_ptr<QuicData> data(framer.ConstructHandshakeMessage(message)); | 124 scoped_ptr<QuicData> data(framer.ConstructHandshakeMessage(message)); |
| 128 ASSERT_TRUE(data.get() != NULL); | 125 ASSERT_TRUE(data.get() != NULL); |
| 129 | 126 |
| 130 test::CompareCharArraysWithHexError("constructed packet", data->data(), | 127 test::CompareCharArraysWithHexError("constructed packet", |
| 131 data->length(), AsChars(packet), | 128 data->data(), |
| 129 data->length(), |
| 130 AsChars(packet), |
| 132 arraysize(packet)); | 131 arraysize(packet)); |
| 133 } | 132 } |
| 134 | 133 |
| 135 TEST(CryptoFramerTest, ConstructHandshakeMessageZeroLength) { | 134 TEST(CryptoFramerTest, ConstructHandshakeMessageZeroLength) { |
| 136 CryptoHandshakeMessage message; | 135 CryptoHandshakeMessage message; |
| 137 message.set_tag(0xFFAA7733); | 136 message.set_tag(0xFFAA7733); |
| 138 message.SetStringPiece(0x12345678, ""); | 137 message.SetStringPiece(0x12345678, ""); |
| 139 | 138 |
| 140 unsigned char packet[] = { | 139 unsigned char packet[] = {// tag |
| 141 // tag | 140 0x33, 0x77, 0xAA, 0xFF, |
| 142 0x33, 0x77, 0xAA, 0xFF, | 141 // num entries |
| 143 // num entries | 142 0x01, 0x00, |
| 144 0x01, 0x00, | 143 // padding |
| 145 // padding | 144 0x00, 0x00, |
| 146 0x00, 0x00, | 145 // tag 1 |
| 147 // tag 1 | 146 0x78, 0x56, 0x34, 0x12, |
| 148 0x78, 0x56, 0x34, 0x12, | 147 // end offset 1 |
| 149 // end offset 1 | 148 0x00, 0x00, 0x00, 0x00, |
| 150 0x00, 0x00, 0x00, 0x00, | |
| 151 }; | 149 }; |
| 152 | 150 |
| 153 CryptoFramer framer; | 151 CryptoFramer framer; |
| 154 scoped_ptr<QuicData> data(framer.ConstructHandshakeMessage(message)); | 152 scoped_ptr<QuicData> data(framer.ConstructHandshakeMessage(message)); |
| 155 ASSERT_TRUE(data.get() != NULL); | 153 ASSERT_TRUE(data.get() != NULL); |
| 156 | 154 |
| 157 test::CompareCharArraysWithHexError("constructed packet", data->data(), | 155 test::CompareCharArraysWithHexError("constructed packet", |
| 158 data->length(), AsChars(packet), | 156 data->data(), |
| 157 data->length(), |
| 158 AsChars(packet), |
| 159 arraysize(packet)); | 159 arraysize(packet)); |
| 160 } | 160 } |
| 161 | 161 |
| 162 TEST(CryptoFramerTest, ConstructHandshakeMessageTooManyEntries) { | 162 TEST(CryptoFramerTest, ConstructHandshakeMessageTooManyEntries) { |
| 163 CryptoHandshakeMessage message; | 163 CryptoHandshakeMessage message; |
| 164 message.set_tag(0xFFAA7733); | 164 message.set_tag(0xFFAA7733); |
| 165 for (uint32 key = 1; key <= kMaxEntries + 1; ++key) { | 165 for (uint32 key = 1; key <= kMaxEntries + 1; ++key) { |
| 166 message.SetStringPiece(key, "abcdef"); | 166 message.SetStringPiece(key, "abcdef"); |
| 167 } | 167 } |
| 168 | 168 |
| 169 CryptoFramer framer; | 169 CryptoFramer framer; |
| 170 scoped_ptr<QuicData> data(framer.ConstructHandshakeMessage(message)); | 170 scoped_ptr<QuicData> data(framer.ConstructHandshakeMessage(message)); |
| 171 EXPECT_TRUE(data.get() == NULL); | 171 EXPECT_TRUE(data.get() == NULL); |
| 172 } | 172 } |
| 173 | 173 |
| 174 TEST(CryptoFramerTest, ConstructHandshakeMessageMinimumSize) { | 174 TEST(CryptoFramerTest, ConstructHandshakeMessageMinimumSize) { |
| 175 CryptoHandshakeMessage message; | 175 CryptoHandshakeMessage message; |
| 176 message.set_tag(0xFFAA7733); | 176 message.set_tag(0xFFAA7733); |
| 177 message.SetStringPiece(0x01020304, "test"); | 177 message.SetStringPiece(0x01020304, "test"); |
| 178 message.set_minimum_size(64); | 178 message.set_minimum_size(64); |
| 179 | 179 |
| 180 unsigned char packet[] = { | 180 unsigned char packet[] = {// tag |
| 181 // tag | 181 0x33, 0x77, 0xAA, 0xFF, |
| 182 0x33, 0x77, 0xAA, 0xFF, | 182 // num entries |
| 183 // num entries | 183 0x02, 0x00, |
| 184 0x02, 0x00, | 184 // padding |
| 185 // padding | 185 0x00, 0x00, |
| 186 0x00, 0x00, | 186 // tag 1 |
| 187 // tag 1 | 187 'P', 'A', 'D', 0, |
| 188 'P', 'A', 'D', 0, | 188 // end offset 1 |
| 189 // end offset 1 | 189 0x24, 0x00, 0x00, 0x00, |
| 190 0x24, 0x00, 0x00, 0x00, | 190 // tag 2 |
| 191 // tag 2 | 191 0x04, 0x03, 0x02, 0x01, |
| 192 0x04, 0x03, 0x02, 0x01, | 192 // end offset 2 |
| 193 // end offset 2 | 193 0x28, 0x00, 0x00, 0x00, |
| 194 0x28, 0x00, 0x00, 0x00, | 194 // 36 bytes of padding. |
| 195 // 36 bytes of padding. | 195 '-', '-', '-', '-', '-', '-', '-', '-', '-', |
| 196 '-', '-', '-', '-', '-', '-', '-', '-', | 196 '-', '-', '-', '-', '-', '-', '-', '-', '-', |
| 197 '-', '-', '-', '-', '-', '-', '-', '-', | 197 '-', '-', '-', '-', '-', '-', '-', '-', '-', |
| 198 '-', '-', '-', '-', '-', '-', '-', '-', | 198 '-', '-', '-', '-', '-', '-', '-', '-', '-', |
| 199 '-', '-', '-', '-', '-', '-', '-', '-', | 199 // value 2 |
| 200 '-', '-', '-', '-', | 200 't', 'e', 's', 't', |
| 201 // value 2 | |
| 202 't', 'e', 's', 't', | |
| 203 }; | 201 }; |
| 204 | 202 |
| 205 CryptoFramer framer; | 203 CryptoFramer framer; |
| 206 scoped_ptr<QuicData> data(framer.ConstructHandshakeMessage(message)); | 204 scoped_ptr<QuicData> data(framer.ConstructHandshakeMessage(message)); |
| 207 ASSERT_TRUE(data.get() != NULL); | 205 ASSERT_TRUE(data.get() != NULL); |
| 208 | 206 |
| 209 test::CompareCharArraysWithHexError("constructed packet", data->data(), | 207 test::CompareCharArraysWithHexError("constructed packet", |
| 210 data->length(), AsChars(packet), | 208 data->data(), |
| 209 data->length(), |
| 210 AsChars(packet), |
| 211 arraysize(packet)); | 211 arraysize(packet)); |
| 212 } | 212 } |
| 213 | 213 |
| 214 TEST(CryptoFramerTest, ConstructHandshakeMessageMinimumSizePadLast) { | 214 TEST(CryptoFramerTest, ConstructHandshakeMessageMinimumSizePadLast) { |
| 215 CryptoHandshakeMessage message; | 215 CryptoHandshakeMessage message; |
| 216 message.set_tag(0xFFAA7733); | 216 message.set_tag(0xFFAA7733); |
| 217 message.SetStringPiece(1, ""); | 217 message.SetStringPiece(1, ""); |
| 218 message.set_minimum_size(64); | 218 message.set_minimum_size(64); |
| 219 | 219 |
| 220 unsigned char packet[] = { | 220 unsigned char packet[] = { |
| 221 // tag | 221 // tag |
| 222 0x33, 0x77, 0xAA, 0xFF, | 222 0x33, 0x77, 0xAA, 0xFF, |
| 223 // num entries | 223 // num entries |
| 224 0x02, 0x00, | 224 0x02, 0x00, |
| 225 // padding | 225 // padding |
| 226 0x00, 0x00, | 226 0x00, 0x00, |
| 227 // tag 1 | 227 // tag 1 |
| 228 0x01, 0x00, 0x00, 0x00, | 228 0x01, 0x00, 0x00, 0x00, |
| 229 // end offset 1 | 229 // end offset 1 |
| 230 0x00, 0x00, 0x00, 0x00, | 230 0x00, 0x00, 0x00, 0x00, |
| 231 // tag 2 | 231 // tag 2 |
| 232 'P', 'A', 'D', 0, | 232 'P', 'A', 'D', 0, |
| 233 // end offset 2 | 233 // end offset 2 |
| 234 0x28, 0x00, 0x00, 0x00, | 234 0x28, 0x00, 0x00, 0x00, |
| 235 // 40 bytes of padding. | 235 // 40 bytes of padding. |
| 236 '-', '-', '-', '-', '-', '-', '-', '-', | 236 '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', |
| 237 '-', '-', '-', '-', '-', '-', '-', '-', | 237 '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', |
| 238 '-', '-', '-', '-', '-', '-', '-', '-', | 238 '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', |
| 239 '-', '-', '-', '-', '-', '-', '-', '-', | |
| 240 '-', '-', '-', '-', '-', '-', '-', '-', | |
| 241 }; | 239 }; |
| 242 | 240 |
| 243 CryptoFramer framer; | 241 CryptoFramer framer; |
| 244 scoped_ptr<QuicData> data(framer.ConstructHandshakeMessage(message)); | 242 scoped_ptr<QuicData> data(framer.ConstructHandshakeMessage(message)); |
| 245 ASSERT_TRUE(data.get() != NULL); | 243 ASSERT_TRUE(data.get() != NULL); |
| 246 | 244 |
| 247 test::CompareCharArraysWithHexError("constructed packet", data->data(), | 245 test::CompareCharArraysWithHexError("constructed packet", |
| 248 data->length(), AsChars(packet), | 246 data->data(), |
| 247 data->length(), |
| 248 AsChars(packet), |
| 249 arraysize(packet)); | 249 arraysize(packet)); |
| 250 } | 250 } |
| 251 | 251 |
| 252 TEST(CryptoFramerTest, ProcessInput) { | 252 TEST(CryptoFramerTest, ProcessInput) { |
| 253 test::TestCryptoVisitor visitor; | 253 test::TestCryptoVisitor visitor; |
| 254 CryptoFramer framer; | 254 CryptoFramer framer; |
| 255 framer.set_visitor(&visitor); | 255 framer.set_visitor(&visitor); |
| 256 | 256 |
| 257 unsigned char input[] = { | 257 unsigned char input[] = {// tag |
| 258 // tag | 258 0x33, 0x77, 0xAA, 0xFF, |
| 259 0x33, 0x77, 0xAA, 0xFF, | 259 // num entries |
| 260 // num entries | 260 0x02, 0x00, |
| 261 0x02, 0x00, | 261 // padding |
| 262 // padding | 262 0x00, 0x00, |
| 263 0x00, 0x00, | 263 // tag 1 |
| 264 // tag 1 | 264 0x78, 0x56, 0x34, 0x12, |
| 265 0x78, 0x56, 0x34, 0x12, | 265 // end offset 1 |
| 266 // end offset 1 | 266 0x06, 0x00, 0x00, 0x00, |
| 267 0x06, 0x00, 0x00, 0x00, | 267 // tag 2 |
| 268 // tag 2 | 268 0x79, 0x56, 0x34, 0x12, |
| 269 0x79, 0x56, 0x34, 0x12, | 269 // end offset 2 |
| 270 // end offset 2 | 270 0x0b, 0x00, 0x00, 0x00, |
| 271 0x0b, 0x00, 0x00, 0x00, | 271 // value 1 |
| 272 // value 1 | 272 'a', 'b', 'c', 'd', 'e', 'f', |
| 273 'a', 'b', 'c', 'd', | 273 // value 2 |
| 274 'e', 'f', | 274 'g', 'h', 'i', 'j', 'k', |
| 275 // value 2 | |
| 276 'g', 'h', 'i', 'j', | |
| 277 'k', | |
| 278 }; | 275 }; |
| 279 | 276 |
| 280 EXPECT_TRUE( | 277 EXPECT_TRUE( |
| 281 framer.ProcessInput(StringPiece(AsChars(input), arraysize(input)))); | 278 framer.ProcessInput(StringPiece(AsChars(input), arraysize(input)))); |
| 282 EXPECT_EQ(0u, framer.InputBytesRemaining()); | 279 EXPECT_EQ(0u, framer.InputBytesRemaining()); |
| 283 EXPECT_EQ(0, visitor.error_count_); | 280 EXPECT_EQ(0, visitor.error_count_); |
| 284 ASSERT_EQ(1u, visitor.messages_.size()); | 281 ASSERT_EQ(1u, visitor.messages_.size()); |
| 285 const CryptoHandshakeMessage& message = visitor.messages_[0]; | 282 const CryptoHandshakeMessage& message = visitor.messages_[0]; |
| 286 EXPECT_EQ(0xFFAA7733, message.tag()); | 283 EXPECT_EQ(0xFFAA7733, message.tag()); |
| 287 EXPECT_EQ(2u, message.tag_value_map().size()); | 284 EXPECT_EQ(2u, message.tag_value_map().size()); |
| 288 EXPECT_EQ("abcdef", CryptoTestUtils::GetValueForTag(message, 0x12345678)); | 285 EXPECT_EQ("abcdef", CryptoTestUtils::GetValueForTag(message, 0x12345678)); |
| 289 EXPECT_EQ("ghijk", CryptoTestUtils::GetValueForTag(message, 0x12345679)); | 286 EXPECT_EQ("ghijk", CryptoTestUtils::GetValueForTag(message, 0x12345679)); |
| 290 } | 287 } |
| 291 | 288 |
| 292 TEST(CryptoFramerTest, ProcessInputWithThreeKeys) { | 289 TEST(CryptoFramerTest, ProcessInputWithThreeKeys) { |
| 293 test::TestCryptoVisitor visitor; | 290 test::TestCryptoVisitor visitor; |
| 294 CryptoFramer framer; | 291 CryptoFramer framer; |
| 295 framer.set_visitor(&visitor); | 292 framer.set_visitor(&visitor); |
| 296 | 293 |
| 297 unsigned char input[] = { | 294 unsigned char input[] = {// tag |
| 298 // tag | 295 0x33, 0x77, 0xAA, 0xFF, |
| 299 0x33, 0x77, 0xAA, 0xFF, | 296 // num entries |
| 300 // num entries | 297 0x03, 0x00, |
| 301 0x03, 0x00, | 298 // padding |
| 302 // padding | 299 0x00, 0x00, |
| 303 0x00, 0x00, | 300 // tag 1 |
| 304 // tag 1 | 301 0x78, 0x56, 0x34, 0x12, |
| 305 0x78, 0x56, 0x34, 0x12, | 302 // end offset 1 |
| 306 // end offset 1 | 303 0x06, 0x00, 0x00, 0x00, |
| 307 0x06, 0x00, 0x00, 0x00, | 304 // tag 2 |
| 308 // tag 2 | 305 0x79, 0x56, 0x34, 0x12, |
| 309 0x79, 0x56, 0x34, 0x12, | 306 // end offset 2 |
| 310 // end offset 2 | 307 0x0b, 0x00, 0x00, 0x00, |
| 311 0x0b, 0x00, 0x00, 0x00, | 308 // tag 3 |
| 312 // tag 3 | 309 0x7A, 0x56, 0x34, 0x12, |
| 313 0x7A, 0x56, 0x34, 0x12, | 310 // end offset 3 |
| 314 // end offset 3 | 311 0x12, 0x00, 0x00, 0x00, |
| 315 0x12, 0x00, 0x00, 0x00, | 312 // value 1 |
| 316 // value 1 | 313 'a', 'b', 'c', 'd', 'e', 'f', |
| 317 'a', 'b', 'c', 'd', | 314 // value 2 |
| 318 'e', 'f', | 315 'g', 'h', 'i', 'j', 'k', |
| 319 // value 2 | 316 // value 3 |
| 320 'g', 'h', 'i', 'j', | 317 'l', 'm', 'n', 'o', 'p', 'q', 'r', |
| 321 'k', | |
| 322 // value 3 | |
| 323 'l', 'm', 'n', 'o', | |
| 324 'p', 'q', 'r', | |
| 325 }; | 318 }; |
| 326 | 319 |
| 327 EXPECT_TRUE( | 320 EXPECT_TRUE( |
| 328 framer.ProcessInput(StringPiece(AsChars(input), arraysize(input)))); | 321 framer.ProcessInput(StringPiece(AsChars(input), arraysize(input)))); |
| 329 EXPECT_EQ(0u, framer.InputBytesRemaining()); | 322 EXPECT_EQ(0u, framer.InputBytesRemaining()); |
| 330 EXPECT_EQ(0, visitor.error_count_); | 323 EXPECT_EQ(0, visitor.error_count_); |
| 331 ASSERT_EQ(1u, visitor.messages_.size()); | 324 ASSERT_EQ(1u, visitor.messages_.size()); |
| 332 const CryptoHandshakeMessage& message = visitor.messages_[0]; | 325 const CryptoHandshakeMessage& message = visitor.messages_[0]; |
| 333 EXPECT_EQ(0xFFAA7733, message.tag()); | 326 EXPECT_EQ(0xFFAA7733, message.tag()); |
| 334 EXPECT_EQ(3u, message.tag_value_map().size()); | 327 EXPECT_EQ(3u, message.tag_value_map().size()); |
| 335 EXPECT_EQ("abcdef", CryptoTestUtils::GetValueForTag(message, 0x12345678)); | 328 EXPECT_EQ("abcdef", CryptoTestUtils::GetValueForTag(message, 0x12345678)); |
| 336 EXPECT_EQ("ghijk", CryptoTestUtils::GetValueForTag(message, 0x12345679)); | 329 EXPECT_EQ("ghijk", CryptoTestUtils::GetValueForTag(message, 0x12345679)); |
| 337 EXPECT_EQ("lmnopqr", CryptoTestUtils::GetValueForTag(message, 0x1234567A)); | 330 EXPECT_EQ("lmnopqr", CryptoTestUtils::GetValueForTag(message, 0x1234567A)); |
| 338 } | 331 } |
| 339 | 332 |
| 340 TEST(CryptoFramerTest, ProcessInputIncrementally) { | 333 TEST(CryptoFramerTest, ProcessInputIncrementally) { |
| 341 test::TestCryptoVisitor visitor; | 334 test::TestCryptoVisitor visitor; |
| 342 CryptoFramer framer; | 335 CryptoFramer framer; |
| 343 framer.set_visitor(&visitor); | 336 framer.set_visitor(&visitor); |
| 344 | 337 |
| 345 unsigned char input[] = { | 338 unsigned char input[] = {// tag |
| 346 // tag | 339 0x33, 0x77, 0xAA, 0xFF, |
| 347 0x33, 0x77, 0xAA, 0xFF, | 340 // num entries |
| 348 // num entries | 341 0x02, 0x00, |
| 349 0x02, 0x00, | 342 // padding |
| 350 // padding | 343 0x00, 0x00, |
| 351 0x00, 0x00, | 344 // tag 1 |
| 352 // tag 1 | 345 0x78, 0x56, 0x34, 0x12, |
| 353 0x78, 0x56, 0x34, 0x12, | 346 // end offset 1 |
| 354 // end offset 1 | 347 0x06, 0x00, 0x00, 0x00, |
| 355 0x06, 0x00, 0x00, 0x00, | 348 // tag 2 |
| 356 // tag 2 | 349 0x79, 0x56, 0x34, 0x12, |
| 357 0x79, 0x56, 0x34, 0x12, | 350 // end offset 2 |
| 358 // end offset 2 | 351 0x0b, 0x00, 0x00, 0x00, |
| 359 0x0b, 0x00, 0x00, 0x00, | 352 // value 1 |
| 360 // value 1 | 353 'a', 'b', 'c', 'd', 'e', 'f', |
| 361 'a', 'b', 'c', 'd', | 354 // value 2 |
| 362 'e', 'f', | 355 'g', 'h', 'i', 'j', 'k', |
| 363 // value 2 | |
| 364 'g', 'h', 'i', 'j', | |
| 365 'k', | |
| 366 }; | 356 }; |
| 367 | 357 |
| 368 for (size_t i = 0; i < arraysize(input); i++) { | 358 for (size_t i = 0; i < arraysize(input); i++) { |
| 369 EXPECT_TRUE(framer.ProcessInput(StringPiece(AsChars(input) + i, 1))); | 359 EXPECT_TRUE(framer.ProcessInput(StringPiece(AsChars(input) + i, 1))); |
| 370 } | 360 } |
| 371 EXPECT_EQ(0u, framer.InputBytesRemaining()); | 361 EXPECT_EQ(0u, framer.InputBytesRemaining()); |
| 372 ASSERT_EQ(1u, visitor.messages_.size()); | 362 ASSERT_EQ(1u, visitor.messages_.size()); |
| 373 const CryptoHandshakeMessage& message = visitor.messages_[0]; | 363 const CryptoHandshakeMessage& message = visitor.messages_[0]; |
| 374 EXPECT_EQ(0xFFAA7733, message.tag()); | 364 EXPECT_EQ(0xFFAA7733, message.tag()); |
| 375 EXPECT_EQ(2u, message.tag_value_map().size()); | 365 EXPECT_EQ(2u, message.tag_value_map().size()); |
| 376 EXPECT_EQ("abcdef", CryptoTestUtils::GetValueForTag(message, 0x12345678)); | 366 EXPECT_EQ("abcdef", CryptoTestUtils::GetValueForTag(message, 0x12345678)); |
| 377 EXPECT_EQ("ghijk", CryptoTestUtils::GetValueForTag(message, 0x12345679)); | 367 EXPECT_EQ("ghijk", CryptoTestUtils::GetValueForTag(message, 0x12345679)); |
| 378 } | 368 } |
| 379 | 369 |
| 380 TEST(CryptoFramerTest, ProcessInputTagsOutOfOrder) { | 370 TEST(CryptoFramerTest, ProcessInputTagsOutOfOrder) { |
| 381 test::TestCryptoVisitor visitor; | 371 test::TestCryptoVisitor visitor; |
| 382 CryptoFramer framer; | 372 CryptoFramer framer; |
| 383 framer.set_visitor(&visitor); | 373 framer.set_visitor(&visitor); |
| 384 | 374 |
| 385 unsigned char input[] = { | 375 unsigned char input[] = {// tag |
| 386 // tag | 376 0x33, 0x77, 0xAA, 0xFF, |
| 387 0x33, 0x77, 0xAA, 0xFF, | 377 // num entries |
| 388 // num entries | 378 0x02, 0x00, |
| 389 0x02, 0x00, | 379 // padding |
| 390 // padding | 380 0x00, 0x00, |
| 391 0x00, 0x00, | 381 // tag 1 |
| 392 // tag 1 | 382 0x78, 0x56, 0x34, 0x13, |
| 393 0x78, 0x56, 0x34, 0x13, | 383 // end offset 1 |
| 394 // end offset 1 | 384 0x01, 0x00, 0x00, 0x00, |
| 395 0x01, 0x00, 0x00, 0x00, | 385 // tag 2 |
| 396 // tag 2 | 386 0x79, 0x56, 0x34, 0x12, |
| 397 0x79, 0x56, 0x34, 0x12, | 387 // end offset 2 |
| 398 // end offset 2 | 388 0x02, 0x00, 0x00, 0x00, |
| 399 0x02, 0x00, 0x00, 0x00, | |
| 400 }; | 389 }; |
| 401 | 390 |
| 402 EXPECT_FALSE( | 391 EXPECT_FALSE( |
| 403 framer.ProcessInput(StringPiece(AsChars(input), arraysize(input)))); | 392 framer.ProcessInput(StringPiece(AsChars(input), arraysize(input)))); |
| 404 EXPECT_EQ(QUIC_CRYPTO_TAGS_OUT_OF_ORDER, framer.error()); | 393 EXPECT_EQ(QUIC_CRYPTO_TAGS_OUT_OF_ORDER, framer.error()); |
| 405 EXPECT_EQ(1, visitor.error_count_); | 394 EXPECT_EQ(1, visitor.error_count_); |
| 406 } | 395 } |
| 407 | 396 |
| 408 TEST(CryptoFramerTest, ProcessEndOffsetsOutOfOrder) { | 397 TEST(CryptoFramerTest, ProcessEndOffsetsOutOfOrder) { |
| 409 test::TestCryptoVisitor visitor; | 398 test::TestCryptoVisitor visitor; |
| 410 CryptoFramer framer; | 399 CryptoFramer framer; |
| 411 framer.set_visitor(&visitor); | 400 framer.set_visitor(&visitor); |
| 412 | 401 |
| 413 unsigned char input[] = { | 402 unsigned char input[] = {// tag |
| 414 // tag | 403 0x33, 0x77, 0xAA, 0xFF, |
| 415 0x33, 0x77, 0xAA, 0xFF, | 404 // num entries |
| 416 // num entries | 405 0x02, 0x00, |
| 417 0x02, 0x00, | 406 // padding |
| 418 // padding | 407 0x00, 0x00, |
| 419 0x00, 0x00, | 408 // tag 1 |
| 420 // tag 1 | 409 0x79, 0x56, 0x34, 0x12, |
| 421 0x79, 0x56, 0x34, 0x12, | 410 // end offset 1 |
| 422 // end offset 1 | 411 0x01, 0x00, 0x00, 0x00, |
| 423 0x01, 0x00, 0x00, 0x00, | 412 // tag 2 |
| 424 // tag 2 | 413 0x78, 0x56, 0x34, 0x13, |
| 425 0x78, 0x56, 0x34, 0x13, | 414 // end offset 2 |
| 426 // end offset 2 | 415 0x00, 0x00, 0x00, 0x00, |
| 427 0x00, 0x00, 0x00, 0x00, | |
| 428 }; | 416 }; |
| 429 | 417 |
| 430 EXPECT_FALSE( | 418 EXPECT_FALSE( |
| 431 framer.ProcessInput(StringPiece(AsChars(input), arraysize(input)))); | 419 framer.ProcessInput(StringPiece(AsChars(input), arraysize(input)))); |
| 432 EXPECT_EQ(QUIC_CRYPTO_TAGS_OUT_OF_ORDER, framer.error()); | 420 EXPECT_EQ(QUIC_CRYPTO_TAGS_OUT_OF_ORDER, framer.error()); |
| 433 EXPECT_EQ(1, visitor.error_count_); | 421 EXPECT_EQ(1, visitor.error_count_); |
| 434 } | 422 } |
| 435 | 423 |
| 436 TEST(CryptoFramerTest, ProcessInputTooManyEntries) { | 424 TEST(CryptoFramerTest, ProcessInputTooManyEntries) { |
| 437 test::TestCryptoVisitor visitor; | 425 test::TestCryptoVisitor visitor; |
| 438 CryptoFramer framer; | 426 CryptoFramer framer; |
| 439 framer.set_visitor(&visitor); | 427 framer.set_visitor(&visitor); |
| 440 | 428 |
| 441 unsigned char input[] = { | 429 unsigned char input[] = {// tag |
| 442 // tag | 430 0x33, 0x77, 0xAA, 0xFF, |
| 443 0x33, 0x77, 0xAA, 0xFF, | 431 // num entries |
| 444 // num entries | 432 0xA0, 0x00, |
| 445 0xA0, 0x00, | 433 // padding |
| 446 // padding | 434 0x00, 0x00, |
| 447 0x00, 0x00, | |
| 448 }; | 435 }; |
| 449 | 436 |
| 450 EXPECT_FALSE( | 437 EXPECT_FALSE( |
| 451 framer.ProcessInput(StringPiece(AsChars(input), arraysize(input)))); | 438 framer.ProcessInput(StringPiece(AsChars(input), arraysize(input)))); |
| 452 EXPECT_EQ(QUIC_CRYPTO_TOO_MANY_ENTRIES, framer.error()); | 439 EXPECT_EQ(QUIC_CRYPTO_TOO_MANY_ENTRIES, framer.error()); |
| 453 EXPECT_EQ(1, visitor.error_count_); | 440 EXPECT_EQ(1, visitor.error_count_); |
| 454 } | 441 } |
| 455 | 442 |
| 456 TEST(CryptoFramerTest, ProcessInputZeroLength) { | 443 TEST(CryptoFramerTest, ProcessInputZeroLength) { |
| 457 test::TestCryptoVisitor visitor; | 444 test::TestCryptoVisitor visitor; |
| 458 CryptoFramer framer; | 445 CryptoFramer framer; |
| 459 framer.set_visitor(&visitor); | 446 framer.set_visitor(&visitor); |
| 460 | 447 |
| 461 unsigned char input[] = { | 448 unsigned char input[] = {// tag |
| 462 // tag | 449 0x33, 0x77, 0xAA, 0xFF, |
| 463 0x33, 0x77, 0xAA, 0xFF, | 450 // num entries |
| 464 // num entries | 451 0x02, 0x00, |
| 465 0x02, 0x00, | 452 // padding |
| 466 // padding | 453 0x00, 0x00, |
| 467 0x00, 0x00, | 454 // tag 1 |
| 468 // tag 1 | 455 0x78, 0x56, 0x34, 0x12, |
| 469 0x78, 0x56, 0x34, 0x12, | 456 // end offset 1 |
| 470 // end offset 1 | 457 0x00, 0x00, 0x00, 0x00, |
| 471 0x00, 0x00, 0x00, 0x00, | 458 // tag 2 |
| 472 // tag 2 | 459 0x79, 0x56, 0x34, 0x12, |
| 473 0x79, 0x56, 0x34, 0x12, | 460 // end offset 2 |
| 474 // end offset 2 | 461 0x05, 0x00, 0x00, 0x00, |
| 475 0x05, 0x00, 0x00, 0x00, | |
| 476 }; | 462 }; |
| 477 | 463 |
| 478 EXPECT_TRUE( | 464 EXPECT_TRUE( |
| 479 framer.ProcessInput(StringPiece(AsChars(input), arraysize(input)))); | 465 framer.ProcessInput(StringPiece(AsChars(input), arraysize(input)))); |
| 480 EXPECT_EQ(0, visitor.error_count_); | 466 EXPECT_EQ(0, visitor.error_count_); |
| 481 } | 467 } |
| 482 | 468 |
| 483 } // namespace test | 469 } // namespace test |
| 484 | 470 |
| 485 } // namespace net | 471 } // namespace net |
| OLD | NEW |