Skip to content

Commit 6261187

Browse files
committed
src: shift even moar x509 to ncrypto
PR-URL: nodejs#54340 Reviewed-By: Yagiz Nizipli <[email protected]> Reviewed-By: Matteo Collina <[email protected]>
1 parent 38ad892 commit 6261187

File tree

8 files changed

+637
-689
lines changed

8 files changed

+637
-689
lines changed

deps/ncrypto/ncrypto.cc

+41
Original file line numberDiff line numberDiff line change
@@ -908,6 +908,24 @@ X509View::CheckMatch X509View::checkIp(const std::string_view ip, int flags) con
908908
}
909909
}
910910

911+
X509View X509View::From(const SSLPointer& ssl) {
912+
ClearErrorOnReturn clear_error_on_return;
913+
if (!ssl) return {};
914+
return X509View(SSL_get_certificate(ssl.get()));
915+
}
916+
917+
X509View X509View::From(const SSLCtxPointer& ctx) {
918+
ClearErrorOnReturn clear_error_on_return;
919+
if (!ctx) return {};
920+
return X509View(SSL_CTX_get0_certificate(ctx.get()));
921+
}
922+
923+
X509Pointer X509View::clone() const {
924+
ClearErrorOnReturn clear_error_on_return;
925+
if (!cert_) return {};
926+
return X509Pointer(X509_dup(const_cast<X509*>(cert_)));
927+
}
928+
911929
Result<X509Pointer, int> X509Pointer::Parse(Buffer<const unsigned char> buffer) {
912930
ClearErrorOnReturn clearErrorOnReturn;
913931
BIOPointer bio(BIO_new_mem_buf(buffer.data, buffer.len));
@@ -922,4 +940,27 @@ Result<X509Pointer, int> X509Pointer::Parse(Buffer<const unsigned char> buffer)
922940

923941
return Result<X509Pointer, int>(ERR_get_error());
924942
}
943+
944+
945+
X509Pointer X509Pointer::IssuerFrom(const SSLPointer& ssl, const X509View& view) {
946+
return IssuerFrom(SSL_get_SSL_CTX(ssl.get()), view);
947+
}
948+
949+
X509Pointer X509Pointer::IssuerFrom(const SSL_CTX* ctx, const X509View& cert) {
950+
X509_STORE* store = SSL_CTX_get_cert_store(ctx);
951+
DeleteFnPtr<X509_STORE_CTX, X509_STORE_CTX_free> store_ctx(
952+
X509_STORE_CTX_new());
953+
X509Pointer result;
954+
X509* issuer;
955+
if (store_ctx.get() != nullptr &&
956+
X509_STORE_CTX_init(store_ctx.get(), store, nullptr, nullptr) == 1 &&
957+
X509_STORE_CTX_get1_issuer(&issuer, store_ctx.get(), cert.get()) == 1) {
958+
result.reset(issuer);
959+
}
960+
return result;
961+
}
962+
963+
X509Pointer X509Pointer::PeerFrom(const SSLPointer& ssl) {
964+
return X509Pointer(SSL_get_peer_certificate(ssl.get()));
965+
}
925966
} // namespace ncrypto

deps/ncrypto/ncrypto.h

+12
Original file line numberDiff line numberDiff line change
@@ -311,14 +311,21 @@ class BignumPointer final {
311311
DeleteFnPtr<BIGNUM, BN_clear_free> bn_;
312312
};
313313

314+
class X509Pointer;
315+
314316
class X509View final {
315317
public:
318+
static X509View From(const SSLPointer& ssl);
319+
static X509View From(const SSLCtxPointer& ctx);
320+
316321
X509View() = default;
317322
inline explicit X509View(const X509* cert) : cert_(cert) {}
318323
X509View(const X509View& other) = default;
319324
X509View& operator=(const X509View& other) = default;
320325
NCRYPTO_DISALLOW_MOVE(X509View)
321326

327+
inline X509* get() const { return const_cast<X509*>(cert_); }
328+
322329
inline bool operator==(std::nullptr_t) noexcept { return cert_ == nullptr; }
323330
inline operator bool() const { return cert_ != nullptr; }
324331

@@ -340,6 +347,8 @@ class X509View final {
340347
bool checkPrivateKey(const EVPKeyPointer& pkey) const;
341348
bool checkPublicKey(const EVPKeyPointer& pkey) const;
342349

350+
X509Pointer clone() const;
351+
343352
enum class CheckMatch {
344353
NO_MATCH,
345354
MATCH,
@@ -358,6 +367,9 @@ class X509View final {
358367
class X509Pointer final {
359368
public:
360369
static Result<X509Pointer, int> Parse(Buffer<const unsigned char> buffer);
370+
static X509Pointer IssuerFrom(const SSLPointer& ssl, const X509View& view);
371+
static X509Pointer IssuerFrom(const SSL_CTX* ctx, const X509View& view);
372+
static X509Pointer PeerFrom(const SSLPointer& ssl);
361373

362374
X509Pointer() = default;
363375
explicit X509Pointer(X509* cert);

0 commit comments

Comments
 (0)