@@ -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 |