Skip to content

Commit 9f20d9e

Browse files
committed
src: simplify X509Pointer/X509View pointer derefs a bit
1 parent 181863b commit 9f20d9e

File tree

5 files changed

+16
-10
lines changed

5 files changed

+16
-10
lines changed

deps/ncrypto/ncrypto.cc

+3-2
Original file line numberDiff line numberDiff line change
@@ -1005,12 +1005,13 @@ X509View X509View::From(const SSLCtxPointer& ctx) {
10051005
return X509View(SSL_CTX_get0_certificate(ctx.get()));
10061006
}
10071007

1008-
std::string X509View::getFingerprint(const EVP_MD* method) const {
1008+
std::optional<std::string> X509View::getFingerprint(const EVP_MD* method) const {
10091009
unsigned int md_size;
10101010
unsigned char md[EVP_MAX_MD_SIZE];
10111011
static constexpr char hex[] = "0123456789ABCDEF";
10121012

10131013
if (X509_digest(get(), method, md, &md_size)) {
1014+
if (md_size == 0) return std::nullopt;
10141015
std::string fingerprint((md_size * 3) - 1, 0);
10151016
for (unsigned int i = 0; i < md_size; i++) {
10161017
auto idx = 3 * i;
@@ -1023,7 +1024,7 @@ std::string X509View::getFingerprint(const EVP_MD* method) const {
10231024
return fingerprint;
10241025
}
10251026

1026-
return std::string();
1027+
return std::nullopt;
10271028
}
10281029

10291030
X509Pointer X509View::clone() const {

deps/ncrypto/ncrypto.h

+5-1
Original file line numberDiff line numberDiff line change
@@ -570,6 +570,8 @@ class X509View final {
570570
NCRYPTO_DISALLOW_MOVE(X509View)
571571

572572
inline X509* get() const { return const_cast<X509*>(cert_); }
573+
inline operator X509*() const { return const_cast<X509*>(cert_); }
574+
inline operator const X509*() const { return cert_; }
573575

574576
inline bool operator==(std::nullptr_t) noexcept { return cert_ == nullptr; }
575577
inline operator bool() const { return cert_ != nullptr; }
@@ -594,7 +596,7 @@ class X509View final {
594596
bool checkPrivateKey(const EVPKeyPointer& pkey) const;
595597
bool checkPublicKey(const EVPKeyPointer& pkey) const;
596598

597-
std::string getFingerprint(const EVP_MD* method) const;
599+
std::optional<std::string> getFingerprint(const EVP_MD* method) const;
598600

599601
X509Pointer clone() const;
600602

@@ -631,6 +633,8 @@ class X509Pointer final {
631633
inline bool operator==(std::nullptr_t) noexcept { return cert_ == nullptr; }
632634
inline operator bool() const { return cert_ != nullptr; }
633635
inline X509* get() const { return cert_.get(); }
636+
inline operator X509*() const { return cert_.get(); }
637+
inline operator const X509*() const { return cert_.get(); }
634638
void reset(X509* cert = nullptr);
635639
X509* release();
636640

src/crypto/crypto_common.cc

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ bool UseSNIContext(
8383
STACK_OF(X509)* chain;
8484

8585
int err = SSL_CTX_get0_chain_certs(ctx, &chain);
86-
if (err == 1) err = SSL_use_certificate(ssl.get(), x509.get());
86+
if (err == 1) err = SSL_use_certificate(ssl.get(), x509);
8787
if (err == 1) err = SSL_use_PrivateKey(ssl.get(), pkey);
8888
if (err == 1 && chain != nullptr) err = SSL_set1_chain(ssl.get(), chain);
8989
return err == 1;

src/crypto/crypto_context.cc

+2-3
Original file line numberDiff line numberDiff line change
@@ -787,9 +787,8 @@ void SecureContext::SetCACert(const BIOPointer& bio) {
787787
while (X509Pointer x509 = X509Pointer(PEM_read_bio_X509_AUX(
788788
bio.get(), nullptr, NoPasswordCallback, nullptr))) {
789789
CHECK_EQ(1,
790-
X509_STORE_add_cert(GetCertStoreOwnedByThisSecureContext(),
791-
x509.get()));
792-
CHECK_EQ(1, SSL_CTX_add_client_CA(ctx_.get(), x509.get()));
790+
X509_STORE_add_cert(GetCertStoreOwnedByThisSecureContext(), x509));
791+
CHECK_EQ(1, SSL_CTX_add_client_CA(ctx_.get(), x509));
793792
}
794793
}
795794

src/crypto/crypto_x509.cc

+5-3
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,11 @@ MaybeLocal<Value> GetFingerprintDigest(Environment* env,
6666
auto fingerprint = cert.getFingerprint(method);
6767
// Returning an empty string indicates that the digest failed for
6868
// some reason.
69-
if (fingerprint == "") return Undefined(env->isolate());
70-
return OneByteString(
71-
env->isolate(), fingerprint.data(), fingerprint.length());
69+
if (!fingerprint.has_value()) [[unlikely]] {
70+
return Undefined(env->isolate());
71+
}
72+
auto& fp = fingerprint.value();
73+
return OneByteString(env->isolate(), fp.data(), fp.length());
7274
}
7375

7476
template <const EVP_MD* (*algo)()>

0 commit comments

Comments
 (0)