| 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 |