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 |