Commit 00d1ed46 authored by eroman's avatar eroman Committed by Commit bot

Convert tests that parse an Extension value to instead

parse an entire Certificate.

(Part of a series of changes for simplifying the parsing tests to be in
terms of just certificates for consistent entry point and expectations)

BUG=634443

Review-Url: https://codereview.chromium.org/2359783003
Cr-Commit-Position: refs/heads/master@{#420669}
parent 24dfd18e
......@@ -362,69 +362,60 @@ TEST(ParseTbsCertificateTest, ValidityRelaxed) {
RunTbsCertificateTest("tbs_validity_relaxed.pem");
}
// Reads a PEM file containing a block "EXTENSION". This input will be
// passed to ParseExtension, and the results filled in |out|.
bool ParseExtensionFromFile(const std::string& file_name,
ParsedExtension* out,
std::string* data) {
const PemBlockMapping mappings[] = {
{"EXTENSION", data},
};
EXPECT_TRUE(ReadTestDataFromPemFile(GetFilePath(file_name), mappings));
return ParseExtension(der::Input(data), out);
der::Input DavidBenOid() {
// This OID corresponds with
// 1.2.840.113554.4.1.72585.0 (https://davidben.net/oid)
static const uint8_t kOid[] = {0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12,
0x04, 0x01, 0x84, 0xb7, 0x09, 0x00};
return der::Input(kOid);
}
// Parses an Extension whose critical field is true (255).
TEST(ParseExtensionTest, Critical) {
std::string data;
ParsedExtension extension;
ASSERT_TRUE(
ParseExtensionFromFile("extension_critical.pem", &extension, &data));
TEST(ParseCertificateTest, ExtensionCritical) {
scoped_refptr<ParsedCertificate> cert =
ParseCertificateFromFile("extension_critical.pem");
ASSERT_TRUE(cert);
EXPECT_TRUE(extension.critical);
const uint8_t kExpectedValue[] = {0x30, 0x00};
const uint8_t kExpectedOid[] = {0x55, 0x1d, 0x13};
EXPECT_EQ(der::Input(kExpectedOid), extension.oid);
auto it = cert->unparsed_extensions().find(DavidBenOid());
ASSERT_NE(cert->unparsed_extensions().end(), it);
const auto& extension = it->second;
const uint8_t kExpectedValue[] = {0x30, 0x00};
EXPECT_TRUE(extension.critical);
EXPECT_EQ(DavidBenOid(), extension.oid);
EXPECT_EQ(der::Input(kExpectedValue), extension.value);
}
// Parses an Extension whose critical field is false (omitted).
TEST(ParseExtensionTest, NotCritical) {
std::string data;
ParsedExtension extension;
ASSERT_TRUE(
ParseExtensionFromFile("extension_not_critical.pem", &extension, &data));
TEST(ParseCertificateTest, ExtensionNotCritical) {
scoped_refptr<ParsedCertificate> cert =
ParseCertificateFromFile("extension_not_critical.pem");
ASSERT_TRUE(cert);
EXPECT_FALSE(extension.critical);
const uint8_t kExpectedValue[] = {0x30, 0x00};
const uint8_t kExpectedOid[] = {0x55, 0x1d, 0x13};
EXPECT_EQ(der::Input(kExpectedOid), extension.oid);
auto it = cert->unparsed_extensions().find(DavidBenOid());
ASSERT_NE(cert->unparsed_extensions().end(), it);
const auto& extension = it->second;
const uint8_t kExpectedValue[] = {0x30, 0x00};
EXPECT_FALSE(extension.critical);
EXPECT_EQ(DavidBenOid(), extension.oid);
EXPECT_EQ(der::Input(kExpectedValue), extension.value);
}
// Parses an Extension whose critical field is 0. This is in one sense FALSE,
// however because critical has DEFAULT of false this is in fact invalid
// DER-encoding.
TEST(ParseExtensionTest, Critical0) {
std::string data;
ParsedExtension extension;
ASSERT_FALSE(
ParseExtensionFromFile("extension_critical_0.pem", &extension, &data));
TEST(ParseCertificateTest, ExtensionCritical0) {
ASSERT_FALSE(ParseCertificateFromFile("extension_critical_0.pem"));
}
// Parses an Extension whose critical field is 3. Under DER-encoding BOOLEAN
// values must an octet of either all zero bits, or all 1 bits, so this is not
// valid.
TEST(ParseExtensionTest, Critical3) {
std::string data;
ParsedExtension extension;
ASSERT_FALSE(
ParseExtensionFromFile("extension_critical_3.pem", &extension, &data));
TEST(ParseCertificateTest, ExtensionCritical3) {
ASSERT_FALSE(ParseCertificateFromFile("extension_critical_3.pem"));
}
// Runs a test for extensions parsing. The input file is a PEM file which
......@@ -485,12 +476,7 @@ TEST(ParseExtensionsTest, UnknownCritical) {
&extensions, &data);
ASSERT_EQ(1u, extensions.size());
// This OID corresponds with
// 1.2.840.113554.4.1.72585.0 (https://davidben.net/oid)
const uint8_t oid[] = {0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12,
0x04, 0x01, 0x84, 0xb7, 0x09, 0x00};
auto iter = extensions.find(der::Input(oid));
auto iter = extensions.find(DavidBenOid());
ASSERT_TRUE(iter != extensions.end());
EXPECT_TRUE(iter->second.critical);
EXPECT_EQ(4u, iter->second.value.Length());
......@@ -504,12 +490,7 @@ TEST(ParseExtensionsTest, UnknownNonCritical) {
&extensions, &data);
ASSERT_EQ(1u, extensions.size());
// This OID corresponds with
// 1.2.840.113554.4.1.72585.0 (https://davidben.net/oid)
const uint8_t oid[] = {0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12,
0x04, 0x01, 0x84, 0xb7, 0x09, 0x00};
auto iter = extensions.find(der::Input(oid));
auto iter = extensions.find(DavidBenOid());
ASSERT_TRUE(iter != extensions.end());
EXPECT_FALSE(iter->second.critical);
EXPECT_EQ(4u, iter->second.value.Length());
......
......@@ -79,6 +79,7 @@ scoped_refptr<ParsedCertificate> ParsedCertificate::CreateInternal(
DataSource source,
const ParseCertificateOptions& options,
CertErrors* errors) {
// TODO(crbug.com/634443): Add errors
scoped_refptr<ParsedCertificate> result(new ParsedCertificate);
switch (source) {
......
This is a basic constraints extension, which is marked as critical.
This is an unknown extension, which is marked as critical.
#-----BEGIN EXTENSION-----
SEQUENCE {
# https://davidben.net/oid
OBJECT_IDENTIFIER { 1.2.840.113554.4.1.72585.0 }
BOOLEAN { `ff` }
OCTET_STRING {
SEQUENCE {}
}
}
#-----END EXTENSION-----
$ openssl asn1parse -i < [EXTENSION]
0:d=0 hl=2 l= 12 cons: SEQUENCE
2:d=1 hl=2 l= 3 prim: OBJECT :X509v3 Basic Constraints
7:d=1 hl=2 l= 1 prim: BOOLEAN :255
10:d=1 hl=2 l= 2 prim: OCTET STRING [HEX DUMP]:3000
-----BEGIN EXTENSION-----
MAwGA1UdEwEB/wQCMAA=
-----END EXTENSION-----
-----BEGIN CERTIFICATE-----
MIICbzCCAdigAwIBAgIJAPuwTC6rEJsMMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwHhcNMTQwNDIzMjA1MDQwWhcNMTcwNDIyMjA1MDQwWjBFMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYK8imMuRi/03z0K1Zi0WnvfFHvwlYeyK9Na6XJYaUoIDAtB92kWdGMdAQhLciHnAjkXLI6W15OoV3gA/ElRZ1xUpxTMhjP6PyY5wqT5r6y8FxbiiFKKAnHmUcrgfVW28tQ+0rkLGMryRtrukXOgXBv7gcrmU7G1jC2a7WqmeI8QIDAQABo2cwZTAdBgNVHQ4EFgQUi3XVrMsIvg4fZbf6Vr5sp3Xaha8wHwYDVR0jBBgwFoAUi3XVrMsIvg4fZbf6Vr5sp3Xaha8wDAYDVR0TBAUwAwEB/zAVBgwqhkiG9xIEAYS3CQABAf8EAjAAMA0GCSqGSIb3DQEBBQUAA4GBADvoeG2V1j1q9xMZLBvCiK4iq/SNMvV8cWfPLdEcwsOH4um+iVzkNKtIkcI/la4rR54leGtPmhCkcv3P9wIMsAoIpFri5XR+ER05YGrJH2nzLmMm3J7va3oK4VRXmKpykXgEfh+PZU0fCxKsnCQPhBQaVS0fu/CdCbIIXFkyZYAm
-----END CERTIFICATE-----
This is a basic constraints extension, where the critical field (BOOLEAN) is 0.
This is an unknown extension, where the critical field (BOOLEAN) is 0.
This is not valid because the critical field has a default of FALSE, so under
DER-encoding it should be omitted.
#-----BEGIN EXTENSION-----
SEQUENCE {
# https://davidben.net/oid
OBJECT_IDENTIFIER { 1.2.840.113554.4.1.72585.0 }
BOOLEAN { `00` }
OCTET_STRING {
SEQUENCE {}
}
}
#-----END EXTENSION-----
$ openssl asn1parse -i < [EXTENSION]
0:d=0 hl=2 l= 12 cons: SEQUENCE
2:d=1 hl=2 l= 3 prim: OBJECT :X509v3 Basic Constraints
7:d=1 hl=2 l= 1 prim: BOOLEAN :0
10:d=1 hl=2 l= 2 prim: OCTET STRING [HEX DUMP]:3000
-----BEGIN EXTENSION-----
MAwGA1UdEwEBAAQCMAA=
-----END EXTENSION-----
-----BEGIN CERTIFICATE-----
MIICbzCCAdigAwIBAgIJAPuwTC6rEJsMMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwHhcNMTQwNDIzMjA1MDQwWhcNMTcwNDIyMjA1MDQwWjBFMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYK8imMuRi/03z0K1Zi0WnvfFHvwlYeyK9Na6XJYaUoIDAtB92kWdGMdAQhLciHnAjkXLI6W15OoV3gA/ElRZ1xUpxTMhjP6PyY5wqT5r6y8FxbiiFKKAnHmUcrgfVW28tQ+0rkLGMryRtrukXOgXBv7gcrmU7G1jC2a7WqmeI8QIDAQABo2cwZTAdBgNVHQ4EFgQUi3XVrMsIvg4fZbf6Vr5sp3Xaha8wHwYDVR0jBBgwFoAUi3XVrMsIvg4fZbf6Vr5sp3Xaha8wDAYDVR0TBAUwAwEB/zAVBgwqhkiG9xIEAYS3CQABAQAEAjAAMA0GCSqGSIb3DQEBBQUAA4GBADvoeG2V1j1q9xMZLBvCiK4iq/SNMvV8cWfPLdEcwsOH4um+iVzkNKtIkcI/la4rR54leGtPmhCkcv3P9wIMsAoIpFri5XR+ER05YGrJH2nzLmMm3J7va3oK4VRXmKpykXgEfh+PZU0fCxKsnCQPhBQaVS0fu/CdCbIIXFkyZYAm
-----END CERTIFICATE-----
This is a basic constraints extension, where the critical field (BOOLEAN) is 3.
This is an unknown extension, where the critical field (BOOLEAN) is 3.
This is not valid because BOOLEANs in DER-encoding should use an octet of
either all 0 bits or all 1 bits.
#-----BEGIN EXTENSION-----
SEQUENCE {
# https://davidben.net/oid
OBJECT_IDENTIFIER { 1.2.840.113554.4.1.72585.0 }
BOOLEAN { `03` }
OCTET_STRING {
SEQUENCE {}
}
}
#-----END EXTENSION-----
$ openssl asn1parse -i < [EXTENSION]
0:d=0 hl=2 l= 12 cons: SEQUENCE
2:d=1 hl=2 l= 3 prim: OBJECT :X509v3 Basic Constraints
7:d=1 hl=2 l= 1 prim: BOOLEAN :3
10:d=1 hl=2 l= 2 prim: OCTET STRING [HEX DUMP]:3000
-----BEGIN EXTENSION-----
MAwGA1UdEwEBAwQCMAA=
-----END EXTENSION-----
-----BEGIN CERTIFICATE-----
MIICbzCCAdigAwIBAgIJAPuwTC6rEJsMMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwHhcNMTQwNDIzMjA1MDQwWhcNMTcwNDIyMjA1MDQwWjBFMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYK8imMuRi/03z0K1Zi0WnvfFHvwlYeyK9Na6XJYaUoIDAtB92kWdGMdAQhLciHnAjkXLI6W15OoV3gA/ElRZ1xUpxTMhjP6PyY5wqT5r6y8FxbiiFKKAnHmUcrgfVW28tQ+0rkLGMryRtrukXOgXBv7gcrmU7G1jC2a7WqmeI8QIDAQABo2cwZTAdBgNVHQ4EFgQUi3XVrMsIvg4fZbf6Vr5sp3Xaha8wHwYDVR0jBBgwFoAUi3XVrMsIvg4fZbf6Vr5sp3Xaha8wDAYDVR0TBAUwAwEB/zAVBgwqhkiG9xIEAYS3CQABAQMEAjAAMA0GCSqGSIb3DQEBBQUAA4GBADvoeG2V1j1q9xMZLBvCiK4iq/SNMvV8cWfPLdEcwsOH4um+iVzkNKtIkcI/la4rR54leGtPmhCkcv3P9wIMsAoIpFri5XR+ER05YGrJH2nzLmMm3J7va3oK4VRXmKpykXgEfh+PZU0fCxKsnCQPhBQaVS0fu/CdCbIIXFkyZYAm
-----END CERTIFICATE-----
This is a modified basic constraints extension, where the critical field was
removed (in other words, FALSE).
This is an unknown extension, where the critical field is absent (in other
words, FALSE).
#-----BEGIN EXTENSION-----
SEQUENCE {
# https://davidben.net/oid
OBJECT_IDENTIFIER { 1.2.840.113554.4.1.72585.0 }
OCTET_STRING {
SEQUENCE {}
}
}
#-----END EXTENSION-----
$ openssl asn1parse -i < [EXTENSION]
0:d=0 hl=2 l= 9 cons: SEQUENCE
2:d=1 hl=2 l= 3 prim: OBJECT :X509v3 Basic Constraints
7:d=1 hl=2 l= 2 prim: OCTET STRING [HEX DUMP]:3000
-----BEGIN EXTENSION-----
MAkGA1UdEwQCMAA=
-----END EXTENSION-----
-----BEGIN CERTIFICATE-----
MIICbDCCAdWgAwIBAgIJAPuwTC6rEJsMMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwHhcNMTQwNDIzMjA1MDQwWhcNMTcwNDIyMjA1MDQwWjBFMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYK8imMuRi/03z0K1Zi0WnvfFHvwlYeyK9Na6XJYaUoIDAtB92kWdGMdAQhLciHnAjkXLI6W15OoV3gA/ElRZ1xUpxTMhjP6PyY5wqT5r6y8FxbiiFKKAnHmUcrgfVW28tQ+0rkLGMryRtrukXOgXBv7gcrmU7G1jC2a7WqmeI8QIDAQABo2QwYjAdBgNVHQ4EFgQUi3XVrMsIvg4fZbf6Vr5sp3Xaha8wHwYDVR0jBBgwFoAUi3XVrMsIvg4fZbf6Vr5sp3Xaha8wDAYDVR0TBAUwAwEB/zASBgwqhkiG9xIEAYS3CQAEAjAAMA0GCSqGSIb3DQEBBQUAA4GBADvoeG2V1j1q9xMZLBvCiK4iq/SNMvV8cWfPLdEcwsOH4um+iVzkNKtIkcI/la4rR54leGtPmhCkcv3P9wIMsAoIpFri5XR+ER05YGrJH2nzLmMm3J7va3oK4VRXmKpykXgEfh+PZU0fCxKsnCQPhBQaVS0fu/CdCbIIXFkyZYAm
-----END CERTIFICATE-----
......@@ -110,6 +110,9 @@ SEQUENCE {
#-----END BASIC_CONSTRAINTS-----
}
}
#-----BEGIN EXTENSION-----
# (For adding in another extension at the end of the list)
#-----END EXTENSION-----
}
}
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment