blob: 077be578467ce7bf1fbbb2936663346d3138ce30 [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chromeos/components/onc/onc_parsed_certificates.h"
#include <memory>
#include "base/json/json_reader.h"
#include "base/strings/string_piece.h"
#include "base/values.h"
#include "net/cert/x509_certificate.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace chromeos::onc {
class OncParsedCertificatesTest : public testing::Test {
public:
OncParsedCertificatesTest() = default;
~OncParsedCertificatesTest() override = default;
protected:
std::unique_ptr<OncParsedCertificates> ReadFromJSON(
base::StringPiece onc_certificates_json) {
absl::optional<base::Value> onc_certificates =
base::JSONReader::Read(onc_certificates_json);
if (!onc_certificates || !onc_certificates->is_list()) {
return nullptr;
}
return std::make_unique<OncParsedCertificates>(onc_certificates->GetList());
}
};
TEST_F(OncParsedCertificatesTest, ClientCert) {
const char onc_certificates_json[] = R"(
[
{ "GUID": "{f998f760-272b-6939-4c2beffe428697ac}",
"PKCS12": "YWJj",
"Type": "Client" }
])";
std::unique_ptr<OncParsedCertificates> onc_parsed_certificates =
ReadFromJSON(onc_certificates_json);
ASSERT_TRUE(onc_parsed_certificates);
EXPECT_FALSE(onc_parsed_certificates->has_error());
EXPECT_EQ(0u,
onc_parsed_certificates->server_or_authority_certificates().size());
ASSERT_EQ(1u, onc_parsed_certificates->client_certificates().size());
const OncParsedCertificates::ClientCertificate& client_cert =
onc_parsed_certificates->client_certificates()[0];
EXPECT_EQ("{f998f760-272b-6939-4c2beffe428697ac}", client_cert.guid());
// YWJj base64-decoded is abc
EXPECT_EQ("abc", client_cert.pkcs12_data());
}
TEST_F(OncParsedCertificatesTest, ClientCertWithNewLines) {
const char onc_certificates_json[] = R"(
[
{ "GUID": "{f998f760-272b-6939-4c2beffe428697ac}",
"PKCS12": "YW\nJ\n\n\nj",
"Type": "Client" }
])";
std::unique_ptr<OncParsedCertificates> onc_parsed_certificates =
ReadFromJSON(onc_certificates_json);
ASSERT_TRUE(onc_parsed_certificates);
EXPECT_FALSE(onc_parsed_certificates->has_error());
EXPECT_EQ(0u,
onc_parsed_certificates->server_or_authority_certificates().size());
ASSERT_EQ(1u, onc_parsed_certificates->client_certificates().size());
const OncParsedCertificates::ClientCertificate& client_cert =
onc_parsed_certificates->client_certificates()[0];
EXPECT_EQ("{f998f760-272b-6939-4c2beffe428697ac}", client_cert.guid());
// YWJj base64-decoded is abc
EXPECT_EQ("abc", client_cert.pkcs12_data());
}
TEST_F(OncParsedCertificatesTest, ClientCertAndError) {
const char onc_certificates_json[] = R"(
[
{ "GUID": "{good-client-cert}",
"PKCS12": "YWJj",
"Type": "Client" },
{ "GUID": "{bad-client-cert}",
"PKCS12": "!!!",
"Type": "Client" }
])";
std::unique_ptr<OncParsedCertificates> onc_parsed_certificates =
ReadFromJSON(onc_certificates_json);
ASSERT_TRUE(onc_parsed_certificates);
EXPECT_TRUE(onc_parsed_certificates->has_error());
EXPECT_EQ(0u,
onc_parsed_certificates->server_or_authority_certificates().size());
ASSERT_EQ(1u, onc_parsed_certificates->client_certificates().size());
const OncParsedCertificates::ClientCertificate& client_cert =
onc_parsed_certificates->client_certificates()[0];
EXPECT_EQ("{good-client-cert}", client_cert.guid());
}
TEST_F(OncParsedCertificatesTest, AuthorityCerts) {
const char onc_certificates_json[] = R"(
[
{ "GUID": "{trusted-cert}",
"TrustBits": [
"Web"
],
"Type": "Authority",
"X509": "-----BEGIN CERTIFICATE-----\n
MIIC8zCCAdugAwIBAgIJALF9qhLor0+aMA0GCSqGSIb3DQEBBQUAMBcxFTATBgNV\n
BAMMDFRlc3QgUm9vdCBDQTAeFw0xNDA4MTQwMzA1MjlaFw0yNDA4MTEwMzA1Mjla\n
MBcxFTATBgNVBAMMDFRlc3QgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\n
ADCCAQoCggEBALZJQeNCAVGofzx6cdP7zZE1F4QajvY2x9FwHfqG8267dm/oMi43\n
/TiSPWjkin1CMxRGG9wE9pFuVEDECgn97C1i4l7huiycwbFgTNrH+CJcgiBlQh5W\n
d3VP65AsSupXDiKNbJWsEerM1+72cA0J3aY1YV3Jdm2w8h6/MIbYd1I2lZcO0UbF\n
7YE9G7DyYZU8wUA4719dumGf7yucn4WJdHBj1XboNX7OAeHzERGQHA31/Y3OEGyt\n
fFUaIW/XLfR4FeovOL2RnjwdB0b1Q8GCi68SU2UZimlpZgay2gv6KgChKhWESfEB\n
v5swBtAVoB+dUZFH4VNf717swmF5whSfxOMCAwEAAaNCMEAwDwYDVR0TAQH/BAUw\n
AwEB/zAdBgNVHQ4EFgQUvPcw0TzA8nn675/JbFyT84poq4MwDgYDVR0PAQH/BAQD\n
AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBXByn7f+j/sObYWGrDkKE4HLTzaLHs6Ikj\n
JNeo8iHDYOSkSVwAv9/HgniAKxj3rd3QYl6nsMzwqrTOcBJZZWd2BQAYmv/EKhfj\n
8VXYvlxe68rLU4cQ1QkyNqdeQfRT2n5WYNJ+TpqlCF9ddennMMsi6e8ZSYOlI6H4\n
YEzlNtU5eBjxXr/OqgtTgSx4qQpr2xMQIRR/G3A9iRpAigYsXVAZYvnHRYnyPWYF\n
PX11W1UegEJyoZp8bQp09u6mIWw6mPt3gl/ya1bm3ZuOUPDGrv3qpgUHqSYGVrOy\n
2bI3oCE+eQYfuVG+9LFJTZC1M+UOx15bQMVqBNFDepRqpE9h/ILg\n
-----END CERTIFICATE-----" },
{ "GUID": "{untrusted-cert}",
"Type": "Authority",
"X509": "-----BEGIN CERTIFICATE-----\n
MIIDvzCCAqegAwIBAgIBAzANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzET\n
MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G\n
A1UECgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMB4XDTE3MDYwNTE3\n
MTA0NloXDTI3MDYwMzE3MTA0NlowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh\n
bGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB1Rlc3Qg\n
Q0ExEjAQBgNVBAMMCTEyNy4wLjAuMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC\n
AQoCggEBALS/0pcz5RNbd2W9cxp1KJtHWea3MOhGM21YW9ofCv/k5C3yHfiJ6GQu\n
9sPN16OO1/fN59gOEMPnVtL85ebTTuL/gk0YY4ewo97a7wo3e6y1t0PO8gc53xTp\n
w6RBPn5oRzSbe2HEGOYTzrO0puC6A+7k6+eq9G2+l1uqBpdQAdB4uNaSsOTiuUOI\n
ta4UZH1ScNQFHAkl1eJPyaiC20Exw75EbwvU/b/B7tlivzuPtQDI0d9dShOtceRL\n
X9HZckyD2JNAv2zNL2YOBNa5QygkySX9WXD+PfKpCk7Cm8TenldeXRYl5ni2REkp\n
nfa/dPuF1g3xZVjyK9aPEEnIAC2I4i0CAwEAAaOBgDB+MAwGA1UdEwEB/wQCMAAw\n
HQYDVR0OBBYEFODc4C8HiHQ6n9Mwo3GK+dal5aZTMB8GA1UdIwQYMBaAFJsmC4qY\n
qbsduR8c4xpAM+2OF4irMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAP\n
BgNVHREECDAGhwR/AAABMA0GCSqGSIb3DQEBCwUAA4IBAQB6FEQuUDRcC5jkX3aZ\n
uuTeZEqMVL7JXgvgFqzXsPb8zIdmxr/tEDfwXx2qDf2Dpxts7Fq4vqUwimK4qV3K\n
7heLnWV2+FBvV1eeSfZ7AQj+SURkdlyo42r41+t13QUf+Z0ftR9266LSWLKrukeI\n
Mxk73hOkm/u8enhTd00dy/FN9dOFBFHseVMspWNxIkdRILgOmiyfQNRgxNYdOf0e\n
EfELR8Hn6WjZ8wAbvO4p7RTrzu1c/RZ0M+NLkID56Brbl70GC2h5681LPwAOaZ7/\n
mWQ5kekSyJjmLfF12b+h9RVAt5MrXZgk2vNujssgGf4nbWh4KZyQ6qrs778ZdDLm\n
yfUn\n
-----END CERTIFICATE-----" }
])";
std::unique_ptr<OncParsedCertificates> onc_parsed_certificates =
ReadFromJSON(onc_certificates_json);
ASSERT_TRUE(onc_parsed_certificates);
EXPECT_FALSE(onc_parsed_certificates->has_error());
EXPECT_EQ(2u,
onc_parsed_certificates->server_or_authority_certificates().size());
EXPECT_EQ(0u, onc_parsed_certificates->client_certificates().size());
const OncParsedCertificates::ServerOrAuthorityCertificate&
trusted_authority_cert =
onc_parsed_certificates->server_or_authority_certificates()[0];
EXPECT_EQ(
OncParsedCertificates::ServerOrAuthorityCertificate::Type::kAuthority,
trusted_authority_cert.type());
EXPECT_EQ(CertificateScope::Default(), trusted_authority_cert.scope());
EXPECT_EQ("{trusted-cert}", trusted_authority_cert.guid());
EXPECT_TRUE(trusted_authority_cert.web_trust_requested());
EXPECT_EQ("Test Root CA",
trusted_authority_cert.certificate()->subject().common_name);
const OncParsedCertificates::ServerOrAuthorityCertificate&
untrusted_authority_cert =
onc_parsed_certificates->server_or_authority_certificates()[1];
EXPECT_EQ(
OncParsedCertificates::ServerOrAuthorityCertificate::Type::kAuthority,
trusted_authority_cert.type());
EXPECT_EQ(CertificateScope::Default(), trusted_authority_cert.scope());
EXPECT_EQ("{untrusted-cert}", untrusted_authority_cert.guid());
EXPECT_FALSE(untrusted_authority_cert.web_trust_requested());
EXPECT_EQ("127.0.0.1",
untrusted_authority_cert.certificate()->subject().common_name);
}
TEST_F(OncParsedCertificatesTest, AuthorityCertsScope) {
const char onc_certificates_json[] = R"(
[
{ "GUID": "{extension-scoped-cert}",
"Type": "Authority",
"TrustBits": [
"Web"
],
"Scope": {
"Type": "Extension",
"Id": "fake-extension-id"
},
"X509": "-----BEGIN CERTIFICATE-----\n
MIIC8zCCAdugAwIBAgIJALF9qhLor0+aMA0GCSqGSIb3DQEBBQUAMBcxFTATBgNV\n
BAMMDFRlc3QgUm9vdCBDQTAeFw0xNDA4MTQwMzA1MjlaFw0yNDA4MTEwMzA1Mjla\n
MBcxFTATBgNVBAMMDFRlc3QgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\n
ADCCAQoCggEBALZJQeNCAVGofzx6cdP7zZE1F4QajvY2x9FwHfqG8267dm/oMi43\n
/TiSPWjkin1CMxRGG9wE9pFuVEDECgn97C1i4l7huiycwbFgTNrH+CJcgiBlQh5W\n
d3VP65AsSupXDiKNbJWsEerM1+72cA0J3aY1YV3Jdm2w8h6/MIbYd1I2lZcO0UbF\n
7YE9G7DyYZU8wUA4719dumGf7yucn4WJdHBj1XboNX7OAeHzERGQHA31/Y3OEGyt\n
fFUaIW/XLfR4FeovOL2RnjwdB0b1Q8GCi68SU2UZimlpZgay2gv6KgChKhWESfEB\n
v5swBtAVoB+dUZFH4VNf717swmF5whSfxOMCAwEAAaNCMEAwDwYDVR0TAQH/BAUw\n
AwEB/zAdBgNVHQ4EFgQUvPcw0TzA8nn675/JbFyT84poq4MwDgYDVR0PAQH/BAQD\n
AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBXByn7f+j/sObYWGrDkKE4HLTzaLHs6Ikj\n
JNeo8iHDYOSkSVwAv9/HgniAKxj3rd3QYl6nsMzwqrTOcBJZZWd2BQAYmv/EKhfj\n
8VXYvlxe68rLU4cQ1QkyNqdeQfRT2n5WYNJ+TpqlCF9ddennMMsi6e8ZSYOlI6H4\n
YEzlNtU5eBjxXr/OqgtTgSx4qQpr2xMQIRR/G3A9iRpAigYsXVAZYvnHRYnyPWYF\n
PX11W1UegEJyoZp8bQp09u6mIWw6mPt3gl/ya1bm3ZuOUPDGrv3qpgUHqSYGVrOy\n
2bI3oCE+eQYfuVG+9LFJTZC1M+UOx15bQMVqBNFDepRqpE9h/ILg\n
-----END CERTIFICATE-----" }
])";
std::unique_ptr<OncParsedCertificates> onc_parsed_certificates =
ReadFromJSON(onc_certificates_json);
ASSERT_TRUE(onc_parsed_certificates);
EXPECT_FALSE(onc_parsed_certificates->has_error());
ASSERT_EQ(1u,
onc_parsed_certificates->server_or_authority_certificates().size());
const OncParsedCertificates::ServerOrAuthorityCertificate& authority_cert =
onc_parsed_certificates->server_or_authority_certificates()[0];
EXPECT_EQ(
OncParsedCertificates::ServerOrAuthorityCertificate::Type::kAuthority,
authority_cert.type());
EXPECT_EQ(CertificateScope::ForExtension("fake-extension-id"),
authority_cert.scope());
EXPECT_EQ("{extension-scoped-cert}", authority_cert.guid());
EXPECT_TRUE(authority_cert.web_trust_requested());
EXPECT_EQ("Test Root CA",
authority_cert.certificate()->subject().common_name);
}
TEST_F(OncParsedCertificatesTest, UnknownTrustBitsIgnored) {
const char onc_certificates_json[] = R"(
[
{ "GUID": "{trusted-cert}",
"TrustBits": [
"Unknown1",
"Web",
"Unknown2"
],
"Type": "Authority",
"X509": "-----BEGIN CERTIFICATE-----\n
MIIC8zCCAdugAwIBAgIJALF9qhLor0+aMA0GCSqGSIb3DQEBBQUAMBcxFTATBgNV\n
BAMMDFRlc3QgUm9vdCBDQTAeFw0xNDA4MTQwMzA1MjlaFw0yNDA4MTEwMzA1Mjla\n
MBcxFTATBgNVBAMMDFRlc3QgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\n
ADCCAQoCggEBALZJQeNCAVGofzx6cdP7zZE1F4QajvY2x9FwHfqG8267dm/oMi43\n
/TiSPWjkin1CMxRGG9wE9pFuVEDECgn97C1i4l7huiycwbFgTNrH+CJcgiBlQh5W\n
d3VP65AsSupXDiKNbJWsEerM1+72cA0J3aY1YV3Jdm2w8h6/MIbYd1I2lZcO0UbF\n
7YE9G7DyYZU8wUA4719dumGf7yucn4WJdHBj1XboNX7OAeHzERGQHA31/Y3OEGyt\n
fFUaIW/XLfR4FeovOL2RnjwdB0b1Q8GCi68SU2UZimlpZgay2gv6KgChKhWESfEB\n
v5swBtAVoB+dUZFH4VNf717swmF5whSfxOMCAwEAAaNCMEAwDwYDVR0TAQH/BAUw\n
AwEB/zAdBgNVHQ4EFgQUvPcw0TzA8nn675/JbFyT84poq4MwDgYDVR0PAQH/BAQD\n
AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBXByn7f+j/sObYWGrDkKE4HLTzaLHs6Ikj\n
JNeo8iHDYOSkSVwAv9/HgniAKxj3rd3QYl6nsMzwqrTOcBJZZWd2BQAYmv/EKhfj\n
8VXYvlxe68rLU4cQ1QkyNqdeQfRT2n5WYNJ+TpqlCF9ddennMMsi6e8ZSYOlI6H4\n
YEzlNtU5eBjxXr/OqgtTgSx4qQpr2xMQIRR/G3A9iRpAigYsXVAZYvnHRYnyPWYF\n
PX11W1UegEJyoZp8bQp09u6mIWw6mPt3gl/ya1bm3ZuOUPDGrv3qpgUHqSYGVrOy\n
2bI3oCE+eQYfuVG+9LFJTZC1M+UOx15bQMVqBNFDepRqpE9h/ILg\n
-----END CERTIFICATE-----" }
])";
std::unique_ptr<OncParsedCertificates> onc_parsed_certificates =
ReadFromJSON(onc_certificates_json);
ASSERT_TRUE(onc_parsed_certificates);
EXPECT_FALSE(onc_parsed_certificates->has_error());
ASSERT_EQ(1u,
onc_parsed_certificates->server_or_authority_certificates().size());
EXPECT_EQ(0u, onc_parsed_certificates->client_certificates().size());
const OncParsedCertificates::ServerOrAuthorityCertificate&
trusted_authority_cert =
onc_parsed_certificates->server_or_authority_certificates()[0];
EXPECT_EQ(
OncParsedCertificates::ServerOrAuthorityCertificate::Type::kAuthority,
trusted_authority_cert.type());
EXPECT_EQ("{trusted-cert}", trusted_authority_cert.guid());
EXPECT_TRUE(trusted_authority_cert.web_trust_requested());
EXPECT_EQ("Test Root CA",
trusted_authority_cert.certificate()->issuer().common_name);
}
TEST_F(OncParsedCertificatesTest, ServerCertAndError) {
const char onc_certificates_json[] = R"(
[
{ "GUID": "{good-server-cert}",
"Type": "Server",
"X509": "leading junk \n
-----BEGIN CERTIFICATE----- \n
MIICWDCCAcECAxAAATANBgkqhkiG9w0BAQQFADCBkzEVMBMGA1UEChMMR29vZ2xlLCBJbm\n
MuMREwDwYDVQQLEwhDaHJvbWVPUzEiMCAGCSqGSIb3DQEJARYTZ3NwZW5jZXJAZ29vZ2xl\n
LmNvbTEaMBgGA1UEBxMRTW91bnRhaW4gVmlldywgQ0ExCzAJBgNVBAgTAkNBMQswCQYDVQ\n
QGEwJVUzENMAsGA1UEAxMEbG1hbzAeFw0xMTAzMTYyMzQ5MzhaFw0xMjAzMTUyMzQ5Mzha\n
MFMxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEVMBMGA1UEChMMR29vZ2xlLCBJbmMuMR\n
EwDwYDVQQLEwhDaHJvbWVPUzENMAsGA1UEAxMEbG1hbzCBnzANBgkqhkiG9w0BAQEFAAOB\n
jQAwgYkCgYEA31WiJ9LvprrhKtDlW0RdLFAO7Qjkvs+sG6j2Vp2aBSrlhALG/0BVHUhWi4\n
F/HHJho+ncLHAg5AGO0sdAjYUdQG6tfPqjLsIALtoKEZZdFe/JhmqOEaxWsSdu2S2RdPgC\n
QOsP79EH58gXwu2gejCkJDmU22WL4YLuqOc17nxbDC8CAwEAATANBgkqhkiG9w0BAQQFAA\n
OBgQCv4vMD+PMlfnftu4/6Yf/oMLE8yCOqZTQ/dWCxB9PiJnOefiBeSzSZE6Uv3G7qnblZ\n
PVZaFeJMd+ostt0viCyPucFsFgLMyyoV1dMVPVwJT5Iq1AHehWXnTBbxUK9wioA5jOEKdr\n
oKjuSSsg/Q8Wx6cpJmttQz5olGPgstmACRWA==\n
-----END CERTIFICATE----- \n
trailing junk" },
{ "GUID": "{bad-server-cert}",
"Type": "Server",
"X509": "leading junk \n
-----BEGIN CERTIFICATE----- \n
!!!!
MIICWDCCAcECAxAAATANBgkqhkiG9w0BAQQFADCBkzEVMBMGA1UEChMMR29vZ2xlLCBJbm\n
MuMREwDwYDVQQLEwhDaHJvbWVPUzEiMCAGCSqGSIb3DQEJARYTZ3NwZW5jZXJAZ29vZ2xl\n
LmNvbTEaMBgGA1UEBxMRTW91bnRhaW4gVmlldywgQ0ExCzAJBgNVBAgTAkNBMQswCQYDVQ\n
QGEwJVUzENMAsGA1UEAxMEbG1hbzAeFw0xMTAzMTYyMzQ5MzhaFw0xMjAzMTUyMzQ5Mzha\n
MFMxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEVMBMGA1UEChMMR29vZ2xlLCBJbmMuMR\n
EwDwYDVQQLEwhDaHJvbWVPUzENMAsGA1UEAxMEbG1hbzCBnzANBgkqhkiG9w0BAQEFAAOB\n
jQAwgYkCgYEA31WiJ9LvprrhKtDlW0RdLFAO7Qjkvs+sG6j2Vp2aBSrlhALG/0BVHUhWi4\n
F/HHJho+ncLHAg5AGO0sdAjYUdQG6tfPqjLsIALtoKEZZdFe/JhmqOEaxWsSdu2S2RdPgC\n
QOsP79EH58gXwu2gejCkJDmU22WL4YLuqOc17nxbDC8CAwEAATANBgkqhkiG9w0BAQQFAA\n
OBgQCv4vMD+PMlfnftu4/6Yf/oMLE8yCOqZTQ/dWCxB9PiJnOefiBeSzSZE6Uv3G7qnblZ\n
PVZaFeJMd+ostt0viCyPucFsFgLMyyoV1dMVPVwJT5Iq1AHehWXnTBbxUK9wioA5jOEKdr\n
oKjuSSsg/Q8Wx6cpJmttQz5olGPgstmACRWA==\n
-----END CERTIFICATE----- \n
trailing junk" }
])";
std::unique_ptr<OncParsedCertificates> onc_parsed_certificates =
ReadFromJSON(onc_certificates_json);
ASSERT_TRUE(onc_parsed_certificates);
EXPECT_TRUE(onc_parsed_certificates->has_error());
EXPECT_EQ(1u,
onc_parsed_certificates->server_or_authority_certificates().size());
EXPECT_EQ(0u, onc_parsed_certificates->client_certificates().size());
const OncParsedCertificates::ServerOrAuthorityCertificate& server_cert =
onc_parsed_certificates->server_or_authority_certificates()[0];
EXPECT_EQ(OncParsedCertificates::ServerOrAuthorityCertificate::Type::kServer,
server_cert.type());
EXPECT_EQ("{good-server-cert}", server_cert.guid());
EXPECT_FALSE(server_cert.web_trust_requested());
EXPECT_EQ("lmao", server_cert.certificate()->issuer().common_name);
}
TEST_F(OncParsedCertificatesTest, EqualityChecks) {
const char onc_certificates_json[] = R"(
[
{ "GUID": "{f998f760-272b-6939-4c2beffe428697ac}",
"PKCS12": "YWJj",
"Type": "Client" },
{ "GUID": "{authority-cert}",
"TrustBits": [
"Web"
],
"Type": "Authority",
"X509": "-----BEGIN CERTIFICATE-----\n
MIIC8zCCAdugAwIBAgIJALF9qhLor0+aMA0GCSqGSIb3DQEBBQUAMBcxFTATBgNV\n
BAMMDFRlc3QgUm9vdCBDQTAeFw0xNDA4MTQwMzA1MjlaFw0yNDA4MTEwMzA1Mjla\n
MBcxFTATBgNVBAMMDFRlc3QgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\n
ADCCAQoCggEBALZJQeNCAVGofzx6cdP7zZE1F4QajvY2x9FwHfqG8267dm/oMi43\n
/TiSPWjkin1CMxRGG9wE9pFuVEDECgn97C1i4l7huiycwbFgTNrH+CJcgiBlQh5W\n
d3VP65AsSupXDiKNbJWsEerM1+72cA0J3aY1YV3Jdm2w8h6/MIbYd1I2lZcO0UbF\n
7YE9G7DyYZU8wUA4719dumGf7yucn4WJdHBj1XboNX7OAeHzERGQHA31/Y3OEGyt\n
fFUaIW/XLfR4FeovOL2RnjwdB0b1Q8GCi68SU2UZimlpZgay2gv6KgChKhWESfEB\n
v5swBtAVoB+dUZFH4VNf717swmF5whSfxOMCAwEAAaNCMEAwDwYDVR0TAQH/BAUw\n
AwEB/zAdBgNVHQ4EFgQUvPcw0TzA8nn675/JbFyT84poq4MwDgYDVR0PAQH/BAQD\n
AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBXByn7f+j/sObYWGrDkKE4HLTzaLHs6Ikj\n
JNeo8iHDYOSkSVwAv9/HgniAKxj3rd3QYl6nsMzwqrTOcBJZZWd2BQAYmv/EKhfj\n
8VXYvlxe68rLU4cQ1QkyNqdeQfRT2n5WYNJ+TpqlCF9ddennMMsi6e8ZSYOlI6H4\n
YEzlNtU5eBjxXr/OqgtTgSx4qQpr2xMQIRR/G3A9iRpAigYsXVAZYvnHRYnyPWYF\n
PX11W1UegEJyoZp8bQp09u6mIWw6mPt3gl/ya1bm3ZuOUPDGrv3qpgUHqSYGVrOy\n
2bI3oCE+eQYfuVG+9LFJTZC1M+UOx15bQMVqBNFDepRqpE9h/ILg\n
-----END CERTIFICATE-----" }
])";
absl::optional<base::Value> onc_certificates =
base::JSONReader::Read(onc_certificates_json);
ASSERT_TRUE(onc_certificates);
ASSERT_TRUE(onc_certificates->is_list());
OncParsedCertificates authority_and_client_certs(onc_certificates->GetList());
EXPECT_EQ(authority_and_client_certs.server_or_authority_certificates(),
authority_and_client_certs.server_or_authority_certificates());
EXPECT_EQ(authority_and_client_certs.client_certificates(),
authority_and_client_certs.client_certificates());
// Mangle the TrustBits part and assume that authorities will not be equal
// anymore.
{
base::Value::List authority_web_trust_mangled =
onc_certificates->GetList().Clone();
base::Value::List* trust_bits =
authority_web_trust_mangled[1].GetDict().FindList("TrustBits");
ASSERT_TRUE(trust_bits);
(*trust_bits)[0] = base::Value("UnknownTrustBit");
OncParsedCertificates parsed_authority_web_trust_mangled(
authority_web_trust_mangled);
EXPECT_FALSE(parsed_authority_web_trust_mangled.has_error());
EXPECT_NE(
authority_and_client_certs.server_or_authority_certificates(),
parsed_authority_web_trust_mangled.server_or_authority_certificates());
EXPECT_EQ(authority_and_client_certs.client_certificates(),
parsed_authority_web_trust_mangled.client_certificates());
}
// Mangle the guid part of an authority certificate.
{
base::Value::List authority_guid_mangled =
onc_certificates->GetList().Clone();
authority_guid_mangled[1].GetDict().Set("GUID", "otherguid");
OncParsedCertificates parsed_authority_guid_mangled(authority_guid_mangled);
EXPECT_FALSE(parsed_authority_guid_mangled.has_error());
EXPECT_NE(authority_and_client_certs.server_or_authority_certificates(),
parsed_authority_guid_mangled.server_or_authority_certificates());
EXPECT_EQ(authority_and_client_certs.client_certificates(),
parsed_authority_guid_mangled.client_certificates());
}
// Mangle the type part of an authority certificate.
{
base::Value::List authority_type_mangled =
onc_certificates->GetList().Clone();
authority_type_mangled[1].GetDict().Set("Type", "Server");
OncParsedCertificates parsed_authority_type_mangled(authority_type_mangled);
EXPECT_FALSE(parsed_authority_type_mangled.has_error());
EXPECT_NE(authority_and_client_certs.server_or_authority_certificates(),
parsed_authority_type_mangled.server_or_authority_certificates());
EXPECT_EQ(authority_and_client_certs.client_certificates(),
parsed_authority_type_mangled.client_certificates());
}
// Mangle the X509 payload an authority certificate.
{
base::Value::List authority_x509_mangled =
onc_certificates->GetList().Clone();
authority_x509_mangled[1].GetDict().Set("X509", R"(
-----BEGIN CERTIFICATE-----
MIICWDCCAcECAxAAATANBgkqhkiG9w0BAQQFADCBkzEVMBMGA1
UEChMMR29vZ2xlLCBJbm
MuMREwDwYDVQQLEwhDaHJvbWVPUzEiMCAGCSqGSIb3DQEJARYT
Z3NwZW5jZXJAZ29vZ2xl
LmNvbTEaMBgGA1UEBxMRTW91bnRhaW4gVmlldywgQ0ExCzAJBg
NVBAgTAkNBMQswCQYDVQ
QGEwJVUzENMAsGA1UEAxMEbG1hbzAeFw0xMTAzMTYyMzQ5Mzha
Fw0xMjAzMTUyMzQ5Mzha
MFMxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEVMBMGA1UECh
MMR29vZ2xlLCBJbmMuMR
EwDwYDVQQLEwhDaHJvbWVPUzENMAsGA1UEAxMEbG1hbzCBnzAN
BgkqhkiG9w0BAQEFAAOB
jQAwgYkCgYEA31WiJ9LvprrhKtDlW0RdLFAO7Qjkvs+
sG6j2Vp2aBSrlhALG/0BVHUhWi4
F/HHJho+ncLHAg5AGO0sdAjYUdQG6tfPqjLsIALtoKEZZdFe/
JhmqOEaxWsSdu2S2RdPgC
QOsP79EH58gXwu2gejCkJDmU22WL4YLuqOc17nxbDC8CAwEAAT
ANBgkqhkiG9w0BAQQFAA
OBgQCv4vMD+PMlfnftu4/6Yf/oMLE8yCOqZTQ/
dWCxB9PiJnOefiBeSzSZE6Uv3G7qnblZ
PVZaFeJMd+
ostt0viCyPucFsFgLMyyoV1dMVPVwJT5Iq1AHehWXnTBbxUK9w
ioA5jOEKdr
oKjuSSsg/Q8Wx6cpJmttQz5olGPgstmACRWA==
-----END CERTIFICATE----- )");
OncParsedCertificates parsed_authority_x509_mangled(authority_x509_mangled);
EXPECT_FALSE(parsed_authority_x509_mangled.has_error());
EXPECT_NE(authority_and_client_certs.server_or_authority_certificates(),
parsed_authority_x509_mangled.server_or_authority_certificates());
EXPECT_EQ(authority_and_client_certs.client_certificates(),
parsed_authority_x509_mangled.client_certificates());
}
// Mangle the GUID of a client certificate.
{
base::Value::List client_guid_mangled = onc_certificates->GetList().Clone();
client_guid_mangled[0].GetDict().Set("GUID", "other-guid");
OncParsedCertificates parsed_client_guid_mangled(client_guid_mangled);
EXPECT_FALSE(parsed_client_guid_mangled.has_error());
EXPECT_EQ(authority_and_client_certs.server_or_authority_certificates(),
parsed_client_guid_mangled.server_or_authority_certificates());
EXPECT_NE(authority_and_client_certs.client_certificates(),
parsed_client_guid_mangled.client_certificates());
}
// Mangle the PKCS12 payload of a client certificate.
{
base::Value::List client_pkcs12_mangled =
onc_certificates->GetList().Clone();
client_pkcs12_mangled[0].GetDict().Set("PKCS12", "YQ==");
OncParsedCertificates parsed_client_pkcs12_mangled(client_pkcs12_mangled);
EXPECT_FALSE(parsed_client_pkcs12_mangled.has_error());
EXPECT_EQ(authority_and_client_certs.server_or_authority_certificates(),
parsed_client_pkcs12_mangled.server_or_authority_certificates());
EXPECT_NE(authority_and_client_certs.client_certificates(),
parsed_client_pkcs12_mangled.client_certificates());
}
}
} // namespace chromeos::onc