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 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 | 122 |
123 for (size_t i = 0; i < arraysize(expected_failures); i++) { | 123 for (size_t i = 0; i < arraysize(expected_failures); i++) { |
124 SCOPED_TRACE(i); | 124 SCOPED_TRACE(i); |
125 | 125 |
126 std::vector<EncryptionHeaderValues> values; | 126 std::vector<EncryptionHeaderValues> values; |
127 EXPECT_FALSE(ParseEncryptionHeader(expected_failures[i], &values)); | 127 EXPECT_FALSE(ParseEncryptionHeader(expected_failures[i], &values)); |
128 EXPECT_EQ(0u, values.size()); | 128 EXPECT_EQ(0u, values.size()); |
129 } | 129 } |
130 } | 130 } |
131 | 131 |
132 TEST(EncryptionHeaderParsersTest, ParseValidEncryptionKeyHeaders) { | 132 TEST(EncryptionHeaderParsersTest, ParseValidCryptoKeyHeaders) { |
133 struct { | 133 struct { |
134 const char* const header; | 134 const char* const header; |
135 const char* const parsed_keyid; | 135 const char* const parsed_keyid; |
136 const char* const parsed_key; | 136 const char* const parsed_aesgcm128; |
137 const char* const parsed_dh; | 137 const char* const parsed_dh; |
138 } expected_results[] = { | 138 } expected_results[] = { |
139 { "keyid=foo;key=c2l4dGVlbmNvb2xieXRlcw;dh=dHdlbHZlY29vbGJ5dGVz", | 139 { "keyid=foo;aesgcm128=c2l4dGVlbmNvb2xieXRlcw;dh=dHdlbHZlY29vbGJ5dGVz", |
140 "foo", "sixteencoolbytes", "twelvecoolbytes" }, | 140 "foo", "sixteencoolbytes", "twelvecoolbytes" }, |
141 { "keyid=foo; key=c2l4dGVlbmNvb2xieXRlcw; dh=dHdlbHZlY29vbGJ5dGVz", | 141 { "keyid=foo; aesgcm128=c2l4dGVlbmNvb2xieXRlcw; dh=dHdlbHZlY29vbGJ5dGVz", |
142 "foo", "sixteencoolbytes", "twelvecoolbytes" }, | 142 "foo", "sixteencoolbytes", "twelvecoolbytes" }, |
143 { "keyid = foo ; key = c2l4dGVlbmNvb2xieXRlcw ; dh = dHdlbHZlY29vbGJ5dGVz ", | 143 { "keyid = foo ; aesgcm128 = c2l4dGVlbmNvb2xieXRlcw ; dh = dHdlbHZlY29vbGJ5" |
| 144 "dGVz ", |
144 "foo", "sixteencoolbytes", "twelvecoolbytes" }, | 145 "foo", "sixteencoolbytes", "twelvecoolbytes" }, |
145 { "KEYID=foo;KEY=c2l4dGVlbmNvb2xieXRlcw;DH=dHdlbHZlY29vbGJ5dGVz", | 146 { "KEYID=foo;AESGCM128=c2l4dGVlbmNvb2xieXRlcw;DH=dHdlbHZlY29vbGJ5dGVz", |
146 "foo", "sixteencoolbytes", "twelvecoolbytes" }, | 147 "foo", "sixteencoolbytes", "twelvecoolbytes" }, |
147 { "keyid=foo", "foo", "", "" }, | 148 { "keyid=foo", "foo", "", "" }, |
148 { "key=c2l4dGVlbmNvb2xieXRlcw", "", "sixteencoolbytes", "" }, | 149 { "aesgcm128=c2l4dGVlbmNvb2xieXRlcw", "", "sixteencoolbytes", "" }, |
149 { "key=\"c2l4dGVlbmNvb2xieXRlcw\"", "", "sixteencoolbytes", "" }, | 150 { "aesgcm128=\"c2l4dGVlbmNvb2xieXRlcw\"", "", "sixteencoolbytes", "" }, |
150 { "key='c2l4dGVlbmNvb2xieXRlcw'", "", "sixteencoolbytes", "" }, | 151 { "aesgcm128='c2l4dGVlbmNvb2xieXRlcw'", "", "sixteencoolbytes", "" }, |
151 { "dh=dHdlbHZlY29vbGJ5dGVz", "", "", "twelvecoolbytes" }, | 152 { "dh=dHdlbHZlY29vbGJ5dGVz", "", "", "twelvecoolbytes" }, |
152 { "keyid=foo;someothervalue=bar;key=dHdlbHZlY29vbGJ5dGVz", | 153 { "keyid=foo;someothervalue=bar;aesgcm128=dHdlbHZlY29vbGJ5dGVz", |
153 "foo", "twelvecoolbytes", "" }, | 154 "foo", "twelvecoolbytes", "" }, |
154 { "keyid=foo;keyid=bar", "bar", "", "" }, | 155 { "keyid=foo;keyid=bar", "bar", "", "" }, |
155 }; | 156 }; |
156 | 157 |
157 for (size_t i = 0; i < arraysize(expected_results); i++) { | 158 for (size_t i = 0; i < arraysize(expected_results); i++) { |
158 SCOPED_TRACE(i); | 159 SCOPED_TRACE(i); |
159 | 160 |
160 std::vector<EncryptionKeyHeaderValues> values; | 161 std::vector<CryptoKeyHeaderValues> values; |
161 ASSERT_TRUE(ParseEncryptionKeyHeader(expected_results[i].header, &values)); | 162 ASSERT_TRUE(ParseCryptoKeyHeader(expected_results[i].header, &values)); |
162 ASSERT_EQ(1u, values.size()); | 163 ASSERT_EQ(1u, values.size()); |
163 | 164 |
164 EXPECT_EQ(expected_results[i].parsed_keyid, values[0].keyid); | 165 EXPECT_EQ(expected_results[i].parsed_keyid, values[0].keyid); |
165 EXPECT_EQ(expected_results[i].parsed_key, values[0].key); | 166 EXPECT_EQ(expected_results[i].parsed_aesgcm128, values[0].aesgcm128); |
166 EXPECT_EQ(expected_results[i].parsed_dh, values[0].dh); | 167 EXPECT_EQ(expected_results[i].parsed_dh, values[0].dh); |
167 } | 168 } |
168 } | 169 } |
169 | 170 |
170 TEST(EncryptionHeaderParsersTest, ParseValidMultiValueEncryptionKeyHeaders) { | 171 TEST(EncryptionHeaderParsersTest, ParseValidMultiValueCryptoKeyHeaders) { |
171 const size_t kNumberOfValues = 2u; | 172 const size_t kNumberOfValues = 2u; |
172 | 173 |
173 struct { | 174 struct { |
174 const char* const header; | 175 const char* const header; |
175 struct { | 176 struct { |
176 const char* const keyid; | 177 const char* const keyid; |
177 const char* const key; | 178 const char* const aesgcm128; |
178 const char* const dh; | 179 const char* const dh; |
179 } parsed_values[kNumberOfValues]; | 180 } parsed_values[kNumberOfValues]; |
180 } expected_results[] = { | 181 } expected_results[] = { |
181 { "keyid=foo;key=c2l4dGVlbmNvb2xieXRlcw;dh=dHdlbHZlY29vbGJ5dGVz,keyid=bar;" | 182 { "keyid=foo;aesgcm128=c2l4dGVlbmNvb2xieXRlcw;dh=dHdlbHZlY29vbGJ5dGVz," |
182 "key=dHdlbHZlY29vbGJ5dGVz;dh=c2l4dGVlbmNvb2xieXRlcw", | 183 "keyid=bar;aesgcm128=dHdlbHZlY29vbGJ5dGVz;dh=c2l4dGVlbmNvb2xieXRlcw", |
183 { { "foo", "sixteencoolbytes", "twelvecoolbytes" }, | 184 { { "foo", "sixteencoolbytes", "twelvecoolbytes" }, |
184 { "bar", "twelvecoolbytes", "sixteencoolbytes" } } }, | 185 { "bar", "twelvecoolbytes", "sixteencoolbytes" } } }, |
185 { "keyid=foo,key=c2l4dGVlbmNvb2xieXRlcw", | 186 { "keyid=foo,aesgcm128=c2l4dGVlbmNvb2xieXRlcw", |
186 { { "foo", "", "" }, | 187 { { "foo", "", "" }, |
187 { "", "sixteencoolbytes", "" } } }, | 188 { "", "sixteencoolbytes", "" } } }, |
188 { "keyid=foo,keyid=bar;dh=dHdlbHZlY29vbGJ5dGVz", | 189 { "keyid=foo,keyid=bar;dh=dHdlbHZlY29vbGJ5dGVz", |
189 { { "foo", "", "" }, | 190 { { "foo", "", "" }, |
190 { "bar", "", "twelvecoolbytes" } } }, | 191 { "bar", "", "twelvecoolbytes" } } }, |
191 { "keyid=\"foo,keyid=bar\",key=c2l4dGVlbmNvb2xieXRlcw", | 192 { "keyid=\"foo,keyid=bar\",aesgcm128=c2l4dGVlbmNvb2xieXRlcw", |
192 { { "foo,keyid=bar", "", "" }, | 193 { { "foo,keyid=bar", "", "" }, |
193 { "", "sixteencoolbytes", "" } } }, | 194 { "", "sixteencoolbytes", "" } } }, |
194 }; | 195 }; |
195 | 196 |
196 for (size_t i = 0; i < arraysize(expected_results); i++) { | 197 for (size_t i = 0; i < arraysize(expected_results); i++) { |
197 SCOPED_TRACE(i); | 198 SCOPED_TRACE(i); |
198 | 199 |
199 std::vector<EncryptionKeyHeaderValues> values; | 200 std::vector<CryptoKeyHeaderValues> values; |
200 ASSERT_TRUE(ParseEncryptionKeyHeader(expected_results[i].header, &values)); | 201 ASSERT_TRUE(ParseCryptoKeyHeader(expected_results[i].header, &values)); |
201 ASSERT_EQ(kNumberOfValues, values.size()); | 202 ASSERT_EQ(kNumberOfValues, values.size()); |
202 | 203 |
203 for (size_t j = 0; j < kNumberOfValues; ++j) { | 204 for (size_t j = 0; j < kNumberOfValues; ++j) { |
204 EXPECT_EQ(expected_results[i].parsed_values[j].keyid, values[j].keyid); | 205 EXPECT_EQ(expected_results[i].parsed_values[j].keyid, values[j].keyid); |
205 EXPECT_EQ(expected_results[i].parsed_values[j].key, values[j].key); | 206 EXPECT_EQ(expected_results[i].parsed_values[j].aesgcm128, |
| 207 values[j].aesgcm128); |
206 EXPECT_EQ(expected_results[i].parsed_values[j].dh, values[j].dh); | 208 EXPECT_EQ(expected_results[i].parsed_values[j].dh, values[j].dh); |
207 } | 209 } |
208 } | 210 } |
209 } | 211 } |
210 | 212 |
211 TEST(EncryptionHeaderParsersTest, ParseInvalidEncryptionKeyHeaders) { | 213 TEST(EncryptionHeaderParsersTest, ParseInvalidCryptoKeyHeaders) { |
212 const char* const expected_failures[] = { | 214 const char* const expected_failures[] = { |
213 "keyid", | 215 "keyid", |
214 "keyid=", | 216 "keyid=", |
215 "keyid=foo,keyid", | 217 "keyid=foo,keyid", |
216 "keyid=foo;novaluekey", | 218 "keyid=foo;novaluekey", |
217 "key", | 219 "aesgcm128", |
218 "key=", | 220 "aesgcm128=", |
219 "key=123$xyz", | 221 "aesgcm128=123$xyz", |
220 "key=foobar,key=123$xyz", | 222 "aesgcm128=foobar,aesgcm128=123$xyz", |
221 "dh", | 223 "dh", |
222 "dh=", | 224 "dh=", |
223 "dh=YmV/2ZXJ-sMDA", | 225 "dh=YmV/2ZXJ-sMDA", |
224 "dh=dHdlbHZlY29vbGJ5dGVz=====", | 226 "dh=dHdlbHZlY29vbGJ5dGVz=====", |
225 "dh=123$xyz", | 227 "dh=123$xyz", |
226 }; | 228 }; |
227 | 229 |
228 for (size_t i = 0; i < arraysize(expected_failures); i++) { | 230 for (size_t i = 0; i < arraysize(expected_failures); i++) { |
229 SCOPED_TRACE(i); | 231 SCOPED_TRACE(i); |
230 | 232 |
231 std::vector<EncryptionKeyHeaderValues> values; | 233 std::vector<CryptoKeyHeaderValues> values; |
232 EXPECT_FALSE(ParseEncryptionKeyHeader(expected_failures[i], &values)); | 234 EXPECT_FALSE(ParseCryptoKeyHeader(expected_failures[i], &values)); |
233 EXPECT_EQ(0u, values.size()); | 235 EXPECT_EQ(0u, values.size()); |
234 } | 236 } |
235 } | 237 } |
236 | 238 |
237 TEST(EncryptionHeaderParsersTest, SixValueHeader) { | 239 TEST(EncryptionHeaderParsersTest, SixValueHeader) { |
238 const char* const header = "keyid=0,keyid=1,keyid=2,keyid=3,keyid=4,keyid=5"; | 240 const char* const header = "keyid=0,keyid=1,keyid=2,keyid=3,keyid=4,keyid=5"; |
239 | 241 |
240 std::vector<EncryptionHeaderValues> encryption_values; | 242 std::vector<EncryptionHeaderValues> encryption_values; |
241 ASSERT_TRUE(ParseEncryptionHeader(header, &encryption_values)); | 243 ASSERT_TRUE(ParseEncryptionHeader(header, &encryption_values)); |
242 | 244 |
243 std::vector<EncryptionKeyHeaderValues> encryption_key_values; | 245 std::vector<CryptoKeyHeaderValues> crypto_key_values; |
244 ASSERT_TRUE(ParseEncryptionKeyHeader(header, &encryption_key_values)); | 246 ASSERT_TRUE(ParseCryptoKeyHeader(header, &crypto_key_values)); |
245 | 247 |
246 ASSERT_EQ(6u, encryption_values.size()); | 248 ASSERT_EQ(6u, encryption_values.size()); |
247 ASSERT_EQ(6u, encryption_key_values.size()); | 249 ASSERT_EQ(6u, crypto_key_values.size()); |
248 | 250 |
249 for (size_t i = 0; i < encryption_values.size(); i++) { | 251 for (size_t i = 0; i < encryption_values.size(); i++) { |
250 SCOPED_TRACE(i); | 252 SCOPED_TRACE(i); |
251 | 253 |
252 const std::string value = base::IntToString(i); | 254 const std::string value = base::IntToString(i); |
253 | 255 |
254 EXPECT_EQ(value, encryption_values[i].keyid); | 256 EXPECT_EQ(value, encryption_values[i].keyid); |
255 EXPECT_EQ(value, encryption_key_values[i].keyid); | 257 EXPECT_EQ(value, crypto_key_values[i].keyid); |
256 } | 258 } |
257 } | 259 } |
258 | 260 |
259 TEST(EncryptionHeaderParsersTest, InvalidHeadersDoNotModifyOutput) { | 261 TEST(EncryptionHeaderParsersTest, InvalidHeadersDoNotModifyOutput) { |
260 EncryptionHeaderValues encryption_value; | 262 EncryptionHeaderValues encryption_value; |
261 encryption_value.keyid = "mykeyid"; | 263 encryption_value.keyid = "mykeyid"; |
262 encryption_value.salt = "somesalt"; | 264 encryption_value.salt = "somesalt"; |
263 encryption_value.rs = 42u; | 265 encryption_value.rs = 42u; |
264 | 266 |
265 std::vector<EncryptionHeaderValues> encryption_values; | 267 std::vector<EncryptionHeaderValues> encryption_values; |
266 encryption_values.push_back(encryption_value); | 268 encryption_values.push_back(encryption_value); |
267 | 269 |
268 ASSERT_FALSE(ParseEncryptionHeader("rs=foobar", &encryption_values)); | 270 ASSERT_FALSE(ParseEncryptionHeader("rs=foobar", &encryption_values)); |
269 ASSERT_EQ(1u, encryption_values.size()); | 271 ASSERT_EQ(1u, encryption_values.size()); |
270 | 272 |
271 EXPECT_EQ("mykeyid", encryption_values[0].keyid); | 273 EXPECT_EQ("mykeyid", encryption_values[0].keyid); |
272 EXPECT_EQ("somesalt", encryption_values[0].salt); | 274 EXPECT_EQ("somesalt", encryption_values[0].salt); |
273 EXPECT_EQ(42u, encryption_values[0].rs); | 275 EXPECT_EQ(42u, encryption_values[0].rs); |
274 | 276 |
275 EncryptionKeyHeaderValues encryption_key_value; | 277 CryptoKeyHeaderValues crypto_key_value; |
276 encryption_key_value.keyid = "myotherkeyid"; | 278 crypto_key_value.keyid = "myotherkeyid"; |
277 encryption_key_value.key = "akey"; | 279 crypto_key_value.aesgcm128 = "akey"; |
278 encryption_key_value.dh = "yourdh"; | 280 crypto_key_value.dh = "yourdh"; |
279 | 281 |
280 std::vector<EncryptionKeyHeaderValues> encryption_key_values; | 282 std::vector<CryptoKeyHeaderValues> crypto_key_values; |
281 encryption_key_values.push_back(encryption_key_value); | 283 crypto_key_values.push_back(crypto_key_value); |
282 | 284 |
283 ASSERT_FALSE(ParseEncryptionKeyHeader("key=$$$", &encryption_key_values)); | 285 ASSERT_FALSE(ParseCryptoKeyHeader("aesgcm128=$$$", &crypto_key_values)); |
284 ASSERT_EQ(1u, encryption_key_values.size()); | 286 ASSERT_EQ(1u, crypto_key_values.size()); |
285 | 287 |
286 EXPECT_EQ("myotherkeyid", encryption_key_values[0].keyid); | 288 EXPECT_EQ("myotherkeyid", crypto_key_values[0].keyid); |
287 EXPECT_EQ("akey", encryption_key_values[0].key); | 289 EXPECT_EQ("akey", crypto_key_values[0].aesgcm128); |
288 EXPECT_EQ("yourdh", encryption_key_values[0].dh); | 290 EXPECT_EQ("yourdh", crypto_key_values[0].dh); |
289 } | 291 } |
290 | 292 |
291 } // namespace | 293 } // namespace |
292 | 294 |
293 } // namespace gcm | 295 } // namespace gcm |
OLD | NEW |