Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(202)

Side by Side Diff: net/cert/internal/parse_certificate_unittest.cc

Issue 2361233002: Convert tests that parse an Extensions sequence to instead (Closed)
Patch Set: rebase Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | net/data/parse_certificate_unittest/extended_key_usage.pem » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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) {
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
538 auto iter = extensions.find(KeyUsageOid()); 464 EXPECT_EQ(5u, cert->key_usage().unused_bits());
539 ASSERT_TRUE(iter != extensions.end()); 465 const uint8_t kExpectedBytes[] = {0xA0};
540 EXPECT_TRUE(iter->second.critical); 466 EXPECT_EQ(der::Input(kExpectedBytes), cert->key_usage().bytes());
541 EXPECT_EQ(4u, iter->second.value.Length()); 467
468 EXPECT_TRUE(cert->key_usage().AssertsBit(0));
469 EXPECT_FALSE(cert->key_usage().AssertsBit(1));
470 EXPECT_TRUE(cert->key_usage().AssertsBit(2));
542 } 471 }
543 472
544 // Parses an Extensions that contains a policies extension. 473 // Parses an Extensions that contains a policies extension.
545 TEST(ParseExtensionsTest, Policies) { 474 TEST(ParseCertificateTest, Policies) {
546 std::string data; 475 scoped_refptr<ParsedCertificate> cert =
547 std::map<der::Input, ParsedExtension> extensions; 476 ParseCertificateFromFile("policies.pem");
548 EnsureParsingExtensionsSucceeds("extensions_policies.pem", &extensions, 477 ASSERT_TRUE(cert);
549 &data);
550 478
551 ASSERT_EQ(1u, extensions.size()); 479 const auto& extensions = cert->unparsed_extensions();
480 ASSERT_EQ(3u, extensions.size());
552 481
553 auto iter = extensions.find(CertificatePoliciesOid()); 482 auto iter = extensions.find(CertificatePoliciesOid());
554 ASSERT_TRUE(iter != extensions.end()); 483 ASSERT_TRUE(iter != extensions.end());
555 EXPECT_FALSE(iter->second.critical); 484 EXPECT_FALSE(iter->second.critical);
556 EXPECT_EQ(95u, iter->second.value.Length()); 485 EXPECT_EQ(95u, iter->second.value.Length());
557 } 486 }
558 487
559 // Parses an Extensions that contains a subjectaltname extension. 488 // Parses an Extensions that contains a subjectaltname extension.
560 TEST(ParseExtensionsTest, SubjectAltName) { 489 TEST(ParseCertificateTest, SubjectAltName) {
561 std::string data; 490 scoped_refptr<ParsedCertificate> cert =
562 std::map<der::Input, ParsedExtension> extensions; 491 ParseCertificateFromFile("subject_alt_name.pem");
563 EnsureParsingExtensionsSucceeds("extensions_subject_alt_name.pem", 492 ASSERT_TRUE(cert);
564 &extensions, &data);
565 493
566 ASSERT_EQ(1u, extensions.size()); 494 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 } 495 }
573 496
574 // Parses an Extensions that contains multiple extensions, sourced from a 497 // Parses an Extensions that contains multiple extensions, sourced from a
575 // real-world certificate. 498 // real-world certificate.
576 TEST(ParseExtensionsTest, Real) { 499 TEST(ParseCertificateTest, ExtensionsReal) {
577 std::string data; 500 scoped_refptr<ParsedCertificate> cert =
578 std::map<der::Input, ParsedExtension> extensions; 501 ParseCertificateFromFile("extensions_real.pem");
579 EnsureParsingExtensionsSucceeds("extensions_real.pem", &extensions, &data); 502 ASSERT_TRUE(cert);
580 503
581 ASSERT_EQ(7u, extensions.size()); 504 const auto& extensions = cert->unparsed_extensions();
505 ASSERT_EQ(4u, extensions.size());
582 506
583 auto iter = extensions.find(KeyUsageOid()); 507 EXPECT_TRUE(cert->has_key_usage());
584 ASSERT_TRUE(iter != extensions.end()); 508 EXPECT_TRUE(cert->has_basic_constraints());
585 EXPECT_TRUE(iter->second.critical);
586 EXPECT_EQ(4u, iter->second.value.Length());
587 509
588 iter = extensions.find(BasicConstraintsOid()); 510 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()); 511 ASSERT_TRUE(iter != extensions.end());
595 EXPECT_FALSE(iter->second.critical); 512 EXPECT_FALSE(iter->second.critical);
596 EXPECT_EQ(16u, iter->second.value.Length()); 513 EXPECT_EQ(16u, iter->second.value.Length());
597 514
598 // TODO(eroman): Verify the other 4 extensions' values. 515 // TODO(eroman): Verify the other 4 extensions' values.
599 } 516 }
600 517
601 // Parses a BasicConstraints with no CA or pathlen. 518 // Parses a BasicConstraints with no CA or pathlen.
602 TEST(ParseCertificateTest, BasicConstraintsNotCa) { 519 TEST(ParseCertificateTest, BasicConstraintsNotCa) {
603 scoped_refptr<ParsedCertificate> cert = 520 scoped_refptr<ParsedCertificate> cert =
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
793 0x00, // Number of unused bits 710 0x00, // Number of unused bits
794 }; 711 };
795 712
796 der::BitString key_usage; 713 der::BitString key_usage;
797 ASSERT_FALSE(ParseKeyUsage(der::Input(der), &key_usage)); 714 ASSERT_FALSE(ParseKeyUsage(der::Input(der), &key_usage));
798 } 715 }
799 716
800 } // namespace 717 } // namespace
801 718
802 } // namespace net 719 } // namespace net
OLDNEW
« no previous file with comments | « no previous file | net/data/parse_certificate_unittest/extended_key_usage.pem » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698