OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |