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