CKM: Replace expired certificates with new ones
[platform/core/test/security-tests.git] / src / ckm / test-certs.cpp
1 /*
2  *  Copyright (c) 2015 - 2021 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  *  Licensed under the Apache License, Version 2.0 (the "License");
5  *  you may not use this file except in compliance with the License.
6  *  You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  *  Unless required by applicable law or agreed to in writing, software
11  *  distributed under the License is distributed on an "AS IS" BASIS,
12  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  *  See the License for the specific language governing permissions and
14  *  limitations under the License
15  */
16 /*
17  * @file       test-certs.cpp
18  * @author     Maciej J. Karpiuk (m.karpiuk2@samsung.com)
19  * @version    1.0
20  */
21
22 #include <map>
23 #include <memory>
24 #include <openssl/pem.h>
25 #include <openssl/bio.h>
26 #include <openssl/x509.h>
27 #include <test-certs.h>
28 #include <dpl/test/test_runner.h>
29 #include <dpl/test/test_runner_child.h>
30
31 using namespace std;
32
33 namespace TestData {
34 namespace {
35
36 enum RawCertificateID {
37     // test certificates
38     TEST_ROOT_CA = 0,    // TEST_ROOT_CA, expires 2035
39     TEST_IM_CA,          // TEST_IM_CA, signed by TEST_ROOT_CA, expires 2035
40     TEST_LEAF,           // TEST_LEAF, signed by TEST_IM_CA, expires 2035
41
42     // third party
43     BALTIMORE_CYBER_TRUST_ROOT,    // Baltimore CyberTrust Root, (root CA), expires May 13, 2025
44     MS_RSA_TLS_CA_01,    // Microsoft RSA TLS CA 01, signed by Baltimore CyberTrust Root,
45                          // expires Oct 8, 2024
46     MICROSOFT_COM,       // www.microsoft.com, signed by Microsoft RSA TLS CA 01,
47                          // expires Jul 28, 2022
48
49     // ocsp available chain on third party
50     MS_RSA_TLS_CA_02,    // Microsoft RSA TLS CA 02, signed by Baltimore CyberTrust Root,
51                          // expires Oct 8 2024
52     BING_COM,            // www.bing.com, signed by Microsoft RSA TLS CA 02,
53                          // expires Mar 30 2022,
54
55     // footer - last element in the set
56     NO_CERT
57 };
58
59
60 struct TestCert {
61     enum Validity {
62         UNKNOWN,
63         VALID,
64         NOT_YET_VALID,
65         EXPIRED
66     };
67
68     TestCert() : valid(UNKNOWN) {}
69
70     string raw_base64;
71     CKM::CertificateShPtr certPtr;
72     Validity valid;
73 };
74
75 typedef map<RawCertificateID, TestCert> CertMap;
76
77 CKM::CertificateShPtr createCert(const string& cert) {
78     CKM::RawBuffer buffer_cert(cert.begin(), cert.end());
79     CKM::CertificateShPtr cptr = CKM::Certificate::create(buffer_cert, CKM::DataFormat::FORM_PEM);
80     return cptr;
81 }
82
83 RawCertificateID toRawCertificateID(certificateID id)
84 {
85     switch (id) {
86     case certificateID::TEST_ROOT_CA:        return RawCertificateID::TEST_ROOT_CA;
87     case certificateID::TEST_IM_CA:          return RawCertificateID::TEST_IM_CA;
88     case certificateID::TEST_LEAF:           return RawCertificateID::TEST_LEAF;
89
90     case certificateID::THIRD_PARTY_ROOT_CA: return RawCertificateID::BALTIMORE_CYBER_TRUST_ROOT;
91     case certificateID::THIRD_PARTY_IM_CA:   return RawCertificateID::MS_RSA_TLS_CA_01;
92     case certificateID::THIRD_PARTY_LEAF:    return RawCertificateID::MICROSOFT_COM;
93
94     case certificateID::OCSP_AVAILABLE_IM:   return RawCertificateID::MS_RSA_TLS_CA_02;
95     case certificateID::OCSP_AVAILABLE_LEAF: return RawCertificateID::BING_COM;
96
97     case certificateID::NO_CERT:             return RawCertificateID::NO_CERT;
98     default: throw std::invalid_argument("Invalid raw certificat ID!");
99     }
100 }
101
102 CertMap initializeTestCerts()
103 {
104     CertMap cm;
105
106     // TEST_ROOT_CA, expires 2035
107     {
108         std::string raw_base64 = std::string(
109             "-----BEGIN CERTIFICATE-----\n"
110             "MIIDnzCCAoegAwIBAgIJAMH/ADkC5YSTMA0GCSqGSIb3DQEBBQUAMGYxCzAJBgNV\n"
111             "BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMQ0wCwYDVQQKDARBQ01FMRAwDgYD\n"
112             "VQQLDAdUZXN0aW5nMSEwHwYDVQQDDBhUZXN0IHJvb3QgY2EgY2VydGlmaWNhdGUw\n"
113             "HhcNMTQxMjMwMTcyMTUyWhcNMjQxMjI3MTcyMTUyWjBmMQswCQYDVQQGEwJBVTET\n"
114             "MBEGA1UECAwKU29tZS1TdGF0ZTENMAsGA1UECgwEQUNNRTEQMA4GA1UECwwHVGVz\n"
115             "dGluZzEhMB8GA1UEAwwYVGVzdCByb290IGNhIGNlcnRpZmljYXRlMIIBIjANBgkq\n"
116             "hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0EJRdUtd2th0vTVF7QxvDKzyFCF3w9vC\n"
117             "9IDE/Yr12w+a9jd0s7/eG96qTHIYffS3B7x2MB+d4n+SR3W0qmYh7xk8qfEgH3da\n"
118             "eDoV59IZ9r543KM+g8jm6KffYGX1bIJVVY5OhBRbO9nY6byYpd5kbCIUB6dCf7/W\n"
119             "rQl1aIdLGFIegAzPGFPXDcU6F192686x54bxt/itMX4agHJ9ZC/rrTBIZghVsjJo\n"
120             "5/AH5WZpasv8sfrGiiohAxtieoYoJkv5MOYP4/2lPlOY+Cgw1Yoz+HHv31AllgFs\n"
121             "BquBb/kJVmCCNsAOcnvQzTZUsW/TXz9G2nwRdqI1nSy2JvVjZGsqGQIDAQABo1Aw\n"
122             "TjAdBgNVHQ4EFgQUt6pkzFt1PZlfYRL/HGnufF4frdwwHwYDVR0jBBgwFoAUt6pk\n"
123             "zFt1PZlfYRL/HGnufF4frdwwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOC\n"
124             "AQEAld7Qwq0cdzDQ51w1RVLwTR8Oy25PB3rzwEHcSGJmdqlMi3xOdaz80S1R1BBX\n"
125             "ldvGBG5Tn0vT7xSuhmSgI2/HnBpy9ocHVOmhtNB4473NieEpfTYrnGXrFxu46Wus\n"
126             "9m/ZnugcQ2G6C54A/NFtvgLmaC8uH8M7gKdS6uYUwJFQEofkjmd4UpOYSqmcRXhS\n"
127             "Jzd5FYFWkJhKJYp3nlENSOD8CUFFVGekm05nFN2gRVc/qaqQkEX77+XYvhodLRsV\n"
128             "qMn7nf7taidDKLO2T4bhujztnTYOhhaXKgPy7AtZ28N2wvX96VyAPB/vrchGmyBK\n"
129             "kOg11TpPdNDkhb1J4ZCh2gupDg==\n"
130             "-----END CERTIFICATE-----\n");
131         cm[RawCertificateID::TEST_ROOT_CA].raw_base64 = raw_base64;
132         cm[RawCertificateID::TEST_ROOT_CA].certPtr = createCert(raw_base64);
133     }
134
135     // TEST_IM_CA, signed by TEST_ROOT_CA, expires 2035
136     {
137         std::string raw_base64 = std::string(
138             "-----BEGIN CERTIFICATE-----\n"
139             "MIIDljCCAn6gAwIBAgICEAAwDQYJKoZIhvcNAQEFBQAwZjELMAkGA1UEBhMCQVUx\n"
140             "EzARBgNVBAgMClNvbWUtU3RhdGUxDTALBgNVBAoMBEFDTUUxEDAOBgNVBAsMB1Rl\n"
141             "c3RpbmcxITAfBgNVBAMMGFRlc3Qgcm9vdCBjYSBjZXJ0aWZpY2F0ZTAeFw0xNTAx\n"
142             "MTYxNjQ1MzRaFw0zNTAxMTExNjQ1MzRaMGQxCzAJBgNVBAYTAkFVMRMwEQYDVQQI\n"
143             "DApTb21lLVN0YXRlMQ0wCwYDVQQKDARBQ01FMRAwDgYDVQQLDAdUZXN0aW5nMR8w\n"
144             "HQYDVQQDDBZUZXN0IElNIENBIGNlcnRpZmljYXRlMIIBIjANBgkqhkiG9w0BAQEF\n"
145             "AAOCAQ8AMIIBCgKCAQEAzmBF78qClgoKfnLAncMXZwZ14TW+5kags1+QCYeg3c7j\n"
146             "L9+RvDxIaX2tKf1sukJcwQfYqUlQkwt+58LMOb2ORtkpj8Or6WCWCZ0BzneT8ug7\n"
147             "nxJT4m9+bohMF0JoKjjB2H4KNMHamLIwUxRKt6nyfk81kVhJOi2vzzxd+UCPi6Pc\n"
148             "UAbJNH48eNgOIg55nyFovVzYj8GIo/9GvHJj83PPa/KlJZ+Z1qZASZZ/VYorplVT\n"
149             "thsHXKfejhFy5YJ9t7n/vyAQsyBsagZsvX19xnH41fbYXHKf8UbXG23rNaZlchs6\n"
150             "XJVLQdzOpj3WTj/lCocVHqLaZISLhNQ3aI7kUBUdiwIDAQABo1AwTjAdBgNVHQ4E\n"
151             "FgQUoCYNaCBP4jl/3SYQuK8Ka+6i3QEwHwYDVR0jBBgwFoAUt6pkzFt1PZlfYRL/\n"
152             "HGnufF4frdwwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAjRzWiD97\n"
153             "Htv4Kxpm3P+C+xP9AEteCJfO+7p8MWgtWEJOknJyt55zeKS2JwZIq57KcbqD8U7v\n"
154             "vAUx1ymtUhlFPFd7J1mJ3pou+3aFYmGShYhGHpbrmUwjp7HVP588jrW1NoZVHdMc\n"
155             "4OgJWFrViXeu9+maIcekjMB/+9Y0dUgQuK5ZuT5H/Jwet7Th/o9uufTUZjBzRvrB\n"
156             "pbXgQpqgME2av4Q/6LuldPCTHLtWXgFUU2R+yCGmuGilvhFJnKoQryAbYnIQNWE8\n"
157             "SLoHQ9s1i7Zyb7HU6UAaqMOz15LBkyAqtNyJcO2p7Q/p5YK0xfD4xisI5qXucqVm\n"
158             "F2obL5qJSTN/RQ==\n"
159             "-----END CERTIFICATE-----\n");
160         cm[RawCertificateID::TEST_IM_CA].raw_base64 = raw_base64;
161         cm[RawCertificateID::TEST_IM_CA].certPtr = createCert(raw_base64);
162     }
163
164     // TEST_LEAF, signed by TEST_IM_CA, expires 2035
165     {
166         std::string raw_base64 = std::string(
167             "-----BEGIN CERTIFICATE-----\n"
168             "MIIDOzCCAiMCAQEwDQYJKoZIhvcNAQEFBQAwZDELMAkGA1UEBhMCQVUxEzARBgNV\n"
169             "BAgMClNvbWUtU3RhdGUxDTALBgNVBAoMBEFDTUUxEDAOBgNVBAsMB1Rlc3Rpbmcx\n"
170             "HzAdBgNVBAMMFlRlc3QgSU0gQ0EgY2VydGlmaWNhdGUwHhcNMTUwMTE2MTY0ODE0\n"
171             "WhcNMzUwMTExMTY0ODE0WjBjMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1T\n"
172             "dGF0ZTENMAsGA1UECgwEQUNNRTEQMA4GA1UECwwHVGVzdGluZzEeMBwGA1UEAwwV\n"
173             "VGVzdCBsZWFmIGNlcnRpZmljYXRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\n"
174             "CgKCAQEAzTdDIa2tDmRxFnIgiG+mBz8GoSVODs0ImNQGbqj+pLhBOFRH8fsah4Jl\n"
175             "z5YF9KwhMVLknnHGFLE/Nb7Ac35kEzhMQMpTRxohW83oxw3eZ8zN/FBoKqg4qHRq\n"
176             "QR8kS10YXTgrBR0ex/Vp+OUKEw6h7yL2r4Tpvrn9/qHwsxtLxqWbDIVf1O9b1Lfc\n"
177             "bllYMdmV5E62yN5tcwrDP8gvHjFnVeLzrG8wTpc9FR90/0Jkfp5jAJcArOBLrT0E\n"
178             "4VRqs+4HuwT8jAwFAmNnc7IYX5qSjtSWkmmHe73K/lzB+OiI0JEc/3eWUTWqwTSk\n"
179             "4tNCiQGBKJ39LXPTBBJdzmxVH7CUDQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQAp\n"
180             "UdDOGu3hNiG+Vn10aQ6B1ZmOj3t+45gUV3sC+y8hB8EK1g4P5Ke9bVDts0T5eOnj\n"
181             "CSc+6VoND5O4adI0IFFRFljHNVnvjeosHfUZNnowsmA2ptQBtC1g5ZKRvKXlkC5/\n"
182             "i5BGgRqPFA7y9WB9Y05MrJHf3E+Oz/RBsLeeNiNN+rF5X1vYExvGHpo0M0zS0ze9\n"
183             "HtC0aOy8ocsTrQkf3ceHTAXx2i8ftoSSD4klojtWFpWMrNQa52F7wB9nU6FfKRuF\n"
184             "Zj/T1JkYXKkEwZU6nAR2jdZp3EP9xj3o15V/tyFcXHx6l8NTxn4cJb+Xe4VquQJz\n"
185             "6ON7PVe0ABN/AlwVQiFE\n"
186             "-----END CERTIFICATE-----\n");
187         cm[RawCertificateID::TEST_LEAF].raw_base64 = raw_base64;
188         cm[RawCertificateID::TEST_LEAF].certPtr = createCert(raw_base64);
189     }
190
191     // Baltimore CyberTrust Root, (root CA), expires May 13, 2025
192     {
193         std::string raw_base64 = std::string(
194             "-----BEGIN CERTIFICATE-----\n"
195             "MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ\n"
196             "RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD\n"
197             "VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX\n"
198             "DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y\n"
199             "ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy\n"
200             "VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr\n"
201             "mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr\n"
202             "IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK\n"
203             "mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu\n"
204             "XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy\n"
205             "dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye\n"
206             "jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1\n"
207             "BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3\n"
208             "DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92\n"
209             "9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx\n"
210             "jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0\n"
211             "Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz\n"
212             "ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS\n"
213             "R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp\n"
214             "-----END CERTIFICATE-----\n");
215         cm[RawCertificateID::BALTIMORE_CYBER_TRUST_ROOT].raw_base64 = raw_base64;
216         cm[RawCertificateID::BALTIMORE_CYBER_TRUST_ROOT].certPtr = createCert(raw_base64);
217     }
218
219     // Microsoft RSA TLS CA 01, signed by Baltimore CyberTrust Root, expires Oct 8, 2024
220     {
221         std::string raw_base64 = std::string(
222             "-----BEGIN CERTIFICATE-----\n"
223             "MIIFWjCCBEKgAwIBAgIQDxSWXyAgaZlP1ceseIlB4jANBgkqhkiG9w0BAQsFADBa\n"
224             "MQswCQYDVQQGEwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJl\n"
225             "clRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTIw\n"
226             "MDcyMTIzMDAwMFoXDTI0MTAwODA3MDAwMFowTzELMAkGA1UEBhMCVVMxHjAcBgNV\n"
227             "BAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEgMB4GA1UEAxMXTWljcm9zb2Z0IFJT\n"
228             "QSBUTFMgQ0EgMDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqYnfP\n"
229             "mmOyBoTzkDb0mfMUUavqlQo7Rgb9EUEf/lsGWMk4bgj8T0RIzTqk970eouKVuL5R\n"
230             "IMW/snBjXXgMQ8ApzWRJCZbar879BV8rKpHoAW4uGJssnNABf2n17j9TiFy6BWy+\n"
231             "IhVnFILyLNK+W2M3zK9gheiWa2uACKhuvgCca5Vw/OQYErEdG7LBEzFnMzTmJcli\n"
232             "W1iCdXby/vI/OxbfqkKD4zJtm45DJvC9Dh+hpzqvLMiK5uo/+aXSJY+SqhoIEpz+\n"
233             "rErHw+uAlKuHFtEjSeeku8eR3+Z5ND9BSqc6JtLqb0bjOHPm5dSRrgt4nnil75bj\n"
234             "c9j3lWXpBb9PXP9Sp/nPCK+nTQmZwHGjUnqlO9ebAVQD47ZisFonnDAmjrZNVqEX\n"
235             "F3p7laEHrFMxttYuD81BdOzxAbL9Rb/8MeFGQjE2Qx65qgVfhH+RsYuuD9dUw/3w\n"
236             "ZAhq05yO6nk07AM9c+AbNtRoEcdZcLCHfMDcbkXKNs5DJncCqXAN6LhXVERCw/us\n"
237             "G2MmCMLSIx9/kwt8bwhUmitOXc6fpT7SmFvRAtvxg84wUkg4Y/Gx++0j0z6StSeN\n"
238             "0EJz150jaHG6WV4HUqaWTb98Tm90IgXAU4AW2GBOlzFPiU5IY9jt+eXC2Q6yC/Zp\n"
239             "TL1LAcnL3Qa/OgLrHN0wiw1KFGD51WRPQ0Sh7QIDAQABo4IBJTCCASEwHQYDVR0O\n"
240             "BBYEFLV2DDARzseSQk1Mx1wsyKkM6AtkMB8GA1UdIwQYMBaAFOWdWTCCR1jMrPoI\n"
241             "VDaGezq1BE3wMA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYI\n"
242             "KwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADA0BggrBgEFBQcBAQQoMCYwJAYI\n"
243             "KwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTA6BgNVHR8EMzAxMC+g\n"
244             "LaArhilodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vT21uaXJvb3QyMDI1LmNybDAq\n"
245             "BgNVHSAEIzAhMAgGBmeBDAECATAIBgZngQwBAgIwCwYJKwYBBAGCNyoBMA0GCSqG\n"
246             "SIb3DQEBCwUAA4IBAQCfK76SZ1vae4qt6P+dTQUO7bYNFUHR5hXcA2D59CJWnEj5\n"
247             "na7aKzyowKvQupW4yMH9fGNxtsh6iJswRqOOfZYC4/giBO/gNsBvwr8uDW7t1nYo\n"
248             "DYGHPpvnpxCM2mYfQFHq576/TmeYu1RZY29C4w8xYBlkAA8mDJfRhMCmehk7cN5F\n"
249             "JtyWRj2cZj/hOoI45TYDBChXpOlLZKIYiG1giY16vhCRi6zmPzEwv+tk156N6cGS\n"
250             "Vm44jTQ/rs1sa0JSYjzUaYngoFdZC4OfxnIkQvUIA4TOFmPzNPEFdjcZsgbeEz4T\n"
251             "cGHTBPK4R28F44qIMCtHRV55VMX53ev6P3hRddJb\n"
252             "-----END CERTIFICATE-----\n"
253             );
254         cm[RawCertificateID::MS_RSA_TLS_CA_01].raw_base64 = raw_base64;
255         cm[RawCertificateID::MS_RSA_TLS_CA_01].certPtr = createCert(raw_base64);
256     }
257
258     // www.microsoft.com, signed by Microsoft RSA TLS CA 01, expires Jul 28, 2022
259     {
260         std::string raw_base64 = std::string(
261             "-----BEGIN CERTIFICATE-----\n"
262             "MIII9DCCBtygAwIBAgITEgAU8ewjldVv3MTctwAAABTx7DANBgkqhkiG9w0BAQsF\n"
263             "ADBPMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u\n"
264             "MSAwHgYDVQQDExdNaWNyb3NvZnQgUlNBIFRMUyBDQSAwMTAeFw0yMTA3MjgyMTIy\n"
265             "MDZaFw0yMjA3MjgyMTIyMDZaMIGIMQswCQYDVQQGEwJVUzELMAkGA1UECBMCV0Ex\n"
266             "EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv\n"
267             "bjEeMBwGA1UECxMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMRowGAYDVQQDExF3d3cu\n"
268             "bWljcm9zb2Z0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMnE\n"
269             "YTuMHAC05tDE3Xeql1wP18DqLF1YZ6z6vsnmS9FQg5HhjYW9d5JEpxldYfA26Rmu\n"
270             "SjzBnPIV6C9TsxSasdijXzMBGBXLMRN1Lqo8t+ULT0JAsmt0TjvhGTk7qAWOxx5W\n"
271             "gbEA+hZP12P1glre2E5LGORyf3/HDDHDJpoyVrJQcXTTxGGFrUaz8BxpSxnk3+p+\n"
272             "/b2hPxO70jt3vqtpgS+dJa9j9CsGm5f6QZdYFCNVL3HNk4ji36dQZd3Z01jjddgn\n"
273             "8eqG220HvEDL+tJY+q9/iz0fLd+rcDO/igCgpEfM3/gmz4b9xUB1MfexdFNX8zxq\n"
274             "7HBedJTQOSrYbcEupCMCAwEAAaOCBI0wggSJMIIBfAYKKwYBBAHWeQIEAgSCAWwE\n"
275             "ggFoAWYAdQApeb7wnjk5IfBWc59jpXflvld9nGAK+PlNXSZcJV3HhAAAAXrvCDQo\n"
276             "AAAEAwBGMEQCIGsG4F9acHkVtLDESPJxtX8xga3P+ib5mF86uhDdHdQyAiAIlmPH\n"
277             "81f0tFDjOT3QypOpS6W95Wv4AB7QpxQPkX5R+wB1AEHIyrHfIkZKEMahOglCh15O\n"
278             "MYsbA+vrS8do8JBilgb2AAABeu8INBYAAAQDAEYwRAIgYLmw/lgwOh/iFUG+ghFb\n"
279             "jH9odXbXMn9pH+6aoOwNpJoCIFOT/s390eZjaTM99x3B+7aF2iah+3NbIVRIO7eU\n"
280             "gCUJAHYARqVV63X6kSAwtaKJafTzfREsQXS+/Um4havy/HD+bUcAAAF67wg0VQAA\n"
281             "BAMARzBFAiEAvkCi3Cm3jnqCQFRVP4cinZcVZbMVsIsCdWq17Ql9W7gCIFsGi8PI\n"
282             "T+LMgAOXRfRyq4o5ffWlrF3RKPjpFm1XmcvaMCcGCSsGAQQBgjcVCgQaMBgwCgYI\n"
283             "KwYBBQUHAwIwCgYIKwYBBQUHAwEwPQYJKwYBBAGCNxUHBDAwLgYmKwYBBAGCNxUI\n"
284             "h9qGdYPu2QGCyYUbgbWeYYX062CBXbn4EIaR0HgCAWQCASUwgYcGCCsGAQUFBwEB\n"
285             "BHsweTBTBggrBgEFBQcwAoZHaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9t\n"
286             "c2NvcnAvTWljcm9zb2Z0JTIwUlNBJTIwVExTJTIwQ0ElMjAwMS5jcnQwIgYIKwYB\n"
287             "BQUHMAGGFmh0dHA6Ly9vY3NwLm1zb2NzcC5jb20wHQYDVR0OBBYEFAkmLKnc/2OR\n"
288             "QOdYZ+IIP3T26vFlMA4GA1UdDwEB/wQEAwIEsDCBmQYDVR0RBIGRMIGOghVwcml2\n"
289             "YWN5Lm1pY3Jvc29mdC5jb22CEWMucy1taWNyb3NvZnQuY29tgg1taWNyb3NvZnQu\n"
290             "Y29tghFpLnMtbWljcm9zb2Z0LmNvbYIYc3RhdGljdmlldy5taWNyb3NvZnQuY29t\n"
291             "ghF3d3cubWljcm9zb2Z0LmNvbYITd3d3cWEubWljcm9zb2Z0LmNvbTCBsAYDVR0f\n"
292             "BIGoMIGlMIGioIGfoIGchk1odHRwOi8vbXNjcmwubWljcm9zb2Z0LmNvbS9wa2kv\n"
293             "bXNjb3JwL2NybC9NaWNyb3NvZnQlMjBSU0ElMjBUTFMlMjBDQSUyMDAxLmNybIZL\n"
294             "aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9tc2NvcnAvY3JsL01pY3Jvc29m\n"
295             "dCUyMFJTQSUyMFRMUyUyMENBJTIwMDEuY3JsMFcGA1UdIARQME4wQgYJKwYBBAGC\n"
296             "NyoBMDUwMwYIKwYBBQUHAgEWJ2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kv\n"
297             "bXNjb3JwL2NwczAIBgZngQwBAgIwHwYDVR0jBBgwFoAUtXYMMBHOx5JCTUzHXCzI\n"
298             "qQzoC2QwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMA0GCSqGSIb3DQEB\n"
299             "CwUAA4ICAQAVMIWmZCVQqfj7bJx9qruDL8/ylrr3axGTW38+QbP7a+705e8piKYA\n"
300             "oSLpwDnWs00JzLLfe55xE7b3veY5q88ZAcQfB34tvewp+2rYvTcvPq641TXloQlJ\n"
301             "an/90VgkCa2YsbSwWg4uldv0fjvbdZmRvm/fofrR45ySK8KK1SsNJ1Aa/3wuNCyj\n"
302             "L03dT3tf2pDymMaNj3PamyjClHsdYcWop3ZBbM/PiL0pY/a0YsqIUsUkpK93yC4E\n"
303             "+IkZkQDEEAeZHzoHlZv2moJSKL357z1wqS2tDTNGpX8NBvudKkUlnShJfu6MFn1m\n"
304             "vXONhYfpYpJ5t0DxFwhahPS7MKmp/sz7A5fO8b/nvyvwohvHHlI502Np7LdRWE1J\n"
305             "7bNmOcCK/gGVWU2VtZUyhJwGN104Aba61Jn8+mds8JagLPAwiB2Si7M1sfKHpacC\n"
306             "GTeO2N8v8WaBQw/hFLnXlV6c8C8QrYLWLxlmM+6pAlm9fHVU4RESJFseMJiJ66US\n"
307             "bKVIwfysnXZseCb5gbVI8v3d/qpPZSkpKfLs47spTDVKEqSBr8a2evyRJFzIZZ0v\n"
308             "MW9by1fTuByXk82Uyz6/MQ4x0Z/zflGSOyozpZFli7FMFbh4+Fpg6s5RgWVVep96\n"
309             "h4MER2f+ulxJ3j9wUxCa/BR6St/Ck6ZO+FL676uHMx3NMrrSVltSuA==\n"
310             "-----END CERTIFICATE-----\n"
311             );
312         cm[RawCertificateID::MICROSOFT_COM].raw_base64 = raw_base64;
313         cm[RawCertificateID::MICROSOFT_COM].certPtr = createCert(raw_base64);
314     }
315
316     // Microsoft RSA TLS CA 02, signed by Baltimore CyberTrust Root, expires 8 Oct 2024
317     {
318         std::string raw_base64(
319             "-----BEGIN CERTIFICATE-----\n"
320             "MIIFWjCCBEKgAwIBAgIQD6dHIsU9iMgPWJ77H51KOjANBgkqhkiG9w0BAQsFADBa\n"
321             "MQswCQYDVQQGEwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJl\n"
322             "clRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTIw\n"
323             "MDcyMTIzMDAwMFoXDTI0MTAwODA3MDAwMFowTzELMAkGA1UEBhMCVVMxHjAcBgNV\n"
324             "BAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEgMB4GA1UEAxMXTWljcm9zb2Z0IFJT\n"
325             "QSBUTFMgQ0EgMDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQD0wBlZ\n"
326             "qiokfAYhMdHuEvWBapTj9tFKL+NdsS4pFDi8zJVdKQfR+F039CDXtD9YOnqS7o88\n"
327             "+isKcgOeQNTri472mPnn8N3vPCX0bDOEVk+nkZNIBA3zApvGGg/40Thv78kAlxib\n"
328             "MipsKahdbuoHByOB4ZlYotcBhf/ObUf65kCRfXMRQqOKWkZLkilPPn3zkYM5GHxe\n"
329             "I4MNZ1SoKBEoHa2E/uDwBQVxadY4SRZWFxMd7ARyI4Cz1ik4N2Z6ALD3MfjAgEED\n"
330             "woknyw9TGvr4PubAZdqU511zNLBoavar2OAVTl0Tddj+RAhbnX1/zypqk+ifv+d3\n"
331             "CgiDa8Mbvo1u2Q8nuUBrKVUmR6EjkV/dDrIsUaU643v/Wp/uE7xLDdhC5rplK9si\n"
332             "NlYohMTMKLAkjxVeWBWbQj7REickISpc+yowi3yUrO5lCgNAKrCNYw+wAfAvhFkO\n"
333             "eqPm6kP41IHVXVtGNC/UogcdiKUiR/N59IfYB+o2v54GMW+ubSC3BohLFbho/oZZ\n"
334             "5XyulIZK75pwTHmauCIeE5clU9ivpLwPTx9b0Vno9+ApElrFgdY0/YKZ46GfjOC9\n"
335             "ta4G25VJ1WKsMmWLtzyrfgwbYopquZd724fFdpvsxfIvMG5m3VFkThOqzsOttDcU\n"
336             "fyMTqM2pan4txG58uxNJ0MjR03UCEULRU+qMnwIDAQABo4IBJTCCASEwHQYDVR0O\n"
337             "BBYEFP8vf+EG9DjzLe0ljZjC/g72bPz6MB8GA1UdIwQYMBaAFOWdWTCCR1jMrPoI\n"
338             "VDaGezq1BE3wMA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYI\n"
339             "KwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADA0BggrBgEFBQcBAQQoMCYwJAYI\n"
340             "KwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTA6BgNVHR8EMzAxMC+g\n"
341             "LaArhilodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vT21uaXJvb3QyMDI1LmNybDAq\n"
342             "BgNVHSAEIzAhMAgGBmeBDAECATAIBgZngQwBAgIwCwYJKwYBBAGCNyoBMA0GCSqG\n"
343             "SIb3DQEBCwUAA4IBAQCg2d165dQ1tHS0IN83uOi4S5heLhsx+zXIOwtxnvwCWdOJ\n"
344             "3wFLQaFDcgaMtN79UjMIFVIUedDZBsvalKnx+6l2tM/VH4YAyNPx+u1LFR0joPYp\n"
345             "QYLbNYkedkNuhRmEBesPqj4aDz68ZDI6fJ92sj2q18QvJUJ5Qz728AvtFOat+Ajg\n"
346             "K0PFqPYEAviUKr162NB1XZJxf6uyIjUlnG4UEdHfUqdhl0R84mMtrYINksTzQ2sH\n"
347             "YM8fEhqICtTlcRLr/FErUaPUe9648nziSnA0qKH7rUZqP/Ifmbo+WNZSZG1BbgOh\n"
348             "lk+521W+Ncih3HRbvRBE0LWYT8vWKnfjgZKxwHwJ\n"
349             "-----END CERTIFICATE-----\n"
350             );
351         cm[RawCertificateID::MS_RSA_TLS_CA_02].raw_base64 = raw_base64;
352         cm[RawCertificateID::MS_RSA_TLS_CA_02].certPtr = createCert(raw_base64);
353     }
354
355     // www.bing.com, signed by Microsoft RSA TLS CA 02, expires Mar 30 2022
356     {
357         std::string raw_base64(
358             "-----BEGIN CERTIFICATE-----\n"
359             "MIINWzCCC0OgAwIBAgITfwAZY6zVenisR3gJUQAAABljrDANBgkqhkiG9w0BAQsF\n"
360             "ADBPMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u\n"
361             "MSAwHgYDVQQDExdNaWNyb3NvZnQgUlNBIFRMUyBDQSAwMjAeFw0yMTA5MzAwMTQz\n"
362             "MzhaFw0yMjAzMzAwMTQzMzhaMBcxFTATBgNVBAMTDHd3dy5iaW5nLmNvbTCCASIw\n"
363             "DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKSz9Gfo3qYZ0sgk/x5rvNFKwQYp\n"
364             "/woiK64gnejdGMn3GKA4uGQsxja3n15NKICSLe5WVmQxlxcXQF+kaaqqRcC5BoCD\n"
365             "2QSZNVh3ZhP9fEco4Q/t97sb+Kfv3cFacLG10eJcSxADW4OOkrbe6Mm8wmzcweiy\n"
366             "8ElKMzegwKB+YI/9u19OT2WObdSM9GKDSVJIw4TXI3IEvQa0PyPIk2A+LiYN01D7\n"
367             "tTjtNMuntFJrer7bHsbrmrJu9iVUdqRYg3Axg+pXuEt23kcH67a2m7fNDI+S8w3g\n"
368             "q21e4iBtWPJ2ef8bUUivN3aeS9Cr9ZY4rEUVNDTnICoezxvAbLW+eC5jjmUCAwEA\n"
369             "AaOCCWYwggliMIIBfwYKKwYBBAHWeQIEAgSCAW8EggFrAWkAdQApeb7wnjk5IfBW\n"
370             "c59jpXflvld9nGAK+PlNXSZcJV3HhAAAAXw0aE91AAAEAwBGMEQCID8MejmGdRsi\n"
371             "JHS9XgDwRLPkpbQT/kLIO3oLY8FQC6TuAiBrDUYaG+8CAUrbnb1o4o/jcsXsrndJ\n"
372             "nyqcaYT8DmpUYwB3AFGjsPX9AXmcVm24N3iPDKR6zBsny/eeiEKaDf7UiwXlAAAB\n"
373             "fDRoUDQAAAQDAEgwRgIhAMPe5w/rrq+CYszV8A+TKhXcffHZL0muGbOvTPh6dq9t\n"
374             "AiEAmDiKOy4jVfLsg8QMpIBJtQSja53Xi2DNtJkhDb5Q4cEAdwBByMqx3yJGShDG\n"
375             "oToJQodeTjGLGwPr60vHaPCQYpYG9gAAAXw0aE7rAAAEAwBIMEYCIQD6Hm5PUAkQ\n"
376             "xRrKomxsk1UIpIo9+pYHgK9JI50JeTjVKQIhAMGK/VJzF4whOX2Bxu1UF9CwzcOr\n"
377             "/7sf1bpFlDNuoPWoMCcGCSsGAQQBgjcVCgQaMBgwCgYIKwYBBQUHAwEwCgYIKwYB\n"
378             "BQUHAwIwPgYJKwYBBAGCNxUHBDEwLwYnKwYBBAGCNxUIh9qGdYPu2QGCyYUbgbWe\n"
379             "YYX062CBXYWGjkGHwphQAgFkAgEnMIGHBggrBgEFBQcBAQR7MHkwUwYIKwYBBQUH\n"
380             "MAKGR2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvbXNjb3JwL01pY3Jvc29m\n"
381             "dCUyMFJTQSUyMFRMUyUyMENBJTIwMDIuY3J0MCIGCCsGAQUFBzABhhZodHRwOi8v\n"
382             "b2NzcC5tc29jc3AuY29tMB0GA1UdDgQWBBSepvy3TlByHLqgLWqxI37KpAuFWDAO\n"
383             "BgNVHQ8BAf8EBAMCBLAwggVtBgNVHREEggVkMIIFYIIMd3d3LmJpbmcuY29tghBk\n"
384             "aWN0LmJpbmcuY29tLmNughMqLnBsYXRmb3JtLmJpbmcuY29tggoqLmJpbmcuY29t\n"
385             "gghiaW5nLmNvbYIWaWVvbmxpbmUubWljcm9zb2Z0LmNvbYITKi53aW5kb3dzc2Vh\n"
386             "cmNoLmNvbYIZY24uaWVvbmxpbmUubWljcm9zb2Z0LmNvbYIRKi5vcmlnaW4uYmlu\n"
387             "Zy5jb22CDSoubW0uYmluZy5uZXSCDiouYXBpLmJpbmcuY29tghhlY24uZGV2LnZp\n"
388             "cnR1YWxlYXJ0aC5uZXSCDSouY24uYmluZy5uZXSCDSouY24uYmluZy5jb22CEHNz\n"
389             "bC1hcGkuYmluZy5jb22CEHNzbC1hcGkuYmluZy5uZXSCDiouYXBpLmJpbmcubmV0\n"
390             "gg4qLmJpbmdhcGlzLmNvbYIPYmluZ3NhbmRib3guY29tghZmZWVkYmFjay5taWNy\n"
391             "b3NvZnQuY29tghtpbnNlcnRtZWRpYS5iaW5nLm9mZmljZS5uZXSCDnIuYmF0LmJp\n"
392             "bmcuY29tghAqLnIuYmF0LmJpbmcuY29tghIqLmRpY3QuYmluZy5jb20uY26CDyou\n"
393             "ZGljdC5iaW5nLmNvbYIOKi5zc2wuYmluZy5jb22CECouYXBwZXguYmluZy5jb22C\n"
394             "FioucGxhdGZvcm0uY24uYmluZy5jb22CDXdwLm0uYmluZy5jb22CDCoubS5iaW5n\n"
395             "LmNvbYIPZ2xvYmFsLmJpbmcuY29tghF3aW5kb3dzc2VhcmNoLmNvbYIOc2VhcmNo\n"
396             "Lm1zbi5jb22CESouYmluZ3NhbmRib3guY29tghkqLmFwaS50aWxlcy5kaXR1Lmxp\n"
397             "dmUuY29tgg8qLmRpdHUubGl2ZS5jb22CGCoudDAudGlsZXMuZGl0dS5saXZlLmNv\n"
398             "bYIYKi50MS50aWxlcy5kaXR1LmxpdmUuY29tghgqLnQyLnRpbGVzLmRpdHUubGl2\n"
399             "ZS5jb22CGCoudDMudGlsZXMuZGl0dS5saXZlLmNvbYIVKi50aWxlcy5kaXR1Lmxp\n"
400             "dmUuY29tggszZC5saXZlLmNvbYITYXBpLnNlYXJjaC5saXZlLmNvbYIUYmV0YS5z\n"
401             "ZWFyY2gubGl2ZS5jb22CFWNud2ViLnNlYXJjaC5saXZlLmNvbYIMZGV2LmxpdmUu\n"
402             "Y29tgg1kaXR1LmxpdmUuY29tghFmYXJlY2FzdC5saXZlLmNvbYIOaW1hZ2UubGl2\n"
403             "ZS5jb22CD2ltYWdlcy5saXZlLmNvbYIRbG9jYWwubGl2ZS5jb20uYXWCFGxvY2Fs\n"
404             "c2VhcmNoLmxpdmUuY29tghRsczRkLnNlYXJjaC5saXZlLmNvbYINbWFpbC5saXZl\n"
405             "LmNvbYIRbWFwaW5kaWEubGl2ZS5jb22CDmxvY2FsLmxpdmUuY29tgg1tYXBzLmxp\n"
406             "dmUuY29tghBtYXBzLmxpdmUuY29tLmF1gg9taW5kaWEubGl2ZS5jb22CDW5ld3Mu\n"
407             "bGl2ZS5jb22CHG9yaWdpbi5jbndlYi5zZWFyY2gubGl2ZS5jb22CFnByZXZpZXcu\n"
408             "bG9jYWwubGl2ZS5jb22CD3NlYXJjaC5saXZlLmNvbYISdGVzdC5tYXBzLmxpdmUu\n"
409             "Y29tgg52aWRlby5saXZlLmNvbYIPdmlkZW9zLmxpdmUuY29tghV2aXJ0dWFsZWFy\n"
410             "dGgubGl2ZS5jb22CDHdhcC5saXZlLmNvbYISd2VibWFzdGVyLmxpdmUuY29tghN3\n"
411             "ZWJtYXN0ZXJzLmxpdmUuY29tghV3d3cubG9jYWwubGl2ZS5jb20uYXWCFHd3dy5t\n"
412             "YXBzLmxpdmUuY29tLmF1MIGwBgNVHR8EgagwgaUwgaKggZ+ggZyGTWh0dHA6Ly9t\n"
413             "c2NybC5taWNyb3NvZnQuY29tL3BraS9tc2NvcnAvY3JsL01pY3Jvc29mdCUyMFJT\n"
414             "QSUyMFRMUyUyMENBJTIwMDIuY3JshktodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20v\n"
415             "cGtpL21zY29ycC9jcmwvTWljcm9zb2Z0JTIwUlNBJTIwVExTJTIwQ0ElMjAwMi5j\n"
416             "cmwwVwYDVR0gBFAwTjBCBgkrBgEEAYI3KgEwNTAzBggrBgEFBQcCARYnaHR0cDov\n"
417             "L3d3dy5taWNyb3NvZnQuY29tL3BraS9tc2NvcnAvY3BzMAgGBmeBDAECATAfBgNV\n"
418             "HSMEGDAWgBT/L3/hBvQ48y3tJY2Ywv4O9mz8+jAdBgNVHSUEFjAUBggrBgEFBQcD\n"
419             "AQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggIBAMSWmxybEy+7DfqTjbQvyg+Q\n"
420             "HsK5ZdakLLVnmlHi/DhDYOXRDutAjNa26QFTTq+t8ZfsDVsJqpynyVVsY1r+5UPZ\n"
421             "5Qqb579wjHrxkricfIHW4OPrrcvbQExmw6YhTx4Xi22Ml2yrY5I3ukV+02dmZTFt\n"
422             "SwpI5mYD9TvdrNU+sBjIdw6kLtxQfNwMcT08HQKwMB2Km8ggRmmEcPtPt1x3eWB1\n"
423             "wMQSsPfg9QdBevV92jZOdj0zVGl3AuIqyTE89CohySsBbGE0Fzr6EDj75iS7iijq\n"
424             "Nd1z41jlBlijQBRrT3yCv/FKARkMmdm1r8JEabcD+WtqtRibPgkt7ELhe/RpXpCn\n"
425             "3mEajrt0fWZVivNuYiDi9OP2qOoCa56sN5cGPNN2XMfIqQ83ynuG1qKBUS9g2dJ0\n"
426             "qaCShUUdS51AEbn+P1YC2Exv6KF0acohJIxa8jLPR55n+eyTbh4w/G2DSepiKXal\n"
427             "3w+DkBQ5RhNDb8GBuLaog+EGiZtuW1tfgjDevOi9YN5lnYxf+WVmNa3q483H1STZ\n"
428             "rjTDJ9qGohcV9Me56Ux9RHcLOj5odDmTe7nhF2QcpuEABAiph14bpm7SKPucoLxl\n"
429             "9pdXzJmtoQgLGuRnjkbZACB3mXZWpLoCu/9aHbBBnndZUoLM/CDTJnBF2wRD5dTs\n"
430             "CCh3ZVRelaZ9bQtf5DlO\n"
431             "-----END CERTIFICATE-----\n"
432             );
433         cm[RawCertificateID::BING_COM].raw_base64 = raw_base64;
434         cm[RawCertificateID::BING_COM].certPtr = createCert(raw_base64);
435     }
436
437     return cm;
438 }
439
440 CertMap TEST_CERTS = initializeTestCerts();
441
442 } // namespace TestData::anonymous
443
444 void checkCertificateValidity(std::map<RawCertificateID, TestCert>::iterator& it)
445 {
446     if (it->second.valid == TestCert::UNKNOWN)
447     {
448         auto buff = BIO_new(BIO_s_mem());
449         BIO_write(buff, it->second.raw_base64.c_str(), it->second.raw_base64.size());
450
451         X509* x509 = PEM_read_bio_X509(buff, nullptr, nullptr, nullptr);
452         BIO_free_all(buff);
453
454         RUNNER_ASSERT_MSG(x509 != NULL, "Test certificate " << it->first << " can't be parsed");
455
456         if (X509_cmp_current_time(X509_get_notBefore(x509)) > 0)
457             it->second.valid = TestCert::NOT_YET_VALID;
458         else if (X509_cmp_current_time(X509_get_notAfter(x509)) < 0)
459             it->second.valid = TestCert::EXPIRED;
460         else
461             it->second.valid = TestCert::VALID;
462
463         X509_free(x509);
464     }
465
466     switch (it->second.valid)
467     {
468     case TestCert::NOT_YET_VALID:
469         RUNNER_FAIL_MSG(
470                 "Test certificate " << it->first <<
471                 " is not yet valid. Check the certificate and the system date.");
472         break;
473     case TestCert::EXPIRED:
474         RUNNER_FAIL_MSG(
475                 "Test certificate " << it->first <<
476                 " has expired. Check the certificate and the system date.");
477         break;
478     default:
479         break;
480     }
481 }
482
483 std::string getTestCertificateBase64(certificateID id)
484 {
485     auto cert = TEST_CERTS.find(toRawCertificateID(id));
486
487     RUNNER_ASSERT_MSG(cert != TEST_CERTS.end(), "Unknown certificate index!");
488
489     auto &certStruct = cert->second;
490     RUNNER_ASSERT_MSG(certStruct.raw_base64.size() > 0, "Certificate is empty!");
491
492     checkCertificateValidity(cert);
493
494     return certStruct.raw_base64;
495 }
496
497 CKM::CertificateShPtr getTestCertificate(certificateID id)
498 {
499     auto cert = TEST_CERTS.find(toRawCertificateID(id));
500
501     RUNNER_ASSERT_MSG(cert != TEST_CERTS.end(), "Unknown certificate index!");
502
503     auto &certStruct = cert->second;
504     RUNNER_ASSERT_MSG(certStruct.certPtr != nullptr, "Certificate is empty!");
505
506     checkCertificateValidity(cert);
507
508     return certStruct.certPtr;
509 }
510
511 } // namespace TestData