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 "content/common/origin_trials/trial_token.h" | 5 #include "content/common/origin_trials/trial_token.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "base/macros.h" | 9 #include "base/macros.h" |
10 #include "base/strings/string_piece.h" | 10 #include "base/strings/string_piece.h" |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
146 valid_timestamp_(base::Time::FromDoubleT(kValidTimestamp)), | 146 valid_timestamp_(base::Time::FromDoubleT(kValidTimestamp)), |
147 invalid_timestamp_(base::Time::FromDoubleT(kInvalidTimestamp)), | 147 invalid_timestamp_(base::Time::FromDoubleT(kInvalidTimestamp)), |
148 correct_public_key_( | 148 correct_public_key_( |
149 base::StringPiece(reinterpret_cast<const char*>(kTestPublicKey), | 149 base::StringPiece(reinterpret_cast<const char*>(kTestPublicKey), |
150 arraysize(kTestPublicKey))), | 150 arraysize(kTestPublicKey))), |
151 incorrect_public_key_( | 151 incorrect_public_key_( |
152 base::StringPiece(reinterpret_cast<const char*>(kTestPublicKey2), | 152 base::StringPiece(reinterpret_cast<const char*>(kTestPublicKey2), |
153 arraysize(kTestPublicKey2))) {} | 153 arraysize(kTestPublicKey2))) {} |
154 | 154 |
155 protected: | 155 protected: |
156 std::unique_ptr<std::string> Extract(const std::string& token_text, | 156 TrialTokenStatus Extract(const std::string& token_text, |
157 base::StringPiece public_key) { | 157 base::StringPiece public_key, |
158 return TrialToken::Extract(token_text, public_key); | 158 std::string* token_payload) { |
| 159 return TrialToken::Extract(token_text, public_key, token_payload); |
159 } | 160 } |
| 161 |
| 162 TrialTokenStatus ExtractIgnorePayload(const std::string& token_text, |
| 163 base::StringPiece public_key) { |
| 164 std::string token_payload; |
| 165 return Extract(token_text, public_key, &token_payload); |
| 166 } |
| 167 |
160 std::unique_ptr<TrialToken> Parse(const std::string& token_payload) { | 168 std::unique_ptr<TrialToken> Parse(const std::string& token_payload) { |
161 return TrialToken::Parse(token_payload); | 169 return TrialToken::Parse(token_payload); |
162 } | 170 } |
163 | 171 |
164 bool ValidateOrigin(TrialToken* token, const url::Origin origin) { | 172 bool ValidateOrigin(TrialToken* token, const url::Origin origin) { |
165 return token->ValidateOrigin(origin); | 173 return token->ValidateOrigin(origin); |
166 } | 174 } |
167 | 175 |
168 bool ValidateFeatureName(TrialToken* token, const char* feature_name) { | 176 bool ValidateFeatureName(TrialToken* token, const char* feature_name) { |
169 return token->ValidateFeatureName(feature_name); | 177 return token->ValidateFeatureName(feature_name); |
(...skipping 19 matching lines...) Expand all Loading... |
189 base::StringPiece incorrect_public_key_; | 197 base::StringPiece incorrect_public_key_; |
190 }; | 198 }; |
191 | 199 |
192 // Test the extraction of the signed payload from token strings. This includes | 200 // Test the extraction of the signed payload from token strings. This includes |
193 // checking the included version identifier, payload length, and cryptographic | 201 // checking the included version identifier, payload length, and cryptographic |
194 // signature. | 202 // signature. |
195 | 203 |
196 // Test verification of signature and extraction of token JSON from signed | 204 // Test verification of signature and extraction of token JSON from signed |
197 // token. | 205 // token. |
198 TEST_F(TrialTokenTest, ValidateValidSignature) { | 206 TEST_F(TrialTokenTest, ValidateValidSignature) { |
199 std::unique_ptr<std::string> token_payload = | 207 std::string token_payload; |
200 Extract(kSampleToken, correct_public_key()); | 208 TrialTokenStatus status = |
201 ASSERT_TRUE(token_payload); | 209 Extract(kSampleToken, correct_public_key(), &token_payload); |
202 EXPECT_STREQ(kSampleTokenJSON, token_payload.get()->c_str()); | 210 ASSERT_EQ(TRIAL_TOKEN_STATUS_SUCCESS, status); |
| 211 EXPECT_STREQ(kSampleTokenJSON, token_payload.c_str()); |
203 } | 212 } |
204 | 213 |
205 TEST_F(TrialTokenTest, ValidateInvalidSignature) { | 214 TEST_F(TrialTokenTest, ValidateInvalidSignature) { |
206 std::unique_ptr<std::string> token_payload = | 215 TrialTokenStatus status = |
207 Extract(kInvalidSignatureToken, correct_public_key()); | 216 ExtractIgnorePayload(kInvalidSignatureToken, correct_public_key()); |
208 ASSERT_FALSE(token_payload); | 217 // TODO(chasej): Recreate the invalid token, and change to |
| 218 // TRIAL_TOKEN_STATUS_INVALID_SIGNATURE |
| 219 EXPECT_EQ(TRIAL_TOKEN_STATUS_MALFORMED, status); |
209 } | 220 } |
210 | 221 |
211 TEST_F(TrialTokenTest, ValidateSignatureWithIncorrectKey) { | 222 TEST_F(TrialTokenTest, ValidateSignatureWithIncorrectKey) { |
212 std::unique_ptr<std::string> token_payload = | 223 TrialTokenStatus status = |
213 Extract(kSampleToken, incorrect_public_key()); | 224 ExtractIgnorePayload(kSampleToken, incorrect_public_key()); |
214 ASSERT_FALSE(token_payload); | 225 EXPECT_EQ(TRIAL_TOKEN_STATUS_INVALID_SIGNATURE, status); |
215 } | 226 } |
216 | 227 |
217 TEST_F(TrialTokenTest, ValidateEmptyToken) { | 228 TEST_F(TrialTokenTest, ValidateEmptyToken) { |
218 std::unique_ptr<std::string> token_payload = | 229 TrialTokenStatus status = ExtractIgnorePayload("", correct_public_key()); |
219 Extract("", correct_public_key()); | 230 EXPECT_EQ(TRIAL_TOKEN_STATUS_MALFORMED, status); |
220 ASSERT_FALSE(token_payload); | |
221 } | 231 } |
222 | 232 |
223 TEST_F(TrialTokenTest, ValidateShortToken) { | 233 TEST_F(TrialTokenTest, ValidateShortToken) { |
224 std::unique_ptr<std::string> token_payload = | 234 TrialTokenStatus status = |
225 Extract(kTruncatedToken, correct_public_key()); | 235 ExtractIgnorePayload(kTruncatedToken, correct_public_key()); |
226 ASSERT_FALSE(token_payload); | 236 EXPECT_EQ(TRIAL_TOKEN_STATUS_MALFORMED, status); |
227 } | 237 } |
228 | 238 |
229 TEST_F(TrialTokenTest, ValidateUnsupportedVersion) { | 239 TEST_F(TrialTokenTest, ValidateUnsupportedVersion) { |
230 std::unique_ptr<std::string> token_payload = | 240 TrialTokenStatus status = |
231 Extract(kIncorrectVersionToken, correct_public_key()); | 241 ExtractIgnorePayload(kIncorrectVersionToken, correct_public_key()); |
232 ASSERT_FALSE(token_payload); | 242 EXPECT_EQ(TRIAL_TOKEN_STATUS_MALFORMED, status); |
233 } | 243 } |
234 | 244 |
235 TEST_F(TrialTokenTest, ValidateSignatureWithIncorrectLength) { | 245 TEST_F(TrialTokenTest, ValidateSignatureWithIncorrectLength) { |
236 std::unique_ptr<std::string> token_payload = | 246 TrialTokenStatus status = |
237 Extract(kIncorrectLengthToken, correct_public_key()); | 247 ExtractIgnorePayload(kIncorrectLengthToken, correct_public_key()); |
238 ASSERT_FALSE(token_payload); | 248 EXPECT_EQ(TRIAL_TOKEN_STATUS_MALFORMED, status); |
239 } | 249 } |
240 | 250 |
241 // Test parsing of fields from JSON token. | 251 // Test parsing of fields from JSON token. |
242 | 252 |
243 TEST_F(TrialTokenTest, ParseEmptyString) { | 253 TEST_F(TrialTokenTest, ParseEmptyString) { |
244 std::unique_ptr<TrialToken> empty_token = Parse(""); | 254 std::unique_ptr<TrialToken> empty_token = Parse(""); |
245 EXPECT_FALSE(empty_token); | 255 EXPECT_FALSE(empty_token); |
246 } | 256 } |
247 | 257 |
248 TEST_P(TrialTokenTest, ParseInvalidString) { | 258 TEST_P(TrialTokenTest, ParseInvalidString) { |
(...skipping 23 matching lines...) Expand all Loading... |
272 token.get(), base::ToUpperASCII(kExpectedFeatureName).c_str())); | 282 token.get(), base::ToUpperASCII(kExpectedFeatureName).c_str())); |
273 EXPECT_FALSE(ValidateFeatureName( | 283 EXPECT_FALSE(ValidateFeatureName( |
274 token.get(), base::ToLowerASCII(kExpectedFeatureName).c_str())); | 284 token.get(), base::ToLowerASCII(kExpectedFeatureName).c_str())); |
275 EXPECT_TRUE(ValidateDate(token.get(), valid_timestamp_)); | 285 EXPECT_TRUE(ValidateDate(token.get(), valid_timestamp_)); |
276 EXPECT_FALSE(ValidateDate(token.get(), invalid_timestamp_)); | 286 EXPECT_FALSE(ValidateDate(token.get(), invalid_timestamp_)); |
277 } | 287 } |
278 | 288 |
279 TEST_F(TrialTokenTest, TokenIsValidForFeature) { | 289 TEST_F(TrialTokenTest, TokenIsValidForFeature) { |
280 std::unique_ptr<TrialToken> token = Parse(kSampleTokenJSON); | 290 std::unique_ptr<TrialToken> token = Parse(kSampleTokenJSON); |
281 ASSERT_TRUE(token); | 291 ASSERT_TRUE(token); |
282 EXPECT_TRUE(token->IsValidForFeature(expected_origin_, kExpectedFeatureName, | 292 EXPECT_EQ(TRIAL_TOKEN_STATUS_SUCCESS, |
283 valid_timestamp_)); | 293 token->IsValidForFeature(expected_origin_, kExpectedFeatureName, |
284 EXPECT_FALSE(token->IsValidForFeature( | 294 valid_timestamp_)); |
285 expected_origin_, base::ToUpperASCII(kExpectedFeatureName), | 295 EXPECT_EQ(TRIAL_TOKEN_STATUS_WRONG_FEATURE, |
286 valid_timestamp_)); | 296 token->IsValidForFeature(expected_origin_, |
287 EXPECT_FALSE(token->IsValidForFeature( | 297 base::ToUpperASCII(kExpectedFeatureName), |
288 expected_origin_, base::ToLowerASCII(kExpectedFeatureName), | 298 valid_timestamp_)); |
289 valid_timestamp_)); | 299 EXPECT_EQ(TRIAL_TOKEN_STATUS_WRONG_FEATURE, |
290 EXPECT_FALSE(token->IsValidForFeature(invalid_origin_, kExpectedFeatureName, | 300 token->IsValidForFeature(expected_origin_, |
291 valid_timestamp_)); | 301 base::ToLowerASCII(kExpectedFeatureName), |
292 EXPECT_FALSE(token->IsValidForFeature(insecure_origin_, kExpectedFeatureName, | 302 valid_timestamp_)); |
293 valid_timestamp_)); | 303 EXPECT_EQ(TRIAL_TOKEN_STATUS_WRONG_ORIGIN, |
294 EXPECT_FALSE(token->IsValidForFeature(expected_origin_, kInvalidFeatureName, | 304 token->IsValidForFeature(invalid_origin_, kExpectedFeatureName, |
295 valid_timestamp_)); | 305 valid_timestamp_)); |
296 EXPECT_FALSE(token->IsValidForFeature(expected_origin_, kExpectedFeatureName, | 306 EXPECT_EQ(TRIAL_TOKEN_STATUS_WRONG_ORIGIN, |
297 invalid_timestamp_)); | 307 token->IsValidForFeature(insecure_origin_, kExpectedFeatureName, |
| 308 valid_timestamp_)); |
| 309 EXPECT_EQ(TRIAL_TOKEN_STATUS_WRONG_FEATURE, |
| 310 token->IsValidForFeature(expected_origin_, kInvalidFeatureName, |
| 311 valid_timestamp_)); |
| 312 EXPECT_EQ(TRIAL_TOKEN_STATUS_EXPIRED, |
| 313 token->IsValidForFeature(expected_origin_, kExpectedFeatureName, |
| 314 invalid_timestamp_)); |
| 315 } |
| 316 |
| 317 // Test overall extraction, to ensure output status matches returned token |
| 318 TEST_F(TrialTokenTest, ExtractValidToken) { |
| 319 TrialTokenStatus status; |
| 320 std::unique_ptr<TrialToken> token = |
| 321 TrialToken::From(kSampleToken, correct_public_key(), &status); |
| 322 EXPECT_TRUE(token); |
| 323 EXPECT_EQ(TRIAL_TOKEN_STATUS_SUCCESS, status); |
| 324 } |
| 325 |
| 326 TEST_F(TrialTokenTest, ExtractInvalidSignature) { |
| 327 TrialTokenStatus status; |
| 328 std::unique_ptr<TrialToken> token = |
| 329 TrialToken::From(kSampleToken, incorrect_public_key(), &status); |
| 330 EXPECT_FALSE(token); |
| 331 EXPECT_EQ(TRIAL_TOKEN_STATUS_INVALID_SIGNATURE, status); |
| 332 } |
| 333 |
| 334 TEST_F(TrialTokenTest, ExtractMalformedToken) { |
| 335 TrialTokenStatus status; |
| 336 std::unique_ptr<TrialToken> token = |
| 337 TrialToken::From(kIncorrectLengthToken, correct_public_key(), &status); |
| 338 EXPECT_FALSE(token); |
| 339 EXPECT_EQ(TRIAL_TOKEN_STATUS_MALFORMED, status); |
298 } | 340 } |
299 | 341 |
300 } // namespace content | 342 } // namespace content |
OLD | NEW |