33#ifdef HAVE_XKEY_PROVIDER
35#include <openssl/provider.h>
36#include <openssl/params.h>
37#include <openssl/core_dispatch.h>
38#include <openssl/core_object.h>
39#include <openssl/core_names.h>
40#include <openssl/store.h>
41#include <openssl/evp.h>
42#include <openssl/err.h>
45static const char *provname =
"OpenVPN External Key Provider";
53#define xkey_dmsg(f, ...) \
56 dmsg(f | M_NOLF, "xkey_provider: In %s: ", __func__); \
57 dmsg(f | M_NOPREFIX, __VA_ARGS__); \
93 XKEY_EXTERNAL_SIGN_fn *sign;
95 XKEY_PRIVKEY_FREE_fn *free;
96 XKEY_PROVIDER_CTX *prov;
100static inline const char *
101get_keytype(
const XKEY_KEYDATA *
key)
103 int keytype =
key->pubkey ? EVP_PKEY_get_id(
key->pubkey) : 0;
113 case EVP_PKEY_ED25519:
123KEYSIZE(
const XKEY_KEYDATA *
key)
125 return key->pubkey ? EVP_PKEY_get_size(
key->pubkey) : 0;
132int xkey_native_sign(XKEY_KEYDATA *
key,
unsigned char *sig,
size_t *siglen,
133 const unsigned char *tbs,
size_t tbslen, XKEY_SIGALG sigalg);
139static OSSL_FUNC_keymgmt_new_fn keymgmt_new;
140static OSSL_FUNC_keymgmt_free_fn keymgmt_free;
141static OSSL_FUNC_keymgmt_load_fn keymgmt_load;
142static OSSL_FUNC_keymgmt_has_fn keymgmt_has;
143static OSSL_FUNC_keymgmt_match_fn keymgmt_match;
144static OSSL_FUNC_keymgmt_import_fn rsa_keymgmt_import;
145static OSSL_FUNC_keymgmt_import_fn ec_keymgmt_import;
146static OSSL_FUNC_keymgmt_import_types_fn keymgmt_import_types;
147static OSSL_FUNC_keymgmt_get_params_fn keymgmt_get_params;
148static OSSL_FUNC_keymgmt_gettable_params_fn keymgmt_gettable_params;
149static OSSL_FUNC_keymgmt_set_params_fn keymgmt_set_params;
150static OSSL_FUNC_keymgmt_query_operation_name_fn rsa_keymgmt_name;
151static OSSL_FUNC_keymgmt_query_operation_name_fn ec_keymgmt_name;
153static int keymgmt_import_helper(XKEY_KEYDATA *
key,
const OSSL_PARAM params[]);
158 xkey_dmsg(
D_XKEY,
"entry");
160 XKEY_KEYDATA *
key = OPENSSL_zalloc(
sizeof(*
key));
170keydata_free(XKEY_KEYDATA *
key)
172 xkey_dmsg(
D_XKEY,
"entry");
174 if (!
key ||
key->refcount-- > 0)
178 if (
key->free &&
key->handle)
185 EVP_PKEY_free(
key->pubkey);
191keymgmt_new(
void *provctx)
193 xkey_dmsg(
D_XKEY,
"entry");
195 XKEY_KEYDATA *
key = keydata_new();
205keymgmt_load(
const void *reference,
size_t reference_sz)
207 xkey_dmsg(
D_XKEY,
"entry");
245keymgmt_import(
void *keydata,
int selection,
const OSSL_PARAM params[],
const char *name)
247 xkey_dmsg(
D_XKEY,
"entry");
249 XKEY_KEYDATA *
key = keydata;
253 if (
key->handle ||
key->pubkey)
255 msg(
M_WARN,
"Error: keymgmt_import: keydata not empty -- our keys are immutable");
260 const OSSL_PARAM *p = OSSL_PARAM_locate_const(params,
"xkey-origin");
261 if (p && p->data_type == OSSL_PARAM_UTF8_STRING)
263 key->origin = EXTERNAL_KEY;
264 xkey_dmsg(
D_XKEY,
"importing external key");
265 return keymgmt_import_helper(
key, params);
268 xkey_dmsg(
D_XKEY,
"importing native key");
271 EVP_PKEY *pkey = NULL;
272 int selection_pub = selection & ~OSSL_KEYMGMT_SELECT_PRIVATE_KEY;
274 EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new_from_name(
key->prov->libctx, name, NULL);
275 if (!ctx || (EVP_PKEY_fromdata_init(ctx) != 1)
276 || (EVP_PKEY_fromdata(ctx, &pkey, selection_pub, (OSSL_PARAM *)params) != 1))
278 msg(
M_WARN,
"Error: keymgmt_import failed for key type <%s>", name);
285 EVP_PKEY_CTX_free(ctx);
291 key->origin = OPENSSL_NATIVE;
292 if (selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY)
296 if (EVP_PKEY_fromdata(ctx, &pkey, selection, (OSSL_PARAM *)params) == 1)
299 key->free = (XKEY_PRIVKEY_FREE_fn *)EVP_PKEY_free;
302 EVP_PKEY_CTX_free(ctx);
304 xkey_dmsg(
D_XKEY,
"imported native %s key", EVP_PKEY_get0_type_name(pkey));
309rsa_keymgmt_import(
void *keydata,
int selection,
const OSSL_PARAM params[])
311 xkey_dmsg(
D_XKEY,
"entry");
313 return keymgmt_import(keydata, selection, params,
"RSA");
317ec_keymgmt_import(
void *keydata,
int selection,
const OSSL_PARAM params[])
319 xkey_dmsg(
D_XKEY,
"entry");
321 return keymgmt_import(keydata, selection, params,
"EC");
325ed448_keymgmt_import(
void *keydata,
int selection,
const OSSL_PARAM params[])
327 xkey_dmsg(
D_XKEY,
"entry");
329 return keymgmt_import(keydata, selection, params,
"ED448");
333ed25519_keymgmt_import(
void *keydata,
int selection,
const OSSL_PARAM params[])
335 xkey_dmsg(
D_XKEY,
"entry");
337 return keymgmt_import(keydata, selection, params,
"ED25519");
345static const OSSL_PARAM *
346keymgmt_import_types(
int selection)
348 xkey_dmsg(
D_XKEY,
"entry");
350 static const OSSL_PARAM key_types[] = { OSSL_PARAM_END };
352 if (selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY)
360keymgmt_free(
void *keydata)
362 xkey_dmsg(
D_XKEY,
"entry");
364 keydata_free(keydata);
368keymgmt_has(
const void *keydata,
int selection)
370 xkey_dmsg(
D_XKEY,
"selection = %d", selection);
372 const XKEY_KEYDATA *
key = keydata;
373 int ok = (
key != NULL);
375 if (selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY)
377 ok = ok &&
key->pubkey;
379 if (selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY)
381 ok = ok &&
key->handle;
388keymgmt_match(
const void *keydata1,
const void *keydata2,
int selection)
390 const XKEY_KEYDATA *
key1 = keydata1;
391 const XKEY_KEYDATA *
key2 = keydata2;
393 xkey_dmsg(
D_XKEY,
"entry");
399 if (selection & OSSL_KEYMGMT_SELECT_KEYPAIR)
401 ret = ret && EVP_PKEY_eq(
key1->pubkey,
key2->pubkey);
402 xkey_dmsg(
D_XKEY,
"checking key pair match: res = %d", ret);
405 if (selection & OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS)
407 ret = ret && EVP_PKEY_parameters_eq(
key1->pubkey,
key2->pubkey);
408 xkey_dmsg(
D_XKEY,
"checking parameter match: res = %d", ret);
415static const OSSL_PARAM *
416keymgmt_gettable_params(
void *provctx)
418 xkey_dmsg(
D_XKEY,
"entry");
420 static OSSL_PARAM gettable[] = { OSSL_PARAM_int(OSSL_PKEY_PARAM_BITS, NULL),
421 OSSL_PARAM_int(OSSL_PKEY_PARAM_SECURITY_BITS, NULL),
422 OSSL_PARAM_int(OSSL_PKEY_PARAM_MAX_SIZE, NULL),
428keymgmt_get_params(
void *keydata, OSSL_PARAM *params)
430 xkey_dmsg(
D_XKEY,
"entry");
432 XKEY_KEYDATA *
key = keydata;
438 return EVP_PKEY_get_params(
key->pubkey, params);
445keymgmt_import_helper(XKEY_KEYDATA *
key,
const OSSL_PARAM *params)
447 xkey_dmsg(
D_XKEY,
"entry");
450 EVP_PKEY *pkey = NULL;
469 p = OSSL_PARAM_locate_const(params,
"pubkey");
470 if (p && p->data_type == OSSL_PARAM_OCTET_STRING && p->data_size ==
sizeof(pkey))
472 pkey = *(EVP_PKEY **)p->data;
475 int id = EVP_PKEY_get_id(pkey);
476 if (
id != EVP_PKEY_RSA &&
id != EVP_PKEY_EC &&
id != EVP_PKEY_ED25519
477 &&
id != EVP_PKEY_ED448)
479 msg(
M_WARN,
"Error: xkey keymgmt_import: unknown key type (%d)",
id);
483 key->pubkey = EVP_PKEY_dup(pkey);
484 if (
key->pubkey == NULL)
486 msg(
M_NONFATAL,
"Error: xkey keymgmt_import: duplicating pubkey failed.");
491 p = OSSL_PARAM_locate_const(params,
"handle");
492 if (p && p->data_type == OSSL_PARAM_OCTET_PTR && p->data_size ==
sizeof(
key->handle))
494 key->handle = *(
void **)p->data;
499 p = OSSL_PARAM_locate_const(params,
"sign_op");
500 if (p && p->data_type == OSSL_PARAM_OCTET_PTR && p->data_size ==
sizeof(
key->sign))
502 key->sign = *(
void **)p->data;
507 p = OSSL_PARAM_locate_const(params,
"free_op");
508 if (p && p->data_type == OSSL_PARAM_OCTET_PTR && p->data_size ==
sizeof(
key->free))
510 key->free = *(
void **)p->data;
512 xkey_dmsg(
D_XKEY,
"imported external %s key", EVP_PKEY_get0_type_name(
key->pubkey));
529keymgmt_set_params(
void *keydata,
const OSSL_PARAM *params)
531 XKEY_KEYDATA *
key = keydata;
534 xkey_dmsg(
D_XKEY,
"entry");
536 if (
key->origin != OPENSSL_NATIVE)
538 return keymgmt_import_helper(
key, params);
540 else if (
key->handle == NULL)
543 return EVP_PKEY_set_params(
key->pubkey, (OSSL_PARAM *)params);
547 msg(
M_WARN,
"xkey keymgmt_set_params: key is immutable");
553rsa_keymgmt_name(
int id)
555 xkey_dmsg(
D_XKEY,
"entry");
561ec_keymgmt_name(
int id)
563 xkey_dmsg(
D_XKEY,
"entry");
565 if (
id == OSSL_OP_SIGNATURE)
572 else if (
id == OSSL_OP_KEYEXCH)
577 msg(
D_XKEY,
"xkey ec_keymgmt_name called with op_id != SIGNATURE or KEYEXCH id=%d",
id);
581static const OSSL_DISPATCH rsa_keymgmt_functions[] = {
582 { OSSL_FUNC_KEYMGMT_NEW, (void (*)(void))keymgmt_new },
583 { OSSL_FUNC_KEYMGMT_FREE, (void (*)(void))keymgmt_free },
584 { OSSL_FUNC_KEYMGMT_LOAD, (void (*)(void))keymgmt_load },
585 { OSSL_FUNC_KEYMGMT_HAS, (void (*)(void))keymgmt_has },
586 { OSSL_FUNC_KEYMGMT_MATCH, (void (*)(void))keymgmt_match },
587 { OSSL_FUNC_KEYMGMT_IMPORT, (void (*)(void))rsa_keymgmt_import },
588 { OSSL_FUNC_KEYMGMT_IMPORT_TYPES, (void (*)(void))keymgmt_import_types },
589 { OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS, (void (*)(void))keymgmt_gettable_params },
590 { OSSL_FUNC_KEYMGMT_GET_PARAMS, (void (*)(void))keymgmt_get_params },
591 { OSSL_FUNC_KEYMGMT_SET_PARAMS, (void (*)(void))keymgmt_set_params },
592 { OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS,
593 (void (*)(void))keymgmt_gettable_params },
594 { OSSL_FUNC_KEYMGMT_QUERY_OPERATION_NAME, (void (*)(void))rsa_keymgmt_name },
598static const OSSL_DISPATCH ec_keymgmt_functions[] = {
599 { OSSL_FUNC_KEYMGMT_NEW, (void (*)(void))keymgmt_new },
600 { OSSL_FUNC_KEYMGMT_FREE, (void (*)(void))keymgmt_free },
601 { OSSL_FUNC_KEYMGMT_LOAD, (void (*)(void))keymgmt_load },
602 { OSSL_FUNC_KEYMGMT_HAS, (void (*)(void))keymgmt_has },
603 { OSSL_FUNC_KEYMGMT_MATCH, (void (*)(void))keymgmt_match },
604 { OSSL_FUNC_KEYMGMT_IMPORT, (void (*)(void))ec_keymgmt_import },
605 { OSSL_FUNC_KEYMGMT_IMPORT_TYPES, (void (*)(void))keymgmt_import_types },
606 { OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS, (void (*)(void))keymgmt_gettable_params },
607 { OSSL_FUNC_KEYMGMT_GET_PARAMS, (void (*)(void))keymgmt_get_params },
608 { OSSL_FUNC_KEYMGMT_SET_PARAMS, (void (*)(void))keymgmt_set_params },
609 { OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS,
610 (void (*)(void))keymgmt_gettable_params },
611 { OSSL_FUNC_KEYMGMT_QUERY_OPERATION_NAME, (void (*)(void))ec_keymgmt_name },
615static const OSSL_DISPATCH ed448_keymgmt_functions[] = {
616 { OSSL_FUNC_KEYMGMT_NEW, (void (*)(void))keymgmt_new },
617 { OSSL_FUNC_KEYMGMT_FREE, (void (*)(void))keymgmt_free },
618 { OSSL_FUNC_KEYMGMT_LOAD, (void (*)(void))keymgmt_load },
619 { OSSL_FUNC_KEYMGMT_HAS, (void (*)(void))keymgmt_has },
620 { OSSL_FUNC_KEYMGMT_MATCH, (void (*)(void))keymgmt_match },
621 { OSSL_FUNC_KEYMGMT_IMPORT, (void (*)(void))ed448_keymgmt_import },
622 { OSSL_FUNC_KEYMGMT_IMPORT_TYPES, (void (*)(void))keymgmt_import_types },
623 { OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS, (void (*)(void))keymgmt_gettable_params },
624 { OSSL_FUNC_KEYMGMT_GET_PARAMS, (void (*)(void))keymgmt_get_params },
625 { OSSL_FUNC_KEYMGMT_SET_PARAMS, (void (*)(void))keymgmt_set_params },
626 { OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS,
627 (void (*)(void))keymgmt_gettable_params },
631static const OSSL_DISPATCH ed25519_keymgmt_functions[] = {
632 { OSSL_FUNC_KEYMGMT_NEW, (void (*)(void))keymgmt_new },
633 { OSSL_FUNC_KEYMGMT_FREE, (void (*)(void))keymgmt_free },
634 { OSSL_FUNC_KEYMGMT_LOAD, (void (*)(void))keymgmt_load },
635 { OSSL_FUNC_KEYMGMT_HAS, (void (*)(void))keymgmt_has },
636 { OSSL_FUNC_KEYMGMT_MATCH, (void (*)(void))keymgmt_match },
637 { OSSL_FUNC_KEYMGMT_IMPORT, (void (*)(void))ed25519_keymgmt_import },
638 { OSSL_FUNC_KEYMGMT_IMPORT_TYPES, (void (*)(void))keymgmt_import_types },
639 { OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS, (void (*)(void))keymgmt_gettable_params },
640 { OSSL_FUNC_KEYMGMT_GET_PARAMS, (void (*)(void))keymgmt_get_params },
641 { OSSL_FUNC_KEYMGMT_SET_PARAMS, (void (*)(void))keymgmt_set_params },
642 { OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS,
643 (void (*)(void))keymgmt_gettable_params },
648const OSSL_ALGORITHM keymgmts[] = {
649 {
"RSA:rsaEncryption", XKEY_PROV_PROPS, rsa_keymgmt_functions,
"OpenVPN xkey RSA Key Manager" },
650 {
"RSA-PSS:RSASSA-PSS", XKEY_PROV_PROPS, rsa_keymgmt_functions,
651 "OpenVPN xkey RSA-PSS Key Manager" },
652 {
"EC:id-ecPublicKey", XKEY_PROV_PROPS, ec_keymgmt_functions,
"OpenVPN xkey EC Key Manager" },
653 {
"ED448", XKEY_PROV_PROPS, ed448_keymgmt_functions,
"OpenVPN xkey ED448 Key Manager" },
654 {
"ED25519", XKEY_PROV_PROPS, ed25519_keymgmt_functions,
"OpenVPN xkey ED25519 Key Manager" },
655 { NULL, NULL, NULL, NULL }
662static OSSL_FUNC_signature_newctx_fn signature_newctx;
663static OSSL_FUNC_signature_freectx_fn signature_freectx;
664static OSSL_FUNC_signature_sign_init_fn signature_sign_init;
665static OSSL_FUNC_signature_sign_fn signature_sign;
666static OSSL_FUNC_signature_digest_verify_init_fn signature_digest_verify_init;
667static OSSL_FUNC_signature_digest_verify_fn signature_digest_verify;
668static OSSL_FUNC_signature_digest_sign_init_fn signature_digest_sign_init;
669static OSSL_FUNC_signature_digest_sign_fn signature_digest_sign;
670static OSSL_FUNC_signature_set_ctx_params_fn signature_set_ctx_params;
671static OSSL_FUNC_signature_settable_ctx_params_fn signature_settable_ctx_params;
672static OSSL_FUNC_signature_get_ctx_params_fn signature_get_ctx_params;
673static OSSL_FUNC_signature_gettable_ctx_params_fn signature_gettable_ctx_params;
677 XKEY_PROVIDER_CTX *prov;
678 XKEY_KEYDATA *keydata;
682static const XKEY_SIGALG default_sigalg = {
683 .mdname =
"MD5-SHA1", .saltlen =
"digest", .padmode =
"pkcs1", .keytype =
"RSA"
690} digest_names[] = { { NID_md5_sha1,
"MD5-SHA1" },
691 { NID_sha1,
"SHA1" },
696 { NID_sha256,
"SHA256" },
697 { NID_sha384,
"SHA384" },
698 { NID_sha512,
"SHA512" },
709} padmode_names[] = { { RSA_PKCS1_PADDING,
"pkcs1" },
710 { RSA_PKCS1_PSS_PADDING,
"pss" },
711 { RSA_NO_PADDING,
"none" },
714static const char *saltlen_names[] = {
"digest",
"max",
"auto", NULL };
720xkey_mdname(
const char *name)
729 int nid = EVP_MD_get_type(EVP_get_digestbyname(name));
731 while (digest_names[
i].name && nid != digest_names[
i].nid)
735 return digest_names[
i].name ? digest_names[
i].name :
"MD5-SHA1";
739signature_newctx(
void *provctx,
const char *propq)
741 xkey_dmsg(
D_XKEY,
"entry");
745 XKEY_SIGNATURE_CTX *sctx = OPENSSL_zalloc(
sizeof(*sctx));
752 sctx->prov = provctx;
753 sctx->sigalg = default_sigalg;
759signature_freectx(
void *ctx)
761 xkey_dmsg(
D_XKEY,
"entry");
763 XKEY_SIGNATURE_CTX *sctx = ctx;
765 keydata_free(sctx->keydata);
770static const OSSL_PARAM *
771signature_settable_ctx_params(
void *ctx,
void *provctx)
773 xkey_dmsg(
D_XKEY,
"entry");
775 static OSSL_PARAM settable[] = {
776 OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_PAD_MODE, NULL, 0),
777 OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST, NULL, 0),
778 OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_PSS_SALTLEN, NULL, 0), OSSL_PARAM_END
785signature_set_ctx_params(
void *ctx,
const OSSL_PARAM params[])
787 xkey_dmsg(
D_XKEY,
"entry");
789 XKEY_SIGNATURE_CTX *sctx = ctx;
796 p = OSSL_PARAM_locate_const(params, OSSL_SIGNATURE_PARAM_PAD_MODE);
797 if (p && p->data_type == OSSL_PARAM_UTF8_STRING)
799 sctx->sigalg.padmode = NULL;
800 for (
int i = 0; padmode_names[
i].id != 0;
i++)
802 if (!strcmp(p->data, padmode_names[
i].name))
804 sctx->sigalg.padmode = padmode_names[
i].name;
808 if (sctx->sigalg.padmode == NULL)
810 msg(
M_WARN,
"xkey signature_ctx: padmode <%s>, treating as <none>", (
char *)p->data);
811 sctx->sigalg.padmode =
"none";
813 xkey_dmsg(
D_XKEY,
"setting padmode as %s", sctx->sigalg.padmode);
815 else if (p && p->data_type == OSSL_PARAM_INTEGER)
817 sctx->sigalg.padmode = NULL;
819 if (OSSL_PARAM_get_int(p, &padmode))
821 for (
int i = 0; padmode_names[
i].id != 0;
i++)
823 if (padmode == padmode_names[
i].
id)
825 sctx->sigalg.padmode = padmode_names[
i].name;
830 if (padmode == 0 || sctx->sigalg.padmode == NULL)
832 msg(
M_WARN,
"xkey signature_ctx: padmode <%d>, treating as <none>", padmode);
833 sctx->sigalg.padmode =
"none";
835 xkey_dmsg(
D_XKEY,
"setting padmode <%s>", sctx->sigalg.padmode);
839 msg(
M_WARN,
"xkey_signature_params: unknown padmode ignored");
842 p = OSSL_PARAM_locate_const(params, OSSL_SIGNATURE_PARAM_DIGEST);
843 if (p && p->data_type == OSSL_PARAM_UTF8_STRING)
845 sctx->sigalg.mdname = xkey_mdname(p->data);
846 xkey_dmsg(
D_XKEY,
"setting hashalg as %s", sctx->sigalg.mdname);
850 msg(
M_WARN,
"xkey_signature_params: unknown digest type ignored");
853 p = OSSL_PARAM_locate_const(params, OSSL_SIGNATURE_PARAM_PSS_SALTLEN);
854 if (p && p->data_type == OSSL_PARAM_UTF8_STRING)
856 sctx->sigalg.saltlen = NULL;
857 for (
int i = 0; saltlen_names[
i] != NULL;
i++)
859 if (!strcmp(p->data, saltlen_names[
i]))
861 sctx->sigalg.saltlen = saltlen_names[
i];
865 if (sctx->sigalg.saltlen == NULL)
867 msg(
M_WARN,
"xkey_signature_params: unknown saltlen <%s>", (
char *)p->data);
868 sctx->sigalg.saltlen =
"digest";
870 xkey_dmsg(
D_XKEY,
"setting saltlen to %s", sctx->sigalg.saltlen);
874 msg(
M_WARN,
"xkey_signature_params: unknown saltlen ignored");
880static const OSSL_PARAM *
881signature_gettable_ctx_params(
void *ctx,
void *provctx)
883 xkey_dmsg(
D_XKEY,
"entry");
885 static OSSL_PARAM gettable[] = { OSSL_PARAM_END };
891signature_get_ctx_params(
void *ctx, OSSL_PARAM params[])
893 xkey_dmsg(
D_XKEY,
"not implemented");
898signature_sign_init(
void *ctx,
void *provkey,
const OSSL_PARAM params[])
900 xkey_dmsg(
D_XKEY,
"entry");
902 XKEY_SIGNATURE_CTX *sctx = ctx;
906 keydata_free(sctx->keydata);
908 sctx->keydata = provkey;
909 sctx->keydata->refcount++;
910 sctx->sigalg.keytype = get_keytype(sctx->keydata);
912 signature_set_ctx_params(sctx, params);
919xkey_sign_dispatch(XKEY_SIGNATURE_CTX *sctx,
unsigned char *sig,
size_t *siglen,
920 const unsigned char *tbs,
size_t tbslen)
922 XKEY_EXTERNAL_SIGN_fn *sign = sctx->keydata->sign;
925 if (sctx->keydata->origin == OPENSSL_NATIVE)
927 ret = xkey_native_sign(sctx->keydata, sig, siglen, tbs, tbslen, sctx->sigalg);
931 ret = sign(sctx->keydata->handle, sig, siglen, tbs, tbslen, sctx->sigalg);
932 xkey_dmsg(
D_XKEY,
"xkey_provider: external sign op returned ret = %d siglen = %d", ret,
937 msg(
M_NONFATAL,
"xkey_provider: Internal error: No sign callback for external key.");
944signature_sign(
void *ctx,
unsigned char *sig,
size_t *siglen,
size_t sigsize,
945 const unsigned char *tbs,
size_t tbslen)
947 xkey_dmsg(
D_XKEY,
"entry with siglen = %zu", *siglen);
949 XKEY_SIGNATURE_CTX *sctx = ctx;
955 *siglen = KEYSIZE(sctx->keydata);
959 sctx->sigalg.op =
"Sign";
960 return xkey_sign_dispatch(sctx, sig, siglen, tbs, tbslen);
964signature_digest_verify_init(
void *ctx,
const char *mdname,
void *provkey,
965 const OSSL_PARAM params[])
967 xkey_dmsg(
D_XKEY,
"mdname <%s>", mdname);
969 msg(
M_WARN,
"xkey_provider: DigestVerifyInit is not implemented");
978signature_digest_verify(
void *ctx,
const unsigned char *sig,
size_t siglen,
979 const unsigned char *tbs,
size_t tbslen)
981 xkey_dmsg(
D_XKEY,
"entry");
983 msg(
M_WARN,
"xkey_provider: DigestVerify is not implemented");
988signature_digest_sign_init(
void *ctx,
const char *mdname,
void *provkey,
const OSSL_PARAM params[])
990 xkey_dmsg(
D_XKEY,
"mdname = <%s>", mdname);
992 XKEY_SIGNATURE_CTX *sctx = ctx;
1000 keydata_free(sctx->keydata);
1002 sctx->keydata = provkey;
1003 sctx->keydata->refcount++;
1004 sctx->sigalg.keytype = get_keytype(sctx->keydata);
1006 signature_set_ctx_params(ctx, params);
1007 if (!strcmp(sctx->sigalg.keytype,
"ED448") || !strcmp(sctx->sigalg.keytype,
"ED25519"))
1013 msg(
M_WARN,
"xkey digest_sign_init: mdname must be NULL for ED448/ED25519.");
1016 sctx->sigalg.mdname =
"none";
1020 sctx->sigalg.mdname = xkey_mdname(mdname);
1024 msg(
M_WARN,
"xkey digest_sign_init: mdname is NULL.");
1030signature_digest_sign(
void *ctx,
unsigned char *sig,
size_t *siglen,
size_t sigsize,
1031 const unsigned char *tbs,
size_t tbslen)
1033 xkey_dmsg(
D_XKEY,
"entry");
1035 XKEY_SIGNATURE_CTX *sctx = ctx;
1042 *siglen = KEYSIZE(sctx->keydata);
1046 if (sctx->keydata->origin != OPENSSL_NATIVE)
1049 sctx->sigalg.op =
"DigestSign";
1050 return xkey_sign_dispatch(ctx, sig, siglen, tbs, tbslen);
1055 const char *mdname = sctx->sigalg.mdname;
1056 EVP_MD *md =
EVP_MD_fetch(sctx->prov->libctx, mdname, NULL);
1059 msg(
M_WARN,
"WARN: xkey digest_sign_init: MD_fetch failed for <%s>", mdname);
1064 unsigned char buf[EVP_MAX_MD_SIZE];
1066 if (EVP_Digest(tbs, tbslen, buf, &sz, md, NULL) != 1)
1068 msg(
M_WARN,
"WARN: xkey digest_sign: EVP_Digest failed");
1074 return signature_sign(ctx, sig, siglen, sigsize, buf, sz);
1080xkey_native_sign(XKEY_KEYDATA *
key,
unsigned char *sig,
size_t *siglen,
const unsigned char *tbs,
1081 size_t tbslen, XKEY_SIGALG sigalg)
1083 xkey_dmsg(
D_XKEY,
"entry");
1087 EVP_PKEY *pkey =
key->handle;
1094 msg(
M_NONFATAL,
"Error: xkey provider: signature request with empty private key");
1098 const char *saltlen = sigalg.saltlen;
1099 const char *mdname = sigalg.mdname;
1100 const char *padmode = sigalg.padmode;
1102 xkey_dmsg(
D_XKEY,
"digest=<%s>, padmode=<%s>, saltlen=<%s>", mdname, padmode, saltlen);
1105 OSSL_PARAM params[6];
1106 if (EVP_PKEY_get_id(pkey) == EVP_PKEY_RSA)
1109 OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST, (
char *)mdname, 0);
1111 OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_PAD_MODE, (
char *)padmode, 0);
1112 if (!strcmp(sigalg.padmode,
"pss"))
1114 params[
i++] = OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_PSS_SALTLEN,
1115 (
char *)saltlen, 0);
1117 params[
i++] = OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_MGF1_DIGEST,
1121 params[
i++] = OSSL_PARAM_construct_end();
1123 EVP_PKEY_CTX *ectx = EVP_PKEY_CTX_new_from_pkey(
key->prov->libctx, pkey, NULL);
1127 msg(
M_WARN,
"WARN: xkey test_sign: call to EVP_PKEY_CTX_new...failed");
1131 if (EVP_PKEY_sign_init_ex(ectx, NULL) != 1)
1133 msg(
M_WARN,
"WARN: xkey test_sign: call to EVP_PKEY_sign_init failed");
1136 EVP_PKEY_CTX_set_params(ectx, params);
1138 ret = EVP_PKEY_sign(ectx, sig, siglen, tbs, tbslen);
1139 EVP_PKEY_CTX_free(ectx);
1144static const OSSL_DISPATCH signature_functions[] = {
1145 { OSSL_FUNC_SIGNATURE_NEWCTX, (void (*)(void))signature_newctx },
1146 { OSSL_FUNC_SIGNATURE_FREECTX, (void (*)(void))signature_freectx },
1147 { OSSL_FUNC_SIGNATURE_SIGN_INIT, (void (*)(void))signature_sign_init },
1148 { OSSL_FUNC_SIGNATURE_SIGN, (void (*)(void))signature_sign },
1149 { OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_INIT, (void (*)(void))signature_digest_verify_init },
1150 { OSSL_FUNC_SIGNATURE_DIGEST_VERIFY, (void (*)(void))signature_digest_verify },
1151 { OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT, (void (*)(void))signature_digest_sign_init },
1152 { OSSL_FUNC_SIGNATURE_DIGEST_SIGN, (void (*)(void))signature_digest_sign },
1153 { OSSL_FUNC_SIGNATURE_SET_CTX_PARAMS, (void (*)(void))signature_set_ctx_params },
1154 { OSSL_FUNC_SIGNATURE_SETTABLE_CTX_PARAMS, (void (*)(void))signature_settable_ctx_params },
1155 { OSSL_FUNC_SIGNATURE_GET_CTX_PARAMS, (void (*)(void))signature_get_ctx_params },
1156 { OSSL_FUNC_SIGNATURE_GETTABLE_CTX_PARAMS, (void (*)(void))signature_gettable_ctx_params },
1160const OSSL_ALGORITHM signatures[] = {
1161 {
"RSA:rsaEncryption", XKEY_PROV_PROPS, signature_functions,
"OpenVPN xkey RSA Signature" },
1162 {
"ECDSA", XKEY_PROV_PROPS, signature_functions,
"OpenVPN xkey ECDSA Signature" },
1163 {
"ED448", XKEY_PROV_PROPS, signature_functions,
"OpenVPN xkey Ed448 Signature" },
1164 {
"ED25519", XKEY_PROV_PROPS, signature_functions,
"OpenVPN xkey Ed25519 Signature" },
1165 { NULL, NULL, NULL, NULL }
1171static OSSL_FUNC_provider_query_operation_fn query_operation;
1172static OSSL_FUNC_provider_gettable_params_fn gettable_params;
1173static OSSL_FUNC_provider_get_params_fn get_params;
1174static OSSL_FUNC_provider_teardown_fn
teardown;
1176static const OSSL_ALGORITHM *
1177query_operation(
void *provctx,
int op,
int *no_store)
1179 xkey_dmsg(
D_XKEY,
"op = %d", op);
1185 case OSSL_OP_SIGNATURE:
1188 case OSSL_OP_KEYMGMT:
1192 xkey_dmsg(
D_XKEY,
"op not supported");
1198static const OSSL_PARAM *
1199gettable_params(
void *provctx)
1201 xkey_dmsg(
D_XKEY,
"entry");
1203 static const OSSL_PARAM param_types[] = {
1204 OSSL_PARAM_DEFN(OSSL_PROV_PARAM_NAME, OSSL_PARAM_UTF8_PTR, NULL, 0), OSSL_PARAM_END
1210get_params(
void *provctx, OSSL_PARAM params[])
1214 xkey_dmsg(
D_XKEY,
"entry");
1216 p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_NAME);
1219 return (OSSL_PARAM_set_utf8_ptr(p, provname) != 0);
1228 xkey_dmsg(
D_XKEY,
"entry");
1230 XKEY_PROVIDER_CTX *prov = provctx;
1231 if (prov && prov->libctx)
1233 OSSL_LIB_CTX_free(prov->libctx);
1238static const OSSL_DISPATCH dispatch_table[] = {
1239 { OSSL_FUNC_PROVIDER_GETTABLE_PARAMS, (void (*)(void))gettable_params },
1240 { OSSL_FUNC_PROVIDER_GET_PARAMS, (void (*)(void))get_params },
1241 { OSSL_FUNC_PROVIDER_QUERY_OPERATION, (void (*)(void))query_operation },
1242 { OSSL_FUNC_PROVIDER_TEARDOWN, (void (*)(void))
teardown },
1247xkey_provider_init(
const OSSL_CORE_HANDLE *handle,
const OSSL_DISPATCH *in,
1248 const OSSL_DISPATCH **out,
void **provctx)
1250 XKEY_PROVIDER_CTX *prov;
1252 xkey_dmsg(
D_XKEY,
"entry");
1254 prov = OPENSSL_zalloc(
sizeof(*prov));
1264 prov->libctx = OSSL_LIB_CTX_new_child(handle, in);
1266 EVP_set_default_properties(prov->libctx,
"provider!=ovpn.xkey");
1268 *out = dispatch_table;
static const char *const key1
static void EVP_MD_free(const EVP_MD *md)
static const EVP_MD * EVP_MD_fetch(void *ctx, const char *algorithm, const char *properties)
Container for bidirectional cipher and HMAC key material.
Container for unidirectional cipher and HMAC key material.
static int teardown(void **state)