19#include <openssl/evp.h>
20#include <openssl/provider.h>
49 const char *name = OSSL_PROVIDER_get0_name(prov);
50 OSSL_PROVIDER_load(
static_cast<OSSL_LIB_CTX *
>(dest_libctx), name);
57 OSSL_PROVIDER_unload(prov);
81 if (!OSSL_PROVIDER_available(
tls_libctx.get(),
"ovpn.xkey"))
83 OSSL_PROVIDER_add_builtin(
tls_libctx.get(),
"ovpn.xkey", xkey_provider_init);
84 if (!OSSL_PROVIDER_load(
tls_libctx.get(),
"ovpn.xkey"))
87 "Signing with external keys will not work.");
97 EVP_set_default_properties(
tls_libctx.get(),
"?provider!=ovpn.xkey");
107 EVP_PKEY *pkey = X509_get0_pubkey(cert);
112 std::unique_ptr<
decltype(shared_from_this())> thisptr{
new std::shared_ptr(shared_from_this())};
115 || !SSL_CTX_use_PrivateKey(ctx, privkey))
117 EVP_PKEY_free(privkey);
129 ret->use_external_key(ssl_ctx, cert);
159 EVP_PKEY_free(privkey);
167 const unsigned char *tbs,
171 return static_cast<std::shared_ptr<XKeyExternalPKIImpl> *
>(this_ptr)->get()->xkey_sign(sig, siglen, tbs, tbslen, alg);
184 delete static_cast<std::shared_ptr<XKeyExternalPKIImpl> *
>(this_ptr);
200 xkey_sign(
unsigned char *sig,
size_t *siglen,
const unsigned char *tbs,
size_t tbslen, XKEY_SIGALG alg)
206 unsigned char enc[EVP_MAX_MD_SIZE + 32];
207 size_t enc_len =
sizeof(enc);
209 if (!strcmp(alg.keytype,
"ED448") || !strcmp(alg.keytype,
"ED25519"))
211 algstr = alg.keytype;
212 hashalg = alg.mdname;
214 else if (!strcmp(alg.keytype,
"EC"))
217 if (strcmp(alg.op,
"Sign"))
219 hashalg = alg.mdname;
222 else if (!strcmp(alg.padmode,
"pkcs1"))
225 algstr =
"RSA_PKCS1_PADDING";
227 if (!strcmp(alg.op,
"Sign"))
229 if (!xkey_encode_pkcs1(enc, &enc_len, alg.mdname, tbs, tbslen))
239 hashalg = alg.mdname;
242 else if (!strcmp(alg.padmode,
"none") && !strcmp(alg.op,
"Sign"))
245 algstr =
"RSA_NO_PADDING";
247 else if (!strcmp(alg.padmode,
"pss"))
249 algstr =
"RSA_PKCS1_PSS_PADDING";
250 hashalg = alg.mdname;
251 saltlen = alg.saltlen;
255 OPENVPN_LOG(
"RSA padding mode not supported by external key " << alg.padmode);
266 Buffer sigbuf(
static_cast<void *
>(sig), *siglen,
false);
268 *siglen = sigbuf.
size();
std::string encode(const V &data) const
size_t decode(void *data, size_t len, const std::string &str) const
size_t size() const
Returns the size of the buffer in T objects.
virtual bool sign(const std::string &alias, const std::string &data, std::string &sig, const std::string &algorithm, const std::string &hashalg, const std::string &saltlen)=0
int xkey_sign(unsigned char *sig, size_t *siglen, const unsigned char *tbs, size_t tbslen, XKEY_SIGALG alg)
static void xkey_free_cb(void *this_ptr)
OSSL_LIB_CTX_unique_ptr tls_libctx
ExternalPKIBase * external_pki
static std::shared_ptr< XKeyExternalPKIImpl > create(SSL_CTX *ssl_ctx, ::X509 *cert, ExternalPKIBase *external_pki, std::string alias)
static int provider_unload(OSSL_PROVIDER *prov, void *unused)
static void xkey_logging_callback(const char *message, bool debug)
static int provider_load(OSSL_PROVIDER *prov, void *dest_libctx)
std::unique_ptr<::OSSL_LIB_CTX, decltype(&::OSSL_LIB_CTX_free)> OSSL_LIB_CTX_unique_ptr
XKeyExternalPKIImpl(ExternalPKIBase *external_pki, std::string alias)
EVP_PKEY * tls_ctx_use_external_key(::SSL_CTX *ctx, ::X509 *cert)
static int xkey_sign_cb(void *this_ptr, unsigned char *sig, size_t *siglen, const unsigned char *tbs, size_t tbslen, XKEY_SIGALG alg)
void load_xkey_provider()
void use_external_key(SSL_CTX *ssl_ctx, ::X509 *cert)
static void OSSL_LIB_CTX_free(void *libctx)
#define OPENVPN_THROW(exc, stuff)
#define OPENVPN_LOG(args)