35#if defined(ENABLE_PKCS11) && defined(ENABLE_CRYPTO_OPENSSL)
41#include <pkcs11-helper-1.0/pkcs11h-openssl.h>
43#ifdef HAVE_XKEY_PROVIDER
44static XKEY_EXTERNAL_SIGN_fn xkey_pkcs11h_sign;
47#define MD_TYPE(n) { NID_sha##n, CKM_SHA##n, CKG_MGF1_SHA##n }
53} mdtypes[] = { MD_TYPE(224),
57 { NID_sha1, CKM_SHA_1, CKG_MGF1_SHA1 },
58 { NID_undef, 0, 0 } };
66set_pss_params(CK_RSA_PKCS_PSS_PARAMS *pss_params, XKEY_SIGALG sigalg, pkcs11h_certificate_t cert)
70 EVP_PKEY *pubkey = NULL;
72 if ((x509 = pkcs11h_openssl_getX509(cert)) == NULL || (pubkey = X509_get0_pubkey(x509)) == NULL)
74 msg(
M_WARN,
"PKCS#11: Unable get public key");
80 int nid = OBJ_sn2nid(sigalg.mdname);
81 while (mdtypes[i].nid != NID_undef && mdtypes[i].nid != nid)
85 pss_params->hashAlg = mdtypes[i].ckm_id;
86 pss_params->mgf = mdtypes[i].mgf_id;
89 const EVP_MD *md = EVP_get_digestbyname(sigalg.mdname);
93 "WARN: set_pss_params: EVP_get_digestbyname returned NULL "
98 int mdsize = EVP_MD_get_size(md);
101 if (!strcmp(sigalg.saltlen,
"digest"))
105 else if (!strcmp(sigalg.saltlen,
"max"))
107 saltlen = xkey_max_saltlen(EVP_PKEY_get_bits(pubkey), mdsize);
110 if (saltlen < 0 || pss_params->hashAlg == 0)
113 "WARN: invalid RSA_PKCS1_PSS parameters: saltlen = <%s> "
115 sigalg.saltlen, sigalg.mdname);
118 pss_params->sLen = (
unsigned long)saltlen;
120 msg(
D_XKEY,
"set_pss_params: sLen = %lu, hashAlg = %lu, mgf = %lu", pss_params->sLen,
121 pss_params->hashAlg, pss_params->mgf);
139xkey_pkcs11h_sign(
void *handle,
unsigned char *sig,
size_t *siglen,
const unsigned char *tbs,
140 size_t tbslen, XKEY_SIGALG sigalg)
142 pkcs11h_certificate_t cert = handle;
143 CK_MECHANISM mech = { CKM_RSA_PKCS, NULL, 0 };
144 CK_RSA_PKCS_PSS_PARAMS pss_params = { 0 };
146 unsigned char buf[EVP_MAX_MD_SIZE];
148 size_t siglen_max = *siglen;
150 unsigned char enc[EVP_MAX_MD_SIZE + 32];
151 size_t enc_len =
sizeof(enc);
153 if (!strcmp(sigalg.op,
"DigestSign"))
155 msg(
D_XKEY,
"xkey_pkcs11h_sign: computing digest");
156 if (xkey_digest(tbs, tbslen, buf, &buflen, sigalg.mdname))
159 tbslen = (size_t)buflen;
167 if (!strcmp(sigalg.keytype,
"EC"))
169 msg(
D_XKEY,
"xkey_pkcs11h_sign: signing with EC key");
170 mech.mechanism = CKM_ECDSA;
172 else if (!strcmp(sigalg.keytype,
"RSA"))
174 msg(
D_XKEY,
"xkey_pkcs11h_sign: signing with RSA key: padmode = %s", sigalg.padmode);
175 if (!strcmp(sigalg.padmode,
"none"))
177 mech.mechanism = CKM_RSA_X_509;
179 else if (!strcmp(sigalg.padmode,
"pss"))
181 mech.mechanism = CKM_RSA_PKCS_PSS;
183 if (!set_pss_params(&pss_params, sigalg, cert))
188 mech.pParameter = &pss_params;
189 mech.ulParameterLen =
sizeof(pss_params);
191 else if (!strcmp(sigalg.padmode,
"pkcs1"))
195 if (!encode_pkcs1(enc, &enc_len, sigalg.mdname, tbs, tbslen))
204 msg(
M_WARN,
"PKCS#11: Unknown padmode <%s>", sigalg.padmode);
212 if (CKR_OK != pkcs11h_certificate_signAny_ex(cert, &mech, tbs, tbslen, sig, siglen))
216 if (strcmp(sigalg.keytype,
"EC"))
222 int derlen = ecdsa_bin2der(sig, (
int)*siglen, siglen_max);
235xkey_handle_free(
void *handle)
237 pkcs11h_certificate_freeCertificate(handle);
252xkey_load_from_pkcs11h(pkcs11h_certificate_t certificate,
struct tls_root_ctx *
const ctx)
256 X509 *x509 = pkcs11h_openssl_getX509(certificate);
259 msg(
M_WARN,
"PKCS#11: Unable get x509 certificate object");
263 EVP_PKEY *pubkey = X509_get0_pubkey(x509);
265 XKEY_PRIVKEY_FREE_fn *free_op = xkey_handle_free;
266 XKEY_EXTERNAL_SIGN_fn *sign_op = xkey_pkcs11h_sign;
268 EVP_PKEY *pkey = xkey_load_generic_key(
tls_libctx, certificate, pubkey, sign_op, free_op);
271 msg(
M_WARN,
"PKCS#11: Failed to load private key into xkey provider");
277 if (!SSL_CTX_use_cert_and_key(ctx->
ctx, x509, pkey, NULL, 0))
280 msg(
M_FATAL,
"PKCS#11: Failed to set cert and private key for OpenSSL");
296 pkcs11h_certificate_freeCertificate(certificate);
303pkcs11_init_tls_session(pkcs11h_certificate_t certificate,
struct tls_root_ctx *
const ssl_ctx)
305#ifdef HAVE_XKEY_PROVIDER
306 return (xkey_load_from_pkcs11h(certificate, ssl_ctx) == 0);
311 EVP_PKEY *evp = NULL;
312 pkcs11h_openssl_session_t openssl_session = NULL;
314 if ((openssl_session = pkcs11h_openssl_createSession(certificate)) == NULL)
316 msg(
M_WARN,
"PKCS#11: Cannot initialize openssl session");
325 if ((evp = pkcs11h_openssl_session_getEVP(openssl_session)) == NULL)
327 msg(
M_WARN,
"PKCS#11: Unable get evp object");
331 if ((x509 = pkcs11h_openssl_session_getX509(openssl_session)) == NULL)
333 msg(
M_WARN,
"PKCS#11: Unable get certificate object");
337 if (!SSL_CTX_use_PrivateKey(ssl_ctx->
ctx, evp))
339 msg(
M_WARN,
"PKCS#11: Cannot set private key for openssl");
343 if (!SSL_CTX_use_certificate(ssl_ctx->
ctx, x509))
346 msg(
M_FATAL,
"PKCS#11: Cannot set certificate for openssl");
356 if (certificate != NULL)
358 pkcs11h_certificate_freeCertificate(certificate);
371 if (openssl_session != NULL)
373 pkcs11h_openssl_freeSession(openssl_session);
380pkcs11_certificate_dn(pkcs11h_certificate_t certificate,
struct gc_arena *
gc)
386 if ((x509 = pkcs11h_openssl_getX509(certificate)) == NULL)
402pkcs11_certificate_serial(pkcs11h_certificate_t certificate,
char *serial,
size_t serial_len)
408 if ((x509 = pkcs11h_openssl_getX509(certificate)) == NULL)
414 if ((bio = BIO_new(BIO_s_mem())) == NULL)
420 i2a_ASN1_INTEGER(bio, X509_get_serialNumber(x509));
421 ASSERT(serial_len <= INT_MAX);
422 int n = BIO_read(bio, serial, (
int)serial_len - 1);
void crypto_print_openssl_errors(const unsigned int flags)
Retrieve any occurred OpenSSL errors and print those errors.
PKCS #11 SSL library-specific backend.
OSSL_LIB_CTX * tls_libctx
Control Channel Verification Module.
char * x509_get_subject(openvpn_x509_cert_t *cert, struct gc_arena *gc)
Garbage collection arena used to keep track of dynamically allocated memory.
Structure that wraps the TLS context.
static int cleanup(void **state)