Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(581)

Side by Side Diff: net/http/ntlm_buffer_reader_unittest.cc

Issue 2879353002: Add a buffer reader/writer for NTLM. (Closed)
Patch Set: Rebase Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 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 "net/http/ntlm_buffer_reader.h"
6
7 #include "base/macros.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "net/http/ntlm.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11
12 namespace net {
13
14 TEST(NtlmBufferReaderTest, Initialization) {
15 const uint8_t buf[1] = {0};
16 NtlmBufferReader reader(buf, arraysize(buf));
17
18 EXPECT_EQ(arraysize(buf), reader.GetLength());
19 EXPECT_EQ(0u, reader.GetCursor());
20 EXPECT_FALSE(reader.IsEndOfBuffer());
21 EXPECT_TRUE(reader.CanRead(1));
22 EXPECT_FALSE(reader.CanRead(2));
23 EXPECT_TRUE(reader.CanReadFrom(0, 1));
24 EXPECT_TRUE(reader.CanReadFrom(ntlm::SecurityBuffer(0, 1)));
25 EXPECT_FALSE(reader.CanReadFrom(1, 1));
26 EXPECT_FALSE(reader.CanReadFrom(ntlm::SecurityBuffer(1, 1)));
27 EXPECT_FALSE(reader.CanReadFrom(0, 2));
28 EXPECT_FALSE(reader.CanReadFrom(ntlm::SecurityBuffer(0, 2)));
29
30 // With length=0 the offset can be out of bounds.
31 EXPECT_TRUE(reader.CanReadFrom(99, 0));
32 EXPECT_TRUE(reader.CanReadFrom(ntlm::SecurityBuffer(99, 0)));
33 }
34
35 TEST(NtlmBufferReaderTest, Read16) {
36 const uint8_t buf[2] = {0x22, 0x11};
37 const uint16_t expected = 0x1122;
38
39 NtlmBufferReader reader(buf, arraysize(buf));
40
41 uint16_t actual;
42 EXPECT_TRUE(reader.ReadUInt16(&actual));
43 EXPECT_EQ(expected, actual);
44 EXPECT_TRUE(reader.IsEndOfBuffer());
45 EXPECT_FALSE(reader.ReadUInt16(&actual));
46 }
47
48 TEST(NtlmBufferReaderTest, Read32) {
49 const uint8_t buf[4] = {0x44, 0x33, 0x22, 0x11};
50 const uint32_t expected = 0x11223344;
51
52 NtlmBufferReader reader(buf, arraysize(buf));
53
54 uint32_t actual;
55 EXPECT_TRUE(reader.ReadUInt32(&actual));
56 EXPECT_EQ(expected, actual);
57 EXPECT_TRUE(reader.IsEndOfBuffer());
58 EXPECT_FALSE(reader.ReadUInt32(&actual));
59 }
60
61 TEST(NtlmBufferReaderTest, Read64) {
62 const uint8_t buf[8] = {0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11};
63 const uint64_t expected = 0x1122334455667788;
64
65 NtlmBufferReader reader(buf, arraysize(buf));
66
67 uint64_t actual;
68 EXPECT_TRUE(reader.ReadUInt64(&actual));
69 EXPECT_EQ(expected, actual);
70 EXPECT_TRUE(reader.IsEndOfBuffer());
71 EXPECT_FALSE(reader.ReadUInt64(&actual));
72 }
73
74 TEST(NtlmBufferReaderTest, ReadBytes) {
75 const uint8_t expected[8] = {0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11};
76 uint8_t actual[8];
77
78 NtlmBufferReader reader(expected, arraysize(expected));
79
80 EXPECT_TRUE(reader.ReadBytes(actual, arraysize(actual)));
81 EXPECT_EQ(0, memcmp(actual, expected, arraysize(actual)));
82 EXPECT_TRUE(reader.IsEndOfBuffer());
83 EXPECT_FALSE(reader.ReadBytes(actual, 1));
84 }
85
86 TEST(NtlmBufferReaderTest, ReadSecurityBuffer) {
87 const uint8_t buf[8] = {0x22, 0x11, 0xFF, 0xEE, 0x88, 0x77, 0x66, 0x55};
88 const uint16_t length = 0x1122;
89 const uint32_t offset = 0x55667788;
90
91 NtlmBufferReader reader(buf, arraysize(buf));
92
93 ntlm::SecurityBuffer sec_buf;
94 EXPECT_TRUE(reader.ReadSecurityBuffer(&sec_buf));
95 EXPECT_EQ(length, sec_buf.length);
96 EXPECT_EQ(offset, sec_buf.offset);
97 EXPECT_TRUE(reader.IsEndOfBuffer());
98 EXPECT_FALSE(reader.ReadSecurityBuffer(&sec_buf));
99 }
100
101 TEST(NtlmBufferReaderTest, ReadSecurityBufferPastEob) {
102 const uint8_t buf[7] = {0};
103 NtlmBufferReader reader(buf, arraysize(buf));
104
105 ntlm::SecurityBuffer sec_buf;
106 EXPECT_FALSE(reader.ReadSecurityBuffer(&sec_buf));
107 }
108
109 TEST(NtlmBufferReaderTest, ReadAsciiString) {
110 const uint8_t buf[8] = {'1', '2', '3', '4', '5', '6', '7', '8'};
111 const std::string expected("12345678");
112
113 NtlmBufferReader reader(buf, arraysize(buf));
114
115 std::string actual;
116 EXPECT_TRUE(reader.ReadUtf8String(&actual, expected.size()));
117 EXPECT_EQ(expected, actual);
118 EXPECT_TRUE(reader.IsEndOfBuffer());
119 EXPECT_FALSE(reader.ReadUtf8String(&actual, expected.size()));
120 }
121
122 TEST(NtlmBufferReaderTest, ReadAsciiStringPastEob) {
123 const size_t len = 8;
124 const uint8_t buf[len] = {0};
125
126 NtlmBufferReader reader(buf, arraysize(buf));
127
128 std::string actual;
129 EXPECT_FALSE(reader.ReadUtf8String(&actual, len + 1));
130 }
131
132 TEST(NtlmBufferReaderTest, ReadUnicodeString) {
133 const uint8_t buf[16] = {
134 '1', 0, '2', 0, '3', 0, '4', 0, '5', 0, '6', 0, '7', 0, '8', 0,
135 };
136 const base::string16 expected = base::ASCIIToUTF16("12345678");
137
138 NtlmBufferReader reader(buf, arraysize(buf));
139
140 base::string16 actual;
141 EXPECT_TRUE(reader.ReadUtf16String(&actual, expected.size() * 2));
142 EXPECT_EQ(expected, actual);
143 EXPECT_TRUE(reader.IsEndOfBuffer());
144 EXPECT_FALSE(reader.ReadUtf16String(&actual, expected.size() * 2));
145 }
146
147 TEST(NtlmBufferReaderTest, ReadUnicodeStringPastEob) {
148 const size_t len = 8;
149 const uint8_t buf[len] = {0};
150
151 NtlmBufferReader reader(buf, arraysize(buf));
152
153 // Try to read one more character (2 bytes) than there is space.
154 base::string16 actual;
155 EXPECT_FALSE(reader.ReadUtf16String(&actual, len + 2));
156 EXPECT_EQ(0u, reader.GetCursor());
157 }
158
159 TEST(NtlmBufferReaderTest, ReadUtf16StringOddLength) {
160 const size_t len = 8;
161 const uint8_t buf[len] = {0};
162
163 NtlmBufferReader reader(buf, arraysize(buf));
164
165 // Try to read a 16-bit string with a length that isn't a multiple
166 // of 2.
167 base::string16 actual;
168 EXPECT_FALSE(reader.ReadUtf16String(&actual, len - 1));
169 EXPECT_EQ(0u, reader.GetCursor());
170 }
171
172 TEST(NtlmBufferReaderTest, ReadUtf8Payload) {
173 const std::string expected("12345678");
174 const size_t len = expected.length();
175
176 const uint8_t buf[16] = {
177 len, 0, len, 0, ntlm::SECURITY_BUFFER_LEN, 0, 0, 0, '1', '2', '3', '4',
178 '5', '6', '7', '8'};
179
180 NtlmBufferReader reader(buf, arraysize(buf));
181
182 std::string actual;
183 EXPECT_TRUE(reader.ReadUtf8Payload(&actual));
184 EXPECT_EQ(expected, actual);
185 // Read payload only advances the cursor over the security buffer.
186 EXPECT_EQ(ntlm::SECURITY_BUFFER_LEN, reader.GetCursor());
187 }
188
189 TEST(NtlmBufferReaderTest, ReadUtf16Payload) {
190 const base::string16 expected = base::ASCIIToUTF16("12345678");
191 const size_t len = expected.length() * 2;
192 const uint8_t buf[24] = {len, 0, len, 0, ntlm::SECURITY_BUFFER_LEN,
193 0, 0, 0, '1', 0,
194 '2', 0, '3', 0, '4',
195 0, '5', 0, '6', 0,
196 '7', 0, '8', 0};
197
198 NtlmBufferReader reader(buf, arraysize(buf));
199
200 base::string16 actual;
201 EXPECT_TRUE(reader.ReadUtf16Payload(&actual));
202 EXPECT_EQ(expected, actual);
203 // Read payload only advances the cursor over the security buffer.
204 EXPECT_EQ(ntlm::SECURITY_BUFFER_LEN, reader.GetCursor());
205 }
206
207 TEST(NtlmBufferReaderTest, SkipSecurityBuffer) {
208 const uint8_t buf[ntlm::SECURITY_BUFFER_LEN] = {0};
209
210 NtlmBufferReader reader(buf, arraysize(buf));
211 EXPECT_TRUE(reader.SkipSecurityBuffer());
212 EXPECT_TRUE(reader.IsEndOfBuffer());
213 EXPECT_FALSE(reader.SkipSecurityBuffer());
214 }
215
216 TEST(NtlmBufferReaderTest, SkipSecurityBufferPastEob) {
217 // The buffer is one byte shorter than security buffer.
218 const uint8_t buf[ntlm::SECURITY_BUFFER_LEN - 1] = {0};
219
220 NtlmBufferReader reader(buf, arraysize(buf));
221 EXPECT_FALSE(reader.SkipSecurityBuffer());
222 EXPECT_EQ(0u, reader.GetCursor());
223 }
224
225 TEST(NtlmBufferReaderTest, SkipSecurityBufferWithValidationEmpty) {
226 const uint8_t buf[ntlm::SECURITY_BUFFER_LEN] = {0, 0, 0, 0, 0, 0, 0, 0};
227
228 NtlmBufferReader reader(buf, arraysize(buf));
229 EXPECT_TRUE(reader.SkipSecurityBufferWithValidation());
230 EXPECT_TRUE(reader.IsEndOfBuffer());
231 EXPECT_FALSE(reader.SkipSecurityBufferWithValidation());
232 }
233
234 TEST(NtlmBufferReaderTest, SkipSecurityBufferWithValidationValid) {
235 // A valid security buffer that points to the 1 payload byte.
236 const uint8_t buf[ntlm::SECURITY_BUFFER_LEN + 1] = {
237 0x01, 0, 0x01, 0, ntlm::SECURITY_BUFFER_LEN, 0, 0, 0, 0xFF};
238
239 NtlmBufferReader reader(buf, arraysize(buf));
240 EXPECT_TRUE(reader.SkipSecurityBufferWithValidation());
241 EXPECT_EQ(ntlm::SECURITY_BUFFER_LEN, reader.GetCursor());
242 EXPECT_FALSE(reader.SkipSecurityBufferWithValidation());
243 }
244
245 TEST(NtlmBufferReaderTest,
246 SkipSecurityBufferWithValidationPayloadLengthPastEob) {
247 // Security buffer with length that points past the end of buffer.
248 const uint8_t buf[ntlm::SECURITY_BUFFER_LEN + 1] = {
249 0x02, 0, 0x02, 0, ntlm::SECURITY_BUFFER_LEN, 0, 0, 0, 0xFF};
250
251 NtlmBufferReader reader(buf, arraysize(buf));
252 EXPECT_FALSE(reader.SkipSecurityBufferWithValidation());
253 EXPECT_EQ(0u, reader.GetCursor());
254 }
255
256 TEST(NtlmBufferReaderTest,
257 SkipSecurityBufferWithValidationPayloadOffsetPastEob) {
258 // Security buffer with offset that points past the end of buffer.
259 const uint8_t buf[ntlm::SECURITY_BUFFER_LEN + 1] = {
260 0x02, 0, 0x02, 0, ntlm::SECURITY_BUFFER_LEN + 1, 0, 0, 0, 0xFF};
261
262 NtlmBufferReader reader(buf, arraysize(buf));
263 EXPECT_FALSE(reader.SkipSecurityBufferWithValidation());
264 EXPECT_EQ(0u, reader.GetCursor());
265 }
266
267 TEST(NtlmBufferReaderTest,
268 SkipSecurityBufferWithValidationZeroLengthPayloadOffsetPastEob) {
269 // Security buffer with offset that points past the end of buffer but
270 // length is 0.
271 const uint8_t buf[ntlm::SECURITY_BUFFER_LEN] = {
272 0, 0, 0, 0, ntlm::SECURITY_BUFFER_LEN + 1, 0, 0, 0};
273
274 NtlmBufferReader reader(buf, arraysize(buf));
275 EXPECT_TRUE(reader.SkipSecurityBufferWithValidation());
276 EXPECT_EQ(ntlm::SECURITY_BUFFER_LEN, reader.GetCursor());
277 }
278
279 TEST(NtlmBufferReaderTest, SkipBytes) {
280 const uint8_t buf[8] = {0};
281
282 NtlmBufferReader reader(buf, arraysize(buf));
283
284 EXPECT_TRUE(reader.SkipBytes(arraysize(buf)));
285 EXPECT_TRUE(reader.IsEndOfBuffer());
286 EXPECT_FALSE(reader.SkipBytes(arraysize(buf)));
287 }
288
289 TEST(NtlmBufferReaderTest, SkipBytesPastEob) {
290 const uint8_t buf[8] = {0};
291
292 NtlmBufferReader reader(buf, arraysize(buf));
293
294 EXPECT_FALSE(reader.SkipBytes(arraysize(buf) + 1));
295 EXPECT_EQ(0u, reader.GetCursor());
296 }
297
298 TEST(NtlmBufferReaderTest, MatchSignatureTooShort) {
299 const uint8_t buf[7] = {0};
300
301 NtlmBufferReader reader(buf, arraysize(buf));
302
303 EXPECT_TRUE(reader.CanRead(7));
304 EXPECT_FALSE(reader.MatchSignature());
305 EXPECT_EQ(0u, reader.GetCursor());
306 EXPECT_TRUE(reader.CanRead(7));
307 }
308
309 TEST(NtlmBufferReaderTest, MatchSignatureNoMatch) {
310 // The last byte should be a 0.
311 const uint8_t buf[8] = {'N', 'T', 'L', 'M', 'S', 'S', 'P', 0xff};
312 NtlmBufferReader reader(buf, arraysize(buf));
313
314 EXPECT_TRUE(reader.CanRead(8));
315 EXPECT_FALSE(reader.MatchSignature());
316 EXPECT_EQ(0u, reader.GetCursor());
317 EXPECT_TRUE(reader.CanRead(8));
318 }
319
320 TEST(NtlmBufferReaderTest, MatchSignatureOk) {
321 const uint8_t buf[8] = {'N', 'T', 'L', 'M', 'S', 'S', 'P', 0};
322 NtlmBufferReader reader(buf, arraysize(buf));
323
324 EXPECT_TRUE(reader.MatchSignature());
325 EXPECT_TRUE(reader.IsEndOfBuffer());
326 }
327
328 TEST(NtlmBufferReaderTest, ReadInvalidMessageType) {
329 // Only 0x01, 0x02, and 0x03 are valid message types.
330 const uint8_t buf[4] = {0x04, 0, 0, 0};
331 NtlmBufferReader reader(buf, arraysize(buf));
332
333 ntlm::MessageType message_type;
334 EXPECT_FALSE(reader.ReadMessageType(&message_type));
335 EXPECT_FALSE(reader.IsEndOfBuffer());
336 EXPECT_TRUE(reader.CanRead(4));
337 }
338
339 TEST(NtlmBufferReaderTest, ReadMessageTypeNegotiate) {
340 const uint8_t buf[4] = {static_cast<uint8_t>(ntlm::MessageType::NEGOTIATE), 0,
341 0, 0};
342 NtlmBufferReader reader(buf, arraysize(buf));
343
344 ntlm::MessageType message_type;
345 EXPECT_TRUE(reader.ReadMessageType(&message_type));
346 EXPECT_EQ(ntlm::MessageType::NEGOTIATE, message_type);
347 EXPECT_TRUE(reader.IsEndOfBuffer());
348 }
349
350 TEST(NtlmBufferReaderTest, ReadMessageTypeChallenge) {
351 const uint8_t buf[4] = {static_cast<uint8_t>(ntlm::MessageType::CHALLENGE), 0,
352 0, 0};
353 NtlmBufferReader reader(buf, arraysize(buf));
354
355 ntlm::MessageType message_type;
356 EXPECT_TRUE(reader.ReadMessageType(&message_type));
357 EXPECT_EQ(ntlm::MessageType::CHALLENGE, message_type);
358 EXPECT_TRUE(reader.IsEndOfBuffer());
359 }
360
361 TEST(NtlmBufferReaderTest, ReadMessageTypeAuthenticate) {
362 const uint8_t buf[4] = {static_cast<uint8_t>(ntlm::MessageType::AUTHENTICATE),
363 0, 0, 0};
364 NtlmBufferReader reader(buf, arraysize(buf));
365
366 ntlm::MessageType message_type;
367 EXPECT_TRUE(reader.ReadMessageType(&message_type));
368 EXPECT_EQ(ntlm::MessageType::AUTHENTICATE, message_type);
369 EXPECT_TRUE(reader.IsEndOfBuffer());
370 }
371
372 TEST(NtlmBufferReaderTest, MatchMessageTypeAuthenticate) {
373 const uint8_t buf[4] = {static_cast<uint8_t>(ntlm::MessageType::AUTHENTICATE),
374 0, 0, 0};
375 NtlmBufferReader reader(buf, arraysize(buf));
376
377 EXPECT_TRUE(reader.MatchMessageType(ntlm::MessageType::AUTHENTICATE));
378 EXPECT_TRUE(reader.IsEndOfBuffer());
379 }
380
381 TEST(NtlmBufferReaderTest, MatchMessageTypeInvalid) {
382 // Only 0x01, 0x02, and 0x03 are valid message types.
383 const uint8_t buf[4] = {0x04, 0, 0, 0};
384 NtlmBufferReader reader(buf, arraysize(buf));
385
386 EXPECT_FALSE(reader.MatchMessageType(ntlm::MessageType::AUTHENTICATE));
387 EXPECT_EQ(0u, reader.GetCursor());
388 }
389
390 TEST(NtlmBufferReaderTest, MatchMessageTypeMismatch) {
391 const uint8_t buf[4] = {static_cast<uint8_t>(ntlm::MessageType::CHALLENGE), 0,
392 0, 0};
393 NtlmBufferReader reader(buf, arraysize(buf));
394
395 EXPECT_FALSE(reader.MatchMessageType(ntlm::MessageType::AUTHENTICATE));
396 EXPECT_EQ(0u, reader.GetCursor());
397 }
398
399 TEST(NtlmBufferReaderTest, MatchAuthenticateHeader) {
400 const uint8_t buf[12] = {
401 'N', 'T', 'L',
402 'M', 'S', 'S',
403 'P', 0, static_cast<uint8_t>(ntlm::MessageType::AUTHENTICATE),
404 0, 0, 0};
405 NtlmBufferReader reader(buf, arraysize(buf));
406
407 EXPECT_TRUE(reader.MatchMessageHeader(ntlm::MessageType::AUTHENTICATE));
408 EXPECT_TRUE(reader.IsEndOfBuffer());
409 }
410
411 TEST(NtlmBufferReaderTest, MatchAuthenticateHeaderMisMatch) {
412 const uint8_t buf[12] = {
413 'N', 'T', 'L',
414 'M', 'S', 'S',
415 'P', 0, static_cast<uint8_t>(ntlm::MessageType::CHALLENGE),
416 0, 0, 0};
417 NtlmBufferReader reader(buf, arraysize(buf));
418
419 EXPECT_FALSE(reader.MatchMessageType(ntlm::MessageType::AUTHENTICATE));
420 EXPECT_EQ(0u, reader.GetCursor());
421 }
422
423 TEST(NtlmBufferReaderTest, MatchZeros) {
424 const uint8_t buf[6] = {0, 0, 0, 0, 0, 0};
425
426 NtlmBufferReader reader(buf, arraysize(buf));
427
428 EXPECT_TRUE(reader.MatchZeros(arraysize(buf)));
429 EXPECT_TRUE(reader.IsEndOfBuffer());
430 EXPECT_FALSE(reader.MatchZeros(1));
431 }
432
433 TEST(NtlmBufferReaderTest, MatchZerosFail) {
434 const uint8_t buf[6] = {0, 0, 0, 0, 0, 0xFF};
435
436 NtlmBufferReader reader(buf, arraysize(buf));
437
438 EXPECT_FALSE(reader.MatchZeros(arraysize(buf)));
439 EXPECT_EQ(0u, reader.GetCursor());
440 }
441
442 TEST(NtlmBufferReaderTest, MatchEmptySecurityBuffer) {
443 const uint8_t buf[ntlm::SECURITY_BUFFER_LEN] = {0, 0, 0, 0, 0, 0, 0, 0};
444
445 NtlmBufferReader reader(buf, ntlm::SECURITY_BUFFER_LEN);
446
447 EXPECT_TRUE(reader.MatchEmptySecurityBuffer());
448 EXPECT_TRUE(reader.IsEndOfBuffer());
449 EXPECT_FALSE(reader.MatchEmptySecurityBuffer());
450 }
451
452 TEST(NtlmBufferReaderTest, MatchEmptySecurityBufferFail) {
453 const uint8_t buf[ntlm::SECURITY_BUFFER_LEN] = {0, 0, 0, 0, 0, 0, 0, 0x01};
454
455 NtlmBufferReader reader(buf, ntlm::SECURITY_BUFFER_LEN);
456
457 EXPECT_FALSE(reader.MatchEmptySecurityBuffer());
458 EXPECT_EQ(0u, reader.GetCursor());
459 }
460
461 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698