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

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

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

Powered by Google App Engine
This is Rietveld 408576698