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 |