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

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: Convert the encryption header parsers to be iterator-based. Created 4 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
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 <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <vector> 10 #include <vector>
(...skipping 30 matching lines...) Expand all
41 { "salt=c2l4dGVlbmNvb2xieXRlcw", 41 { "salt=c2l4dGVlbmNvb2xieXRlcw",
42 "", "sixteencoolbytes", kDefaultRecordSize }, 42 "", "sixteencoolbytes", kDefaultRecordSize },
43 { "rs=2048", "", "", 2048 }, 43 { "rs=2048", "", "", 2048 },
44 { "keyid=foo;someothervalue=1;rs=42", "foo", "", 42 }, 44 { "keyid=foo;someothervalue=1;rs=42", "foo", "", 42 },
45 { "keyid=foo;keyid=bar", "bar", "", kDefaultRecordSize }, 45 { "keyid=foo;keyid=bar", "bar", "", kDefaultRecordSize },
46 }; 46 };
47 47
48 for (size_t i = 0; i < arraysize(expected_results); i++) { 48 for (size_t i = 0; i < arraysize(expected_results); i++) {
49 SCOPED_TRACE(i); 49 SCOPED_TRACE(i);
50 50
51 std::vector<EncryptionHeaderValues> values; 51 std::string header(expected_results[i].header);
52 ASSERT_TRUE(ParseEncryptionHeader(expected_results[i].header, &values));
53 ASSERT_EQ(1u, values.size());
54 52
55 EXPECT_EQ(expected_results[i].parsed_keyid, values[0].keyid); 53 EncryptionHeaderIterator iterator(header.begin(), header.end());
56 EXPECT_EQ(expected_results[i].parsed_salt, values[0].salt); 54 ASSERT_TRUE(iterator.GetNext());
57 EXPECT_EQ(expected_results[i].parsed_rs, values[0].rs); 55
56 EXPECT_EQ(expected_results[i].parsed_keyid, iterator.keyid());
57 EXPECT_EQ(expected_results[i].parsed_salt, iterator.salt());
58 EXPECT_EQ(expected_results[i].parsed_rs, iterator.rs());
59
60 EXPECT_FALSE(iterator.GetNext());
58 } 61 }
59 } 62 }
60 63
61 TEST(EncryptionHeaderParsersTest, ParseValidMultiValueEncryptionHeaders) { 64 TEST(EncryptionHeaderParsersTest, ParseValidMultiValueEncryptionHeaders) {
62 const size_t kNumberOfValues = 2u; 65 const size_t kNumberOfValues = 2u;
63 66
64 struct { 67 struct {
65 const char* const header; 68 const char* const header;
66 struct { 69 struct {
67 const char* const keyid; 70 const char* const keyid;
(...skipping 12 matching lines...) Expand all
80 { { "foo", "", kDefaultRecordSize }, 83 { { "foo", "", kDefaultRecordSize },
81 { "bar", "sixteencoolbytes", 1024 } } }, 84 { "bar", "sixteencoolbytes", 1024 } } },
82 { "keyid=\"foo,keyid=bar\",salt=c2l4dGVlbmNvb2xieXRlcw", 85 { "keyid=\"foo,keyid=bar\",salt=c2l4dGVlbmNvb2xieXRlcw",
83 { { "foo,keyid=bar", "", kDefaultRecordSize }, 86 { { "foo,keyid=bar", "", kDefaultRecordSize },
84 { "", "sixteencoolbytes", kDefaultRecordSize } } }, 87 { "", "sixteencoolbytes", kDefaultRecordSize } } },
85 }; 88 };
86 89
87 for (size_t i = 0; i < arraysize(expected_results); i++) { 90 for (size_t i = 0; i < arraysize(expected_results); i++) {
88 SCOPED_TRACE(i); 91 SCOPED_TRACE(i);
89 92
90 std::vector<EncryptionHeaderValues> values; 93 std::string header(expected_results[i].header);
91 ASSERT_TRUE(ParseEncryptionHeader(expected_results[i].header, &values));
92 ASSERT_EQ(kNumberOfValues, values.size());
93 94
95 EncryptionHeaderIterator iterator(header.begin(), header.end());
94 for (size_t j = 0; j < kNumberOfValues; ++j) { 96 for (size_t j = 0; j < kNumberOfValues; ++j) {
95 EXPECT_EQ(expected_results[i].parsed_values[j].keyid, values[j].keyid); 97 ASSERT_TRUE(iterator.GetNext());
96 EXPECT_EQ(expected_results[i].parsed_values[j].salt, values[j].salt); 98
97 EXPECT_EQ(expected_results[i].parsed_values[j].rs, values[j].rs); 99 EXPECT_EQ(expected_results[i].parsed_values[j].keyid, iterator.keyid());
100 EXPECT_EQ(expected_results[i].parsed_values[j].salt, iterator.salt());
101 EXPECT_EQ(expected_results[i].parsed_values[j].rs, iterator.rs());
98 } 102 }
103
104 EXPECT_FALSE(iterator.GetNext());
99 } 105 }
100 } 106 }
101 107
102 TEST(EncryptionHeaderParsersTest, ParseInvalidEncryptionHeaders) { 108 TEST(EncryptionHeaderParsersTest, ParseInvalidEncryptionHeaders) {
103 const char* const expected_failures[] = { 109 const char* const expected_failures[] = {
110 // Values in the name-value pairs are not optional.
104 "keyid", 111 "keyid",
105 "keyid=", 112 "keyid=",
106 "keyid=foo;novaluekey", 113 "keyid=foo;keyid",
107 "keyid=foo,keyid",
108 "salt", 114 "salt",
109 "salt=", 115 "salt=",
116 "rs",
117 "rs=",
118
119 // The salt must be a URL-safe base64 decodable string.
110 "salt=YmV/2ZXJ-sMDA", 120 "salt=YmV/2ZXJ-sMDA",
111 "salt=dHdlbHZlY29vbGJ5dGVz=====", 121 "salt=dHdlbHZlY29vbGJ5dGVz=====",
122 "salt=c2l4dGVlbmNvb2xieXRlcw;salt=123$xyz",
112 "salt=123$xyz", 123 "salt=123$xyz",
113 "salt=c2l4dGVlbmNvb2xieXRlcw,salt=123$xyz", 124
114 "rs", 125 // The record size must be a positive decimal integer greater than one that
115 "rs=", 126 // does not start with a plus.
116 "rs=0", 127 "rs=0",
117 "rs=0x13", 128 "rs=0x13",
118 "rs=1", 129 "rs=1",
119 "rs=-1", 130 "rs=-1",
120 "rs=+5", 131 "rs=+5",
121 "rs=99999999999999999999999999999999", 132 "rs=99999999999999999999999999999999",
133 "rs=foobar",
134 };
135
136 const char* const expected_failures_second_iter[] = {
137 // Valid first field, missing value in the second field.
138 "keyid=foo,novaluekey",
139
140 // Valid first field, undecodable salt in the second field.
141 "salt=c2l4dGVlbmNvb2xieXRlcw,salt=123$xyz",
142
143 // Valid first field, invalid record size in the second field.
122 "rs=2,rs=0", 144 "rs=2,rs=0",
123 "rs=foobar",
124 }; 145 };
125 146
126 for (size_t i = 0; i < arraysize(expected_failures); i++) { 147 for (size_t i = 0; i < arraysize(expected_failures); i++) {
127 SCOPED_TRACE(i); 148 SCOPED_TRACE(i);
128 149
129 std::vector<EncryptionHeaderValues> values; 150 std::string header(expected_failures[i]);
130 EXPECT_FALSE(ParseEncryptionHeader(expected_failures[i], &values)); 151
131 EXPECT_EQ(0u, values.size()); 152 EncryptionHeaderIterator iterator(header.begin(), header.end());
153 EXPECT_FALSE(iterator.GetNext());
154 }
155
156 for (size_t i = 0; i < arraysize(expected_failures_second_iter); i++) {
157 SCOPED_TRACE(i);
158
159 std::string header(expected_failures_second_iter[i]);
160
161 EncryptionHeaderIterator iterator(header.begin(), header.end());
162 EXPECT_TRUE(iterator.GetNext());
163 EXPECT_FALSE(iterator.GetNext());
132 } 164 }
133 } 165 }
134 166
135 TEST(EncryptionHeaderParsersTest, ParseValidCryptoKeyHeaders) { 167 TEST(EncryptionHeaderParsersTest, ParseValidCryptoKeyHeaders) {
136 struct { 168 struct {
137 const char* const header; 169 const char* const header;
138 const char* const parsed_keyid; 170 const char* const parsed_keyid;
139 const char* const parsed_aesgcm128; 171 const char* const parsed_aesgcm128;
140 const char* const parsed_dh; 172 const char* const parsed_dh;
141 } expected_results[] = { 173 } expected_results[] = {
(...skipping 12 matching lines...) Expand all
154 { "aesgcm128='c2l4dGVlbmNvb2xieXRlcw'", "", "sixteencoolbytes", "" }, 186 { "aesgcm128='c2l4dGVlbmNvb2xieXRlcw'", "", "sixteencoolbytes", "" },
155 { "dh=dHdlbHZlY29vbGJ5dGVz", "", "", "twelvecoolbytes" }, 187 { "dh=dHdlbHZlY29vbGJ5dGVz", "", "", "twelvecoolbytes" },
156 { "keyid=foo;someothervalue=bar;aesgcm128=dHdlbHZlY29vbGJ5dGVz", 188 { "keyid=foo;someothervalue=bar;aesgcm128=dHdlbHZlY29vbGJ5dGVz",
157 "foo", "twelvecoolbytes", "" }, 189 "foo", "twelvecoolbytes", "" },
158 { "keyid=foo;keyid=bar", "bar", "", "" }, 190 { "keyid=foo;keyid=bar", "bar", "", "" },
159 }; 191 };
160 192
161 for (size_t i = 0; i < arraysize(expected_results); i++) { 193 for (size_t i = 0; i < arraysize(expected_results); i++) {
162 SCOPED_TRACE(i); 194 SCOPED_TRACE(i);
163 195
164 std::vector<CryptoKeyHeaderValues> values; 196 std::string header(expected_results[i].header);
165 ASSERT_TRUE(ParseCryptoKeyHeader(expected_results[i].header, &values));
166 ASSERT_EQ(1u, values.size());
167 197
168 EXPECT_EQ(expected_results[i].parsed_keyid, values[0].keyid); 198 CryptoKeyHeaderIterator iterator(header.begin(), header.end());
169 EXPECT_EQ(expected_results[i].parsed_aesgcm128, values[0].aesgcm128); 199 ASSERT_TRUE(iterator.GetNext());
170 EXPECT_EQ(expected_results[i].parsed_dh, values[0].dh); 200
201 EXPECT_EQ(expected_results[i].parsed_keyid, iterator.keyid());
202 EXPECT_EQ(expected_results[i].parsed_aesgcm128, iterator.aesgcm128());
203 EXPECT_EQ(expected_results[i].parsed_dh, iterator.dh());
204
205 EXPECT_FALSE(iterator.GetNext());
171 } 206 }
172 } 207 }
173 208
174 TEST(EncryptionHeaderParsersTest, ParseValidMultiValueCryptoKeyHeaders) { 209 TEST(EncryptionHeaderParsersTest, ParseValidMultiValueCryptoKeyHeaders) {
175 const size_t kNumberOfValues = 2u; 210 const size_t kNumberOfValues = 2u;
176 211
177 struct { 212 struct {
178 const char* const header; 213 const char* const header;
179 struct { 214 struct {
180 const char* const keyid; 215 const char* const keyid;
(...skipping 12 matching lines...) Expand all
193 { { "foo", "", "" }, 228 { { "foo", "", "" },
194 { "bar", "", "twelvecoolbytes" } } }, 229 { "bar", "", "twelvecoolbytes" } } },
195 { "keyid=\"foo,keyid=bar\",aesgcm128=c2l4dGVlbmNvb2xieXRlcw", 230 { "keyid=\"foo,keyid=bar\",aesgcm128=c2l4dGVlbmNvb2xieXRlcw",
196 { { "foo,keyid=bar", "", "" }, 231 { { "foo,keyid=bar", "", "" },
197 { "", "sixteencoolbytes", "" } } }, 232 { "", "sixteencoolbytes", "" } } },
198 }; 233 };
199 234
200 for (size_t i = 0; i < arraysize(expected_results); i++) { 235 for (size_t i = 0; i < arraysize(expected_results); i++) {
201 SCOPED_TRACE(i); 236 SCOPED_TRACE(i);
202 237
203 std::vector<CryptoKeyHeaderValues> values; 238 std::string header(expected_results[i].header);
204 ASSERT_TRUE(ParseCryptoKeyHeader(expected_results[i].header, &values));
205 ASSERT_EQ(kNumberOfValues, values.size());
206 239
240 CryptoKeyHeaderIterator iterator(header.begin(), header.end());
207 for (size_t j = 0; j < kNumberOfValues; ++j) { 241 for (size_t j = 0; j < kNumberOfValues; ++j) {
208 EXPECT_EQ(expected_results[i].parsed_values[j].keyid, values[j].keyid); 242 ASSERT_TRUE(iterator.GetNext());
243
244 EXPECT_EQ(expected_results[i].parsed_values[j].keyid, iterator.keyid());
209 EXPECT_EQ(expected_results[i].parsed_values[j].aesgcm128, 245 EXPECT_EQ(expected_results[i].parsed_values[j].aesgcm128,
210 values[j].aesgcm128); 246 iterator.aesgcm128());
211 EXPECT_EQ(expected_results[i].parsed_values[j].dh, values[j].dh); 247 EXPECT_EQ(expected_results[i].parsed_values[j].dh, iterator.dh());
212 } 248 }
249
250 EXPECT_FALSE(iterator.GetNext());
213 } 251 }
214 } 252 }
215 253
216 TEST(EncryptionHeaderParsersTest, ParseInvalidCryptoKeyHeaders) { 254 TEST(EncryptionHeaderParsersTest, ParseInvalidCryptoKeyHeaders) {
217 const char* const expected_failures[] = { 255 const char* const expected_failures[] = {
256 // Values in the name-value pairs are not optional.
218 "keyid", 257 "keyid",
219 "keyid=", 258 "keyid=",
220 "keyid=foo,keyid", 259 "keyid=foo;keyid",
221 "keyid=foo;novaluekey",
222 "aesgcm128", 260 "aesgcm128",
223 "aesgcm128=", 261 "aesgcm128=",
224 "aesgcm128=123$xyz",
225 "aesgcm128=foobar,aesgcm128=123$xyz",
226 "dh", 262 "dh",
227 "dh=", 263 "dh=",
264
265 // The "aesgcm128" parameter must be a URL-safe base64 decodable string.
266 "aesgcm128=123$xyz",
267 "aesgcm128=foobar;aesgcm128=123$xyz",
268
269 // The "dh" parameter must be a URL-safe base64 decodable string.
228 "dh=YmV/2ZXJ-sMDA", 270 "dh=YmV/2ZXJ-sMDA",
229 "dh=dHdlbHZlY29vbGJ5dGVz=====", 271 "dh=dHdlbHZlY29vbGJ5dGVz=====",
230 "dh=123$xyz", 272 "dh=123$xyz",
231 }; 273 };
232 274
275 const char* const expected_failures_second_iter[] = {
276 // Valid first field, missing value in the second field.
277 "keyid=foo,novaluekey",
278
279 // Valid first field, undecodable aesgcm128 value in the second field.
280 "dh=dHdlbHZlY29vbGJ5dGVz,aesgcm128=123$xyz",
281 };
282
233 for (size_t i = 0; i < arraysize(expected_failures); i++) { 283 for (size_t i = 0; i < arraysize(expected_failures); i++) {
234 SCOPED_TRACE(i); 284 SCOPED_TRACE(i);
235 285
236 std::vector<CryptoKeyHeaderValues> values; 286 std::string header(expected_failures[i]);
237 EXPECT_FALSE(ParseCryptoKeyHeader(expected_failures[i], &values)); 287
238 EXPECT_EQ(0u, values.size()); 288 CryptoKeyHeaderIterator iterator(header.begin(), header.end());
289 EXPECT_FALSE(iterator.GetNext());
290 }
291
292 for (size_t i = 0; i < arraysize(expected_failures_second_iter); i++) {
293 SCOPED_TRACE(i);
294
295 std::string header(expected_failures_second_iter[i]);
296
297 CryptoKeyHeaderIterator iterator(header.begin(), header.end());
298 EXPECT_TRUE(iterator.GetNext());
299 EXPECT_FALSE(iterator.GetNext());
239 } 300 }
240 } 301 }
241 302
242 TEST(EncryptionHeaderParsersTest, SixValueHeader) { 303 TEST(EncryptionHeaderParsersTest, SixValueHeader) {
243 const char* const header = "keyid=0,keyid=1,keyid=2,keyid=3,keyid=4,keyid=5"; 304 const std::string header("keyid=0,keyid=1,keyid=2,keyid=3,keyid=4,keyid=5");
244 305
245 std::vector<EncryptionHeaderValues> encryption_values; 306 EncryptionHeaderIterator encryption_iterator(header.begin(), header.end());
246 ASSERT_TRUE(ParseEncryptionHeader(header, &encryption_values)); 307 CryptoKeyHeaderIterator crypto_key_iterator(header.begin(), header.end());
247 308
248 std::vector<CryptoKeyHeaderValues> crypto_key_values; 309 for (size_t i = 0; i < 6; ++i) {
249 ASSERT_TRUE(ParseCryptoKeyHeader(header, &crypto_key_values));
250
251 ASSERT_EQ(6u, encryption_values.size());
252 ASSERT_EQ(6u, crypto_key_values.size());
253
254 for (size_t i = 0; i < encryption_values.size(); i++) {
255 SCOPED_TRACE(i); 310 SCOPED_TRACE(i);
256 311
257 const std::string value = base::IntToString(i); 312 ASSERT_TRUE(encryption_iterator.GetNext());
313 ASSERT_TRUE(crypto_key_iterator.GetNext());
314 }
258 315
259 EXPECT_EQ(value, encryption_values[i].keyid); 316 EXPECT_FALSE(encryption_iterator.GetNext());
260 EXPECT_EQ(value, crypto_key_values[i].keyid); 317 EXPECT_FALSE(crypto_key_iterator.GetNext());
261 }
262 } 318 }
263 319
264 TEST(EncryptionHeaderParsersTest, InvalidHeadersDoNotModifyOutput) { 320 TEST(EncryptionHeaderParsersTest, InvalidHeadersResetOutput) {
265 EncryptionHeaderValues encryption_value; 321 // Valid first field, invalid record size parameter in the second field.
266 encryption_value.keyid = "mykeyid"; 322 const std::string encryption_header(
267 encryption_value.salt = "somesalt"; 323 "keyid=foo;salt=c2l4dGVlbmNvb2xieXRlcw;rs=1024,rs=foobar");
268 encryption_value.rs = 42u;
269 324
270 std::vector<EncryptionHeaderValues> encryption_values; 325 // Valid first field, undecodable aesgcm128 parameter in the second field.
271 encryption_values.push_back(encryption_value); 326 const std::string crypto_key_header(
327 "keyid=foo;aesgcm128=c2l4dGVlbmNvb2xieXRlcw;dh=dHdlbHZlY29vbGJ5dGVz,"
328 "aesgcm128=$$$");
272 329
273 ASSERT_FALSE(ParseEncryptionHeader("rs=foobar", &encryption_values)); 330 EncryptionHeaderIterator encryption_iterator(
274 ASSERT_EQ(1u, encryption_values.size()); 331 encryption_header.begin(), encryption_header.end());
275 332
276 EXPECT_EQ("mykeyid", encryption_values[0].keyid); 333 ASSERT_EQ(0u, encryption_iterator.keyid().size());
277 EXPECT_EQ("somesalt", encryption_values[0].salt); 334 ASSERT_EQ(0u, encryption_iterator.salt().size());
278 EXPECT_EQ(42u, encryption_values[0].rs); 335 ASSERT_EQ(4096u, encryption_iterator.rs());
279 336
280 CryptoKeyHeaderValues crypto_key_value; 337 ASSERT_TRUE(encryption_iterator.GetNext());
281 crypto_key_value.keyid = "myotherkeyid";
282 crypto_key_value.aesgcm128 = "akey";
283 crypto_key_value.dh = "yourdh";
284 338
285 std::vector<CryptoKeyHeaderValues> crypto_key_values; 339 EXPECT_EQ("foo", encryption_iterator.keyid());
286 crypto_key_values.push_back(crypto_key_value); 340 EXPECT_EQ("sixteencoolbytes", encryption_iterator.salt());
341 EXPECT_EQ(1024u, encryption_iterator.rs());
287 342
288 ASSERT_FALSE(ParseCryptoKeyHeader("aesgcm128=$$$", &crypto_key_values)); 343 ASSERT_FALSE(encryption_iterator.GetNext());
289 ASSERT_EQ(1u, crypto_key_values.size());
290 344
291 EXPECT_EQ("myotherkeyid", crypto_key_values[0].keyid); 345 EXPECT_EQ(0u, encryption_iterator.keyid().size());
292 EXPECT_EQ("akey", crypto_key_values[0].aesgcm128); 346 EXPECT_EQ(0u, encryption_iterator.salt().size());
293 EXPECT_EQ("yourdh", crypto_key_values[0].dh); 347 EXPECT_EQ(4096u, encryption_iterator.rs());
348
349 CryptoKeyHeaderIterator crypto_key_iterator(
350 crypto_key_header.begin(), crypto_key_header.end());
351
352 ASSERT_EQ(0u, crypto_key_iterator.keyid().size());
353 ASSERT_EQ(0u, crypto_key_iterator.aesgcm128().size());
354 ASSERT_EQ(0u, crypto_key_iterator.dh().size());
355
356 ASSERT_TRUE(crypto_key_iterator.GetNext());
357
358 EXPECT_EQ("foo", crypto_key_iterator.keyid());
359 EXPECT_EQ("sixteencoolbytes", crypto_key_iterator.aesgcm128());
360 EXPECT_EQ("twelvecoolbytes", crypto_key_iterator.dh());
361
362 ASSERT_FALSE(crypto_key_iterator.GetNext());
363
364 EXPECT_EQ(0u, crypto_key_iterator.keyid().size());
365 EXPECT_EQ(0u, crypto_key_iterator.aesgcm128().size());
366 EXPECT_EQ(0u, crypto_key_iterator.dh().size());
294 } 367 }
295 368
296 } // namespace 369 } // namespace
297 370
298 } // namespace gcm 371 } // namespace gcm
OLDNEW
« no previous file with comments | « components/gcm_driver/crypto/encryption_header_parsers.cc ('k') | components/gcm_driver/crypto/gcm_encryption_provider.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698