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

Side by Side Diff: components/gcm_driver/crypto/encryption_header_parsers_unittest.cc

Issue 1509683002: Convert the encryption header parsers to be iterator-based. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years 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
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "components/gcm_driver/crypto/encryption_header_parsers.h" 5 #include "components/gcm_driver/crypto/encryption_header_parsers.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/macros.h" 9 #include "base/macros.h"
10 #include "base/strings/string_number_conversions.h" 10 #include "base/strings/string_number_conversions.h"
(...skipping 27 matching lines...) Expand all
38 { "salt=c2l4dGVlbmNvb2xieXRlcw", 38 { "salt=c2l4dGVlbmNvb2xieXRlcw",
39 "", "sixteencoolbytes", kDefaultRecordSize }, 39 "", "sixteencoolbytes", kDefaultRecordSize },
40 { "rs=2048", "", "", 2048 }, 40 { "rs=2048", "", "", 2048 },
41 { "keyid=foo;someothervalue=1;rs=42", "foo", "", 42 }, 41 { "keyid=foo;someothervalue=1;rs=42", "foo", "", 42 },
42 { "keyid=foo;keyid=bar", "bar", "", kDefaultRecordSize }, 42 { "keyid=foo;keyid=bar", "bar", "", kDefaultRecordSize },
43 }; 43 };
44 44
45 for (size_t i = 0; i < arraysize(expected_results); i++) { 45 for (size_t i = 0; i < arraysize(expected_results); i++) {
46 SCOPED_TRACE(i); 46 SCOPED_TRACE(i);
47 47
48 std::vector<EncryptionHeaderValues> values; 48 std::string header(expected_results[i].header);
49 ASSERT_TRUE(ParseEncryptionHeader(expected_results[i].header, &values));
50 ASSERT_EQ(1u, values.size());
51 49
52 EXPECT_EQ(expected_results[i].parsed_keyid, values[0].keyid); 50 EncryptionHeaderIterator iterator(header.begin(), header.end());
53 EXPECT_EQ(expected_results[i].parsed_salt, values[0].salt); 51 ASSERT_TRUE(iterator.GetNext());
54 EXPECT_EQ(expected_results[i].parsed_rs, values[0].rs); 52
53 EXPECT_EQ(expected_results[i].parsed_keyid, iterator.keyid());
54 EXPECT_EQ(expected_results[i].parsed_salt, iterator.salt());
55 EXPECT_EQ(expected_results[i].parsed_rs, iterator.rs());
56
57 EXPECT_FALSE(iterator.GetNext());
55 } 58 }
56 } 59 }
57 60
58 TEST(EncryptionHeaderParsersTest, ParseValidMultiValueEncryptionHeaders) { 61 TEST(EncryptionHeaderParsersTest, ParseValidMultiValueEncryptionHeaders) {
59 const size_t kNumberOfValues = 2u; 62 const size_t kNumberOfValues = 2u;
60 63
61 struct { 64 struct {
62 const char* const header; 65 const char* const header;
63 struct { 66 struct {
64 const char* const keyid; 67 const char* const keyid;
(...skipping 12 matching lines...) Expand all
77 { { "foo", "", kDefaultRecordSize }, 80 { { "foo", "", kDefaultRecordSize },
78 { "bar", "sixteencoolbytes", 1024 } } }, 81 { "bar", "sixteencoolbytes", 1024 } } },
79 { "keyid=\"foo,keyid=bar\",salt=c2l4dGVlbmNvb2xieXRlcw", 82 { "keyid=\"foo,keyid=bar\",salt=c2l4dGVlbmNvb2xieXRlcw",
80 { { "foo,keyid=bar", "", kDefaultRecordSize }, 83 { { "foo,keyid=bar", "", kDefaultRecordSize },
81 { "", "sixteencoolbytes", kDefaultRecordSize } } }, 84 { "", "sixteencoolbytes", kDefaultRecordSize } } },
82 }; 85 };
83 86
84 for (size_t i = 0; i < arraysize(expected_results); i++) { 87 for (size_t i = 0; i < arraysize(expected_results); i++) {
85 SCOPED_TRACE(i); 88 SCOPED_TRACE(i);
86 89
87 std::vector<EncryptionHeaderValues> values; 90 std::string header(expected_results[i].header);
88 ASSERT_TRUE(ParseEncryptionHeader(expected_results[i].header, &values));
89 ASSERT_EQ(kNumberOfValues, values.size());
90 91
92 EncryptionHeaderIterator iterator(header.begin(), header.end());
91 for (size_t j = 0; j < kNumberOfValues; ++j) { 93 for (size_t j = 0; j < kNumberOfValues; ++j) {
92 EXPECT_EQ(expected_results[i].parsed_values[j].keyid, values[j].keyid); 94 ASSERT_TRUE(iterator.GetNext());
93 EXPECT_EQ(expected_results[i].parsed_values[j].salt, values[j].salt); 95
94 EXPECT_EQ(expected_results[i].parsed_values[j].rs, values[j].rs); 96 EXPECT_EQ(expected_results[i].parsed_values[j].keyid, iterator.keyid());
97 EXPECT_EQ(expected_results[i].parsed_values[j].salt, iterator.salt());
98 EXPECT_EQ(expected_results[i].parsed_values[j].rs, iterator.rs());
95 } 99 }
100
101 EXPECT_FALSE(iterator.GetNext());
96 } 102 }
97 } 103 }
98 104
99 TEST(EncryptionHeaderParsersTest, ParseInvalidEncryptionHeaders) { 105 TEST(EncryptionHeaderParsersTest, ParseInvalidEncryptionHeaders) {
100 const char* const expected_failures[] = { 106 const char* const expected_failures[] = {
101 "keyid", 107 "keyid",
102 "keyid=", 108 "keyid=",
103 "keyid=foo;novaluekey", 109 "keyid=foo;keyid",
104 "keyid=foo,keyid",
105 "salt", 110 "salt",
106 "salt=", 111 "salt=",
107 "salt=YmV/2ZXJ-sMDA", 112 "salt=YmV/2ZXJ-sMDA",
108 "salt=dHdlbHZlY29vbGJ5dGVz=====", 113 "salt=dHdlbHZlY29vbGJ5dGVz=====",
114 "salt=c2l4dGVlbmNvb2xieXRlcw;salt=123$xyz",
109 "salt=123$xyz", 115 "salt=123$xyz",
110 "salt=c2l4dGVlbmNvb2xieXRlcw,salt=123$xyz",
111 "rs", 116 "rs",
112 "rs=", 117 "rs=",
113 "rs=0", 118 "rs=0",
114 "rs=0x13", 119 "rs=0x13",
115 "rs=1", 120 "rs=1",
116 "rs=-1", 121 "rs=-1",
117 "rs=+5", 122 "rs=+5",
118 "rs=99999999999999999999999999999999", 123 "rs=99999999999999999999999999999999",
124 "rs=foobar",
125 };
126
127 const char* const expected_failures_second_iter[] = {
128 "keyid=foo,novaluekey",
129 "salt=c2l4dGVlbmNvb2xieXRlcw,salt=123$xyz",
119 "rs=2,rs=0", 130 "rs=2,rs=0",
120 "rs=foobar",
121 }; 131 };
Ryan Sleevi 2015/12/16 21:21:27 As an aside (and perhaps not for this CL), the dow
Peter Beverloo 2015/12/16 21:35:35 Realistically, I'm unlikely to touch this code any
122 132
123 for (size_t i = 0; i < arraysize(expected_failures); i++) { 133 for (size_t i = 0; i < arraysize(expected_failures); i++) {
124 SCOPED_TRACE(i); 134 SCOPED_TRACE(i);
125 135
126 std::vector<EncryptionHeaderValues> values; 136 std::string header(expected_failures[i]);
127 EXPECT_FALSE(ParseEncryptionHeader(expected_failures[i], &values)); 137
128 EXPECT_EQ(0u, values.size()); 138 EncryptionHeaderIterator iterator(header.begin(), header.end());
139 EXPECT_FALSE(iterator.GetNext());
140 }
141
142 for (size_t i = 0; i < arraysize(expected_failures_second_iter); i++) {
143 SCOPED_TRACE(i);
144
145 std::string header(expected_failures_second_iter[i]);
146
147 EncryptionHeaderIterator iterator(header.begin(), header.end());
148 EXPECT_TRUE(iterator.GetNext());
149 EXPECT_FALSE(iterator.GetNext());
129 } 150 }
130 } 151 }
131 152
132 TEST(EncryptionHeaderParsersTest, ParseValidCryptoKeyHeaders) { 153 TEST(EncryptionHeaderParsersTest, ParseValidCryptoKeyHeaders) {
133 struct { 154 struct {
134 const char* const header; 155 const char* const header;
135 const char* const parsed_keyid; 156 const char* const parsed_keyid;
136 const char* const parsed_aesgcm128; 157 const char* const parsed_aesgcm128;
137 const char* const parsed_dh; 158 const char* const parsed_dh;
138 } expected_results[] = { 159 } expected_results[] = {
(...skipping 12 matching lines...) Expand all
151 { "aesgcm128='c2l4dGVlbmNvb2xieXRlcw'", "", "sixteencoolbytes", "" }, 172 { "aesgcm128='c2l4dGVlbmNvb2xieXRlcw'", "", "sixteencoolbytes", "" },
152 { "dh=dHdlbHZlY29vbGJ5dGVz", "", "", "twelvecoolbytes" }, 173 { "dh=dHdlbHZlY29vbGJ5dGVz", "", "", "twelvecoolbytes" },
153 { "keyid=foo;someothervalue=bar;aesgcm128=dHdlbHZlY29vbGJ5dGVz", 174 { "keyid=foo;someothervalue=bar;aesgcm128=dHdlbHZlY29vbGJ5dGVz",
154 "foo", "twelvecoolbytes", "" }, 175 "foo", "twelvecoolbytes", "" },
155 { "keyid=foo;keyid=bar", "bar", "", "" }, 176 { "keyid=foo;keyid=bar", "bar", "", "" },
156 }; 177 };
157 178
158 for (size_t i = 0; i < arraysize(expected_results); i++) { 179 for (size_t i = 0; i < arraysize(expected_results); i++) {
159 SCOPED_TRACE(i); 180 SCOPED_TRACE(i);
160 181
161 std::vector<CryptoKeyHeaderValues> values; 182 std::string header(expected_results[i].header);
162 ASSERT_TRUE(ParseCryptoKeyHeader(expected_results[i].header, &values));
163 ASSERT_EQ(1u, values.size());
164 183
165 EXPECT_EQ(expected_results[i].parsed_keyid, values[0].keyid); 184 CryptoKeyHeaderIterator iterator(header.begin(), header.end());
166 EXPECT_EQ(expected_results[i].parsed_aesgcm128, values[0].aesgcm128); 185 ASSERT_TRUE(iterator.GetNext());
167 EXPECT_EQ(expected_results[i].parsed_dh, values[0].dh); 186
187 EXPECT_EQ(expected_results[i].parsed_keyid, iterator.keyid());
188 EXPECT_EQ(expected_results[i].parsed_aesgcm128, iterator.aesgcm128());
189 EXPECT_EQ(expected_results[i].parsed_dh, iterator.dh());
190
191 EXPECT_FALSE(iterator.GetNext());
168 } 192 }
169 } 193 }
170 194
171 TEST(EncryptionHeaderParsersTest, ParseValidMultiValueCryptoKeyHeaders) { 195 TEST(EncryptionHeaderParsersTest, ParseValidMultiValueCryptoKeyHeaders) {
172 const size_t kNumberOfValues = 2u; 196 const size_t kNumberOfValues = 2u;
173 197
174 struct { 198 struct {
175 const char* const header; 199 const char* const header;
176 struct { 200 struct {
177 const char* const keyid; 201 const char* const keyid;
(...skipping 12 matching lines...) Expand all
190 { { "foo", "", "" }, 214 { { "foo", "", "" },
191 { "bar", "", "twelvecoolbytes" } } }, 215 { "bar", "", "twelvecoolbytes" } } },
192 { "keyid=\"foo,keyid=bar\",aesgcm128=c2l4dGVlbmNvb2xieXRlcw", 216 { "keyid=\"foo,keyid=bar\",aesgcm128=c2l4dGVlbmNvb2xieXRlcw",
193 { { "foo,keyid=bar", "", "" }, 217 { { "foo,keyid=bar", "", "" },
194 { "", "sixteencoolbytes", "" } } }, 218 { "", "sixteencoolbytes", "" } } },
195 }; 219 };
196 220
197 for (size_t i = 0; i < arraysize(expected_results); i++) { 221 for (size_t i = 0; i < arraysize(expected_results); i++) {
198 SCOPED_TRACE(i); 222 SCOPED_TRACE(i);
199 223
200 std::vector<CryptoKeyHeaderValues> values; 224 std::string header(expected_results[i].header);
201 ASSERT_TRUE(ParseCryptoKeyHeader(expected_results[i].header, &values));
202 ASSERT_EQ(kNumberOfValues, values.size());
203 225
226 CryptoKeyHeaderIterator iterator(header.begin(), header.end());
204 for (size_t j = 0; j < kNumberOfValues; ++j) { 227 for (size_t j = 0; j < kNumberOfValues; ++j) {
205 EXPECT_EQ(expected_results[i].parsed_values[j].keyid, values[j].keyid); 228 ASSERT_TRUE(iterator.GetNext());
229
230 EXPECT_EQ(expected_results[i].parsed_values[j].keyid, iterator.keyid());
206 EXPECT_EQ(expected_results[i].parsed_values[j].aesgcm128, 231 EXPECT_EQ(expected_results[i].parsed_values[j].aesgcm128,
207 values[j].aesgcm128); 232 iterator.aesgcm128());
208 EXPECT_EQ(expected_results[i].parsed_values[j].dh, values[j].dh); 233 EXPECT_EQ(expected_results[i].parsed_values[j].dh, iterator.dh());
209 } 234 }
235
236 EXPECT_FALSE(iterator.GetNext());
210 } 237 }
211 } 238 }
212 239
213 TEST(EncryptionHeaderParsersTest, ParseInvalidCryptoKeyHeaders) { 240 TEST(EncryptionHeaderParsersTest, ParseInvalidCryptoKeyHeaders) {
214 const char* const expected_failures[] = { 241 const char* const expected_failures[] = {
215 "keyid", 242 "keyid",
216 "keyid=", 243 "keyid=",
217 "keyid=foo,keyid", 244 "keyid=foo;keyid",
218 "keyid=foo;novaluekey",
219 "aesgcm128", 245 "aesgcm128",
220 "aesgcm128=", 246 "aesgcm128=",
221 "aesgcm128=123$xyz", 247 "aesgcm128=123$xyz",
222 "aesgcm128=foobar,aesgcm128=123$xyz", 248 "aesgcm128=foobar;aesgcm128=123$xyz",
223 "dh", 249 "dh",
224 "dh=", 250 "dh=",
225 "dh=YmV/2ZXJ-sMDA", 251 "dh=YmV/2ZXJ-sMDA",
226 "dh=dHdlbHZlY29vbGJ5dGVz=====", 252 "dh=dHdlbHZlY29vbGJ5dGVz=====",
227 "dh=123$xyz", 253 "dh=123$xyz",
228 }; 254 };
229 255
256 const char* const expected_failures_second_iter[] = {
257 "keyid=foo,novaluekey",
258 "dh=dHdlbHZlY29vbGJ5dGVz,aesgcm128=",
259 };
260
230 for (size_t i = 0; i < arraysize(expected_failures); i++) { 261 for (size_t i = 0; i < arraysize(expected_failures); i++) {
231 SCOPED_TRACE(i); 262 SCOPED_TRACE(i);
232 263
233 std::vector<CryptoKeyHeaderValues> values; 264 std::string header(expected_failures[i]);
234 EXPECT_FALSE(ParseCryptoKeyHeader(expected_failures[i], &values)); 265
235 EXPECT_EQ(0u, values.size()); 266 CryptoKeyHeaderIterator iterator(header.begin(), header.end());
267 EXPECT_FALSE(iterator.GetNext());
268 }
269
270 for (size_t i = 0; i < arraysize(expected_failures_second_iter); i++) {
271 SCOPED_TRACE(i);
272
273 std::string header(expected_failures_second_iter[i]);
274
275 CryptoKeyHeaderIterator iterator(header.begin(), header.end());
276 EXPECT_TRUE(iterator.GetNext());
277 EXPECT_FALSE(iterator.GetNext());
236 } 278 }
237 } 279 }
238 280
239 TEST(EncryptionHeaderParsersTest, SixValueHeader) { 281 TEST(EncryptionHeaderParsersTest, SixValueHeader) {
240 const char* const header = "keyid=0,keyid=1,keyid=2,keyid=3,keyid=4,keyid=5"; 282 const std::string header("keyid=0,keyid=1,keyid=2,keyid=3,keyid=4,keyid=5");
241 283
242 std::vector<EncryptionHeaderValues> encryption_values; 284 EncryptionHeaderIterator encryption_iterator(header.begin(), header.end());
243 ASSERT_TRUE(ParseEncryptionHeader(header, &encryption_values)); 285 CryptoKeyHeaderIterator crypto_key_iterator(header.begin(), header.end());
244 286
245 std::vector<CryptoKeyHeaderValues> crypto_key_values; 287 for (size_t i = 0; i < 6; ++i) {
246 ASSERT_TRUE(ParseCryptoKeyHeader(header, &crypto_key_values));
247
248 ASSERT_EQ(6u, encryption_values.size());
249 ASSERT_EQ(6u, crypto_key_values.size());
250
251 for (size_t i = 0; i < encryption_values.size(); i++) {
252 SCOPED_TRACE(i); 288 SCOPED_TRACE(i);
253 289
254 const std::string value = base::IntToString(i); 290 ASSERT_TRUE(encryption_iterator.GetNext());
291 ASSERT_TRUE(crypto_key_iterator.GetNext());
292 }
255 293
256 EXPECT_EQ(value, encryption_values[i].keyid); 294 EXPECT_FALSE(encryption_iterator.GetNext());
257 EXPECT_EQ(value, crypto_key_values[i].keyid); 295 EXPECT_FALSE(crypto_key_iterator.GetNext());
258 }
259 } 296 }
260 297
261 TEST(EncryptionHeaderParsersTest, InvalidHeadersDoNotModifyOutput) { 298 TEST(EncryptionHeaderParsersTest, InvalidHeadersResetOutput) {
Ryan Sleevi 2015/12/16 21:21:27 Some comments here could help
Peter Beverloo 2015/12/16 21:35:35 Done.
262 EncryptionHeaderValues encryption_value; 299 const std::string encryption_header(
263 encryption_value.keyid = "mykeyid"; 300 "keyid=foo;salt=c2l4dGVlbmNvb2xieXRlcw;rs=1024,rs=foobar");
264 encryption_value.salt = "somesalt"; 301 const std::string crypto_key_header(
265 encryption_value.rs = 42u; 302 "keyid=foo;aesgcm128=c2l4dGVlbmNvb2xieXRlcw;dh=dHdlbHZlY29vbGJ5dGVz,"
303 "aesgcm128=$$$");
266 304
267 std::vector<EncryptionHeaderValues> encryption_values; 305 EncryptionHeaderIterator encryption_iterator(
268 encryption_values.push_back(encryption_value); 306 encryption_header.begin(), encryption_header.end());
269 307
270 ASSERT_FALSE(ParseEncryptionHeader("rs=foobar", &encryption_values)); 308 ASSERT_EQ(0u, encryption_iterator.keyid().size());
271 ASSERT_EQ(1u, encryption_values.size()); 309 ASSERT_EQ(0u, encryption_iterator.salt().size());
310 ASSERT_EQ(4096u, encryption_iterator.rs());
272 311
273 EXPECT_EQ("mykeyid", encryption_values[0].keyid); 312 ASSERT_TRUE(encryption_iterator.GetNext());
274 EXPECT_EQ("somesalt", encryption_values[0].salt);
275 EXPECT_EQ(42u, encryption_values[0].rs);
276 313
277 CryptoKeyHeaderValues crypto_key_value; 314 EXPECT_EQ("foo", encryption_iterator.keyid());
278 crypto_key_value.keyid = "myotherkeyid"; 315 EXPECT_EQ("sixteencoolbytes", encryption_iterator.salt());
279 crypto_key_value.aesgcm128 = "akey"; 316 EXPECT_EQ(1024u, encryption_iterator.rs());
280 crypto_key_value.dh = "yourdh";
281 317
282 std::vector<CryptoKeyHeaderValues> crypto_key_values; 318 ASSERT_FALSE(encryption_iterator.GetNext());
283 crypto_key_values.push_back(crypto_key_value);
284 319
285 ASSERT_FALSE(ParseCryptoKeyHeader("aesgcm128=$$$", &crypto_key_values)); 320 EXPECT_EQ(0u, encryption_iterator.keyid().size());
286 ASSERT_EQ(1u, crypto_key_values.size()); 321 EXPECT_EQ(0u, encryption_iterator.salt().size());
322 EXPECT_EQ(4096u, encryption_iterator.rs());
287 323
288 EXPECT_EQ("myotherkeyid", crypto_key_values[0].keyid); 324 CryptoKeyHeaderIterator crypto_key_iterator(
289 EXPECT_EQ("akey", crypto_key_values[0].aesgcm128); 325 crypto_key_header.begin(), crypto_key_header.end());
290 EXPECT_EQ("yourdh", crypto_key_values[0].dh); 326
327 ASSERT_EQ(0u, crypto_key_iterator.keyid().size());
328 ASSERT_EQ(0u, crypto_key_iterator.aesgcm128().size());
329 ASSERT_EQ(0u, crypto_key_iterator.dh().size());
330
331 ASSERT_TRUE(crypto_key_iterator.GetNext());
332
333 EXPECT_EQ("foo", crypto_key_iterator.keyid());
334 EXPECT_EQ("sixteencoolbytes", crypto_key_iterator.aesgcm128());
335 EXPECT_EQ("twelvecoolbytes", crypto_key_iterator.dh());
336
337 ASSERT_FALSE(crypto_key_iterator.GetNext());
338
339 EXPECT_EQ(0u, crypto_key_iterator.keyid().size());
340 EXPECT_EQ(0u, crypto_key_iterator.aesgcm128().size());
341 EXPECT_EQ(0u, crypto_key_iterator.dh().size());
291 } 342 }
292 343
293 } // namespace 344 } // namespace
294 345
295 } // namespace gcm 346 } // namespace gcm
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698