11#include <fmt/format.h>
13#include <openssl/asn1.h>
14#include <openssl/bn.h>
15#include <openssl/ec.h>
16#include <openssl/engine.h>
17#include <openssl/err.h>
18#include <openssl/evp.h>
19#include <openssl/pem.h>
20#include <openssl/rsa.h>
21#include <openssl/ssl.h>
22#include <openssl/x509.h>
23#include <openssl/x509v3.h>
25#if defined(OPENSSL_VERSION_MAJOR) && OPENSSL_VERSION_MAJOR >= 3
26# include <openssl/evp.h>
45 std::string err(256,
'\0');
46 ERR_error_string_n((
unsigned long)ec, err.data(), err.size());
48 err.resize(std::strlen(err.c_str()));
53 return "unknown error";
60 unsigned long ec = ERR_get_error();
61 if (rc != 1 && ec != 0)
63 throw std::runtime_error(
71 unsigned long ec = ERR_get_error();
72 if (rc == 0 && ec != 0)
74 throw std::runtime_error(
84 throw std::runtime_error(
"OpenSSL error: missing object");
93 unsigned long ec = ERR_get_error();
94 throw std::runtime_error(
104 throw std::runtime_error(
"OpenSSL error: expected positive value");
118 template <
class T, T* (*CTOR)(),
void (*DTOR)(T*)>
123 std::unique_ptr<T, void (*)(T*)>
p;
167 BIO_new_mem_buf(buf, len), [](auto x) { BIO_free(x); })
171 BIO_new_mem_buf(d.data(), d.size()), [](auto x) { BIO_free(x); })
175 BIO_new_mem_buf(pem.data(), -1), [](auto x) { BIO_free(x); })
179 BIO_new_ssl_connect(ctx), [](auto x) { BIO_free_all(x); })
201 PEM_read_bio_PUBKEY(mem, NULL, NULL, NULL), EVP_PKEY_free)
204#if defined(OPENSSL_VERSION_MAJOR) && OPENSSL_VERSION_MAJOR >= 3
219 EVP_PKEY_CTX_new_id(key_type, NULL), EVP_PKEY_CTX_free)
222#if defined(OPENSSL_VERSION_MAJOR) && OPENSSL_VERSION_MAJOR >= 3
225 EVP_PKEY_CTX_new_from_name(NULL, name.c_str(), NULL),
244 PEM_read_bio_X509_REQ(mem, NULL, NULL, NULL), X509_REQ_free)
254 PEM_read_bio_X509_CRL(mem, NULL, NULL, NULL), X509_CRL_free)
258 static const char pem_prefix[] =
"-----BEGIN CERTIFICATE-----\n";
260 static constexpr size_t pem_prefix_len =
sizeof(pem_prefix) - 1;
268 std::vector<char> buf(pem_prefix_len);
269 auto read = BIO_read(mem, buf.data(), pem_prefix_len);
272 read != pem_prefix_len ||
273 std::memcmp(buf.data(), pem_prefix, read) != 0)
277 return PEM_read_bio_X509(mem, NULL, NULL, NULL);
286 pem ?
read_pem(mem) : d2i_X509_bio(mem, NULL), X509_free, check_null)
320 sk_X509_new_null(), [](auto x) { sk_X509_pop_free(x, X509_free); })
329 sk_X509_EXTENSION_pop_free(x, X509_EXTENSION_free);
335 [](auto x) { sk_X509_EXTENSION_pop_free(x, X509_EXTENSION_free); },
363 auto t = ::ds::to_x509_time_string(s);
364 CHECK1(ASN1_TIME_set_string(*
this, t.c_str()));
365 CHECK1(ASN1_TIME_normalize(*
this));
386 EC_GROUP_new_by_curve_name(nid), EC_GROUP_free, true)
395 EC_POINT_new(group), EC_POINT_free, true)
402#if !(defined(OPENSSL_VERSION_MAJOR) && OPENSSL_VERSION_MAJOR >= 3)
407 EC_KEY_new_by_curve_name(nid), EC_KEY_free, true)
Definition openssl_wrappers.h:120
std::unique_ptr< T, void(*)(T *)> p
Pointer owning storage.
Definition openssl_wrappers.h:123
T * release()
Release pointer, so it's freed elsewhere (CAUTION!)
Definition openssl_wrappers.h:154
Unique_SSL_OBJECT(T *ptr, void(*dtor)(T *), bool check_null=true)
C-tor with pointer created in base class.
Definition openssl_wrappers.h:132
void reset(T *other)
Reset pointer, free old if any.
Definition openssl_wrappers.h:149
Unique_SSL_OBJECT()
C-tor with new pointer via T's c-tor.
Definition openssl_wrappers.h:127
void CHECKNULL(void *ptr)
Throws if ptr is null.
Definition openssl_wrappers.h:80
std::string error_string(int ec)
Returns the error string from an error code.
Definition openssl_wrappers.h:38
void CHECK0(int rc)
Throws if rc is 0 and has error.
Definition openssl_wrappers.h:69
void CHECKEQUAL(int expect, int actual)
Definition openssl_wrappers.h:89
X509 * read_pem(BIO *mem)
Definition openssl_wrappers.h:266
void CHECK1(int rc)
Throws if rc is not 1 and has error.
Definition openssl_wrappers.h:58
void CHECKPOSITIVE(int val)
Definition openssl_wrappers.h:100
Definition openssl_wrappers.h:350
Unique_BIGNUM(const BIGNUM *n)
Definition openssl_wrappers.h:353
Definition openssl_wrappers.h:161
Unique_BIO(const void *buf, int len)
Definition openssl_wrappers.h:165
Unique_BIO(const Pem &pem)
Definition openssl_wrappers.h:173
Unique_BIO(const std::vector< uint8_t > &d)
Definition openssl_wrappers.h:169
Unique_BIO()
Definition openssl_wrappers.h:162
Unique_BIO(SSL_CTX *ctx)
Definition openssl_wrappers.h:177
Definition openssl_wrappers.h:377
Definition openssl_wrappers.h:342
Unique_ECDSA_SIG(ECDSA_SIG *ecdsa_sig)
Definition openssl_wrappers.h:344
Definition openssl_wrappers.h:383
Unique_EC_GROUP(int nid)
Definition openssl_wrappers.h:384
Definition openssl_wrappers.h:404
Unique_EC_KEY(EC_KEY *key)
Definition openssl_wrappers.h:409
Unique_EC_KEY(int nid)
Definition openssl_wrappers.h:405
Definition openssl_wrappers.h:392
Unique_EC_POINT(EC_POINT *point)
Definition openssl_wrappers.h:397
Unique_EC_POINT(const EC_GROUP *group)
Definition openssl_wrappers.h:393
Definition openssl_wrappers.h:311
Definition openssl_wrappers.h:424
Definition openssl_wrappers.h:233
Unique_EVP_MD_CTX()
Definition openssl_wrappers.h:234
Definition openssl_wrappers.h:213
Unique_EVP_PKEY_CTX(int key_type=EVP_PKEY_EC)
Definition openssl_wrappers.h:217
Unique_EVP_PKEY_CTX(EVP_PKEY *key)
Definition openssl_wrappers.h:214
Definition openssl_wrappers.h:197
Unique_PKEY(BIO *mem)
Definition openssl_wrappers.h:199
Definition openssl_wrappers.h:415
Definition openssl_wrappers.h:184
Unique_SSL_CTX(const SSL_METHOD *m)
Definition openssl_wrappers.h:185
Definition openssl_wrappers.h:191
Unique_SSL(SSL_CTX *ctx)
Definition openssl_wrappers.h:192
Definition openssl_wrappers.h:326
Unique_STACK_OF_X509_EXTENSIONS()
Definition openssl_wrappers.h:327
Unique_STACK_OF_X509_EXTENSIONS(STACK_OF(X509_EXTENSION) *exts)
Definition openssl_wrappers.h:332
Definition openssl_wrappers.h:317
Unique_STACK_OF_X509()
Definition openssl_wrappers.h:318
Definition openssl_wrappers.h:250
Unique_X509_CRL(BIO *mem)
Definition openssl_wrappers.h:252
Definition openssl_wrappers.h:240
Unique_X509_REQ(BIO *mem)
Definition openssl_wrappers.h:242
Definition openssl_wrappers.h:303
Definition openssl_wrappers.h:295
Definition openssl_wrappers.h:358
Unique_X509_TIME(ASN1_TIME *t)
Definition openssl_wrappers.h:367
Unique_X509_TIME(const std::string &s)
Definition openssl_wrappers.h:360
Unique_X509_TIME(const std::chrono::system_clock::time_point &t)
Definition openssl_wrappers.h:370
Definition openssl_wrappers.h:281
Unique_X509(BIO *mem, bool pem, bool check_null=false)
Definition openssl_wrappers.h:284
Unique_X509(X509 *cert, bool check_null)
Definition openssl_wrappers.h:288