OLD | NEW |
(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_writer.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 #if defined(ARCH_CPU_LITTLE_ENDIAN) |
| 12 #define IS_LITTLE_ENDIAN 1 |
| 13 #undef IS_BIG_ENDIAN |
| 14 #elif defined(ARCH_CPU_BIG_ENDIAN) |
| 15 #define IS_BIG_ENDIAN 1 |
| 16 #undef IS_LITTLE_ENDIAN |
| 17 #else |
| 18 #error "Unknown endianness" |
| 19 #endif |
| 20 |
| 21 namespace net { |
| 22 |
| 23 namespace { |
| 24 |
| 25 // Helper method to hide all the ugly casting. |
| 26 const uint8_t* GetBufferPtr(const NtlmBufferWriter& writer) { |
| 27 return reinterpret_cast<const uint8_t*>(writer.GetBuffer().data()); |
| 28 } |
| 29 |
| 30 // Helper method to get a byte at a specific index in the buffer. |
| 31 uint8_t GetByteFromBuffer(const NtlmBufferWriter& writer, size_t index) { |
| 32 base::StringPiece piece(writer.GetBuffer()); |
| 33 EXPECT_TRUE(index < piece.length()); |
| 34 return static_cast<uint8_t>(piece.data()[index]); |
| 35 } |
| 36 |
| 37 } // namespace |
| 38 |
| 39 TEST(NtlmBufferWriterTest, Initialization) { |
| 40 NtlmBufferWriter writer(1); |
| 41 |
| 42 EXPECT_EQ(1u, writer.GetLength()); |
| 43 EXPECT_EQ(1u, writer.GetBuffer().length()); |
| 44 EXPECT_EQ(0u, writer.GetCursor()); |
| 45 EXPECT_FALSE(writer.IsEndOfBuffer()); |
| 46 EXPECT_TRUE(writer.CanWrite(1)); |
| 47 EXPECT_FALSE(writer.CanWrite(2)); |
| 48 } |
| 49 |
| 50 TEST(NtlmBufferWriterTest, Write16) { |
| 51 uint8_t expected[2] = {0x22, 0x11}; |
| 52 const uint16_t value = 0x1122; |
| 53 |
| 54 NtlmBufferWriter writer(sizeof(uint16_t)); |
| 55 |
| 56 EXPECT_TRUE(writer.WriteUInt16(value)); |
| 57 EXPECT_TRUE(writer.IsEndOfBuffer()); |
| 58 EXPECT_EQ(arraysize(expected), writer.GetLength()); |
| 59 EXPECT_FALSE(writer.WriteUInt16(value)); |
| 60 |
| 61 std::unique_ptr<uint8_t[]> actual(writer.ReleaseBufferPtr()); |
| 62 EXPECT_EQ(0, memcmp(expected, actual.get(), arraysize(expected))); |
| 63 } |
| 64 |
| 65 TEST(NtlmBufferWriterTest, Write16PastEob) { |
| 66 NtlmBufferWriter writer(sizeof(uint16_t) - 1); |
| 67 |
| 68 EXPECT_FALSE(writer.WriteUInt16(0)); |
| 69 EXPECT_EQ(0u, writer.GetCursor()); |
| 70 } |
| 71 |
| 72 TEST(NtlmBufferWriterTest, Write32) { |
| 73 uint8_t expected[4] = {0x44, 0x33, 0x22, 0x11}; |
| 74 const uint32_t value = 0x11223344; |
| 75 |
| 76 NtlmBufferWriter writer(sizeof(uint32_t)); |
| 77 |
| 78 EXPECT_TRUE(writer.WriteUInt32(value)); |
| 79 EXPECT_TRUE(writer.IsEndOfBuffer()); |
| 80 EXPECT_FALSE(writer.WriteUInt32(value)); |
| 81 |
| 82 EXPECT_EQ(0, memcmp(expected, GetBufferPtr(writer), arraysize(expected))); |
| 83 } |
| 84 |
| 85 TEST(NtlmBufferWriterTest, Write32PastEob) { |
| 86 NtlmBufferWriter writer(sizeof(uint32_t) - 1); |
| 87 |
| 88 EXPECT_FALSE(writer.WriteUInt32(0)); |
| 89 EXPECT_EQ(0u, writer.GetCursor()); |
| 90 } |
| 91 |
| 92 TEST(NtlmBufferWriterTest, Write64) { |
| 93 uint8_t expected[8] = {0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11}; |
| 94 const uint64_t value = 0x1122334455667788; |
| 95 |
| 96 NtlmBufferWriter writer(sizeof(uint64_t)); |
| 97 |
| 98 EXPECT_TRUE(writer.WriteUInt64(value)); |
| 99 EXPECT_TRUE(writer.IsEndOfBuffer()); |
| 100 EXPECT_FALSE(writer.WriteUInt64(value)); |
| 101 |
| 102 EXPECT_EQ(0, memcmp(expected, GetBufferPtr(writer), arraysize(expected))); |
| 103 } |
| 104 |
| 105 TEST(NtlmBufferWriterTest, Write64PastEob) { |
| 106 NtlmBufferWriter writer(sizeof(uint64_t) - 1); |
| 107 |
| 108 EXPECT_FALSE(writer.WriteUInt64(0)); |
| 109 EXPECT_EQ(0u, writer.GetCursor()); |
| 110 } |
| 111 |
| 112 TEST(NtlmBufferWriterTest, WriteBytes) { |
| 113 uint8_t expected[8] = {0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11}; |
| 114 |
| 115 NtlmBufferWriter writer(arraysize(expected)); |
| 116 |
| 117 EXPECT_TRUE(writer.WriteBytes(expected, arraysize(expected))); |
| 118 EXPECT_EQ(0, memcmp(GetBufferPtr(writer), expected, arraysize(expected))); |
| 119 EXPECT_TRUE(writer.IsEndOfBuffer()); |
| 120 EXPECT_FALSE(writer.WriteBytes(expected, 1)); |
| 121 |
| 122 EXPECT_EQ(0, memcmp(expected, GetBufferPtr(writer), arraysize(expected))); |
| 123 } |
| 124 |
| 125 TEST(NtlmBufferWriterTest, WriteBytesPastEob) { |
| 126 uint8_t buffer[8]; |
| 127 |
| 128 NtlmBufferWriter writer(arraysize(buffer) - 1); |
| 129 |
| 130 EXPECT_FALSE(writer.WriteBytes(buffer, arraysize(buffer))); |
| 131 EXPECT_EQ(0u, writer.GetCursor()); |
| 132 } |
| 133 |
| 134 TEST(NtlmBufferWriterTest, WriteSecurityBuffer) { |
| 135 uint8_t expected[8] = {0x22, 0x11, 0x22, 0x11, 0x88, 0x77, 0x66, 0x55}; |
| 136 uint16_t length = 0x1122; |
| 137 uint32_t offset = 0x55667788; |
| 138 |
| 139 NtlmBufferWriter writer(ntlm::SECURITY_BUFFER_LEN); |
| 140 |
| 141 EXPECT_TRUE(writer.WriteSecurityBuffer(ntlm::SecurityBuffer(offset, length))); |
| 142 EXPECT_TRUE(writer.IsEndOfBuffer()); |
| 143 EXPECT_FALSE( |
| 144 writer.WriteSecurityBuffer(ntlm::SecurityBuffer(offset, length))); |
| 145 |
| 146 EXPECT_EQ(0, memcmp(expected, GetBufferPtr(writer), arraysize(expected))); |
| 147 } |
| 148 |
| 149 TEST(NtlmBufferWriterTest, WriteSecurityBufferPastEob) { |
| 150 ntlm::SecurityBuffer sec_buf; |
| 151 NtlmBufferWriter writer(ntlm::SECURITY_BUFFER_LEN - 1); |
| 152 |
| 153 EXPECT_FALSE(writer.WriteSecurityBuffer(sec_buf)); |
| 154 EXPECT_EQ(0u, writer.GetCursor()); |
| 155 } |
| 156 |
| 157 TEST(NtlmBufferWriterTest, WriteNarrowString) { |
| 158 uint8_t expected[8] = {'1', '2', '3', '4', '5', '6', '7', '8'}; |
| 159 std::string value("12345678"); |
| 160 |
| 161 NtlmBufferWriter writer(value.size()); |
| 162 |
| 163 EXPECT_TRUE(writer.WriteUtf8String(value)); |
| 164 EXPECT_TRUE(writer.IsEndOfBuffer()); |
| 165 EXPECT_FALSE(writer.WriteUtf8String(value)); |
| 166 |
| 167 EXPECT_EQ(0, memcmp(expected, GetBufferPtr(writer), arraysize(expected))); |
| 168 } |
| 169 |
| 170 TEST(NtlmBufferWriterTest, WriteAsciiStringPastEob) { |
| 171 std::string str("12345678"); |
| 172 NtlmBufferWriter writer(str.length() - 1); |
| 173 |
| 174 EXPECT_FALSE(writer.WriteUtf8String(str)); |
| 175 EXPECT_EQ(0u, writer.GetCursor()); |
| 176 } |
| 177 |
| 178 TEST(NtlmBufferWriterTest, WriteUtf16String) { |
| 179 uint8_t expected[16] = {'1', 0, '2', 0, '3', 0, '4', 0, |
| 180 '5', 0, '6', 0, '7', 0, '8', 0}; |
| 181 base::string16 value = base::ASCIIToUTF16("12345678"); |
| 182 |
| 183 NtlmBufferWriter writer(value.size() * 2); |
| 184 |
| 185 EXPECT_TRUE(writer.WriteUtf16String(value)); |
| 186 EXPECT_TRUE(writer.IsEndOfBuffer()); |
| 187 EXPECT_FALSE(writer.WriteUtf16String(value)); |
| 188 |
| 189 EXPECT_EQ(0, memcmp(expected, GetBufferPtr(writer), arraysize(expected))); |
| 190 } |
| 191 |
| 192 TEST(NtlmBufferWriterTest, WriteUtf16StringPastEob) { |
| 193 base::string16 str = base::ASCIIToUTF16("12345678"); |
| 194 NtlmBufferWriter writer((str.length() * 2) - 1); |
| 195 |
| 196 EXPECT_FALSE(writer.WriteUtf16String(str)); |
| 197 EXPECT_EQ(0u, writer.GetCursor()); |
| 198 } |
| 199 |
| 200 TEST(NtlmBufferWriterTest, WriteUtf8AsUtf16String) { |
| 201 uint8_t expected[16] = {'1', 0, '2', 0, '3', 0, '4', 0, |
| 202 '5', 0, '6', 0, '7', 0, '8', 0}; |
| 203 std::string input = "12345678"; |
| 204 |
| 205 NtlmBufferWriter writer(input.size() * 2); |
| 206 |
| 207 EXPECT_TRUE(writer.WriteUtf8AsUtf16String(input)); |
| 208 EXPECT_TRUE(writer.IsEndOfBuffer()); |
| 209 EXPECT_FALSE(writer.WriteUtf8AsUtf16String(input)); |
| 210 |
| 211 EXPECT_EQ(0, memcmp(expected, GetBufferPtr(writer), arraysize(expected))); |
| 212 } |
| 213 |
| 214 TEST(NtlmBufferWriterTest, WriteSignature) { |
| 215 uint8_t expected[8] = {'N', 'T', 'L', 'M', 'S', 'S', 'P', 0}; |
| 216 NtlmBufferWriter writer(ntlm::SIGNATURE_LEN); |
| 217 |
| 218 EXPECT_TRUE(writer.WriteSignature()); |
| 219 EXPECT_TRUE(writer.IsEndOfBuffer()); |
| 220 |
| 221 EXPECT_EQ(0, memcmp(expected, GetBufferPtr(writer), arraysize(expected))); |
| 222 } |
| 223 |
| 224 TEST(NtlmBufferWriterTest, WriteSignaturePastEob) { |
| 225 NtlmBufferWriter writer(1); |
| 226 |
| 227 EXPECT_FALSE(writer.WriteSignature()); |
| 228 EXPECT_FALSE(writer.IsEndOfBuffer()); |
| 229 EXPECT_EQ(0u, writer.GetCursor()); |
| 230 EXPECT_TRUE(writer.CanWrite(1)); |
| 231 } |
| 232 |
| 233 TEST(NtlmBufferWriterTest, WriteMessageType) { |
| 234 NtlmBufferWriter writer(4); |
| 235 |
| 236 EXPECT_TRUE(writer.WriteMessageType(ntlm::MessageType::NEGOTIATE)); |
| 237 EXPECT_TRUE(writer.IsEndOfBuffer()); |
| 238 EXPECT_EQ(static_cast<uint32_t>(ntlm::MessageType::NEGOTIATE), |
| 239 GetByteFromBuffer(writer, 0)); |
| 240 EXPECT_EQ(0, GetByteFromBuffer(writer, 1)); |
| 241 EXPECT_EQ(0, GetByteFromBuffer(writer, 2)); |
| 242 EXPECT_EQ(0, GetByteFromBuffer(writer, 3)); |
| 243 } |
| 244 |
| 245 TEST(NtlmBufferWriterTest, WriteMessageTypePastEob) { |
| 246 NtlmBufferWriter writer(sizeof(uint32_t) - 1); |
| 247 |
| 248 EXPECT_FALSE(writer.WriteMessageType(ntlm::MessageType::NEGOTIATE)); |
| 249 EXPECT_EQ(0u, writer.GetCursor()); |
| 250 } |
| 251 |
| 252 TEST(NtlmBufferWriterTest, ReleaseBufferPtr) { |
| 253 size_t buf_len = 4; |
| 254 NtlmBufferWriter writer(buf_len); |
| 255 |
| 256 EXPECT_TRUE(writer.CanWrite(buf_len)); |
| 257 EXPECT_TRUE(GetBufferPtr(writer) != nullptr); |
| 258 EXPECT_EQ(buf_len, writer.GetLength()); |
| 259 EXPECT_EQ(0u, writer.GetCursor()); |
| 260 |
| 261 // Write soemthing so that the cursor moves. |
| 262 EXPECT_TRUE(writer.WriteUInt16(23)); |
| 263 EXPECT_EQ(sizeof(uint16_t), writer.GetCursor()); |
| 264 EXPECT_TRUE(writer.CanWrite(buf_len - sizeof(uint16_t))); |
| 265 |
| 266 // Release the buffer from the writer. |
| 267 std::unique_ptr<uint8_t[]> buf(writer.ReleaseBufferPtr()); |
| 268 |
| 269 // Expect that the writer behaves empty now. |
| 270 EXPECT_TRUE(writer.IsEndOfBuffer()); |
| 271 EXPECT_FALSE(writer.CanWrite(buf_len - sizeof(uint16_t))); |
| 272 EXPECT_EQ(0u, writer.GetCursor()); |
| 273 EXPECT_EQ(0u, writer.GetLength()); |
| 274 EXPECT_EQ(nullptr, GetBufferPtr(writer)); |
| 275 } |
| 276 |
| 277 } // namespace net |
OLD | NEW |