b6aeb708750eb6c194d7bbe72258df1073076d05
[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_IT_TLS_CA_5,      // Microsoft IT TLS CA 5, signed by Baltimore CyberTrust Root,
45                          // expires May 20, 2024
46     MICROSOFT_COM,       // www.microsoft.com - signed by Microsoft IT TLS CA 5,
47                          // expires October 22, 2021
48
49     // ocsp available chain on third party
50     MS_RSA_TLS_CA_2,     // Microsoft RSA TLS CA 02, signed by Baltimore CyberTrust Root, expires 08 Oct 2024
51     BING_COM,            // BING, signed by Microsoft RSA TLS CA 2, expires 19 Jul 2021
52
53     // footer - last element in the set
54     NO_CERT
55 };
56
57
58 struct TestCert {
59     enum Validity {
60         UNKNOWN,
61         VALID,
62         NOT_YET_VALID,
63         EXPIRED
64     };
65
66     TestCert() : valid(UNKNOWN) {}
67
68     string raw_base64;
69     CKM::CertificateShPtr certPtr;
70     Validity valid;
71 };
72
73 typedef map<RawCertificateID, TestCert> CertMap;
74
75 CKM::CertificateShPtr createCert(const string& cert) {
76     CKM::RawBuffer buffer_cert(cert.begin(), cert.end());
77     CKM::CertificateShPtr cptr = CKM::Certificate::create(buffer_cert, CKM::DataFormat::FORM_PEM);
78     return cptr;
79 }
80
81 RawCertificateID toRawCertificateID(certificateID id)
82 {
83     switch (id) {
84     case certificateID::TEST_ROOT_CA:        return RawCertificateID::TEST_ROOT_CA;
85     case certificateID::TEST_IM_CA:          return RawCertificateID::TEST_IM_CA;
86     case certificateID::TEST_LEAF:           return RawCertificateID::TEST_LEAF;
87
88     case certificateID::THIRD_PARTY_ROOT_CA: return RawCertificateID::BALTIMORE_CYBER_TRUST_ROOT;
89     case certificateID::THIRD_PARTY_IM_CA:   return RawCertificateID::MS_IT_TLS_CA_5;
90     case certificateID::THIRD_PARTY_LEAF:    return RawCertificateID::MICROSOFT_COM;
91
92     case certificateID::OCSP_AVAILABLE_IM:   return RawCertificateID::MS_RSA_TLS_CA_2;
93     case certificateID::OCSP_AVAILABLE_LEAF: return RawCertificateID::BING_COM;
94
95     case certificateID::NO_CERT:             return RawCertificateID::NO_CERT;
96     default: throw std::invalid_argument("Invalid raw certificat ID!");
97     }
98 }
99
100 CertMap initializeTestCerts()
101 {
102     CertMap cm;
103
104     // TEST_ROOT_CA, expires 2035
105     {
106         std::string raw_base64 = std::string(
107             "-----BEGIN CERTIFICATE-----\n"
108             "MIIDnzCCAoegAwIBAgIJAMH/ADkC5YSTMA0GCSqGSIb3DQEBBQUAMGYxCzAJBgNV\n"
109             "BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMQ0wCwYDVQQKDARBQ01FMRAwDgYD\n"
110             "VQQLDAdUZXN0aW5nMSEwHwYDVQQDDBhUZXN0IHJvb3QgY2EgY2VydGlmaWNhdGUw\n"
111             "HhcNMTQxMjMwMTcyMTUyWhcNMjQxMjI3MTcyMTUyWjBmMQswCQYDVQQGEwJBVTET\n"
112             "MBEGA1UECAwKU29tZS1TdGF0ZTENMAsGA1UECgwEQUNNRTEQMA4GA1UECwwHVGVz\n"
113             "dGluZzEhMB8GA1UEAwwYVGVzdCByb290IGNhIGNlcnRpZmljYXRlMIIBIjANBgkq\n"
114             "hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0EJRdUtd2th0vTVF7QxvDKzyFCF3w9vC\n"
115             "9IDE/Yr12w+a9jd0s7/eG96qTHIYffS3B7x2MB+d4n+SR3W0qmYh7xk8qfEgH3da\n"
116             "eDoV59IZ9r543KM+g8jm6KffYGX1bIJVVY5OhBRbO9nY6byYpd5kbCIUB6dCf7/W\n"
117             "rQl1aIdLGFIegAzPGFPXDcU6F192686x54bxt/itMX4agHJ9ZC/rrTBIZghVsjJo\n"
118             "5/AH5WZpasv8sfrGiiohAxtieoYoJkv5MOYP4/2lPlOY+Cgw1Yoz+HHv31AllgFs\n"
119             "BquBb/kJVmCCNsAOcnvQzTZUsW/TXz9G2nwRdqI1nSy2JvVjZGsqGQIDAQABo1Aw\n"
120             "TjAdBgNVHQ4EFgQUt6pkzFt1PZlfYRL/HGnufF4frdwwHwYDVR0jBBgwFoAUt6pk\n"
121             "zFt1PZlfYRL/HGnufF4frdwwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOC\n"
122             "AQEAld7Qwq0cdzDQ51w1RVLwTR8Oy25PB3rzwEHcSGJmdqlMi3xOdaz80S1R1BBX\n"
123             "ldvGBG5Tn0vT7xSuhmSgI2/HnBpy9ocHVOmhtNB4473NieEpfTYrnGXrFxu46Wus\n"
124             "9m/ZnugcQ2G6C54A/NFtvgLmaC8uH8M7gKdS6uYUwJFQEofkjmd4UpOYSqmcRXhS\n"
125             "Jzd5FYFWkJhKJYp3nlENSOD8CUFFVGekm05nFN2gRVc/qaqQkEX77+XYvhodLRsV\n"
126             "qMn7nf7taidDKLO2T4bhujztnTYOhhaXKgPy7AtZ28N2wvX96VyAPB/vrchGmyBK\n"
127             "kOg11TpPdNDkhb1J4ZCh2gupDg==\n"
128             "-----END CERTIFICATE-----\n");
129         cm[RawCertificateID::TEST_ROOT_CA].raw_base64 = raw_base64;
130         cm[RawCertificateID::TEST_ROOT_CA].certPtr = createCert(raw_base64);
131     }
132
133     // TEST_IM_CA, signed by TEST_ROOT_CA, expires 2035
134     {
135         std::string raw_base64 = std::string(
136             "-----BEGIN CERTIFICATE-----\n"
137             "MIIDljCCAn6gAwIBAgICEAAwDQYJKoZIhvcNAQEFBQAwZjELMAkGA1UEBhMCQVUx\n"
138             "EzARBgNVBAgMClNvbWUtU3RhdGUxDTALBgNVBAoMBEFDTUUxEDAOBgNVBAsMB1Rl\n"
139             "c3RpbmcxITAfBgNVBAMMGFRlc3Qgcm9vdCBjYSBjZXJ0aWZpY2F0ZTAeFw0xNTAx\n"
140             "MTYxNjQ1MzRaFw0zNTAxMTExNjQ1MzRaMGQxCzAJBgNVBAYTAkFVMRMwEQYDVQQI\n"
141             "DApTb21lLVN0YXRlMQ0wCwYDVQQKDARBQ01FMRAwDgYDVQQLDAdUZXN0aW5nMR8w\n"
142             "HQYDVQQDDBZUZXN0IElNIENBIGNlcnRpZmljYXRlMIIBIjANBgkqhkiG9w0BAQEF\n"
143             "AAOCAQ8AMIIBCgKCAQEAzmBF78qClgoKfnLAncMXZwZ14TW+5kags1+QCYeg3c7j\n"
144             "L9+RvDxIaX2tKf1sukJcwQfYqUlQkwt+58LMOb2ORtkpj8Or6WCWCZ0BzneT8ug7\n"
145             "nxJT4m9+bohMF0JoKjjB2H4KNMHamLIwUxRKt6nyfk81kVhJOi2vzzxd+UCPi6Pc\n"
146             "UAbJNH48eNgOIg55nyFovVzYj8GIo/9GvHJj83PPa/KlJZ+Z1qZASZZ/VYorplVT\n"
147             "thsHXKfejhFy5YJ9t7n/vyAQsyBsagZsvX19xnH41fbYXHKf8UbXG23rNaZlchs6\n"
148             "XJVLQdzOpj3WTj/lCocVHqLaZISLhNQ3aI7kUBUdiwIDAQABo1AwTjAdBgNVHQ4E\n"
149             "FgQUoCYNaCBP4jl/3SYQuK8Ka+6i3QEwHwYDVR0jBBgwFoAUt6pkzFt1PZlfYRL/\n"
150             "HGnufF4frdwwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAjRzWiD97\n"
151             "Htv4Kxpm3P+C+xP9AEteCJfO+7p8MWgtWEJOknJyt55zeKS2JwZIq57KcbqD8U7v\n"
152             "vAUx1ymtUhlFPFd7J1mJ3pou+3aFYmGShYhGHpbrmUwjp7HVP588jrW1NoZVHdMc\n"
153             "4OgJWFrViXeu9+maIcekjMB/+9Y0dUgQuK5ZuT5H/Jwet7Th/o9uufTUZjBzRvrB\n"
154             "pbXgQpqgME2av4Q/6LuldPCTHLtWXgFUU2R+yCGmuGilvhFJnKoQryAbYnIQNWE8\n"
155             "SLoHQ9s1i7Zyb7HU6UAaqMOz15LBkyAqtNyJcO2p7Q/p5YK0xfD4xisI5qXucqVm\n"
156             "F2obL5qJSTN/RQ==\n"
157             "-----END CERTIFICATE-----\n");
158         cm[RawCertificateID::TEST_IM_CA].raw_base64 = raw_base64;
159         cm[RawCertificateID::TEST_IM_CA].certPtr = createCert(raw_base64);
160     }
161
162     // TEST_LEAF, signed by TEST_IM_CA, expires 2035
163     {
164         std::string raw_base64 = std::string(
165             "-----BEGIN CERTIFICATE-----\n"
166             "MIIDOzCCAiMCAQEwDQYJKoZIhvcNAQEFBQAwZDELMAkGA1UEBhMCQVUxEzARBgNV\n"
167             "BAgMClNvbWUtU3RhdGUxDTALBgNVBAoMBEFDTUUxEDAOBgNVBAsMB1Rlc3Rpbmcx\n"
168             "HzAdBgNVBAMMFlRlc3QgSU0gQ0EgY2VydGlmaWNhdGUwHhcNMTUwMTE2MTY0ODE0\n"
169             "WhcNMzUwMTExMTY0ODE0WjBjMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1T\n"
170             "dGF0ZTENMAsGA1UECgwEQUNNRTEQMA4GA1UECwwHVGVzdGluZzEeMBwGA1UEAwwV\n"
171             "VGVzdCBsZWFmIGNlcnRpZmljYXRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\n"
172             "CgKCAQEAzTdDIa2tDmRxFnIgiG+mBz8GoSVODs0ImNQGbqj+pLhBOFRH8fsah4Jl\n"
173             "z5YF9KwhMVLknnHGFLE/Nb7Ac35kEzhMQMpTRxohW83oxw3eZ8zN/FBoKqg4qHRq\n"
174             "QR8kS10YXTgrBR0ex/Vp+OUKEw6h7yL2r4Tpvrn9/qHwsxtLxqWbDIVf1O9b1Lfc\n"
175             "bllYMdmV5E62yN5tcwrDP8gvHjFnVeLzrG8wTpc9FR90/0Jkfp5jAJcArOBLrT0E\n"
176             "4VRqs+4HuwT8jAwFAmNnc7IYX5qSjtSWkmmHe73K/lzB+OiI0JEc/3eWUTWqwTSk\n"
177             "4tNCiQGBKJ39LXPTBBJdzmxVH7CUDQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQAp\n"
178             "UdDOGu3hNiG+Vn10aQ6B1ZmOj3t+45gUV3sC+y8hB8EK1g4P5Ke9bVDts0T5eOnj\n"
179             "CSc+6VoND5O4adI0IFFRFljHNVnvjeosHfUZNnowsmA2ptQBtC1g5ZKRvKXlkC5/\n"
180             "i5BGgRqPFA7y9WB9Y05MrJHf3E+Oz/RBsLeeNiNN+rF5X1vYExvGHpo0M0zS0ze9\n"
181             "HtC0aOy8ocsTrQkf3ceHTAXx2i8ftoSSD4klojtWFpWMrNQa52F7wB9nU6FfKRuF\n"
182             "Zj/T1JkYXKkEwZU6nAR2jdZp3EP9xj3o15V/tyFcXHx6l8NTxn4cJb+Xe4VquQJz\n"
183             "6ON7PVe0ABN/AlwVQiFE\n"
184             "-----END CERTIFICATE-----\n");
185         cm[RawCertificateID::TEST_LEAF].raw_base64 = raw_base64;
186         cm[RawCertificateID::TEST_LEAF].certPtr = createCert(raw_base64);
187     }
188
189     // BING, signed by Microsoft RSA TLS CA 2, expires 19 Jul 2021
190     {
191         std::string raw_base64(
192             "-----BEGIN CERTIFICATE-----\n"
193             "MIIM3jCCCsagAwIBAgITfwAHP+m/X4JffLePJgAAAAc/6TANBgkqhkiG9w0BAQsF\n"
194             "ADBPMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u\n"
195             "MSAwHgYDVQQDExdNaWNyb3NvZnQgUlNBIFRMUyBDQSAwMjAeFw0yMTAxMTkwMjEw\n"
196             "MjBaFw0yMTA3MTkwMjEwMjBaMBcxFTATBgNVBAMTDHd3dy5iaW5nLmNvbTCCASIw\n"
197             "DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALtyvjNIaDEpBgHoi3Hq9e62DuXe\n"
198             "B6eVJ3pEGF9pPLH5JpSOt3u8Zfpshe0I8qBgWGI877K+iCwPG3tSst8NybLfeEik\n"
199             "1Z1JxzPgph9xC3uPAJWNSXaG+ZChICUtIEFEfZ4dyoGpB8LGX82Cpdk6GCvq0WxT\n"
200             "k6dhSgeF+MTmmvAvMS4Im8HEb0ruz8Z+Cx2GqY2gDIx0QACBEHQLSQmz2w4caQKv\n"
201             "ZtTCH4Y8gjiJvmwIBqPPmr2qSot5kRUZdFbwi0FlLUrmcYRE7Rrs3F0lVR9ceZ8L\n"
202             "ykoZ0p3JhSpAZ08q72eJM43NC9aYhydZgFDoIPNlbaGrmQjJTrKhh7emCu0CAwEA\n"
203             "AaOCCOkwggjlMIIBBQYKKwYBBAHWeQIEAgSB9gSB8wDxAHYAfT7y+I//iFVoJMLA\n"
204             "yp5SiXkrxQ54CX8uapdomX4i8NcAAAF3GHF4PQAABAMARzBFAiA/IV2Hn3TDzlg8\n"
205             "r+Pw5lfcKvECYsC3Dm2o356gTi/AmQIhAPgBb5fydZBLH95SnqmyhHQgYQnMq/f3\n"
206             "7uUsdosP46frAHcA7sCV7o1yZA+S48O5G8cSo2lqCXtLahoUOOZHssvtxfkAAAF3\n"
207             "GHF4NAAABAMASDBGAiEA5HA9s2/r8N+on58s5Gm0QEIX2pvliUObpOXJhJyk8fcC\n"
208             "IQDO6gHTzvNoljkCdj6LjQS6JIYHJxS40vCNZ9dPOOhJ6TAnBgkrBgEEAYI3FQoE\n"
209             "GjAYMAoGCCsGAQUFBwMBMAoGCCsGAQUFBwMCMD4GCSsGAQQBgjcVBwQxMC8GJysG\n"
210             "AQQBgjcVCIfahnWD7tkBgsmFG4G1nmGF9OtggV2Fho5Bh8KYUAIBZAIBJTCBhwYI\n"
211             "KwYBBQUHAQEEezB5MFMGCCsGAQUFBzAChkdodHRwOi8vd3d3Lm1pY3Jvc29mdC5j\n"
212             "b20vcGtpL21zY29ycC9NaWNyb3NvZnQlMjBSU0ElMjBUTFMlMjBDQSUyMDAyLmNy\n"
213             "dDAiBggrBgEFBQcwAYYWaHR0cDovL29jc3AubXNvY3NwLmNvbTAdBgNVHQ4EFgQU\n"
214             "fQyzsQomVt5vmIpIjxaFs+xTSD8wCwYDVR0PBAQDAgSwMIIFbQYDVR0RBIIFZDCC\n"
215             "BWCCDHd3dy5iaW5nLmNvbYIQZGljdC5iaW5nLmNvbS5jboITKi5wbGF0Zm9ybS5i\n"
216             "aW5nLmNvbYIKKi5iaW5nLmNvbYIIYmluZy5jb22CFmllb25saW5lLm1pY3Jvc29m\n"
217             "dC5jb22CEyoud2luZG93c3NlYXJjaC5jb22CGWNuLmllb25saW5lLm1pY3Jvc29m\n"
218             "dC5jb22CESoub3JpZ2luLmJpbmcuY29tgg0qLm1tLmJpbmcubmV0gg4qLmFwaS5i\n"
219             "aW5nLmNvbYIYZWNuLmRldi52aXJ0dWFsZWFydGgubmV0gg0qLmNuLmJpbmcubmV0\n"
220             "gg0qLmNuLmJpbmcuY29tghBzc2wtYXBpLmJpbmcuY29tghBzc2wtYXBpLmJpbmcu\n"
221             "bmV0gg4qLmFwaS5iaW5nLm5ldIIOKi5iaW5nYXBpcy5jb22CD2JpbmdzYW5kYm94\n"
222             "LmNvbYIWZmVlZGJhY2subWljcm9zb2Z0LmNvbYIbaW5zZXJ0bWVkaWEuYmluZy5v\n"
223             "ZmZpY2UubmV0gg5yLmJhdC5iaW5nLmNvbYIQKi5yLmJhdC5iaW5nLmNvbYISKi5k\n"
224             "aWN0LmJpbmcuY29tLmNugg8qLmRpY3QuYmluZy5jb22CDiouc3NsLmJpbmcuY29t\n"
225             "ghAqLmFwcGV4LmJpbmcuY29tghYqLnBsYXRmb3JtLmNuLmJpbmcuY29tgg13cC5t\n"
226             "LmJpbmcuY29tggwqLm0uYmluZy5jb22CD2dsb2JhbC5iaW5nLmNvbYIRd2luZG93\n"
227             "c3NlYXJjaC5jb22CDnNlYXJjaC5tc24uY29tghEqLmJpbmdzYW5kYm94LmNvbYIZ\n"
228             "Ki5hcGkudGlsZXMuZGl0dS5saXZlLmNvbYIPKi5kaXR1LmxpdmUuY29tghgqLnQw\n"
229             "LnRpbGVzLmRpdHUubGl2ZS5jb22CGCoudDEudGlsZXMuZGl0dS5saXZlLmNvbYIY\n"
230             "Ki50Mi50aWxlcy5kaXR1LmxpdmUuY29tghgqLnQzLnRpbGVzLmRpdHUubGl2ZS5j\n"
231             "b22CFSoudGlsZXMuZGl0dS5saXZlLmNvbYILM2QubGl2ZS5jb22CE2FwaS5zZWFy\n"
232             "Y2gubGl2ZS5jb22CFGJldGEuc2VhcmNoLmxpdmUuY29tghVjbndlYi5zZWFyY2gu\n"
233             "bGl2ZS5jb22CDGRldi5saXZlLmNvbYINZGl0dS5saXZlLmNvbYIRZmFyZWNhc3Qu\n"
234             "bGl2ZS5jb22CDmltYWdlLmxpdmUuY29tgg9pbWFnZXMubGl2ZS5jb22CEWxvY2Fs\n"
235             "LmxpdmUuY29tLmF1ghRsb2NhbHNlYXJjaC5saXZlLmNvbYIUbHM0ZC5zZWFyY2gu\n"
236             "bGl2ZS5jb22CDW1haWwubGl2ZS5jb22CEW1hcGluZGlhLmxpdmUuY29tgg5sb2Nh\n"
237             "bC5saXZlLmNvbYINbWFwcy5saXZlLmNvbYIQbWFwcy5saXZlLmNvbS5hdYIPbWlu\n"
238             "ZGlhLmxpdmUuY29tgg1uZXdzLmxpdmUuY29tghxvcmlnaW4uY253ZWIuc2VhcmNo\n"
239             "LmxpdmUuY29tghZwcmV2aWV3LmxvY2FsLmxpdmUuY29tgg9zZWFyY2gubGl2ZS5j\n"
240             "b22CEnRlc3QubWFwcy5saXZlLmNvbYIOdmlkZW8ubGl2ZS5jb22CD3ZpZGVvcy5s\n"
241             "aXZlLmNvbYIVdmlydHVhbGVhcnRoLmxpdmUuY29tggx3YXAubGl2ZS5jb22CEndl\n"
242             "Ym1hc3Rlci5saXZlLmNvbYITd2VibWFzdGVycy5saXZlLmNvbYIVd3d3LmxvY2Fs\n"
243             "LmxpdmUuY29tLmF1ghR3d3cubWFwcy5saXZlLmNvbS5hdTCBsAYDVR0fBIGoMIGl\n"
244             "MIGioIGfoIGchk1odHRwOi8vbXNjcmwubWljcm9zb2Z0LmNvbS9wa2kvbXNjb3Jw\n"
245             "L2NybC9NaWNyb3NvZnQlMjBSU0ElMjBUTFMlMjBDQSUyMDAyLmNybIZLaHR0cDov\n"
246             "L2NybC5taWNyb3NvZnQuY29tL3BraS9tc2NvcnAvY3JsL01pY3Jvc29mdCUyMFJT\n"
247             "QSUyMFRMUyUyMENBJTIwMDIuY3JsMFcGA1UdIARQME4wQgYJKwYBBAGCNyoBMDUw\n"
248             "MwYIKwYBBQUHAgEWJ2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvbXNjb3Jw\n"
249             "L2NwczAIBgZngQwBAgEwHwYDVR0jBBgwFoAU/y9/4Qb0OPMt7SWNmML+DvZs/Pow\n"
250             "HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA0GCSqGSIb3DQEBCwUAA4IC\n"
251             "AQBv+MBd+JCQU0JC7zy7iwV3XAiWr72G5cd7g8qO4ewjJMydoToF8E6BndIBlaPi\n"
252             "HcRlY0/UZYIGpU9T7xB0xgXYzo1E9a5znUIGmfSNfalfZAknMS5VIdGkWwqBYvn7\n"
253             "AibqGjiH521CjdxedWy/NjQlsmMxzLh/kXkqWonhMjuFy1u9hZbWDBHU6KwjHcic\n"
254             "ikgWR9+pgZdpab1xZ+rw9ubYALjLl8H7RnOFSVwiKZaR6ZuHNN+7Jiy5SsrfCJ0J\n"
255             "h3kqaDL35PMdW2SlV8neH2r31wf6b3EVHBldIuviY05adR5wy6odYzrjgcj9QdlT\n"
256             "bpajRgTwzuOeWLOP592GAcpI5iie2toRfuPtmCUtbgB5/SeneV1+Yqv9EnYxoUiK\n"
257             "0Q8jfbyoTAZ/uuQUkrzamlZkEw615kONH49AREYiuuyFAygvZ11f4V6GgS+/Y3K5\n"
258             "5/mX5niKcaQsWvqlfsvBJC43lDQNAjv7fvPGxBOEF8msuq44/G4bU5qNuhvVYV6/\n"
259             "TPrRWAGSomK2OPO+SiVim/HnPP7U+Koz5gTD0wrDrnfkj2KuS8X7AVGyTq0hhSil\n"
260             "rE6eVc9Ql3135QkhYEb+3A0JlSpW5kfE8YoYKtow2CTlGsE6U6m+V6AFLbkc08rC\n"
261             "6w2nIBfLF41lU58CgyUGyPBsB3gyw8AKt2gYOKhg4ZQp6w==\n"
262             "-----END CERTIFICATE-----\n");
263         cm[RawCertificateID::BING_COM].raw_base64 = raw_base64;
264         cm[RawCertificateID::BING_COM].certPtr = createCert(raw_base64);
265
266     }
267
268     // Microsoft RSA TLS CA 02, signed by Baltimore CyberTrust Root, expires 08 Oct 2024
269     {
270         std::string raw_base64(
271             "-----BEGIN CERTIFICATE-----\n"
272             "MIIFWjCCBEKgAwIBAgIQD6dHIsU9iMgPWJ77H51KOjANBgkqhkiG9w0BAQsFADBa\n"
273             "MQswCQYDVQQGEwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJl\n"
274             "clRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTIw\n"
275             "MDcyMTIzMDAwMFoXDTI0MTAwODA3MDAwMFowTzELMAkGA1UEBhMCVVMxHjAcBgNV\n"
276             "BAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEgMB4GA1UEAxMXTWljcm9zb2Z0IFJT\n"
277             "QSBUTFMgQ0EgMDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQD0wBlZ\n"
278             "qiokfAYhMdHuEvWBapTj9tFKL+NdsS4pFDi8zJVdKQfR+F039CDXtD9YOnqS7o88\n"
279             "+isKcgOeQNTri472mPnn8N3vPCX0bDOEVk+nkZNIBA3zApvGGg/40Thv78kAlxib\n"
280             "MipsKahdbuoHByOB4ZlYotcBhf/ObUf65kCRfXMRQqOKWkZLkilPPn3zkYM5GHxe\n"
281             "I4MNZ1SoKBEoHa2E/uDwBQVxadY4SRZWFxMd7ARyI4Cz1ik4N2Z6ALD3MfjAgEED\n"
282             "woknyw9TGvr4PubAZdqU511zNLBoavar2OAVTl0Tddj+RAhbnX1/zypqk+ifv+d3\n"
283             "CgiDa8Mbvo1u2Q8nuUBrKVUmR6EjkV/dDrIsUaU643v/Wp/uE7xLDdhC5rplK9si\n"
284             "NlYohMTMKLAkjxVeWBWbQj7REickISpc+yowi3yUrO5lCgNAKrCNYw+wAfAvhFkO\n"
285             "eqPm6kP41IHVXVtGNC/UogcdiKUiR/N59IfYB+o2v54GMW+ubSC3BohLFbho/oZZ\n"
286             "5XyulIZK75pwTHmauCIeE5clU9ivpLwPTx9b0Vno9+ApElrFgdY0/YKZ46GfjOC9\n"
287             "ta4G25VJ1WKsMmWLtzyrfgwbYopquZd724fFdpvsxfIvMG5m3VFkThOqzsOttDcU\n"
288             "fyMTqM2pan4txG58uxNJ0MjR03UCEULRU+qMnwIDAQABo4IBJTCCASEwHQYDVR0O\n"
289             "BBYEFP8vf+EG9DjzLe0ljZjC/g72bPz6MB8GA1UdIwQYMBaAFOWdWTCCR1jMrPoI\n"
290             "VDaGezq1BE3wMA4GA1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYI\n"
291             "KwYBBQUHAwIwEgYDVR0TAQH/BAgwBgEB/wIBADA0BggrBgEFBQcBAQQoMCYwJAYI\n"
292             "KwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTA6BgNVHR8EMzAxMC+g\n"
293             "LaArhilodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vT21uaXJvb3QyMDI1LmNybDAq\n"
294             "BgNVHSAEIzAhMAgGBmeBDAECATAIBgZngQwBAgIwCwYJKwYBBAGCNyoBMA0GCSqG\n"
295             "SIb3DQEBCwUAA4IBAQCg2d165dQ1tHS0IN83uOi4S5heLhsx+zXIOwtxnvwCWdOJ\n"
296             "3wFLQaFDcgaMtN79UjMIFVIUedDZBsvalKnx+6l2tM/VH4YAyNPx+u1LFR0joPYp\n"
297             "QYLbNYkedkNuhRmEBesPqj4aDz68ZDI6fJ92sj2q18QvJUJ5Qz728AvtFOat+Ajg\n"
298             "K0PFqPYEAviUKr162NB1XZJxf6uyIjUlnG4UEdHfUqdhl0R84mMtrYINksTzQ2sH\n"
299             "YM8fEhqICtTlcRLr/FErUaPUe9648nziSnA0qKH7rUZqP/Ifmbo+WNZSZG1BbgOh\n"
300             "lk+521W+Ncih3HRbvRBE0LWYT8vWKnfjgZKxwHwJ\n"
301             "-----END CERTIFICATE-----\n");
302         cm[RawCertificateID::MS_RSA_TLS_CA_2].raw_base64 = raw_base64;
303         cm[RawCertificateID::MS_RSA_TLS_CA_2].certPtr = createCert(raw_base64);
304
305     }
306
307     // Baltimore CyberTrust Root, (root CA), expires May 13, 2025
308     {
309         std::string raw_base64 = std::string(
310             "-----BEGIN CERTIFICATE-----\n"
311             "MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ\n"
312             "RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD\n"
313             "VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX\n"
314             "DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y\n"
315             "ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy\n"
316             "VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr\n"
317             "mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr\n"
318             "IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK\n"
319             "mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu\n"
320             "XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy\n"
321             "dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye\n"
322             "jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1\n"
323             "BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3\n"
324             "DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92\n"
325             "9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx\n"
326             "jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0\n"
327             "Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz\n"
328             "ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS\n"
329             "R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp\n"
330             "-----END CERTIFICATE-----\n");
331         cm[RawCertificateID::BALTIMORE_CYBER_TRUST_ROOT].raw_base64 = raw_base64;
332         cm[RawCertificateID::BALTIMORE_CYBER_TRUST_ROOT].certPtr = createCert(raw_base64);
333     }
334
335     // Microsoft IT TLS CA 5, signed by Baltimore CyberTrust Root, expires May 20, 2024
336     {
337         std::string raw_base64 = std::string(
338             "-----BEGIN CERTIFICATE-----\n"
339             "MIIFtDCCBJygAwIBAgIQCIjNUl8ZJERNFKWCkd65UjANBgkqhkiG9w0BAQsFADBa\n"
340             "MQswCQYDVQQGEwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJl\n"
341             "clRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTE2\n"
342             "MDUyMDEyNTMwM1oXDTI0MDUyMDEyNTMwM1owgYsxCzAJBgNVBAYTAlVTMRMwEQYD\n"
343             "VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy\n"
344             "b3NvZnQgQ29ycG9yYXRpb24xFTATBgNVBAsTDE1pY3Jvc29mdCBJVDEeMBwGA1UE\n"
345             "AxMVTWljcm9zb2Z0IElUIFRMUyBDQSA1MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A\n"
346             "MIICCgKCAgEAmt+BXDuPrul5lrmaeaeB8jnaVShGIwLFgmYHthXe/Zw6GpuRCdJm\n"
347             "jwuJF/hxhyF/ONM/miUAtzXQq/gIejbzUFvfKykn3qTdJJL69MZwjTYqmvCA3jX6\n"
348             "HkKdCYGq1QcKFqXFWkJtQr4eQoK0VzCZW0Ur1I/TCgbGc5Ok4YPvxb8FJ6d4zbML\n"
349             "4J4iFvOY3KYU6MyU1yP50FCZu7ULEJXx3wLpj46dVpk82I/TWPtckn49e/hQSVr3\n"
350             "EHt3+OZKkEpVUt6UrXQJoGRXLM0HkJ8WrZXD0Qa68e9sBbUErKncGzGbDi0ZlQRP\n"
351             "3mbLrTVyrxmCCLIUOhZfsDyb240MsALWJh/oFXHE7/ljOUOM6cKSLqHCoDAlDpYn\n"
352             "X56jK4LWEL08GR6mh/5VITpcQfwBmMwvkv9mOLS4ZpwPEmhLSqyGu16Y/56mnFNs\n"
353             "MxGk0K5SR9eLj/GWrLkpmo8s8a1kGMMmuwBk3lBwwLvsxmuu06DvwPFcDfLMelna\n"
354             "GDMvWRCtZxQsXyJDSkTh6N3g51UWTgnvA0wMSFBa8APfju9jyltnh0NALAa2Hw8+\n"
355             "U8BmP9cUFeYIYphIfoPlp7VdUS1ULWH9NF3Ut4DN0n3OsSQ785dsbBPeihfJivVI\n"
356             "lUL3EpDjEBf2oQDFNiplkZ4F7EIuWriZG//UTrX6ZlXZg46/CCmN+gsCAwEAAaOC\n"
357             "AUIwggE+MB0GA1UdDgQWBBQI/iWfdOqHBMK8u46oOF8zxtFsZTAfBgNVHSMEGDAW\n"
358             "gBTlnVkwgkdYzKz6CFQ2hns6tQRN8DASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1Ud\n"
359             "DwEB/wQEAwIBhjAnBgNVHSUEIDAeBggrBgEFBQcDAQYIKwYBBQUHAwIGCCsGAQUF\n"
360             "BwMJMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGln\n"
361             "aWNlcnQuY29tMDoGA1UdHwQzMDEwL6AtoCuGKWh0dHA6Ly9jcmwzLmRpZ2ljZXJ0\n"
362             "LmNvbS9PbW5pcm9vdDIwMjUuY3JsMD0GA1UdIAQ2MDQwMgYEVR0gADAqMCgGCCsG\n"
363             "AQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BTMA0GCSqGSIb3DQEB\n"
364             "CwUAA4IBAQA+8s8wpXq/HmrfOVgYKDzDne7ngcVL/Gf2vx9ON9re8K/uivkDe2Bn\n"
365             "dMc72v8rSuv9VHUTi+XCgRK6UhIguimKOs1DJMzVFwX+nBY/c+BtQcB2PfKrSMVZ\n"
366             "YmS6RE8KGII/Qeo/GDpY56AwV3X10WoxFLaUmWXatugB3uSr+7Xz5RkKGF+kAlfe\n"
367             "tlwmb3P+Lgn1CEPED8ckf50oZ2Wh3FvwOv34cIXnpU8k3kI/HUQ7XYUGhR0eHNTZ\n"
368             "TlHk/R4RFsyeANmXGpfjZceGNRtTdr4y0SxBSUujPpMMW3dXBzA8NYuM0WmiJ/pV\n"
369             "6KudEB7RF9+6bInTyVvXC5SIqdi0ldeO\n"
370             "-----END CERTIFICATE-----\n");
371         cm[RawCertificateID::MS_IT_TLS_CA_5].raw_base64 = raw_base64;
372         cm[RawCertificateID::MS_IT_TLS_CA_5].certPtr = createCert(raw_base64);
373     }
374
375     // www.microsoft.com - signed by Microsoft IT TLS CA 5, expires October 22, 2021
376     {
377         std::string raw_base64 = std::string(
378             "-----BEGIN CERTIFICATE-----\n"
379             "MIIJHzCCBwegAwIBAgITLQAMNxVixB2TlAh/aAAAAAw3FTANBgkqhkiG9w0BAQsF\n"
380             "ADCBizELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT\n"
381             "B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEVMBMGA1UE\n"
382             "CxMMTWljcm9zb2Z0IElUMR4wHAYDVQQDExVNaWNyb3NvZnQgSVQgVExTIENBIDUw\n"
383             "HhcNMTkxMDIxMjIwNDA0WhcNMjExMDIxMjIwNDA0WjCBiDELMAkGA1UEBhMCVVMx\n"
384             "CzAJBgNVBAgTAldBMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv\n"
385             "ZnQgQ29ycG9yYXRpb24xHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEa\n"
386             "MBgGA1UEAxMRd3d3Lm1pY3Jvc29mdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IB\n"
387             "DwAwggEKAoIBAQDTEK1CzUwdArEOb/vDOqds7/vQ1yGQtAYaZYNBch27Kw3/XKnf\n"
388             "td3NVj7tYe7MhI1U+bknxhSx7m4ti7Pzt6mxQiTZ/KegYhxosd3sOEikXgJVzECv\n"
389             "h0Mvd6adrvi00cUeQz0dlkUkuxMAjiFs+FX7Ogf4xt8ub4hKZPGB85vDnQQ0OHVh\n"
390             "L9IuUbYHhmh8EoDEdR+og+lj7u5OKt3YEWntgbnfV1d66U59kfp5Dg4T/zFjqz/l\n"
391             "U3KGBWgj0YoxH8KGfuq2YfFQsm7Q4MDJnR2PNUbwwrK5JldcRn27o5SVZxaB55bs\n"
392             "dyHWL0GbG5JoIIWg8pGJXKYGfARDEVjWijBPAgMBAAGjggR7MIIEdzCCAXwGCisG\n"
393             "AQQB1nkCBAIEggFsBIIBaAFmAHYA9lyUL9F3MCIUVBgIMJRWjuNNExkzv98MLyAL\n"
394             "zE7xZOMAAAFt8GJxcQAABAMARzBFAiEAldKDzhaLTJ1PpTpE7TmrRp+nDwoEZbW5\n"
395             "JOfrPKoR6PsCIBOqc6bzu7MnferBbxkUKwS67LpFTJgxYk6RV98m5fK2AHUAVYHU\n"
396             "whaQNgFK6gubVzxT8MDkOHhwJQgXL6OqHQcT0wwAAAFt8GJyzQAABAMARjBEAiBa\n"
397             "JqHGYrk+yh3ccuelsJxqLbhE3DJuSBZxe+xEpiabhQIgRdcckht/x8uG6tSrRKg5\n"
398             "0GdwnWlFKMBDT50rQjIPflMAdQB9PvL4j/+IVWgkwsDKnlKJeSvFDngJfy5ql2iZ\n"
399             "fiLw1wAAAW3wYnG7AAAEAwBGMEQCIGToqXolvHTes1f0QwV9RSvEE5HVwX6jn70+\n"
400             "KaExl0+BAiBosObeHSU867FO1Aw5dw+R01ZZ1fudHxDwuXgLvqFmQzAnBgkrBgEE\n"
401             "AYI3FQoEGjAYMAoGCCsGAQUFBwMCMAoGCCsGAQUFBwMBMD4GCSsGAQQBgjcVBwQx\n"
402             "MC8GJysGAQQBgjcVCIfahnWD7tkBgsmFG4G1nmGF9OtggV2E0t9CgueTegIBZAIB\n"
403             "HTCBhQYIKwYBBQUHAQEEeTB3MFEGCCsGAQUFBzAChkVodHRwOi8vd3d3Lm1pY3Jv\n"
404             "c29mdC5jb20vcGtpL21zY29ycC9NaWNyb3NvZnQlMjBJVCUyMFRMUyUyMENBJTIw\n"
405             "NS5jcnQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLm1zb2NzcC5jb20wHQYDVR0O\n"
406             "BBYEFParvwUeQbdw6ZH4GpVu9gwrCfuVMAsGA1UdDwQEAwIEsDCBmQYDVR0RBIGR\n"
407             "MIGOghN3d3dxYS5taWNyb3NvZnQuY29tghF3d3cubWljcm9zb2Z0LmNvbYIYc3Rh\n"
408             "dGljdmlldy5taWNyb3NvZnQuY29tghFpLnMtbWljcm9zb2Z0LmNvbYINbWljcm9z\n"
409             "b2Z0LmNvbYIRYy5zLW1pY3Jvc29mdC5jb22CFXByaXZhY3kubWljcm9zb2Z0LmNv\n"
410             "bTCBrAYDVR0fBIGkMIGhMIGeoIGboIGYhktodHRwOi8vbXNjcmwubWljcm9zb2Z0\n"
411             "LmNvbS9wa2kvbXNjb3JwL2NybC9NaWNyb3NvZnQlMjBJVCUyMFRMUyUyMENBJTIw\n"
412             "NS5jcmyGSWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvbXNjb3JwL2NybC9N\n"
413             "aWNyb3NvZnQlMjBJVCUyMFRMUyUyMENBJTIwNS5jcmwwTQYDVR0gBEYwRDBCBgkr\n"
414             "BgEEAYI3KgEwNTAzBggrBgEFBQcCARYnaHR0cDovL3d3dy5taWNyb3NvZnQuY29t\n"
415             "L3BraS9tc2NvcnAvY3BzMB8GA1UdIwQYMBaAFAj+JZ906ocEwry7jqg4XzPG0Wxl\n"
416             "MB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDATANBgkqhkiG9w0BAQsFAAOC\n"
417             "AgEAdWMaW3NOP5Yr47Sow1UZNLMmDlxNjz+8DcHiflQfKsImOvs/UflUrMGXG7rH\n"
418             "57NbJZ9nYpSTHWxSJfKsGPc3pgc5R1sxZxDb6lBuXEN9NvhJMmPwBkyKJAAnjYN6\n"
419             "yCNZP4X6dBOONW8uopknF+CRHDZdSiMaFiE4fVCe0LrO90b4ROPsRV8zHn57i1B1\n"
420             "69n1cqsLXrMHvK0Xnu7rwrvvd5BbOaqm7DrgwJYUk0UciNEfcyN2dNRcCxofWQdV\n"
421             "GQqvagqtjyDCm/EJ6DJ2kWllGHjauc8IkMaUeCedTYphChEckXoRBZikZtyL0oZj\n"
422             "67iKht6mm4fST+x0Zuu5wdzUoCTQsNTHV0GSbcVIRcgmaNiwP+0+lrRocUrj2h/7\n"
423             "2IQN8Pe/+CrDeVJNlKA9gWNl+t1F/r3CKWnkENyNUCTggiCSojdY9Rkj1rTieP6M\n"
424             "SBUZBWf3MB5XIuaLOTO0/whM831krxNG/k0mdCpDtdKvCKIcARrkKM9A3TxtVpOd\n"
425             "8f9kifcGaPqTQYr8fxhrNB864qsCG17o8ZckBKW8FY5H/jSQAZb1qbwsTbBMXJIr\n"
426             "0lAPwH7LIAHJJyslG0X3Mp0ARumGWqVwiHOCaLXO1iSQX0wW4yo+lGxWONvOIoad\n"
427             "2Ned/fxM675fEVC+r+DI6BKbt9ChfIXiXeULqOZC3yp2Fo8=\n"
428             "-----END CERTIFICATE-----\n");
429         cm[RawCertificateID::MICROSOFT_COM].raw_base64 = raw_base64;
430         cm[RawCertificateID::MICROSOFT_COM].certPtr = createCert(raw_base64);
431     }
432
433     return cm;
434 }
435
436 CertMap TEST_CERTS = initializeTestCerts();
437
438 } // namespace TestData::anonymous
439
440 void checkCertificateValidity(std::map<RawCertificateID, TestCert>::iterator& it)
441 {
442     if (it->second.valid == TestCert::UNKNOWN)
443     {
444         auto buff = BIO_new(BIO_s_mem());
445         BIO_write(buff, it->second.raw_base64.c_str(), it->second.raw_base64.size());
446
447         X509* x509 = PEM_read_bio_X509(buff, nullptr, nullptr, nullptr);
448         BIO_free_all(buff);
449
450         RUNNER_ASSERT_MSG(x509 != NULL, "Test certificate " << it->first << " can't be parsed");
451
452         if (X509_cmp_current_time(X509_get_notBefore(x509)) > 0)
453             it->second.valid = TestCert::NOT_YET_VALID;
454         else if (X509_cmp_current_time(X509_get_notAfter(x509)) < 0)
455             it->second.valid = TestCert::EXPIRED;
456         else
457             it->second.valid = TestCert::VALID;
458
459         X509_free(x509);
460     }
461
462     switch (it->second.valid)
463     {
464     case TestCert::NOT_YET_VALID:
465         RUNNER_FAIL_MSG(
466                 "Test certificate " << it->first <<
467                 " is not yet valid. Check the certificate and the system date.");
468         break;
469     case TestCert::EXPIRED:
470         RUNNER_FAIL_MSG(
471                 "Test certificate " << it->first <<
472                 " has expired. Check the certificate and the system date.");
473         break;
474     default:
475         break;
476     }
477 }
478
479 std::string getTestCertificateBase64(certificateID id)
480 {
481     auto cert = TEST_CERTS.find(toRawCertificateID(id));
482
483     RUNNER_ASSERT_MSG(cert != TEST_CERTS.end(), "Unknown certificate index!");
484
485     auto &certStruct = cert->second;
486     RUNNER_ASSERT_MSG(certStruct.raw_base64.size() > 0, "Certificate is empty!");
487
488     checkCertificateValidity(cert);
489
490     return certStruct.raw_base64;
491 }
492
493 CKM::CertificateShPtr getTestCertificate(certificateID id)
494 {
495     auto cert = TEST_CERTS.find(toRawCertificateID(id));
496
497     RUNNER_ASSERT_MSG(cert != TEST_CERTS.end(), "Unknown certificate index!");
498
499     auto &certStruct = cert->second;
500     RUNNER_ASSERT_MSG(certStruct.certPtr != nullptr, "Certificate is empty!");
501
502     checkCertificateValidity(cert);
503
504     return certStruct.certPtr;
505 }
506
507 } // namespace TestData