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/parse_certificate.h" | 5 #include "net/cert/internal/parse_certificate.h" |
6 | 6 |
7 #include "base/strings/stringprintf.h" | 7 #include "base/strings/stringprintf.h" |
8 #include "net/cert/internal/cert_errors.h" | 8 #include "net/cert/internal/cert_errors.h" |
9 // TODO(eroman): These tests should be moved into | 9 // TODO(eroman): These tests should be moved into |
10 // parsed_certificate_unittest.cc; this include dependency should | 10 // parsed_certificate_unittest.cc; this include dependency should |
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
411 ASSERT_FALSE(ParseCertificateFromFile("extension_critical_0.pem")); | 411 ASSERT_FALSE(ParseCertificateFromFile("extension_critical_0.pem")); |
412 } | 412 } |
413 | 413 |
414 // Parses an Extension whose critical field is 3. Under DER-encoding BOOLEAN | 414 // Parses an Extension whose critical field is 3. Under DER-encoding BOOLEAN |
415 // values must an octet of either all zero bits, or all 1 bits, so this is not | 415 // values must an octet of either all zero bits, or all 1 bits, so this is not |
416 // valid. | 416 // valid. |
417 TEST(ParseCertificateTest, ExtensionCritical3) { | 417 TEST(ParseCertificateTest, ExtensionCritical3) { |
418 ASSERT_FALSE(ParseCertificateFromFile("extension_critical_3.pem")); | 418 ASSERT_FALSE(ParseCertificateFromFile("extension_critical_3.pem")); |
419 } | 419 } |
420 | 420 |
421 // Runs a test for extensions parsing. The input file is a PEM file which | |
422 // contains a DER-encoded Extensions sequence, as well as the expected value | |
423 // for each contained extension. | |
424 void EnsureParsingExtensionsSucceeds( | |
425 const std::string& file_name, | |
426 std::map<der::Input, ParsedExtension>* extensions, | |
427 std::string* data) { | |
428 const PemBlockMapping mappings[] = { | |
429 // Test Input. | |
430 {"EXTENSIONS", data}, | |
431 }; | |
432 | |
433 ASSERT_TRUE(ReadTestDataFromPemFile(GetFilePath(file_name), mappings)); | |
434 ASSERT_TRUE(ParseExtensions(der::Input(data), extensions)); | |
435 } | |
436 | |
437 // Runs a test that verifies extensions parsing fails. The input file is a PEM | |
438 // file which contains a DER-encoded Extensions sequence. | |
439 void EnsureParsingExtensionsFails(const std::string& file_name) { | |
440 std::string data; | |
441 | |
442 const PemBlockMapping mappings[] = { | |
443 {"EXTENSIONS", &data}, | |
444 }; | |
445 | |
446 std::map<der::Input, ParsedExtension> extensions; | |
447 ASSERT_TRUE(ReadTestDataFromPemFile(GetFilePath(file_name), mappings)); | |
448 ASSERT_FALSE(ParseExtensions(der::Input(&data), &extensions)); | |
449 } | |
450 | |
451 // Parses an Extensions that is an empty sequence. | 421 // Parses an Extensions that is an empty sequence. |
452 TEST(ParseExtensionsTest, EmptySequence) { | 422 TEST(ParseCertificateTest, ExtensionsEmptySequence) { |
453 EnsureParsingExtensionsFails("extensions_empty_sequence.pem"); | 423 ASSERT_FALSE(ParseCertificateFromFile("extensions_empty_sequence.pem")); |
454 } | 424 } |
455 | 425 |
456 // Parses an Extensions that is not a sequence. | 426 // Parses an Extensions that is not a sequence. |
457 TEST(ParseExtensionsTest, NotSequence) { | 427 TEST(ParseCertificateTest, ExtensionsNotSequence) { |
458 EnsureParsingExtensionsFails("extensions_not_sequence.pem"); | 428 ASSERT_FALSE(ParseCertificateFromFile("extensions_not_sequence.pem")); |
459 } | 429 } |
460 | 430 |
461 // Parses an Extensions that has data after the sequence. | 431 // Parses an Extensions that has data after the sequence. |
462 TEST(ParseExtensionsTest, DataAfterSequence) { | 432 TEST(ParseCertificateTest, ExtensionsDataAfterSequence) { |
463 EnsureParsingExtensionsFails("extensions_data_after_sequence.pem"); | 433 ASSERT_FALSE(ParseCertificateFromFile("extensions_data_after_sequence.pem")); |
464 } | 434 } |
465 | 435 |
466 // Parses an Extensions that contains duplicated key usages. | 436 // Parses an Extensions that contains duplicated key usages. |
467 TEST(ParseExtensionsTest, DuplicateKeyUsage) { | 437 TEST(ParseCertificateTest, ExtensionsDuplicateKeyUsage) { |
468 EnsureParsingExtensionsFails("extensions_duplicate_key_usage.pem"); | 438 ASSERT_FALSE(ParseCertificateFromFile("extensions_duplicate_key_usage.pem")); |
469 } | |
470 | |
471 // Parses an Extensions that contains an unknown critical extension. | |
472 TEST(ParseExtensionsTest, UnknownCritical) { | |
mattm
2016/09/23 01:54:32
Were these tests supposed to be removed?
eroman
2016/09/23 01:58:05
Yes -- they are basically duplicates with extensio
| |
473 std::string data; | |
474 std::map<der::Input, ParsedExtension> extensions; | |
475 EnsureParsingExtensionsSucceeds("extensions_unknown_critical.pem", | |
476 &extensions, &data); | |
477 | |
478 ASSERT_EQ(1u, extensions.size()); | |
479 auto iter = extensions.find(DavidBenOid()); | |
480 ASSERT_TRUE(iter != extensions.end()); | |
481 EXPECT_TRUE(iter->second.critical); | |
482 EXPECT_EQ(4u, iter->second.value.Length()); | |
483 } | |
484 | |
485 // Parses an Extensions that contains an unknown non-critical extension. | |
486 TEST(ParseExtensionsTest, UnknownNonCritical) { | |
487 std::string data; | |
488 std::map<der::Input, ParsedExtension> extensions; | |
489 EnsureParsingExtensionsSucceeds("extensions_unknown_non_critical.pem", | |
490 &extensions, &data); | |
491 | |
492 ASSERT_EQ(1u, extensions.size()); | |
493 auto iter = extensions.find(DavidBenOid()); | |
494 ASSERT_TRUE(iter != extensions.end()); | |
495 EXPECT_FALSE(iter->second.critical); | |
496 EXPECT_EQ(4u, iter->second.value.Length()); | |
497 } | |
498 | |
499 // Parses an Extensions that contains a basic constraints. | |
500 TEST(ParseExtensionsTest, BasicConstraints) { | |
501 std::string data; | |
502 std::map<der::Input, ParsedExtension> extensions; | |
503 EnsureParsingExtensionsSucceeds("extensions_basic_constraints.pem", | |
504 &extensions, &data); | |
505 | |
506 ASSERT_EQ(1u, extensions.size()); | |
507 | |
508 auto iter = extensions.find(BasicConstraintsOid()); | |
509 ASSERT_TRUE(iter != extensions.end()); | |
510 EXPECT_TRUE(iter->second.critical); | |
511 EXPECT_EQ(2u, iter->second.value.Length()); | |
512 } | 439 } |
513 | 440 |
514 // Parses an Extensions that contains an extended key usages. | 441 // Parses an Extensions that contains an extended key usages. |
515 TEST(ParseExtensionsTest, ExtendedKeyUsage) { | 442 TEST(ParseCertificateTest, ExtendedKeyUsage) { |
516 std::string data; | 443 scoped_refptr<ParsedCertificate> cert = |
517 std::map<der::Input, ParsedExtension> extensions; | 444 ParseCertificateFromFile("extended_key_usage.pem"); |
518 EnsureParsingExtensionsSucceeds("extensions_extended_key_usage.pem", | 445 ASSERT_TRUE(cert); |
519 &extensions, &data); | |
520 | 446 |
521 ASSERT_EQ(1u, extensions.size()); | 447 const auto& extensions = cert->unparsed_extensions(); |
448 ASSERT_EQ(3u, extensions.size()); | |
522 | 449 |
523 auto iter = extensions.find(ExtKeyUsageOid()); | 450 auto iter = extensions.find(ExtKeyUsageOid()); |
524 ASSERT_TRUE(iter != extensions.end()); | 451 ASSERT_TRUE(iter != extensions.end()); |
525 EXPECT_FALSE(iter->second.critical); | 452 EXPECT_FALSE(iter->second.critical); |
526 EXPECT_EQ(45u, iter->second.value.Length()); | 453 EXPECT_EQ(45u, iter->second.value.Length()); |
527 } | 454 } |
528 | 455 |
529 // Parses an Extensions that contains a key usage. | 456 // Parses an Extensions that contains a key usage. |
530 TEST(ParseExtensionsTest, KeyUsage) { | 457 TEST(ParseCertificateTest, KeyUsage) { |
531 std::string data; | 458 scoped_refptr<ParsedCertificate> cert = |
532 std::map<der::Input, ParsedExtension> extensions; | 459 ParseCertificateFromFile("key_usage.pem"); |
533 EnsureParsingExtensionsSucceeds("extensions_key_usage.pem", &extensions, | 460 ASSERT_TRUE(cert); |
534 &data); | |
535 | 461 |
536 ASSERT_EQ(1u, extensions.size()); | 462 ASSERT_TRUE(cert->has_key_usage()); |
537 | 463 const uint8_t kExpectedValue[] = {0xA0}; |
mattm
2016/09/23 01:54:32
maybe dumb question, but why is it {a0} and not {0
eroman
2016/09/23 02:14:10
I will make this clearer in the code, and also add
eroman
2016/09/23 02:21:39
Done.
| |
538 auto iter = extensions.find(KeyUsageOid()); | 464 EXPECT_EQ(der::Input(kExpectedValue), cert->key_usage().bytes()); |
539 ASSERT_TRUE(iter != extensions.end()); | |
540 EXPECT_TRUE(iter->second.critical); | |
541 EXPECT_EQ(4u, iter->second.value.Length()); | |
542 } | 465 } |
543 | 466 |
544 // Parses an Extensions that contains a policies extension. | 467 // Parses an Extensions that contains a policies extension. |
545 TEST(ParseExtensionsTest, Policies) { | 468 TEST(ParseCertificateTest, Policies) { |
546 std::string data; | 469 scoped_refptr<ParsedCertificate> cert = |
547 std::map<der::Input, ParsedExtension> extensions; | 470 ParseCertificateFromFile("policies.pem"); |
548 EnsureParsingExtensionsSucceeds("extensions_policies.pem", &extensions, | 471 ASSERT_TRUE(cert); |
549 &data); | |
550 | 472 |
551 ASSERT_EQ(1u, extensions.size()); | 473 const auto& extensions = cert->unparsed_extensions(); |
474 ASSERT_EQ(3u, extensions.size()); | |
552 | 475 |
553 auto iter = extensions.find(CertificatePoliciesOid()); | 476 auto iter = extensions.find(CertificatePoliciesOid()); |
554 ASSERT_TRUE(iter != extensions.end()); | 477 ASSERT_TRUE(iter != extensions.end()); |
555 EXPECT_FALSE(iter->second.critical); | 478 EXPECT_FALSE(iter->second.critical); |
556 EXPECT_EQ(95u, iter->second.value.Length()); | 479 EXPECT_EQ(95u, iter->second.value.Length()); |
557 } | 480 } |
558 | 481 |
559 // Parses an Extensions that contains a subjectaltname extension. | 482 // Parses an Extensions that contains a subjectaltname extension. |
560 TEST(ParseExtensionsTest, SubjectAltName) { | 483 TEST(ParseCertificateTest, SubjectAltName) { |
561 std::string data; | 484 scoped_refptr<ParsedCertificate> cert = |
562 std::map<der::Input, ParsedExtension> extensions; | 485 ParseCertificateFromFile("subject_alt_name.pem"); |
563 EnsureParsingExtensionsSucceeds("extensions_subject_alt_name.pem", | 486 ASSERT_TRUE(cert); |
564 &extensions, &data); | |
565 | 487 |
566 ASSERT_EQ(1u, extensions.size()); | 488 ASSERT_TRUE(cert->has_subject_alt_names()); |
567 | |
568 auto iter = extensions.find(SubjectAltNameOid()); | |
569 ASSERT_TRUE(iter != extensions.end()); | |
570 EXPECT_FALSE(iter->second.critical); | |
571 EXPECT_EQ(23u, iter->second.value.Length()); | |
572 } | 489 } |
573 | 490 |
574 // Parses an Extensions that contains multiple extensions, sourced from a | 491 // Parses an Extensions that contains multiple extensions, sourced from a |
575 // real-world certificate. | 492 // real-world certificate. |
576 TEST(ParseExtensionsTest, Real) { | 493 TEST(ParseCertificateTest, ExtensionsReal) { |
577 std::string data; | 494 scoped_refptr<ParsedCertificate> cert = |
578 std::map<der::Input, ParsedExtension> extensions; | 495 ParseCertificateFromFile("extensions_real.pem"); |
579 EnsureParsingExtensionsSucceeds("extensions_real.pem", &extensions, &data); | 496 ASSERT_TRUE(cert); |
580 | 497 |
581 ASSERT_EQ(7u, extensions.size()); | 498 const auto& extensions = cert->unparsed_extensions(); |
499 ASSERT_EQ(4u, extensions.size()); | |
582 | 500 |
583 auto iter = extensions.find(KeyUsageOid()); | 501 EXPECT_TRUE(cert->has_key_usage()); |
584 ASSERT_TRUE(iter != extensions.end()); | 502 EXPECT_TRUE(cert->has_basic_constraints()); |
585 EXPECT_TRUE(iter->second.critical); | 503 EXPECT_TRUE(cert->has_basic_constraints()); |
mattm
2016/09/23 01:54:32
repeated
eroman
2016/09/23 02:21:39
Done.
| |
586 EXPECT_EQ(4u, iter->second.value.Length()); | |
587 | 504 |
588 iter = extensions.find(BasicConstraintsOid()); | 505 auto iter = extensions.find(CertificatePoliciesOid()); |
589 ASSERT_TRUE(iter != extensions.end()); | |
590 EXPECT_TRUE(iter->second.critical); | |
591 EXPECT_EQ(8u, iter->second.value.Length()); | |
592 | |
593 iter = extensions.find(CertificatePoliciesOid()); | |
594 ASSERT_TRUE(iter != extensions.end()); | 506 ASSERT_TRUE(iter != extensions.end()); |
595 EXPECT_FALSE(iter->second.critical); | 507 EXPECT_FALSE(iter->second.critical); |
596 EXPECT_EQ(16u, iter->second.value.Length()); | 508 EXPECT_EQ(16u, iter->second.value.Length()); |
597 | 509 |
598 // TODO(eroman): Verify the other 4 extensions' values. | 510 // TODO(eroman): Verify the other 4 extensions' values. |
599 } | 511 } |
600 | 512 |
601 // Parses a BasicConstraints with no CA or pathlen. | 513 // Parses a BasicConstraints with no CA or pathlen. |
602 TEST(ParseCertificateTest, BasicConstraintsNotCa) { | 514 TEST(ParseCertificateTest, BasicConstraintsNotCa) { |
603 scoped_refptr<ParsedCertificate> cert = | 515 scoped_refptr<ParsedCertificate> cert = |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
793 0x00, // Number of unused bits | 705 0x00, // Number of unused bits |
794 }; | 706 }; |
795 | 707 |
796 der::BitString key_usage; | 708 der::BitString key_usage; |
797 ASSERT_FALSE(ParseKeyUsage(der::Input(der), &key_usage)); | 709 ASSERT_FALSE(ParseKeyUsage(der::Input(der), &key_usage)); |
798 } | 710 } |
799 | 711 |
800 } // namespace | 712 } // namespace |
801 | 713 |
802 } // namespace net | 714 } // namespace net |
OLD | NEW |