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

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

Issue 2879353002: Add a buffer reader/writer for NTLM. (Closed)
Patch Set: Add a buffer reader/writer for NTLM. Created 3 years, 5 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/ntlm/ntlm_buffer_reader.h"
6
7 #include "base/macros.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10
11 namespace net {
12 namespace ntlm {
13
14 TEST(NtlmBufferReaderTest, Initialization) {
15 const uint8_t buf[1] = {0};
16 NtlmBufferReader reader(buf, arraysize(buf));
17
18 ASSERT_EQ(arraysize(buf), reader.GetLength());
19 ASSERT_EQ(0u, reader.GetCursor());
20 ASSERT_FALSE(reader.IsEndOfBuffer());
21 ASSERT_TRUE(reader.CanRead(1));
22 ASSERT_FALSE(reader.CanRead(2));
23 ASSERT_TRUE(reader.CanReadFrom(0, 1));
24 ASSERT_TRUE(reader.CanReadFrom(SecurityBuffer(0, 1)));
25 ASSERT_FALSE(reader.CanReadFrom(1, 1));
26 ASSERT_FALSE(reader.CanReadFrom(SecurityBuffer(1, 1)));
27 ASSERT_FALSE(reader.CanReadFrom(0, 2));
28 ASSERT_FALSE(reader.CanReadFrom(SecurityBuffer(0, 2)));
29
30 // With length=0 the offset can be out of bounds.
31 ASSERT_TRUE(reader.CanReadFrom(99, 0));
32 ASSERT_TRUE(reader.CanReadFrom(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 ASSERT_TRUE(reader.ReadUInt16(&actual));
43 ASSERT_EQ(expected, actual);
44 ASSERT_TRUE(reader.IsEndOfBuffer());
45 ASSERT_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 ASSERT_TRUE(reader.ReadUInt32(&actual));
56 ASSERT_EQ(expected, actual);
57 ASSERT_TRUE(reader.IsEndOfBuffer());
58 ASSERT_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 ASSERT_TRUE(reader.ReadUInt64(&actual));
69 ASSERT_EQ(expected, actual);
70 ASSERT_TRUE(reader.IsEndOfBuffer());
71 ASSERT_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 ASSERT_TRUE(reader.ReadBytes(actual, arraysize(actual)));
81 ASSERT_EQ(0, memcmp(actual, expected, arraysize(actual)));
82 ASSERT_TRUE(reader.IsEndOfBuffer());
83 ASSERT_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 SecurityBuffer sec_buf;
94 ASSERT_TRUE(reader.ReadSecurityBuffer(&sec_buf));
95 ASSERT_EQ(length, sec_buf.length);
96 ASSERT_EQ(offset, sec_buf.offset);
97 ASSERT_TRUE(reader.IsEndOfBuffer());
98 ASSERT_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 SecurityBuffer sec_buf;
106 ASSERT_FALSE(reader.ReadSecurityBuffer(&sec_buf));
107 }
108
109 TEST(NtlmBufferReaderTest, SkipSecurityBuffer) {
110 const uint8_t buf[SECURITY_BUFFER_LEN] = {0};
111
112 NtlmBufferReader reader(buf, arraysize(buf));
113 ASSERT_TRUE(reader.SkipSecurityBuffer());
114 ASSERT_TRUE(reader.IsEndOfBuffer());
115 ASSERT_FALSE(reader.SkipSecurityBuffer());
116 }
117
118 TEST(NtlmBufferReaderTest, SkipSecurityBufferPastEob) {
119 // The buffer is one byte shorter than security buffer.
120 const uint8_t buf[SECURITY_BUFFER_LEN - 1] = {0};
121
122 NtlmBufferReader reader(buf, arraysize(buf));
123 ASSERT_FALSE(reader.SkipSecurityBuffer());
124 }
125
126 TEST(NtlmBufferReaderTest, SkipSecurityBufferWithValidationEmpty) {
127 const uint8_t buf[SECURITY_BUFFER_LEN] = {0, 0, 0, 0, 0, 0, 0, 0};
128
129 NtlmBufferReader reader(buf, arraysize(buf));
130 ASSERT_TRUE(reader.SkipSecurityBufferWithValidation());
131 ASSERT_TRUE(reader.IsEndOfBuffer());
132 ASSERT_FALSE(reader.SkipSecurityBufferWithValidation());
133 }
134
135 TEST(NtlmBufferReaderTest, SkipSecurityBufferWithValidationValid) {
136 // A valid security buffer that points to the 1 payload byte.
137 const uint8_t buf[SECURITY_BUFFER_LEN + 1] = {
138 0x01, 0, 0x01, 0, SECURITY_BUFFER_LEN, 0, 0, 0, 0xFF};
139
140 NtlmBufferReader reader(buf, arraysize(buf));
141 ASSERT_TRUE(reader.SkipSecurityBufferWithValidation());
142 ASSERT_EQ(SECURITY_BUFFER_LEN, reader.GetCursor());
143 ASSERT_FALSE(reader.SkipSecurityBufferWithValidation());
144 }
145
146 TEST(NtlmBufferReaderTest,
147 SkipSecurityBufferWithValidationPayloadLengthPastEob) {
148 // Security buffer with length that points past the end of buffer.
149 const uint8_t buf[SECURITY_BUFFER_LEN + 1] = {
150 0x02, 0, 0x02, 0, SECURITY_BUFFER_LEN, 0, 0, 0, 0xFF};
151
152 NtlmBufferReader reader(buf, arraysize(buf));
153 ASSERT_FALSE(reader.SkipSecurityBufferWithValidation());
154 }
155
156 TEST(NtlmBufferReaderTest,
157 SkipSecurityBufferWithValidationPayloadOffsetPastEob) {
158 // Security buffer with offset that points past the end of buffer.
159 const uint8_t buf[SECURITY_BUFFER_LEN + 1] = {
160 0x02, 0, 0x02, 0, SECURITY_BUFFER_LEN + 1, 0, 0, 0, 0xFF};
161
162 NtlmBufferReader reader(buf, arraysize(buf));
163 ASSERT_FALSE(reader.SkipSecurityBufferWithValidation());
164 }
165
166 TEST(NtlmBufferReaderTest,
167 SkipSecurityBufferWithValidationZeroLengthPayloadOffsetPastEob) {
168 // Security buffer with offset that points past the end of buffer but
169 // length is 0.
170 const uint8_t buf[SECURITY_BUFFER_LEN] = {0, 0, 0, 0, SECURITY_BUFFER_LEN + 1,
171 0, 0, 0};
172
173 NtlmBufferReader reader(buf, arraysize(buf));
174 ASSERT_TRUE(reader.SkipSecurityBufferWithValidation());
175 ASSERT_EQ(SECURITY_BUFFER_LEN, reader.GetCursor());
176 }
177
178 TEST(NtlmBufferReaderTest, SkipBytes) {
179 const uint8_t buf[8] = {0};
180
181 NtlmBufferReader reader(buf, arraysize(buf));
182
183 ASSERT_TRUE(reader.SkipBytes(arraysize(buf)));
184 ASSERT_TRUE(reader.IsEndOfBuffer());
185 ASSERT_FALSE(reader.SkipBytes(arraysize(buf)));
186 }
187
188 TEST(NtlmBufferReaderTest, SkipBytesPastEob) {
189 const uint8_t buf[8] = {0};
190
191 NtlmBufferReader reader(buf, arraysize(buf));
192
193 ASSERT_FALSE(reader.SkipBytes(arraysize(buf) + 1));
194 }
195
196 TEST(NtlmBufferReaderTest, MatchSignatureTooShort) {
197 const uint8_t buf[7] = {0};
198
199 NtlmBufferReader reader(buf, arraysize(buf));
200
201 ASSERT_TRUE(reader.CanRead(7));
202 ASSERT_FALSE(reader.MatchSignature());
203 }
204
205 TEST(NtlmBufferReaderTest, MatchSignatureNoMatch) {
206 // The last byte should be a 0.
207 const uint8_t buf[8] = {'N', 'T', 'L', 'M', 'S', 'S', 'P', 0xff};
208 NtlmBufferReader reader(buf, arraysize(buf));
209
210 ASSERT_TRUE(reader.CanRead(8));
211 ASSERT_FALSE(reader.MatchSignature());
212 }
213
214 TEST(NtlmBufferReaderTest, MatchSignatureOk) {
215 const uint8_t buf[8] = {'N', 'T', 'L', 'M', 'S', 'S', 'P', 0};
216 NtlmBufferReader reader(buf, arraysize(buf));
217
218 ASSERT_TRUE(reader.MatchSignature());
219 ASSERT_TRUE(reader.IsEndOfBuffer());
220 }
221
222 TEST(NtlmBufferReaderTest, ReadInvalidMessageType) {
223 // Only 0x01, 0x02, and 0x03 are valid message types.
224 const uint8_t buf[4] = {0x04, 0, 0, 0};
225 NtlmBufferReader reader(buf, arraysize(buf));
226
227 MessageType message_type;
228 ASSERT_FALSE(reader.ReadMessageType(&message_type));
229 }
230
231 TEST(NtlmBufferReaderTest, ReadMessageTypeNegotiate) {
232 const uint8_t buf[4] = {static_cast<uint8_t>(MessageType::NEGOTIATE), 0, 0,
233 0};
234 NtlmBufferReader reader(buf, arraysize(buf));
235
236 MessageType message_type;
237 ASSERT_TRUE(reader.ReadMessageType(&message_type));
238 ASSERT_EQ(MessageType::NEGOTIATE, message_type);
239 ASSERT_TRUE(reader.IsEndOfBuffer());
240 }
241
242 TEST(NtlmBufferReaderTest, ReadMessageTypeChallenge) {
243 const uint8_t buf[4] = {static_cast<uint8_t>(MessageType::CHALLENGE), 0, 0,
244 0};
245 NtlmBufferReader reader(buf, arraysize(buf));
246
247 MessageType message_type;
248 ASSERT_TRUE(reader.ReadMessageType(&message_type));
249 ASSERT_EQ(MessageType::CHALLENGE, message_type);
250 ASSERT_TRUE(reader.IsEndOfBuffer());
251 }
252
253 TEST(NtlmBufferReaderTest, ReadMessageTypeAuthenticate) {
254 const uint8_t buf[4] = {static_cast<uint8_t>(MessageType::AUTHENTICATE), 0, 0,
255 0};
256 NtlmBufferReader reader(buf, arraysize(buf));
257
258 MessageType message_type;
259 ASSERT_TRUE(reader.ReadMessageType(&message_type));
260 ASSERT_EQ(MessageType::AUTHENTICATE, message_type);
261 ASSERT_TRUE(reader.IsEndOfBuffer());
262 }
263
264 TEST(NtlmBufferReaderTest, MatchMessageTypeAuthenticate) {
265 const uint8_t buf[4] = {static_cast<uint8_t>(MessageType::AUTHENTICATE), 0, 0,
266 0};
267 NtlmBufferReader reader(buf, arraysize(buf));
268
269 ASSERT_TRUE(reader.MatchMessageType(MessageType::AUTHENTICATE));
270 ASSERT_TRUE(reader.IsEndOfBuffer());
271 }
272
273 TEST(NtlmBufferReaderTest, MatchMessageTypeInvalid) {
274 // Only 0x01, 0x02, and 0x03 are valid message types.
275 const uint8_t buf[4] = {0x04, 0, 0, 0};
276 NtlmBufferReader reader(buf, arraysize(buf));
277
278 ASSERT_FALSE(reader.MatchMessageType(MessageType::AUTHENTICATE));
279 }
280
281 TEST(NtlmBufferReaderTest, MatchMessageTypeMismatch) {
282 const uint8_t buf[4] = {static_cast<uint8_t>(MessageType::CHALLENGE), 0, 0,
283 0};
284 NtlmBufferReader reader(buf, arraysize(buf));
285
286 ASSERT_FALSE(reader.MatchMessageType(MessageType::AUTHENTICATE));
287 }
288
289 TEST(NtlmBufferReaderTest, MatchAuthenticateHeader) {
290 const uint8_t buf[12] = {
291 'N', 'T', 'L',
292 'M', 'S', 'S',
293 'P', 0, static_cast<uint8_t>(MessageType::AUTHENTICATE),
294 0, 0, 0};
295 NtlmBufferReader reader(buf, arraysize(buf));
296
297 ASSERT_TRUE(reader.MatchMessageHeader(MessageType::AUTHENTICATE));
298 ASSERT_TRUE(reader.IsEndOfBuffer());
299 }
300
301 TEST(NtlmBufferReaderTest, MatchAuthenticateHeaderMisMatch) {
302 const uint8_t buf[12] = {
303 'N', 'T', 'L',
304 'M', 'S', 'S',
305 'P', 0, static_cast<uint8_t>(MessageType::CHALLENGE),
306 0, 0, 0};
307 NtlmBufferReader reader(buf, arraysize(buf));
308
309 ASSERT_FALSE(reader.MatchMessageType(MessageType::AUTHENTICATE));
310 }
311
312 TEST(NtlmBufferReaderTest, MatchZeros) {
313 const uint8_t buf[6] = {0, 0, 0, 0, 0, 0};
314
315 NtlmBufferReader reader(buf, arraysize(buf));
316
317 ASSERT_TRUE(reader.MatchZeros(arraysize(buf)));
318 ASSERT_TRUE(reader.IsEndOfBuffer());
319 ASSERT_FALSE(reader.MatchZeros(1));
320 }
321
322 TEST(NtlmBufferReaderTest, MatchZerosFail) {
323 const uint8_t buf[6] = {0, 0, 0, 0, 0, 0xFF};
324
325 NtlmBufferReader reader(buf, arraysize(buf));
326
327 ASSERT_FALSE(reader.MatchZeros(arraysize(buf)));
328 }
329
330 TEST(NtlmBufferReaderTest, MatchEmptySecurityBuffer) {
331 const uint8_t buf[SECURITY_BUFFER_LEN] = {0, 0, 0, 0, 0, 0, 0, 0};
332
333 NtlmBufferReader reader(buf, SECURITY_BUFFER_LEN);
334
335 ASSERT_TRUE(reader.MatchEmptySecurityBuffer());
336 ASSERT_TRUE(reader.IsEndOfBuffer());
337 ASSERT_FALSE(reader.MatchEmptySecurityBuffer());
338 }
339
340 TEST(NtlmBufferReaderTest, MatchEmptySecurityBufferLengthZeroOffsetEnd) {
341 const uint8_t buf[SECURITY_BUFFER_LEN] = {0, 0, 0, 0, 0x08, 0, 0, 0};
342
343 NtlmBufferReader reader(buf, SECURITY_BUFFER_LEN);
344
345 ASSERT_TRUE(reader.MatchEmptySecurityBuffer());
346 ASSERT_TRUE(reader.IsEndOfBuffer());
347 }
348
349 TEST(NtlmBufferReaderTest, MatchEmptySecurityBufferLengthZeroPastEob) {
350 const uint8_t buf[SECURITY_BUFFER_LEN] = {0, 0, 0, 0, 0x09, 0, 0, 0};
351
352 NtlmBufferReader reader(buf, SECURITY_BUFFER_LEN);
353
354 ASSERT_FALSE(reader.MatchEmptySecurityBuffer());
355 }
356
357 TEST(NtlmBufferReaderTest, MatchEmptySecurityBufferLengthNonZeroLength) {
358 const uint8_t buf[SECURITY_BUFFER_LEN + 1] = {0x01, 0, 0, 0, 0x08,
359 0, 0, 0, 0xff};
360
361 NtlmBufferReader reader(buf, SECURITY_BUFFER_LEN);
362
363 ASSERT_FALSE(reader.MatchEmptySecurityBuffer());
364 }
365
366 } // namespace ntlm
367 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698