Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "components/gcm_driver/crypto/encryption_header_parsers.h" | |
| 6 | |
| 7 #include <vector> | |
| 8 | |
| 9 #include "base/macros.h" | |
| 10 #include "testing/gtest/include/gtest/gtest.h" | |
| 11 | |
| 12 namespace gcm { | |
| 13 | |
| 14 namespace { | |
| 15 | |
| 16 const int64_t kDefaultRecordSize = 4096; | |
| 17 | |
| 18 TEST(EncryptionHeaderParsersTest, ParseValidEncryptionHeaders) { | |
| 19 struct { | |
| 20 const char* const header; | |
| 21 const char* const parsed_keyid; | |
| 22 const char* const parsed_salt; | |
| 23 int64_t parsed_rs; | |
| 24 } expected_results[] = { | |
| 25 { "keyid=foo;salt=c2l4dGVlbmNvb2xieXRlcw;rs=1024", | |
| 26 "foo", "sixteencoolbytes", 1024 }, | |
| 27 { "keyid=foo; salt=c2l4dGVlbmNvb2xieXRlcw; rs=1024", | |
| 28 "foo", "sixteencoolbytes", 1024 }, | |
| 29 { "KEYID=foo;SALT=c2l4dGVlbmNvb2xieXRlcw;RS=1024", | |
| 30 "foo", "sixteencoolbytes", 1024 }, | |
| 31 { " keyid = foo ; salt = c2l4dGVlbmNvb2xieXRlcw ; rs = 1024 ", | |
| 32 "foo", "sixteencoolbytes", 1024 }, | |
| 33 { "keyid=foo", "foo", "", kDefaultRecordSize }, | |
|
eroman
2015/09/25 18:18:19
Does this file incldue a test for unrecognized rop
Peter Beverloo
2015/09/28 11:27:16
Line 40 (Encryption) and 106 (Encryption-Key).
| |
| 34 { "keyid=foo;", "foo", "", kDefaultRecordSize }, | |
| 35 { "keyid=\"foo\"", "foo", "", kDefaultRecordSize }, | |
| 36 { "keyid='foo'", "foo", "", kDefaultRecordSize }, | |
| 37 { "salt=c2l4dGVlbmNvb2xieXRlcw", | |
| 38 "", "sixteencoolbytes", kDefaultRecordSize }, | |
| 39 { "rs=2048", "", "", 2048 }, | |
| 40 { "keyid=foo;someothervalue=1;rs=42", "foo", "", 42 }, | |
| 41 { "keyid=foo;keyid=bar", "bar", "", kDefaultRecordSize }, | |
| 42 }; | |
| 43 | |
| 44 for (size_t i = 0; i < arraysize(expected_results); i++) { | |
| 45 SCOPED_TRACE(i); | |
| 46 | |
| 47 std::string keyid, salt; | |
| 48 int64_t rs = kDefaultRecordSize; | |
| 49 | |
| 50 ASSERT_TRUE(ParseEncryptionHeader(expected_results[i].header, &keyid, | |
| 51 &salt, &rs)); | |
| 52 | |
| 53 EXPECT_EQ(expected_results[i].parsed_keyid, keyid); | |
| 54 EXPECT_EQ(expected_results[i].parsed_salt, salt); | |
| 55 EXPECT_EQ(expected_results[i].parsed_rs, rs); | |
| 56 } | |
| 57 } | |
| 58 | |
| 59 TEST(EncryptionHeaderParsersTest, ParseInvalidEncryptionHeaders) { | |
| 60 const char* const expected_failures[] = { | |
| 61 "keyid", | |
| 62 "keyid=", | |
| 63 "keyid=foo;novaluekey", | |
| 64 "salt", | |
| 65 "salt=", | |
| 66 "salt=123$xyz", | |
| 67 "rs", | |
| 68 "rs=", | |
| 69 "rs=1", | |
|
eroman
2015/09/25 18:18:19
These are all good tests!
I would additionally sug
Peter Beverloo
2015/09/28 11:27:15
Done, except for the following two which pass:
rs
eroman
2015/09/28 16:25:29
Regarding rs=+5:
While this behavior my be reason
Peter Beverloo
2015/10/01 14:56:20
That's a great explanation, thank you! Since this
| |
| 70 "rs=-1", | |
| 71 "rs=99999999999999999999999999999999", | |
| 72 "rs=foobar", | |
| 73 }; | |
| 74 | |
| 75 for (size_t i = 0; i < arraysize(expected_failures); i++) { | |
| 76 SCOPED_TRACE(i); | |
| 77 | |
| 78 std::string keyid, salt; | |
| 79 int64_t rs = kDefaultRecordSize; | |
|
eroman
2015/09/25 18:18:19
Does this initialization matter? (I don't mind it,
Peter Beverloo
2015/09/28 11:27:16
No, it does not. Muscle memory reminds me of cases
| |
| 80 | |
| 81 EXPECT_FALSE(ParseEncryptionHeader(expected_failures[i], &keyid, &salt, | |
| 82 &rs)); | |
| 83 } | |
| 84 } | |
| 85 | |
| 86 TEST(EncryptionHeaderParsersTest, ParseValidEncryptionKeyHeaders) { | |
| 87 struct { | |
| 88 const char* const header; | |
| 89 const char* const parsed_keyid; | |
| 90 const char* const parsed_key; | |
| 91 const char* const parsed_dh; | |
| 92 } expected_results[] = { | |
| 93 { "keyid=foo;key=c2l4dGVlbmNvb2xieXRlcw;dh=dHdlbHZlY29vbGJ5dGVz", | |
| 94 "foo", "sixteencoolbytes", "twelvecoolbytes" }, | |
| 95 { "keyid=foo; key=c2l4dGVlbmNvb2xieXRlcw; dh=dHdlbHZlY29vbGJ5dGVz", | |
| 96 "foo", "sixteencoolbytes", "twelvecoolbytes" }, | |
| 97 { "keyid = foo ; key = c2l4dGVlbmNvb2xieXRlcw ; dh = dHdlbHZlY29vbGJ5dGVz ", | |
| 98 "foo", "sixteencoolbytes", "twelvecoolbytes" }, | |
| 99 { "KEYID=foo;KEY=c2l4dGVlbmNvb2xieXRlcw;DH=dHdlbHZlY29vbGJ5dGVz", | |
| 100 "foo", "sixteencoolbytes", "twelvecoolbytes" }, | |
| 101 { "keyid=foo", "foo", "", "" }, | |
| 102 { "key=c2l4dGVlbmNvb2xieXRlcw", "", "sixteencoolbytes", "" }, | |
| 103 { "key=\"c2l4dGVlbmNvb2xieXRlcw\"", "", "sixteencoolbytes", "" }, | |
| 104 { "key='c2l4dGVlbmNvb2xieXRlcw'", "", "sixteencoolbytes", "" }, | |
| 105 { "dh=dHdlbHZlY29vbGJ5dGVz", "", "", "twelvecoolbytes" }, | |
| 106 { "keyid=foo;someothervalue=bar;key=dHdlbHZlY29vbGJ5dGVz", | |
| 107 "foo", "twelvecoolbytes", "" }, | |
| 108 { "keyid=foo;keyid=bar", "bar", "", "" }, | |
| 109 }; | |
| 110 | |
| 111 for (size_t i = 0; i < arraysize(expected_results); i++) { | |
| 112 SCOPED_TRACE(i); | |
| 113 | |
| 114 std::string keyid, key, dh; | |
| 115 | |
| 116 ASSERT_TRUE(ParseEncryptionKeyHeader(expected_results[i].header, &keyid, | |
| 117 &key, &dh)); | |
| 118 | |
| 119 EXPECT_EQ(expected_results[i].parsed_keyid, keyid); | |
| 120 EXPECT_EQ(expected_results[i].parsed_key, key); | |
| 121 EXPECT_EQ(expected_results[i].parsed_dh, dh); | |
| 122 } | |
| 123 } | |
| 124 | |
| 125 TEST(EncryptionHeaderParsersTest, ParseInvalidEncryptionKeyHeaders) { | |
| 126 const char* const expected_failures[] = { | |
| 127 "keyid", | |
| 128 "keyid=", | |
| 129 "keyid=foo;novaluekey", | |
|
eroman
2015/09/25 18:18:20
I suggest also testing:
* characters which are n
Peter Beverloo
2015/09/28 11:27:16
Done, also for the Encryption header.
| |
| 130 "key", | |
| 131 "key=", | |
| 132 "key=123$xyz", | |
| 133 "dh", | |
| 134 "dh=", | |
| 135 "dh=123$xyz", | |
| 136 }; | |
| 137 | |
| 138 for (size_t i = 0; i < arraysize(expected_failures); i++) { | |
|
eroman
2015/09/25 18:18:20
optional: Though the magic of c++11 I believe you
Peter Beverloo
2015/09/28 11:27:16
Acknowledged.
| |
| 139 SCOPED_TRACE(i); | |
| 140 | |
| 141 std::string keyid, key, dh; | |
| 142 | |
| 143 EXPECT_FALSE(ParseEncryptionKeyHeader(expected_failures[i], &keyid, &key, | |
| 144 &dh)); | |
| 145 } | |
| 146 } | |
| 147 | |
| 148 TEST(EncryptionHeaderParsersTest, InvalidHeadersDoNotModifyOutput) { | |
| 149 std::string keyid = "mykeyid"; | |
| 150 std::string salt = "somesalt"; | |
| 151 int64_t rs = 42; | |
| 152 | |
| 153 ASSERT_FALSE(ParseEncryptionHeader("rs=foobar", &keyid, &salt, &rs)); | |
| 154 | |
| 155 EXPECT_EQ("mykeyid", keyid); | |
| 156 EXPECT_EQ("somesalt", salt); | |
| 157 EXPECT_EQ(42, rs); | |
| 158 | |
| 159 std::string key = "akey"; | |
| 160 std::string dh = "yourdh"; | |
| 161 | |
| 162 ASSERT_FALSE(ParseEncryptionKeyHeader("key=$$$", &keyid, &key, &dh)); | |
| 163 | |
| 164 EXPECT_EQ("mykeyid", keyid); | |
| 165 EXPECT_EQ("akey", key); | |
| 166 EXPECT_EQ("yourdh", dh); | |
| 167 } | |
| 168 | |
| 169 TEST(EncryptionHeaderParsersTest, ParseMultipleValueHeaders) { | |
| 170 // Chrome currently does not support multiple lists of parameters as part | |
| 171 // of the Encryption headers. Make sure we reject such headers until we do. | |
| 172 std::string keyid, salt; | |
| 173 int64_t rs = kDefaultRecordSize; | |
| 174 | |
| 175 EXPECT_FALSE(ParseEncryptionHeader( | |
| 176 "keyid=foo;salt=c2l4dGVlbmNvb2xieXRlcw;rs=12," | |
| 177 "keyid=bar;salt=dHdlbHZlY29vbGJ5dGVzl;rs=24", | |
| 178 &keyid, &salt, &rs)); | |
| 179 | |
| 180 std::string key, dh; | |
| 181 | |
| 182 EXPECT_FALSE(ParseEncryptionKeyHeader( | |
| 183 "keyid=foo;key=c2l4dGVlbmNvb2xieXRlcw;dh=dHdlbHZlY29vbGJ5dGVzl," | |
| 184 "keyid=bar;key=dHdlbHZlY29vbGJ5dGVzl;dh=c2l4dGVlbmNvb2xieXRlcw", | |
| 185 &keyid, &key, &dh)); | |
| 186 } | |
| 187 | |
| 188 } // namespace | |
| 189 | |
| 190 } // namespace gcm | |
| OLD | NEW |