proxygen
fizz::JavaCryptoCertificateVerifier Class Reference

#include <JavaCryptoCertificateVerifier.h>

Inheritance diagram for fizz::JavaCryptoCertificateVerifier:
fizz::CertificateVerifier

Public Member Functions

 JavaCryptoCertificateVerifier (VerificationContext context)
 
 JavaCryptoCertificateVerifier (VerificationContext context, folly::ssl::X509StoreUniquePtr &&store)
 
void verify (const std::vector< std::shared_ptr< const fizz::PeerCert >> &certs) const override
 
void setX509Store (folly::ssl::X509StoreUniquePtr &&store)
 
std::vector< ExtensiongetCertificateRequestExtensions () const override
 
- Public Member Functions inherited from fizz::CertificateVerifier
virtual ~CertificateVerifier ()=default
 

Static Public Member Functions

static X509_STORE * getDefaultX509Store ()
 
static std::unique_ptr< JavaCryptoCertificateVerifiercreateFromCAFile (VerificationContext context, const std::string &caFile)
 

Private Member Functions

void createAuthorities ()
 

Private Attributes

CertificateAuthorities authorities_
 
VerificationContext context_
 
folly::ssl::X509StoreUniquePtr x509Store_
 

Detailed Description

Certificate verifier that verifies a certificate against a trusted certificate store

This does not perform any identity or hostname verification.

Definition at line 27 of file JavaCryptoCertificateVerifier.h.

Constructor & Destructor Documentation

fizz::JavaCryptoCertificateVerifier::JavaCryptoCertificateVerifier ( VerificationContext  context)
inlineexplicit
fizz::JavaCryptoCertificateVerifier::JavaCryptoCertificateVerifier ( VerificationContext  context,
folly::ssl::X509StoreUniquePtr &&  store 
)
inlineexplicit

Definition at line 33 of file JavaCryptoCertificateVerifier.h.

References verify().

36  : context_(context), x509Store_(std::move(store)) {
38  }
context
Definition: CMakeCache.txt:563
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567

Member Function Documentation

void fizz::JavaCryptoCertificateVerifier::createAuthorities ( )
private

Definition at line 89 of file JavaCryptoCertificateVerifier.cpp.

References fizz::CertificateAuthorities::authorities, folly::IOBuf::create(), fizz::DistinguishedName::encoded_name, i, folly::gen::move, folly::portability::ssl::STACK_OF(), folly::portability::ssl::X509_OBJECT_get0_X509(), and folly::portability::ssl::X509_OBJECT_get_type().

89  {
90  CertificateAuthorities auth;
91  X509_STORE* store = x509Store_ ? x509Store_.get() : getDefaultX509Store();
92  // X509_STORE stores CA certs as objects in this stack.
93  STACK_OF(X509_OBJECT)* entries = X509_STORE_get0_objects(store);
94 
95  for (int i = 0; i < sk_X509_OBJECT_num(entries); i++) {
96  X509_OBJECT* obj = sk_X509_OBJECT_value(entries, i);
97  if (X509_OBJECT_get_type(obj) == X509_LU_X509) {
98  auto certIssuer = X509_get_subject_name(X509_OBJECT_get0_X509(obj));
99  int dnLength = i2d_X509_NAME(certIssuer, nullptr);
100  if (dnLength < 0) {
101  throw std::runtime_error("Error computing DN length");
102  }
103  DistinguishedName dn;
104  dn.encoded_name = folly::IOBuf::create(dnLength);
105  auto dnData = dn.encoded_name->writableData();
106  dnLength = i2d_X509_NAME(certIssuer, &dnData);
107  if (dnLength < 0) {
108  throw std::runtime_error("Error encoding DN in DER format");
109  }
110  dn.encoded_name->append(dnLength);
111  auth.authorities.push_back(std::move(dn));
112  }
113  }
114  authorities_ = std::move(auth);
115 }
X509 * X509_OBJECT_get0_X509(const X509_OBJECT *obj)
Definition: OpenSSL.cpp:487
static std::unique_ptr< IOBuf > create(std::size_t capacity)
Definition: IOBuf.cpp:229
STACK_OF(X509_OBJECT)*X509_STORE_get0_objects(X509_STORE *store)
Definition: OpenSSL.cpp:305
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
int X509_OBJECT_get_type(const X509_OBJECT *obj)
Definition: OpenSSL.cpp:483
std::unique_ptr< JavaCryptoCertificateVerifier > fizz::JavaCryptoCertificateVerifier::createFromCAFile ( VerificationContext  context,
const std::string caFile 
)
static

Definition at line 21 of file JavaCryptoCertificateVerifier.cpp.

References context, folly::gen::move, and folly::ssl::OpenSSLCertUtils::readStoreFromFile().

23  {
25  return std::make_unique<JavaCryptoCertificateVerifier>(
26  context, std::move(store));
27 }
context
Definition: CMakeCache.txt:563
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
static X509StoreUniquePtr readStoreFromFile(std::string caFile)
std::vector< Extension > fizz::JavaCryptoCertificateVerifier::getCertificateRequestExtensions ( ) const
overridevirtual

Returns a vector of extensions to send in a certificate request.

Implements fizz::CertificateVerifier.

Definition at line 136 of file JavaCryptoCertificateVerifier.cpp.

References fizz::encodeExtension().

136  {
137  std::vector<Extension> exts;
138  exts.push_back(encodeExtension(authorities_));
139  return exts;
140 }
Extension encodeExtension(const TokenBindingParameters &params)
Definition: Types.cpp:113
X509_STORE * fizz::JavaCryptoCertificateVerifier::getDefaultX509Store ( )
static

Definition at line 117 of file JavaCryptoCertificateVerifier.cpp.

117  {
118  static folly::ssl::X509StoreUniquePtr defaultStore([]() {
119  X509_STORE* store = X509_STORE_new();
120 
121  if (!store) {
122  throw std::bad_alloc();
123  }
124 
125  if (X509_STORE_set_default_paths(store) != 1) {
126  throw std::runtime_error("failed to set default paths");
127  }
128 
129  return store;
130  }());
131 
132  return defaultStore.get();
133 }
std::unique_ptr< X509_STORE, X509StoreDeleter > X509StoreUniquePtr
void fizz::JavaCryptoCertificateVerifier::setX509Store ( folly::ssl::X509StoreUniquePtr &&  store)
inline

Definition at line 43 of file JavaCryptoCertificateVerifier.h.

References context, folly::gen::move, and string.

43  {
44  x509Store_ = std::move(store);
46  }
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
void fizz::JavaCryptoCertificateVerifier::verify ( const std::vector< std::shared_ptr< const fizz::PeerCert >> &  certs) const
overridevirtual

Verifies the certificates in certs. The peer has been already proven possession of the first certificate in certs. Throws on error or if verification fails.

Implements fizz::CertificateVerifier.

Definition at line 29 of file JavaCryptoCertificateVerifier.cpp.

References i, fizz::Server, and string.

30  {
31  if (certs.empty()) {
32  throw std::runtime_error("no certificates to verify");
33  }
34 
35  auto leafCert = certs.front()->getX509();
36 
37  auto certChainStack = std::unique_ptr<STACK_OF(X509), STACK_OF_X509_deleter>(
38  sk_X509_new_null());
39  if (!certChainStack) {
40  throw std::bad_alloc();
41  }
42 
43  for (size_t i = 1; i < certs.size(); i++) {
44  sk_X509_push(certChainStack.get(), certs[i]->getX509().get());
45  }
46 
47  auto ctx = folly::ssl::X509StoreCtxUniquePtr(X509_STORE_CTX_new());
48  if (!ctx) {
49  throw std::bad_alloc();
50  }
51 
52  if (X509_STORE_CTX_init(
53  ctx.get(),
55  leafCert.get(),
56  certChainStack.get()) != 1) {
57  throw std::runtime_error("failed to initialize store context");
58  }
59 
60  if (X509_STORE_CTX_set_default(
61  ctx.get(),
62  context_ == VerificationContext::Server ? "ssl_client"
63  : "ssl_server") != 1) {
64  throw std::runtime_error("failed to set default verification method");
65  }
66 
67  folly::ssl::X509VerifyParam param(X509_VERIFY_PARAM_new());
68  if (!param) {
69  throw std::bad_alloc();
70  }
71 
72  if (X509_VERIFY_PARAM_set_flags(param.get(), X509_V_FLAG_X509_STRICT) != 1) {
73  throw std::runtime_error("failed to set strict certificate checking");
74  }
75 
76  if (X509_VERIFY_PARAM_set1(
77  X509_STORE_CTX_get0_param(ctx.get()), param.get()) != 1) {
78  throw std::runtime_error("failed to apply verification parameters");
79  }
80 
81  if (X509_verify_cert(ctx.get()) != 1) {
82  const auto errorInt = X509_STORE_CTX_get_error(ctx.get());
83  std::string errorText =
84  std::string(X509_verify_cert_error_string(errorInt));
85  throw std::runtime_error("certificate verification failed: " + errorText);
86  }
87 }
const char * string
Definition: Conv.cpp:212
std::unique_ptr< X509_STORE_CTX, X509StoreCtxDeleter > X509StoreCtxUniquePtr
std::unique_ptr< X509_VERIFY_PARAM, X509VerifyParamDeleter > X509VerifyParam

Member Data Documentation

CertificateAuthorities fizz::JavaCryptoCertificateVerifier::authorities_
private

Definition at line 58 of file JavaCryptoCertificateVerifier.h.

VerificationContext fizz::JavaCryptoCertificateVerifier::context_
private

Definition at line 59 of file JavaCryptoCertificateVerifier.h.

folly::ssl::X509StoreUniquePtr fizz::JavaCryptoCertificateVerifier::x509Store_
private

Definition at line 60 of file JavaCryptoCertificateVerifier.h.


The documentation for this class was generated from the following files: