@@ -908,6 +908,24 @@ X509View::CheckMatch X509View::checkIp(const std::string_view ip, int flags) con
908
908
}
909
909
}
910
910
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
+
911
929
Result<X509Pointer, int > X509Pointer::Parse (Buffer<const unsigned char > buffer) {
912
930
ClearErrorOnReturn clearErrorOnReturn;
913
931
BIOPointer bio (BIO_new_mem_buf (buffer.data , buffer.len ));
@@ -922,4 +940,27 @@ Result<X509Pointer, int> X509Pointer::Parse(Buffer<const unsigned char> buffer)
922
940
923
941
return Result<X509Pointer, int >(ERR_get_error ());
924
942
}
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
+ }
925
966
} // namespace ncrypto
0 commit comments