36#if defined(ENABLE_PKCS11) && defined(ENABLE_CRYPTO_OPENSSL)
42#include <pkcs11-helper-1.0/pkcs11h-openssl.h>
44#ifdef HAVE_XKEY_PROVIDER
45static XKEY_EXTERNAL_SIGN_fn xkey_pkcs11h_sign;
47#if PKCS11H_VERSION > ((1<<16) | (27<<8))
50#define MD_TYPE(n) {NID_sha ## n, CKM_SHA ## n, CKG_MGF1_SHA ## n}
56} mdtypes[] = {MD_TYPE(224), MD_TYPE(256), MD_TYPE(384), MD_TYPE(512),
57 {NID_sha1, CKM_SHA_1, CKG_MGF1_SHA1},
66set_pss_params(CK_RSA_PKCS_PSS_PARAMS *pss_params, XKEY_SIGALG sigalg,
67 pkcs11h_certificate_t cert)
71 EVP_PKEY *pubkey = NULL;
73 if ((x509 = pkcs11h_openssl_getX509(cert)) == NULL
74 || (pubkey = X509_get0_pubkey(x509)) == NULL)
76 msg(
M_WARN,
"PKCS#11: Unable get public key");
82 int nid = OBJ_sn2nid(sigalg.mdname);
83 while (mdtypes[i].nid != NID_undef && mdtypes[i].nid != nid)
87 pss_params->hashAlg = mdtypes[i].ckm_id;
88 pss_params->mgf = mdtypes[i].mgf_id;
91 const EVP_MD *md = EVP_get_digestbyname(sigalg.mdname);
94 msg(
M_WARN,
"WARN: set_pss_params: EVP_get_digestbyname returned NULL "
95 "for mdname = <%s>", sigalg.mdname);
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)
112 msg(
M_WARN,
"WARN: invalid RSA_PKCS1_PSS parameters: saltlen = <%s> "
113 "mdname = <%s>.", sigalg.saltlen, sigalg.mdname);
116 pss_params->sLen = (
unsigned long) saltlen;
118 msg(
D_XKEY,
"set_pss_params: sLen = %lu, hashAlg = %lu, mgf = %lu",
119 pss_params->sLen, pss_params->hashAlg, pss_params->mgf);
134#define set_pss_params(...) (1)
142pkcs11h_certificate_signAny_ex(
const pkcs11h_certificate_t cert,
143 const CK_MECHANISM *mech,
const unsigned char *tbs,
144 size_t tbslen,
unsigned char *sig,
size_t *siglen)
146 if (mech->mechanism == CKM_RSA_PKCS_PSS)
148 msg(
M_NONFATAL,
"PKCS#11: Error: PSS padding is not supported by "
149 "this version of pkcs11-helper library.");
150 return CKR_MECHANISM_INVALID;
152 return pkcs11h_certificate_signAny(cert, mech->mechanism, tbs, tbslen, sig, siglen);
162xkey_pkcs11h_sign(
void *handle,
unsigned char *sig,
163 size_t *siglen,
const unsigned char *tbs,
size_t tbslen, XKEY_SIGALG sigalg)
165 pkcs11h_certificate_t cert = handle;
166 CK_MECHANISM mech = {CKM_RSA_PKCS, NULL, 0};
167 CK_RSA_PKCS_PSS_PARAMS pss_params = {0};
169 unsigned char buf[EVP_MAX_MD_SIZE];
171 size_t siglen_max = *siglen;
173 unsigned char enc[EVP_MAX_MD_SIZE + 32];
174 size_t enc_len =
sizeof(enc);
176 if (!strcmp(sigalg.op,
"DigestSign"))
178 msg(
D_XKEY,
"xkey_pkcs11h_sign: computing digest");
179 if (xkey_digest(tbs, tbslen, buf, &buflen, sigalg.mdname))
182 tbslen = (size_t) buflen;
191 if (!strcmp(sigalg.keytype,
"EC"))
193 msg(
D_XKEY,
"xkey_pkcs11h_sign: signing with EC key");
194 mech.mechanism = CKM_ECDSA;
196 else if (!strcmp(sigalg.keytype,
"RSA"))
198 msg(
D_XKEY,
"xkey_pkcs11h_sign: signing with RSA key: padmode = %s",
200 if (!strcmp(sigalg.padmode,
"none"))
202 mech.mechanism = CKM_RSA_X_509;
204 else if (!strcmp(sigalg.padmode,
"pss"))
206 mech.mechanism = CKM_RSA_PKCS_PSS;
208 if (!set_pss_params(&pss_params, sigalg, cert))
213 mech.pParameter = &pss_params;
214 mech.ulParameterLen =
sizeof(pss_params);
216 else if (!strcmp(sigalg.padmode,
"pkcs1"))
220 if (!encode_pkcs1(enc, &enc_len, sigalg.mdname, tbs, tbslen))
229 msg(
M_WARN,
"PKCS#11: Unknown padmode <%s>", sigalg.padmode);
237 if (CKR_OK != pkcs11h_certificate_signAny_ex(cert, &mech,
238 tbs, tbslen, sig, siglen))
242 if (strcmp(sigalg.keytype,
"EC"))
248 int derlen = ecdsa_bin2der(sig, (
int) *siglen, siglen_max);
261xkey_handle_free(
void *handle)
263 pkcs11h_certificate_freeCertificate(handle);
278xkey_load_from_pkcs11h(pkcs11h_certificate_t certificate,
283 X509 *x509 = pkcs11h_openssl_getX509(certificate);
286 msg(
M_WARN,
"PKCS#11: Unable get x509 certificate object");
290 EVP_PKEY *pubkey = X509_get0_pubkey(x509);
292 XKEY_PRIVKEY_FREE_fn *free_op = xkey_handle_free;
293 XKEY_EXTERNAL_SIGN_fn *sign_op = xkey_pkcs11h_sign;
295 EVP_PKEY *pkey = xkey_load_generic_key(
tls_libctx, certificate, pubkey, sign_op, free_op);
298 msg(
M_WARN,
"PKCS#11: Failed to load private key into xkey provider");
304 if (!SSL_CTX_use_cert_and_key(ctx->
ctx, x509, pkey, NULL, 0))
307 msg(
M_FATAL,
"PKCS#11: Failed to set cert and private key for OpenSSL");
323 pkcs11h_certificate_freeCertificate(certificate);
330pkcs11_init_tls_session(pkcs11h_certificate_t certificate,
334#ifdef HAVE_XKEY_PROVIDER
335 return (xkey_load_from_pkcs11h(certificate, ssl_ctx) == 0);
340 EVP_PKEY *evp = NULL;
341 pkcs11h_openssl_session_t openssl_session = NULL;
343 if ((openssl_session = pkcs11h_openssl_createSession(certificate)) == NULL)
345 msg(
M_WARN,
"PKCS#11: Cannot initialize openssl session");
354 if ((evp = pkcs11h_openssl_session_getEVP(openssl_session)) == NULL)
356 msg(
M_WARN,
"PKCS#11: Unable get evp object");
360 if ((x509 = pkcs11h_openssl_session_getX509(openssl_session)) == NULL)
362 msg(
M_WARN,
"PKCS#11: Unable get certificate object");
366 if (!SSL_CTX_use_PrivateKey(ssl_ctx->
ctx, evp))
368 msg(
M_WARN,
"PKCS#11: Cannot set private key for openssl");
372 if (!SSL_CTX_use_certificate(ssl_ctx->
ctx, x509))
375 msg(
M_FATAL,
"PKCS#11: Cannot set certificate for openssl");
385 if (certificate != NULL)
387 pkcs11h_certificate_freeCertificate(certificate);
401 if (openssl_session != NULL)
403 pkcs11h_openssl_freeSession(openssl_session);
404 openssl_session = NULL;
411pkcs11_certificate_dn(pkcs11h_certificate_t certificate,
struct gc_arena *
gc)
417 if ((x509 = pkcs11h_openssl_getX509(certificate)) == NULL)
433pkcs11_certificate_serial(pkcs11h_certificate_t certificate,
char *serial,
441 if ((x509 = pkcs11h_openssl_getX509(certificate)) == NULL)
447 if ((bio = BIO_new(BIO_s_mem())) == NULL)
453 i2a_ASN1_INTEGER(bio, X509_get_serialNumber(x509));
454 n = BIO_read(bio, serial, 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)