proxygen
OpenSSLCertUtilsTest.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2017-present Facebook, Inc.
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  */
17 
18 #include <folly/Format.h>
19 #include <folly/Range.h>
20 #include <folly/String.h>
24 #include <folly/ssl/Init.h>
26 
27 using namespace testing;
28 using namespace folly;
29 
30 const char* kTestCertWithoutSan = "folly/io/async/test/certs/tests-cert.pem";
31 const char* kTestCa = "folly/io/async/test/certs/ca-cert.pem";
32 
33 // Test key
35  ----BEGIN EC PRIVATE KEY-----
36  MHcCAQEEIBskFwVZ9miFN+SKCFZPe9WEuFGmP+fsecLUnsTN6bOcoAoGCCqGSM49
37  AwEHoUQDQgAE7/f4YYOYunAM/VkmjDYDg3AWUgyyTIraWmmQZsnu0bYNV/lLLfNz
38  CtHggxGSwEtEe40nNb9C8wQmHUvb7VBBlw==
39  -----END EC PRIVATE KEY-----
40 )");
42  -----BEGIN CERTIFICATE-----
43  MIIDXDCCAkSgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBQMQswCQYDVQQGEwJVUzEL
44  MAkGA1UECAwCQ0ExDTALBgNVBAoMBEFzb3gxJTAjBgNVBAMMHEFzb3ggQ2VydGlm
45  aWNhdGlvbiBBdXRob3JpdHkwHhcNMTcwMjEzMjMyMTAzWhcNNDQwNzAxMjMyMTAz
46  WjAwMQswCQYDVQQGEwJVUzENMAsGA1UECgwEQXNveDESMBAGA1UEAwwJMTI3LjAu
47  MC4xMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE7/f4YYOYunAM/VkmjDYDg3AW
48  UgyyTIraWmmQZsnu0bYNV/lLLfNzCtHggxGSwEtEe40nNb9C8wQmHUvb7VBBl6OC
49  ASowggEmMAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJh
50  dGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBRx1kmdZEfXHmWLHpSDI0Lh8hmfwzAf
51  BgNVHSMEGDAWgBQX3ykJKb97nxp/6UZJyDvts7noezAxBgNVHREEKjAoghJhbm90
52  aGVyZXhhbXBsZS5jb22CEioudGhpcmRleGFtcGxlLmNvbTB4BggrBgEFBQcBAQRs
53  MGowaAYIKwYBBQUHMAKGXGh0dHBzOi8vcGhhYnJpY2F0b3IuZmIuY29tL2RpZmZ1
54  c2lvbi9GQkNPREUvYnJvd3NlL21hc3Rlci90aS90ZXN0X2NlcnRzL2NhX2NlcnQu
55  cGVtP3ZpZXc9cmF3MA0GCSqGSIb3DQEBCwUAA4IBAQCj3FLjLMLudaFDiYo9pAPQ
56  NBYNpG27aajQCvnEsYaMAGnNBxUUhv/E4xpnJEhatiCJWlPgGebdjXkpXYkLxnFj
57  38UmpfZbNcvPPKxXmjIlkpYeFwcHTAUpFmMXVHdr8FjkDSN+qWHLllMFNAAqp0U6
58  4VWjDlq9xCjzNw+8fdcEpwylpPrbNyQHqSO1k+DhM2qPuQfiWPmHe2PbJv8JB3no
59  HWGi9SNe0FjtJM3066L0Gj8g/bFDo/pnyKguQyGkS7PaepK5/u5Y2fMMBO/m4+U0
60  b9Yb0TvatsqL688CoZcSn73A0yAjptwbD/4HmcVlG2j/y8eTVpXisugu6Xz+QQGu
61  -----END CERTIFICATE-----
62 )");
63 
65  -----BEGIN CERTIFICATE-----
66  MIIDgzCCAmugAwIBAgIJAIkcS3PQcCm+MA0GCSqGSIb3DQEBCwUAMFgxCzAJBgNV
67  BAYTAlhYMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0RlZmF1bHQg
68  Q29tcGFueSBMdGQxFDASBgNVBAMMC3Rlc3QgY2VydCAxMB4XDTE3MTAyMzIwNTcw
69  M1oXDTE4MTAyMzIwNTcwM1owWDELMAkGA1UEBhMCWFgxFTATBgNVBAcMDERlZmF1
70  bHQgQ2l0eTEcMBoGA1UECgwTRGVmYXVsdCBDb21wYW55IEx0ZDEUMBIGA1UEAwwL
71  dGVzdCBjZXJ0IDEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCplTzR
72  6shdhVNbx5HFViiYDBjRYXCWiUeR0/0+XPkyI+DPIGAQ6Mre8WD03GPebYn7j3Lr
73  JwgV06BJNvVCLDy0SJbf6ToxGfKWSLEWOoip32nIpb9qxURtx44NUvhChP54hhKI
74  zAf8nNlS+qKUYbmixJHeUWO//8wNpsMKDkvtfVUZ6oVV3JPOOihJ+sQ0sIc5x+xk
75  3eWfa0cNoZnxu4plQg2O4RlHOv8ruMW6BttpcqQ8I+Rxq+/YOhNQhX+6GZ1+Rs+f
76  ddWXYNH6tFxsLIEbgCqHhLGw7g+JRms9R+CxLCpjmhYhR2xgl6KQu/Racr2T/17z
77  897VfY7X94PmamidAgMBAAGjUDBOMB0GA1UdDgQWBBRHQvRr2p3/83y1yXiiVnnS
78  zObpzTAfBgNVHSMEGDAWgBRHQvRr2p3/83y1yXiiVnnSzObpzTAMBgNVHRMEBTAD
79  AQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAk61K1sjrS7rrLnGND1o1Q6D2ebgb1wcfU
80  WX+ZnhlkUxjSS1nHmaulMftpvzbgrOt7HWZKMXIpetnDSfksrGpw6QJ3VWFIJlH5
81  P4x8//pVeI5jQd4W7gIl65tZOc5cEH8aqnzkaGP8YBx6BI6N8px1gZVgePVu3ebR
82  eLdrWH2l4VishWOf6rO/ltQdTwRIqj08QNsWmSrRK2d7J/DGA6R9JkdyxeLdxqmB
83  2BMwJ7IVR+bWuTzD9Zk5lZseIVFcIksxmQ8jJuZXUdN8WOT/65p9UnN+Cc6+Q7F4
84  rlVz+ytcdvaf5mDeqFILDK6btWcUP2Vr1EfRDt/QBrU6OjAVQD+U
85  -----END CERTIFICATE-----
86  -----BEGIN CERTIFICATE-----
87  MIIDgzCCAmugAwIBAgIJAPzrfjTkvHezMA0GCSqGSIb3DQEBCwUAMFgxCzAJBgNV
88  BAYTAlhYMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0RlZmF1bHQg
89  Q29tcGFueSBMdGQxFDASBgNVBAMMC3Rlc3QgY2VydCAyMB4XDTE3MTAyMzIwNTcx
90  NloXDTE4MTAyMzIwNTcxNlowWDELMAkGA1UEBhMCWFgxFTATBgNVBAcMDERlZmF1
91  bHQgQ2l0eTEcMBoGA1UECgwTRGVmYXVsdCBDb21wYW55IEx0ZDEUMBIGA1UEAwwL
92  dGVzdCBjZXJ0IDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzy9G/
93  NM7Llp+foYxug2Dqc3r9zWtb4PvbRqoz8W0ZRy0GkL3JtOfLWtlz+RCGa//mlGMA
94  HLa+Qg77nnjuhO/KCCgQS9fxHY+zcv1VBwzsKmKcju4BCscsTLPsy0SJCXBXSgnH
95  S4NMR/K+YozwdikEZRbU4VLJiw44CeJ1h74r2ElHYuOL0SpL8PSlv7kJu3/xWUiV
96  L2iWk+y8yKIpCRQ9I7+L0kuhylZAmVBTKtgbdcLfERqQNNWAT7D+p/6CwNmpT9ei
97  G2xJ0N4bt3w8kwcZ+IkGwei8Nadix+POe3WVU9K1VXVfoLZ9nNWKRnwIFP4Bsmld
98  rP4Uy2IZuhrKE4BPAgMBAAGjUDBOMB0GA1UdDgQWBBQkmeMfPQaax9wCZL16jSSG
99  XigBWjAfBgNVHSMEGDAWgBQkmeMfPQaax9wCZL16jSSGXigBWjAMBgNVHRMEBTAD
100  AQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCXzqxYp1FqMS2M+opCSPezgPDBdE2S9g6d
101  HJHV5CLptGnu1vQIlyCXy/7X9b6Qq8UzuYyFacN/37tbNw6sGyTRfL8sEeFYfFoT
102  GvgSrRqSM47ZBYx5jW/Uslkc5qbq+v4zeGCq5611stQKsJYIudu0+PjJmgtNF6en
103  zTx8B6eS79GRN3/M7/kFLlxeZNCQpmKwvPp8P7JE4ZHUtuzQoKtjdt/etWpS76fV
104  Akx7VhCFg/lw80tmgSclq885hYRYc6DOKfUubWOacKVfmHwL4oDiSffBonI7MoH8
105  SJbzsCBpVd/tkDADZpxBQplGV7AaDBoNS0qvZHfH5x9R9R5lx9M+
106  -----END CERTIFICATE-----
107  -----BEGIN CERTIFICATE-----
108  MIIDgzCCAmugAwIBAgIJAOzqPJDDfSKDMA0GCSqGSIb3DQEBCwUAMFgxCzAJBgNV
109  BAYTAlhYMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNVBAoME0RlZmF1bHQg
110  Q29tcGFueSBMdGQxFDASBgNVBAMMC3Rlc3QgY2VydCAzMB4XDTE3MTAyMzIwNTcy
111  NVoXDTE4MTAyMzIwNTcyNVowWDELMAkGA1UEBhMCWFgxFTATBgNVBAcMDERlZmF1
112  bHQgQ2l0eTEcMBoGA1UECgwTRGVmYXVsdCBDb21wYW55IEx0ZDEUMBIGA1UEAwwL
113  dGVzdCBjZXJ0IDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDWqU2b
114  eBzaOAja6od84hFfgvitOGrCYqLXMUXe0X7AlldzXV4zHaVyTKdEwDwvKDi5p9OF
115  uTxSZkZ0JSPHZeH2/rHXidNMWdtiy5x/5ra1u9ctN7jHeboIxmdpfxoGq7s6cRA5
116  oRh0bCNmw+Y7K+1RITmPloB7155RbrJYZR5MOFIaCnZV3j/icKjASTOg3ivXX4lx
117  BoHGMYF8rl+51FIJsuXvnBgF+GhadMVSWl4Qy6gLliml1MgujlmFg9/1y/xzdWZg
118  yyLI3tvw7fo/NN62u41VQBdCGdpvnVxU4ADu2/T0vhAS+Bh2CMK1OAAw61x1507S
119  f68mab9s8at49qefAgMBAAGjUDBOMB0GA1UdDgQWBBQnn76Swsnld6Q1weLgpo/S
120  tt0KeTAfBgNVHSMEGDAWgBQnn76Swsnld6Q1weLgpo/Stt0KeTAMBgNVHRMEBTAD
121  AQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCB0XANIWyP7DYROh6MFQLqeylngd9iUGNe
122  BMT4pWu60p5ZX13kK/gbV/P2cayUkkWEMWpzKcIX70IkaB5y/OxVMXUXo94UupsM
123  b1T736wHA0TLeL7yDj9OnMYj/qa2r8pAyEObI84KoWRGMHH9UPSRbVMVrhg/agBA
124  LA6eZhwiGctkCy09kp+SFbUpv+SMyVp60UrPub6j68Hzd0FioGY01Os7nScuPNo0
125  rl2S+G36bcem8Z5MOkJ0LEFi6ctK9JdLcHkr1SVavo3fsYZaIZraJxFGcYUVyLT+
126  Rw7ydBokxHWsmVJczuRmEovXcTmgIphti234e7usKjw8M5mGwYfa
127  -----END CERTIFICATE-----
128 )");
129 
130 class OpenSSLCertUtilsTest : public TestWithParam<bool> {
131  public:
132  void SetUp() override {
134 
135  if (GetParam()) {
136  // Run the test with an polluted error stack.
137  SSLerr(SSL_F_SSL3_READ_BYTES, SSL_R_SSL_HANDSHAKE_FAILURE);
138  }
139  }
140 };
141 
143 
145  folly::ssl::BioUniquePtr bio(BIO_new(BIO_s_file()));
146  if (!bio) {
147  throw std::runtime_error("Couldn't create BIO");
148  }
149 
150  if (BIO_read_filename(bio.get(), filename.c_str()) != 1) {
151  throw std::runtime_error("Couldn't read cert file: " + filename);
152  }
154  PEM_read_bio_X509(bio.get(), nullptr, nullptr, nullptr));
155 }
156 
158  const folly::StringPiece data) {
159  folly::ssl::BioUniquePtr bio(BIO_new_mem_buf(data.data(), data.size()));
160  if (!bio) {
161  throw std::runtime_error("Couldn't create BIO");
162  }
164  PEM_read_bio_X509(bio.get(), nullptr, nullptr, nullptr));
165 }
166 
167 // Validate the certs parsed from kTestCertBundle buffer.
169  const std::vector<folly::ssl::X509UniquePtr>& certs) {
170  EXPECT_EQ(certs.size(), 3);
171  for (auto i : folly::enumerate(certs)) {
173  EXPECT_TRUE(identity);
174  EXPECT_EQ(*identity, folly::sformat("test cert {}", i.index + 1));
175  }
176 }
177 
178 // Validate parsed cert from kTestCertWithSan.
179 static void validateTestCertWithSAN(X509* x509) {
180  ASSERT_NE(nullptr, x509);
181  auto identity = folly::ssl::OpenSSLCertUtils::getCommonName(*x509);
182  EXPECT_EQ("127.0.0.1", identity.value());
184  EXPECT_EQ(2, altNames.size());
185  EXPECT_EQ("anotherexample.com", altNames[0]);
186  EXPECT_EQ("*.thirdexample.com", altNames[1]);
187 }
188 
191  EXPECT_NE(x509, nullptr);
192  auto identity = folly::ssl::OpenSSLCertUtils::getCommonName(*x509);
193  EXPECT_EQ(identity.value(), "Asox Company");
195  EXPECT_EQ(sans.size(), 0);
196 }
197 
198 TEST_P(OpenSSLCertUtilsTest, TestX509Sans) {
199  auto x509 = readCertFromData(kTestCertWithSan);
200  validateTestCertWithSAN(x509.get());
201 }
202 
203 TEST_P(OpenSSLCertUtilsTest, TestX509IssuerAndSubject) {
204  auto x509 = readCertFromData(kTestCertWithSan);
205  EXPECT_NE(x509, nullptr);
206  auto issuer = folly::ssl::OpenSSLCertUtils::getIssuer(*x509);
207  EXPECT_EQ(
208  issuer.value(),
209  "C = US, ST = CA, O = Asox, CN = Asox Certification Authority");
210  auto subj = folly::ssl::OpenSSLCertUtils::getSubject(*x509);
211  EXPECT_EQ(subj.value(), "C = US, O = Asox, CN = 127.0.0.1");
212 }
213 
214 TEST_P(OpenSSLCertUtilsTest, TestX509Dates) {
215  auto x509 = readCertFromData(kTestCertWithSan);
216  EXPECT_NE(x509, nullptr);
217  auto notBefore = folly::ssl::OpenSSLCertUtils::getNotBeforeTime(*x509);
218  EXPECT_EQ(notBefore, "Feb 13 23:21:03 2017 GMT");
219  auto notAfter = folly::ssl::OpenSSLCertUtils::getNotAfterTime(*x509);
220  EXPECT_EQ(notAfter, "Jul 1 23:21:03 2044 GMT");
221 }
222 
223 TEST_P(OpenSSLCertUtilsTest, TestX509Summary) {
224  auto x509 = readCertFromData(kTestCertWithSan);
225  EXPECT_NE(x509, nullptr);
226  auto summary = folly::ssl::OpenSSLCertUtils::toString(*x509);
227  EXPECT_EQ(
228  summary.value(),
229  " Version: 3 (0x2)\n Serial Number: 2 (0x2)\n"
230  " Issuer: C = US, ST = CA, O = Asox, CN = Asox Certification Authority\n"
231  " Validity\n Not Before: Feb 13 23:21:03 2017 GMT\n"
232  " Not After : Jul 1 23:21:03 2044 GMT\n"
233  " Subject: C = US, O = Asox, CN = 127.0.0.1\n"
234  " X509v3 extensions:\n"
235  " X509v3 Basic Constraints: \n"
236  " CA:FALSE\n"
237  " Netscape Comment: \n"
238  " OpenSSL Generated Certificate\n"
239  " X509v3 Subject Key Identifier: \n"
240  " 71:D6:49:9D:64:47:D7:1E:65:8B:1E:94:83:23:42:E1:F2:19:9F:C3\n"
241  " X509v3 Authority Key Identifier: \n"
242  " keyid:17:DF:29:09:29:BF:7B:9F:1A:7F:E9:46:49:C8:3B:ED:B3:B9:E8:7B\n\n"
243  " X509v3 Subject Alternative Name: \n"
244  " DNS:anotherexample.com, DNS:*.thirdexample.com\n"
245  " Authority Information Access: \n"
246  " CA Issuers - URI:https://phabricator.fb.com/diffusion/FBCODE/browse/master/ti/test_certs/ca_cert.pem?view=raw\n\n");
247 }
248 
249 TEST_P(OpenSSLCertUtilsTest, TestDerEncodeDecode) {
250  auto x509 = readCertFromData(kTestCertWithSan);
251 
252  auto der = folly::ssl::OpenSSLCertUtils::derEncode(*x509);
253  auto decoded = folly::ssl::OpenSSLCertUtils::derDecode(der->coalesce());
254 
255  EXPECT_EQ(
258 }
259 
260 TEST_P(OpenSSLCertUtilsTest, TestDerDecodeJunkData) {
261  StringPiece junk{"MyFakeCertificate"};
262  EXPECT_THROW(
263  folly::ssl::OpenSSLCertUtils::derDecode(junk), std::runtime_error);
264 }
265 
266 TEST_P(OpenSSLCertUtilsTest, TestDerDecodeTooShort) {
267  auto x509 = readCertFromData(kTestCertWithSan);
268 
269  auto der = folly::ssl::OpenSSLCertUtils::derEncode(*x509);
270  der->trimEnd(1);
271  EXPECT_THROW(
273  std::runtime_error);
274 }
275 
276 TEST_P(OpenSSLCertUtilsTest, TestReadCertsFromBuffer) {
279  validateTestCertBundle(certs);
280 }
281 
282 // readCertsFromBuffer() should manage to read certs from a buffer that contain
283 // both cert and private key.
284 TEST_P(OpenSSLCertUtilsTest, TestReadCertsFromMixedBuffer) {
285  std::vector<std::string> bufs(
286  {folly::to<std::string>(kTestCertWithSan, "\n\n", kTestKey, "\n"),
287  folly::to<std::string>(kTestKey, "\n\n", kTestCertWithSan, "\n")});
288  for (auto& buf : bufs) {
290  folly::StringPiece(buf));
291  ASSERT_EQ(1, certs.size());
292  validateTestCertWithSAN(certs.front().get());
293  }
294 }
295 
296 TEST_P(OpenSSLCertUtilsTest, TestX509Digest) {
298  EXPECT_NE(x509, nullptr);
299 
300  auto sha1Digest = folly::ssl::OpenSSLCertUtils::getDigestSha1(*x509);
301  EXPECT_EQ(
302  folly::hexlify(folly::range(sha1Digest)),
303  "b84e951d6c4e6cc70346357fab43d7ed73a07b0f");
304 
305  auto sha2Digest = folly::ssl::OpenSSLCertUtils::getDigestSha256(*x509);
306  EXPECT_EQ(
307  folly::hexlify(folly::range(sha2Digest)),
308  "364d3a6a0b10d0635ce59b40c0b7f505ab2cd9fd0a06661cdc61d9cb8c9c9821");
309 }
310 
311 TEST_P(OpenSSLCertUtilsTest, TestX509Store) {
313  EXPECT_NE(store, nullptr);
314 
316  folly::ssl::X509StoreCtxUniquePtr ctx(X509_STORE_CTX_new());
317  auto rc = X509_STORE_CTX_init(ctx.get(), store.get(), x509.get(), nullptr);
318  EXPECT_EQ(rc, 1);
319  rc = X509_verify_cert(ctx.get());
320  EXPECT_EQ(rc, 1);
321 }
322 
323 TEST_P(OpenSSLCertUtilsTest, TestProcessMalformedCertBuf) {
324  std::string badCert =
325  "-----BEGIN CERTIFICATE-----\n"
326  "yo\n"
327  "-----END CERTIFICATE-----\n";
328 
329  EXPECT_THROW(
331  folly::StringPiece(badCert)),
332  std::runtime_error);
333 
334  EXPECT_THROW(
336  folly::StringPiece(badCert)),
337  std::runtime_error);
338 
339  std::string bufWithBadCert =
340  folly::to<std::string>(badCert, "\n", kTestCertBundle);
341 
342  EXPECT_THROW(
344  folly::StringPiece(bufWithBadCert)),
345  std::runtime_error);
346 
347  EXPECT_THROW(
349  folly::StringPiece(bufWithBadCert)),
350  std::runtime_error);
351 }
352 
353 TEST_P(OpenSSLCertUtilsTest, TestReadStoreDuplicate) {
354  auto dupBundle =
355  folly::to<std::string>(kTestCertBundle, "\n\n", kTestCertBundle);
356 
358  folly::StringPiece(dupBundle));
359  EXPECT_NE(store, nullptr);
360  EXPECT_EQ(ERR_get_error(), 0);
361 }
INSTANTIATE_TEST_CASE_P(, CodeLocationForTESTP, Values(0))
static void validateTestCertWithSAN(X509 *x509)
#define EXPECT_THROW(statement, expected_exception)
Definition: gtest.h:1843
#define ASSERT_EQ(val1, val2)
Definition: gtest.h:1956
static folly::Optional< std::string > toString(X509 &x509)
std::unique_ptr< X509, X509Deleter > X509UniquePtr
const std::string kTestCertWithSan
std::unique_ptr< BIO, BioDeleter > BioUniquePtr
std::string sformat(StringPiece fmt, Args &&...args)
Definition: Format.h:280
const std::string kTestKey
static std::array< uint8_t, SHA_DIGEST_LENGTH > getDigestSha1(X509 &x509)
static std::array< uint8_t, SHA256_DIGEST_LENGTH > getDigestSha256(X509 &x509)
#define EXPECT_EQ(val1, val2)
Definition: gtest.h:1922
static Optional< std::string > getSubject(X509 &x509)
static X509StoreUniquePtr readStoreFromBuffer(ByteRange range)
static X509UniquePtr derDecode(ByteRange)
constexpr size_type size() const
Definition: Range.h:431
void init()
Definition: Init.cpp:54
const char * kTestCertWithoutSan
—— Concurrent Priority Queue Implementation ——
Definition: AtomicBitSet.h:29
static folly::ssl::X509UniquePtr readCertFromFile(const std::string &filename)
TEST_P(CodeLocationForTESTP, Verify)
std::string stripLeftMargin(std::string s)
Definition: String.cpp:704
static folly::ssl::X509UniquePtr readCertFromData(const folly::StringPiece data)
static std::vector< std::string > getSubjectAltNames(X509 &x509)
static X509StoreUniquePtr readStoreFromFile(std::string caFile)
static Optional< std::string > getIssuer(X509 &x509)
static std::string getNotAfterTime(X509 &x509)
const std::string kTestCertBundle
constexpr Iter data() const
Definition: Range.h:446
constexpr Range< Iter > range(Iter first, Iter last)
Definition: Range.h:1114
const char * kTestCa
static void validateTestCertBundle(const std::vector< folly::ssl::X509UniquePtr > &certs)
static Optional< std::string > getCommonName(X509 &x509)
detail::RangeEnumerator< Range > enumerate(Range &&r)
Definition: Enumerate.h:167
#define EXPECT_TRUE(condition)
Definition: gtest.h:1859
const char * string
Definition: Conv.cpp:212
std::unique_ptr< X509_STORE_CTX, X509StoreCtxDeleter > X509StoreCtxUniquePtr
#define EXPECT_NE(val1, val2)
Definition: gtest.h:1926
static std::vector< X509UniquePtr > readCertsFromBuffer(ByteRange range)
bool_constant< B > Bool
Definition: TypeList.h:81
static std::unique_ptr< IOBuf > derEncode(X509 &)
#define ASSERT_NE(val1, val2)
Definition: gtest.h:1960
Range< const char * > StringPiece
bool hexlify(const InputString &input, OutputString &output, bool append_output)
Definition: String-inl.h:596
static constexpr uint64_t data[1]
Definition: Fingerprint.cpp:43
static std::string getNotBeforeTime(X509 &x509)