| 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 }; |
| 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) { |
| 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 |