proxygen
DefaultCertificateVerifierTest.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2018-present, Facebook, Inc.
3  * All rights reserved.
4  *
5  * This source code is licensed under the BSD-style license found in the
6  * LICENSE file in the root directory of this source tree.
7  */
8 
9 #include <gtest/gtest.h>
10 
13 
14 using namespace folly;
15 using namespace folly::ssl;
16 using namespace testing;
17 
18 namespace fizz {
19 namespace test {
20 
22  public:
23  void SetUp() override {
24  OpenSSL_add_all_algorithms();
25  folly::ssl::X509StoreUniquePtr store(X509_STORE_new());
26  ASSERT_TRUE(store);
27  rootCertAndKey_ = createCert("root", true, nullptr);
28  leafCertAndKey_ = createCert("leaf", false, &rootCertAndKey_);
29  ASSERT_EQ(X509_STORE_add_cert(store.get(), rootCertAndKey_.cert.get()), 1);
30  verifier_ = std::make_unique<DefaultCertificateVerifier>(
31  VerificationContext::Client, std::move(store));
32  }
33 
34  void TearDown() override {}
35 
36  static int allowSelfSignedLeafCertCallback(int ok, X509_STORE_CTX* ctx) {
37  if (X509_STORE_CTX_get_error(ctx) ==
38  X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT) {
39  return 1;
40  }
41  return ok;
42  }
43 
44  protected:
47  std::unique_ptr<DefaultCertificateVerifier> verifier_;
48 };
49 
51  verifier_->verify({getPeerCert(leafCertAndKey_)});
52 }
53 
54 TEST_F(DefaultCertificateVerifierTest, TestVerifyWithIntermediates) {
55  auto subauth = createCert("subauth", true, &rootCertAndKey_);
56  auto subleaf = createCert("subleaf", false, &subauth);
57  verifier_->verify({getPeerCert(subleaf), getPeerCert(subauth)});
58 }
59 
60 TEST_F(DefaultCertificateVerifierTest, TestVerifySelfSignedCert) {
61  auto selfsigned = createCert("self", false, nullptr);
63  verifier_->verify({getPeerCert(selfsigned)}), std::runtime_error);
64 }
65 
66 TEST_F(DefaultCertificateVerifierTest, TestVerifySelfSignedCertWithOverride) {
67  auto selfsigned = createCert("self", false, nullptr);
68  verifier_->setCustomVerifyCallback(
69  &DefaultCertificateVerifierTest::allowSelfSignedLeafCertCallback);
70  // Will not throw because the override allows for this type of error.
71  verifier_->verify({getPeerCert(selfsigned)});
72 }
73 
74 TEST_F(DefaultCertificateVerifierTest, TestVerifyWithIntermediateMissing) {
75  auto subauth = createCert("subauth", true, &rootCertAndKey_);
76  auto subleaf = createCert("subleaf", false, &subauth);
77  EXPECT_THROW(verifier_->verify({getPeerCert(subleaf)}), std::runtime_error);
78 }
79 
82  TestVerifyWithIntermediateMissingWithOverride) {
83  auto subauth = createCert("subauth", true, &rootCertAndKey_);
84  auto subleaf = createCert("subleaf", false, &subauth);
85  verifier_->setCustomVerifyCallback(
86  &DefaultCertificateVerifierTest::allowSelfSignedLeafCertCallback);
87  // The override is irrelevant to the error here. So exception is expected.
88  EXPECT_THROW(verifier_->verify({getPeerCert(subleaf)}), std::runtime_error);
89 }
90 
91 TEST_F(DefaultCertificateVerifierTest, TestVerifyWithBadIntermediate) {
92  auto subauth = createCert("badsubauth", false, &rootCertAndKey_);
93  auto subleaf = createCert("badsubleaf", false, &subauth);
94  EXPECT_THROW(verifier_->verify({getPeerCert(subleaf)}), std::runtime_error);
95 }
96 
97 TEST_F(DefaultCertificateVerifierTest, TestVerifyWithBadRoot) {
98  auto newroot = createCert("root2", true, nullptr);
99  auto subauth = createCert("subauth2", true, &newroot);
100  auto subleaf = createCert("leaf2", false, &subauth);
101  EXPECT_THROW(
102  verifier_->verify({getPeerCert(subleaf), getPeerCert(subauth)}),
103  std::runtime_error);
104 }
105 } // namespace test
106 } // namespace fizz
static int allowSelfSignedLeafCertCallback(int ok, X509_STORE_CTX *ctx)
#define EXPECT_THROW(statement, expected_exception)
Definition: gtest.h:1843
#define ASSERT_EQ(val1, val2)
Definition: gtest.h:1956
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
std::unique_ptr< DefaultCertificateVerifier > verifier_
—— Concurrent Priority Queue Implementation ——
Definition: AtomicBitSet.h:29
std::unique_ptr< X509_STORE, X509StoreDeleter > X509StoreUniquePtr
Definition: Actions.h:16
TEST_F(AsyncSSLSocketWriteTest, write_coalescing1)
std::shared_ptr< PeerCert > getPeerCert(const CertAndKey &cert)
Definition: Utilities.h:122
CertAndKey createCert(std::string cn, bool ca, CertAndKey *issuer)
Definition: Utilities.h:35
std::shared_ptr< const CertificateVerifier > verifier_
#define ASSERT_TRUE(condition)
Definition: gtest.h:1865