OLD | NEW |
(Empty) | |
| 1 /* |
| 2 * Copyright 2017 The WebRTC Project Authors. All rights reserved. |
| 3 * |
| 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ |
| 10 |
| 11 #include "rtc_base/opensslidentity.h" |
| 12 #include "rtc_base/gunit.h" |
| 13 #include "rtc_base/openssl.h" |
| 14 #include "rtc_base/ptr_util.h" |
| 15 |
| 16 using rtc::OpenSSLCertificate; |
| 17 using rtc::SSLCertChain; |
| 18 |
| 19 namespace { |
| 20 const char kCert1[] = |
| 21 "-----BEGIN CERTIFICATE-----\n" |
| 22 "MIIB8TCCAZugAwIBAgIJAL9GDdi6iSRZMA0GCSqGSIb3DQEBCwUAMFQxCzAJBgNV\n" |
| 23 "BAYTAlVTMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX\n" |
| 24 "aWRnaXRzIFB0eSBMdGQxDTALBgNVBAMMBFRFU1QwHhcNMTcwOTI3MTgwMzQ5WhcN\n" |
| 25 "MjcwOTI1MTgwMzQ5WjBUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKU29tZS1TdGF0\n" |
| 26 "ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMQ0wCwYDVQQDDARU\n" |
| 27 "RVNUMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMgT+ilZ4v5mKjZ+JWmNjPJZ4C6o\n" |
| 28 "T3y9+/0SRRW6+hlDrVcxOcmOsZlTDLotBBBrN2P0faUA/A4suPvHVQJVG40CAwEA\n" |
| 29 "AaNQME4wHQYDVR0OBBYEFM1kyOTdSRaP/1WI+IlNtsBE/B4+MB8GA1UdIwQYMBaA\n" |
| 30 "FM1kyOTdSRaP/1WI+IlNtsBE/B4+MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEL\n" |
| 31 "BQADQQABvqSHEQCo6vgZCJj6sCoDGe0i0eKeIcvKFxED8V0XideZYJe1631sjTf6\n" |
| 32 "rEMVuoAszWVBiIRlhfL2Ng7d2lFs\n" |
| 33 "-----END CERTIFICATE-----\n"; |
| 34 const char kCert2[] = |
| 35 "-----BEGIN CERTIFICATE-----\n" |
| 36 "MIIB8zCCAZ2gAwIBAgIJAM/U3cfUNJArMA0GCSqGSIb3DQEBCwUAMFUxCzAJBgNV\n" |
| 37 "BAYTAlVTMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX\n" |
| 38 "aWRnaXRzIFB0eSBMdGQxDjAMBgNVBAMMBVRFU1QyMB4XDTE3MDkyNzE4MDQxOFoX\n" |
| 39 "DTI3MDkyNTE4MDQxOFowVTELMAkGA1UEBhMCVVMxEzARBgNVBAgMClNvbWUtU3Rh\n" |
| 40 "dGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEOMAwGA1UEAwwF\n" |
| 41 "VEVTVDIwXDANBgkqhkiG9w0BAQEFAANLADBIAkEAxBhQ0F+T8ykg8qve7un4wso3\n" |
| 42 "8xWs1sCCIVaXmEbBL1boY33wFwcu+/e8ux+4QhMzoivd+1MH2vlKEyZ+06uNMwID\n" |
| 43 "AQABo1AwTjAdBgNVHQ4EFgQUsIfPUvDOqAbTVVRhaFvOiDz0NAgwHwYDVR0jBBgw\n" |
| 44 "FoAUsIfPUvDOqAbTVVRhaFvOiDz0NAgwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0B\n" |
| 45 "AQsFAANBAKjdk11ufKiL4glzBKDpO3VGUGTbvSgftgD53DYbFzFKpxlXosO9BClR\n" |
| 46 "bblOKyeuExziGR0hAQZVgiZFL+66gYw=\n" |
| 47 "-----END CERTIFICATE-----\n"; |
| 48 |
| 49 const char kCert3[] = |
| 50 "-----BEGIN CERTIFICATE-----\n" |
| 51 "MIIEUjCCAjqgAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBljELMAkGA1UEBhMCVVMx\n" |
| 52 "EzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxFDAS\n" |
| 53 "BgNVBAoMC0dvb2dsZSwgSW5jMQwwCgYDVQQLDANHVFAxFzAVBgNVBAMMDnRlbGVw\n" |
| 54 "aG9ueS5nb29nMR0wGwYJKoZIhvcNAQkBFg5ndHBAZ29vZ2xlLmNvbTAeFw0xNzA5\n" |
| 55 "MjYwNDA5MDNaFw0yMDA2MjIwNDA5MDNaMGQxCzAJBgNVBAYTAlVTMQswCQYDVQQI\n" |
| 56 "DAJDQTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEXMBUGA1UECgwOdGVsZXBob255\n" |
| 57 "Lmdvb2cxFzAVBgNVBAMMDnRlbGVwaG9ueS5nb29nMIGfMA0GCSqGSIb3DQEBAQUA\n" |
| 58 "A4GNADCBiQKBgQDJXWeeU1v1+wlqkVobzI3aN7Uh2iVQA9YCdq5suuabtiD/qoOD\n" |
| 59 "NKpmQqsx7WZGGWSZTDFEBaUpvIK7Hb+nzRqk6iioPCFOFuarm6GxO1xVneImMuE6\n" |
| 60 "tuWb3YZPr+ikChJbl11y5UcSbg0QsbeUc+jHl5umNvrL85Y+z8SP0rxbBwIDAQAB\n" |
| 61 "o2AwXjAdBgNVHQ4EFgQU7tdZobqlN8R8V72FQnRxmqq8tKswHwYDVR0jBBgwFoAU\n" |
| 62 "5GgKMUtcxkQ2dJrtNR5YOlIAPDswDwYDVR0TAQH/BAUwAwEB/zALBgNVHQ8EBAMC\n" |
| 63 "AQYwDQYJKoZIhvcNAQELBQADggIBADObh9Z+z14FmP9zSenhFtq7hFnmNrSkklk8\n" |
| 64 "eyYWXKfOuIriEQQBZsz76ZcnzStih8Rj+yQ0AXydk4fJ5LOwC2cUqQBar17g6Pd2\n" |
| 65 "8g4SIL4azR9WvtiSvpuGlwp25b+yunaacDne6ebnf/MUiiKT5w61Xo3cEPVfl38e\n" |
| 66 "/Up2l0bioid5enUTmg6LY6RxDO6tnZQkz3XD+nNSwT4ehtkqFpHYWjErj0BbkDM2\n" |
| 67 "hiVc/JsYOZn3DmuOlHVHU6sKwqh3JEyvHO/d7DGzMGWHpHwv2mCTJq6l/sR95Tc2\n" |
| 68 "GaQZgGDVNs9pdEouJCDm9e/PbQWRYhnat82PTkXx/6mDAAwdZlIi/pACzq8K4p7e\n" |
| 69 "6hF0t8uKGnXJubHPXxlnJU6yxZ0yWmivAGjwWK4ur832gKlho4jeMDhiI/T3QPpl\n" |
| 70 "iMNsIvxRhdD+GxJkQP1ezayw8s+Uc9KwKglrkBSRRDLCJUfPOvMmXLUDSTMX7kp4\n" |
| 71 "/Ak1CA8dVLJIlfEjLBUuvAttlP7+7lsKNgxAjCxZkWLXIyGULzNPQwVWkGfCbrQs\n" |
| 72 "XyMvSbFsSIb7blV7eLlmf9a+2RprUUkc2ALXLLCI9YQXmxm2beBfMyNmmebwBJzT\n" |
| 73 "B0OR+5pFFNTJPoNlqpdrDsGrDu7JlUtk0ZLZzYyKXbgy2qXxfd4OWzXXjxpLMszZ\n" |
| 74 "LDIpOAkj\n" |
| 75 "-----END CERTIFICATE-----\n"; |
| 76 } // namespace |
| 77 |
| 78 class OpenSSLCertificateTest : public testing::Test { |
| 79 public: |
| 80 OpenSSLCertificateTest() {} |
| 81 ~OpenSSLCertificateTest() {} |
| 82 |
| 83 void SetUp() override { |
| 84 leaf_cert = rtc::WrapUnique<OpenSSLCertificate>( |
| 85 OpenSSLCertificate::FromPEMString(kCert3)); |
| 86 int_cert1 = rtc::WrapUnique<OpenSSLCertificate>( |
| 87 OpenSSLCertificate::FromPEMString(kCert1)); |
| 88 int_cert2 = rtc::WrapUnique<OpenSSLCertificate>( |
| 89 OpenSSLCertificate::FromPEMString(kCert2)); |
| 90 x509s = sk_X509_new_null(); |
| 91 sk_X509_push(x509s, leaf_cert->x509()); |
| 92 sk_X509_push(x509s, int_cert1->x509()); |
| 93 sk_X509_push(x509s, int_cert2->x509()); |
| 94 } |
| 95 std::unique_ptr<OpenSSLCertificate> leaf_cert; |
| 96 std::unique_ptr<OpenSSLCertificate> int_cert1; |
| 97 std::unique_ptr<OpenSSLCertificate> int_cert2; |
| 98 |
| 99 STACK_OF(X509) * x509s; |
| 100 }; |
| 101 |
| 102 TEST_F(OpenSSLCertificateTest, OneCert) { |
| 103 auto leaf_cert = rtc::WrapUnique<OpenSSLCertificate>( |
| 104 OpenSSLCertificate::FromPEMString(kCert3)); |
| 105 std::unique_ptr<SSLCertChain> chain = leaf_cert->GetChain(); |
| 106 EXPECT_EQ(chain, nullptr); |
| 107 } |
| 108 |
| 109 TEST_F(OpenSSLCertificateTest, ThreeCert) { |
| 110 auto certificate = |
| 111 rtc::WrapUnique<OpenSSLCertificate>(new OpenSSLCertificate(x509s)); |
| 112 std::unique_ptr<SSLCertChain> chain = certificate->GetChain(); |
| 113 ASSERT_EQ(chain->GetSize(), (size_t)2); |
| 114 ASSERT_EQ(chain->Get(0).ToPEMString(), kCert1); |
| 115 ASSERT_EQ(chain->Get(1).ToPEMString(), kCert2); |
| 116 } |
| 117 |
| 118 TEST_F(OpenSSLCertificateTest, CompareCert) { |
| 119 auto cert1 = |
| 120 rtc::WrapUnique<OpenSSLCertificate>(new OpenSSLCertificate(x509s)); |
| 121 auto cert2 = |
| 122 rtc::WrapUnique<OpenSSLCertificate>(new OpenSSLCertificate(x509s)); |
| 123 auto cert3 = rtc::WrapUnique<OpenSSLCertificate>( |
| 124 new OpenSSLCertificate(sk_X509_value(x509s, 0))); |
| 125 ASSERT_TRUE(*cert1 == *cert2); |
| 126 ASSERT_TRUE(*cert1 != *cert3); |
| 127 } |
| 128 |
| 129 TEST_F(OpenSSLCertificateTest, ToPEMString) { |
| 130 auto cert1 = |
| 131 rtc::WrapUnique<OpenSSLCertificate>(new OpenSSLCertificate(x509s)); |
| 132 auto cert2 = rtc::WrapUnique<OpenSSLCertificate>( |
| 133 new OpenSSLCertificate(sk_X509_value(x509s, 0))); |
| 134 ASSERT_EQ(cert1->ToPEMString(), std::string(kCert3) + kCert1 + kCert2); |
| 135 ASSERT_EQ(cert2->ToPEMString(), kCert3); |
| 136 } |
| 137 |
| 138 TEST_F(OpenSSLCertificateTest, FromPEMString) { |
| 139 auto cert1 = rtc::WrapUnique<OpenSSLCertificate>( |
| 140 OpenSSLCertificate::FromPEMString(kCert1)); |
| 141 auto chain_cert2 = rtc::WrapUnique<OpenSSLCertificate>( |
| 142 OpenSSLCertificate::FromPEMString(std::string(kCert1) + kCert2)); |
| 143 ASSERT_EQ(cert1->ToPEMString(), kCert1); |
| 144 ASSERT_EQ(chain_cert2->GetChain()->GetSize(), (size_t)1); |
| 145 ASSERT_EQ(chain_cert2->GetChain()->Get(0).ToPEMString(), kCert2); |
| 146 } |
OLD | NEW |