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 "net/cert/internal/verify_name_match.h" | 5 #include "net/cert/internal/verify_name_match.h" |
6 | 6 |
7 #include "base/strings/string_number_conversions.h" | 7 #include "base/strings/string_number_conversions.h" |
8 #include "base/strings/string_util.h" | 8 #include "base/strings/string_util.h" |
9 #include "net/cert/internal/test_helpers.h" | 9 #include "net/cert/internal/test_helpers.h" |
10 #include "net/der/input.h" | |
11 #include "net/der/parser.h" | |
12 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
13 | 11 |
14 namespace net { | 12 namespace net { |
15 namespace { | 13 namespace { |
16 | 14 |
17 der::Input SequenceValueFromString(const std::string* s) { | |
18 der::Parser parser(InputFromString(s)); | |
19 der::Input data; | |
20 if (!parser.ReadTag(der::kSequence, &data)) { | |
21 ADD_FAILURE(); | |
22 return der::Input(); | |
23 } | |
24 if (parser.HasMore()) { | |
25 ADD_FAILURE(); | |
26 return der::Input(); | |
27 } | |
28 return data; | |
29 } | |
30 | |
31 // Loads test data from file. The filename is constructed from the parameters: | 15 // Loads test data from file. The filename is constructed from the parameters: |
32 // |prefix| describes the type of data being tested, e.g. "ascii", | 16 // |prefix| describes the type of data being tested, e.g. "ascii", |
33 // "unicode_bmp", "unicode_supplementary", and "invalid". | 17 // "unicode_bmp", "unicode_supplementary", and "invalid". |
34 // |value_type| indicates what ASN.1 type is used to encode the data. | 18 // |value_type| indicates what ASN.1 type is used to encode the data. |
35 // |suffix| indicates any additional modifications, such as caseswapping, | 19 // |suffix| indicates any additional modifications, such as caseswapping, |
36 // whitespace adding, etc. | 20 // whitespace adding, etc. |
37 ::testing::AssertionResult LoadTestData(const std::string& prefix, | 21 ::testing::AssertionResult LoadTestData(const std::string& prefix, |
38 const std::string& value_type, | 22 const std::string& value_type, |
39 const std::string& suffix, | 23 const std::string& suffix, |
40 std::string* result) { | 24 std::string* result) { |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
225 ASSERT_TRUE(LoadTestData("ascii", value_type_2(), "unmangled", &der_2)); | 209 ASSERT_TRUE(LoadTestData("ascii", value_type_2(), "unmangled", &der_2)); |
226 if (TypesAreComparable(value_type_1(), value_type_2())) { | 210 if (TypesAreComparable(value_type_1(), value_type_2())) { |
227 EXPECT_TRUE(VerifyNameMatch(SequenceValueFromString(&der_1), | 211 EXPECT_TRUE(VerifyNameMatch(SequenceValueFromString(&der_1), |
228 SequenceValueFromString(&der_2))); | 212 SequenceValueFromString(&der_2))); |
229 } else { | 213 } else { |
230 EXPECT_FALSE(VerifyNameMatch(SequenceValueFromString(&der_1), | 214 EXPECT_FALSE(VerifyNameMatch(SequenceValueFromString(&der_1), |
231 SequenceValueFromString(&der_2))); | 215 SequenceValueFromString(&der_2))); |
232 } | 216 } |
233 } | 217 } |
234 | 218 |
| 219 TEST_P(VerifyNameMatchDifferingTypesTest, NormalizableTypesInSubtrees) { |
| 220 std::string der_1; |
| 221 ASSERT_TRUE(LoadTestData("ascii", value_type_1(), "unmangled", &der_1)); |
| 222 std::string der_1_extra_rdn; |
| 223 ASSERT_TRUE(LoadTestData("ascii", value_type_1(), "unmangled-extra_rdn", |
| 224 &der_1_extra_rdn)); |
| 225 std::string der_1_extra_attr; |
| 226 ASSERT_TRUE(LoadTestData("ascii", value_type_1(), "unmangled-extra_attr", |
| 227 &der_1_extra_attr)); |
| 228 std::string der_2; |
| 229 ASSERT_TRUE(LoadTestData("ascii", value_type_2(), "unmangled", &der_2)); |
| 230 std::string der_2_extra_rdn; |
| 231 ASSERT_TRUE(LoadTestData("ascii", value_type_2(), "unmangled-extra_rdn", |
| 232 &der_2_extra_rdn)); |
| 233 std::string der_2_extra_attr; |
| 234 ASSERT_TRUE(LoadTestData("ascii", value_type_2(), "unmangled-extra_attr", |
| 235 &der_2_extra_attr)); |
| 236 |
| 237 if (TypesAreComparable(value_type_1(), value_type_2())) { |
| 238 EXPECT_TRUE(VerifyNameInSubtree(SequenceValueFromString(&der_1), |
| 239 SequenceValueFromString(&der_2))); |
| 240 EXPECT_TRUE(VerifyNameInSubtree(SequenceValueFromString(&der_2), |
| 241 SequenceValueFromString(&der_1))); |
| 242 EXPECT_TRUE(VerifyNameInSubtree(SequenceValueFromString(&der_1_extra_rdn), |
| 243 SequenceValueFromString(&der_2))); |
| 244 EXPECT_TRUE(VerifyNameInSubtree(SequenceValueFromString(&der_2_extra_rdn), |
| 245 SequenceValueFromString(&der_1))); |
| 246 } else { |
| 247 EXPECT_FALSE(VerifyNameInSubtree(SequenceValueFromString(&der_1), |
| 248 SequenceValueFromString(&der_2))); |
| 249 EXPECT_FALSE(VerifyNameInSubtree(SequenceValueFromString(&der_2), |
| 250 SequenceValueFromString(&der_1))); |
| 251 EXPECT_FALSE(VerifyNameInSubtree(SequenceValueFromString(&der_1_extra_rdn), |
| 252 SequenceValueFromString(&der_2))); |
| 253 EXPECT_FALSE(VerifyNameInSubtree(SequenceValueFromString(&der_2_extra_rdn), |
| 254 SequenceValueFromString(&der_1))); |
| 255 } |
| 256 |
| 257 EXPECT_FALSE(VerifyNameInSubtree(SequenceValueFromString(&der_1), |
| 258 SequenceValueFromString(&der_2_extra_rdn))); |
| 259 EXPECT_FALSE(VerifyNameInSubtree(SequenceValueFromString(&der_2), |
| 260 SequenceValueFromString(&der_1_extra_rdn))); |
| 261 EXPECT_FALSE(VerifyNameInSubtree(SequenceValueFromString(&der_1_extra_attr), |
| 262 SequenceValueFromString(&der_2))); |
| 263 EXPECT_FALSE(VerifyNameInSubtree(SequenceValueFromString(&der_2_extra_attr), |
| 264 SequenceValueFromString(&der_1))); |
| 265 EXPECT_FALSE(VerifyNameInSubtree(SequenceValueFromString(&der_1), |
| 266 SequenceValueFromString(&der_2_extra_attr))); |
| 267 EXPECT_FALSE(VerifyNameInSubtree(SequenceValueFromString(&der_2), |
| 268 SequenceValueFromString(&der_1_extra_attr))); |
| 269 } |
| 270 |
235 // Runs VerifyNameMatchDifferingTypesTest for all combinations of value types in | 271 // Runs VerifyNameMatchDifferingTypesTest for all combinations of value types in |
236 // value_type1 and value_type_2. | 272 // value_type1 and value_type_2. |
237 INSTANTIATE_TEST_CASE_P(InstantiationName, | 273 INSTANTIATE_TEST_CASE_P(InstantiationName, |
238 VerifyNameMatchDifferingTypesTest, | 274 VerifyNameMatchDifferingTypesTest, |
239 ::testing::Combine(::testing::ValuesIn(kValueTypes), | 275 ::testing::Combine(::testing::ValuesIn(kValueTypes), |
240 ::testing::ValuesIn(kValueTypes))); | 276 ::testing::ValuesIn(kValueTypes))); |
241 | 277 |
242 class VerifyNameMatchUnicodeConversionTest | 278 class VerifyNameMatchUnicodeConversionTest |
243 : public ::testing::TestWithParam< | 279 : public ::testing::TestWithParam< |
244 ::testing::tuple<const char*, | 280 ::testing::tuple<const char*, |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
452 std::string a; | 488 std::string a; |
453 ASSERT_TRUE(LoadTestData("ascii", "mixed", "rdn_dupetype_sorting_1", &a)); | 489 ASSERT_TRUE(LoadTestData("ascii", "mixed", "rdn_dupetype_sorting_1", &a)); |
454 std::string b; | 490 std::string b; |
455 ASSERT_TRUE(LoadTestData("ascii", "mixed", "rdn_dupetype_sorting_2", &b)); | 491 ASSERT_TRUE(LoadTestData("ascii", "mixed", "rdn_dupetype_sorting_2", &b)); |
456 EXPECT_TRUE(VerifyNameMatch(SequenceValueFromString(&a), | 492 EXPECT_TRUE(VerifyNameMatch(SequenceValueFromString(&a), |
457 SequenceValueFromString(&b))); | 493 SequenceValueFromString(&b))); |
458 EXPECT_TRUE(VerifyNameMatch(SequenceValueFromString(&b), | 494 EXPECT_TRUE(VerifyNameMatch(SequenceValueFromString(&b), |
459 SequenceValueFromString(&a))); | 495 SequenceValueFromString(&a))); |
460 } | 496 } |
461 | 497 |
| 498 TEST(VerifyNameInSubtreeInvalidDataTest, FailOnEmptyRdn) { |
| 499 std::string valid; |
| 500 ASSERT_TRUE(LoadTestData("ascii", "PRINTABLESTRING", "unmangled", &valid)); |
| 501 std::string invalid; |
| 502 ASSERT_TRUE(LoadTestData("invalid", "RDN", "empty", &invalid)); |
| 503 // For both |name| and |parent|, a RelativeDistinguishedName must have at |
| 504 // least one AttributeTypeAndValue. |
| 505 EXPECT_FALSE(VerifyNameInSubtree(SequenceValueFromString(&valid), |
| 506 SequenceValueFromString(&invalid))); |
| 507 EXPECT_FALSE(VerifyNameInSubtree(SequenceValueFromString(&invalid), |
| 508 SequenceValueFromString(&valid))); |
| 509 EXPECT_FALSE(VerifyNameInSubtree(SequenceValueFromString(&invalid), |
| 510 SequenceValueFromString(&invalid))); |
| 511 } |
| 512 |
| 513 TEST(VerifyNameInSubtreeTest, EmptyNameMatching) { |
| 514 std::string empty; |
| 515 ASSERT_TRUE(LoadTestData("valid", "Name", "empty", &empty)); |
| 516 std::string non_empty; |
| 517 ASSERT_TRUE( |
| 518 LoadTestData("ascii", "PRINTABLESTRING", "unmangled", &non_empty)); |
| 519 // Empty name is in the subtree defined by empty name. |
| 520 EXPECT_TRUE(VerifyNameInSubtree(SequenceValueFromString(&empty), |
| 521 SequenceValueFromString(&empty))); |
| 522 // Any non-empty name is in the subtree defined by empty name. |
| 523 EXPECT_TRUE(VerifyNameInSubtree(SequenceValueFromString(&non_empty), |
| 524 SequenceValueFromString(&empty))); |
| 525 // Empty name is not in the subtree defined by non-empty name. |
| 526 EXPECT_FALSE(VerifyNameInSubtree(SequenceValueFromString(&empty), |
| 527 SequenceValueFromString(&non_empty))); |
| 528 } |
| 529 |
462 } // namespace net | 530 } // namespace net |
OLD | NEW |