18#ifdef HAVE_XKEY_PROVIDER
20#include <openssl/provider.h>
21#include <openssl/params.h>
22#include <openssl/core_dispatch.h>
23#include <openssl/core_object.h>
24#include <openssl/core_names.h>
25#include <openssl/store.h>
26#include <openssl/evp.h>
27#include <openssl/err.h>
34static const char *provname =
"OpenVPN External Key Provider";
42#define xkey_dmsg(f, ...) \
44 dmsg(f|M_NOLF, "xkey_provider: In %s: ", __func__); \
45 dmsg(f|M_NOPREFIX, __VA_ARGS__); \
81 XKEY_EXTERNAL_SIGN_fn *sign;
83 XKEY_PRIVKEY_FREE_fn *free;
84 XKEY_PROVIDER_CTX *prov;
88static inline const char *
89get_keytype(
const XKEY_KEYDATA *key)
91 int keytype = key->pubkey ? EVP_PKEY_get_id(key->pubkey) : 0;
101 case EVP_PKEY_ED25519:
111KEYSIZE(
const XKEY_KEYDATA *key)
113 return key->pubkey ? EVP_PKEY_get_size(key->pubkey) : 0;
121xkey_native_sign(XKEY_KEYDATA *key,
unsigned char *sig,
size_t *siglen,
122 const unsigned char *tbs,
size_t tbslen, XKEY_SIGALG sigalg);
128static OSSL_FUNC_keymgmt_new_fn keymgmt_new;
129static OSSL_FUNC_keymgmt_free_fn keymgmt_free;
130static OSSL_FUNC_keymgmt_load_fn keymgmt_load;
131static OSSL_FUNC_keymgmt_has_fn keymgmt_has;
132static OSSL_FUNC_keymgmt_match_fn keymgmt_match;
133static OSSL_FUNC_keymgmt_import_fn rsa_keymgmt_import;
134static OSSL_FUNC_keymgmt_import_fn ec_keymgmt_import;
135static OSSL_FUNC_keymgmt_import_types_fn keymgmt_import_types;
136static OSSL_FUNC_keymgmt_get_params_fn keymgmt_get_params;
137static OSSL_FUNC_keymgmt_gettable_params_fn keymgmt_gettable_params;
138static OSSL_FUNC_keymgmt_set_params_fn keymgmt_set_params;
139static OSSL_FUNC_keymgmt_query_operation_name_fn rsa_keymgmt_name;
140static OSSL_FUNC_keymgmt_query_operation_name_fn ec_keymgmt_name;
143keymgmt_import_helper(XKEY_KEYDATA *key,
const OSSL_PARAM params[]);
148 xkey_dmsg(
D_XKEY,
"entry");
150 XKEY_KEYDATA *key = OPENSSL_zalloc(
sizeof(*key));
160keydata_free(XKEY_KEYDATA *key)
162 xkey_dmsg(
D_XKEY,
"entry");
164 if (!key || key->refcount-- > 0)
168 if (key->free && key->handle)
170 key->free(key->handle);
175 EVP_PKEY_free(key->pubkey);
181keymgmt_new(
void *provctx)
183 xkey_dmsg(
D_XKEY,
"entry");
185 XKEY_KEYDATA *key = keydata_new();
195keymgmt_load(
const void *reference,
size_t reference_sz)
197 xkey_dmsg(
D_XKEY,
"entry");
235keymgmt_import(
void *keydata,
int selection,
const OSSL_PARAM params[],
const char *name)
237 xkey_dmsg(
D_XKEY,
"entry");
239 XKEY_KEYDATA *key = keydata;
243 if (key->handle || key->pubkey)
245 msg(
M_WARN,
"Error: keymgmt_import: keydata not empty -- our keys are immutable");
250 const OSSL_PARAM *p = OSSL_PARAM_locate_const(params,
"xkey-origin");
251 if (p && p->data_type == OSSL_PARAM_UTF8_STRING)
253 key->origin = EXTERNAL_KEY;
254 xkey_dmsg(
D_XKEY,
"importing external key");
255 return keymgmt_import_helper(key, params);
258 xkey_dmsg(
D_XKEY,
"importing native key");
261 EVP_PKEY *pkey = NULL;
262 int selection_pub = selection & ~OSSL_KEYMGMT_SELECT_PRIVATE_KEY;
264 EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new_from_name(key->prov->libctx, name, NULL);
266 || (EVP_PKEY_fromdata_init(ctx) != 1)
267 || (EVP_PKEY_fromdata(ctx, &pkey, selection_pub, (OSSL_PARAM *) params) !=1))
269 msg(
M_WARN,
"Error: keymgmt_import failed for key type <%s>", name);
276 EVP_PKEY_CTX_free(ctx);
282 key->origin = OPENSSL_NATIVE;
283 if (selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY)
287 if (EVP_PKEY_fromdata(ctx, &pkey, selection, (OSSL_PARAM *) params) == 1)
290 key->free = (XKEY_PRIVKEY_FREE_fn *) EVP_PKEY_free;
293 EVP_PKEY_CTX_free(ctx);
295 xkey_dmsg(
D_XKEY,
"imported native %s key", EVP_PKEY_get0_type_name(pkey));
300rsa_keymgmt_import(
void *keydata,
int selection,
const OSSL_PARAM params[])
302 xkey_dmsg(
D_XKEY,
"entry");
304 return keymgmt_import(keydata, selection, params,
"RSA");
308ec_keymgmt_import(
void *keydata,
int selection,
const OSSL_PARAM params[])
310 xkey_dmsg(
D_XKEY,
"entry");
312 return keymgmt_import(keydata, selection, params,
"EC");
316ed448_keymgmt_import(
void *keydata,
int selection,
const OSSL_PARAM params[])
318 xkey_dmsg(
D_XKEY,
"entry");
320 return keymgmt_import(keydata, selection, params,
"ED448");
324ed25519_keymgmt_import(
void *keydata,
int selection,
const OSSL_PARAM params[])
326 xkey_dmsg(
D_XKEY,
"entry");
328 return keymgmt_import(keydata, selection, params,
"ED25519");
336static const OSSL_PARAM *
337keymgmt_import_types(
int selection)
339 xkey_dmsg(
D_XKEY,
"entry");
341 static const OSSL_PARAM key_types[] = { OSSL_PARAM_END };
343 if (selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY)
351keymgmt_free(
void *keydata)
353 xkey_dmsg(
D_XKEY,
"entry");
355 keydata_free(keydata);
359keymgmt_has(
const void *keydata,
int selection)
361 xkey_dmsg(
D_XKEY,
"selection = %d", selection);
363 const XKEY_KEYDATA *key = keydata;
364 int ok = (key != NULL);
366 if (selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY)
368 ok = ok && key->pubkey;
370 if (selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY)
372 ok = ok && key->handle;
379keymgmt_match(
const void *keydata1,
const void *keydata2,
int selection)
381 const XKEY_KEYDATA *key1 = keydata1;
382 const XKEY_KEYDATA *key2 = keydata2;
384 xkey_dmsg(
D_XKEY,
"entry");
386 int ret = key1 && key2 && key1->pubkey && key2->pubkey;
390 if (selection & OSSL_KEYMGMT_SELECT_KEYPAIR)
392 ret =
ret && EVP_PKEY_eq(key1->pubkey, key2->pubkey);
393 xkey_dmsg(
D_XKEY,
"checking key pair match: res = %d",
ret);
396 if (selection & OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS)
398 ret =
ret && EVP_PKEY_parameters_eq(key1->pubkey, key2->pubkey);
399 xkey_dmsg(
D_XKEY,
"checking parameter match: res = %d",
ret);
406static const OSSL_PARAM *
407keymgmt_gettable_params(
void *provctx)
409 xkey_dmsg(
D_XKEY,
"entry");
411 static OSSL_PARAM gettable[] = {
412 OSSL_PARAM_int(OSSL_PKEY_PARAM_BITS, NULL),
413 OSSL_PARAM_int(OSSL_PKEY_PARAM_SECURITY_BITS, NULL),
414 OSSL_PARAM_int(OSSL_PKEY_PARAM_MAX_SIZE, NULL),
421keymgmt_get_params(
void *keydata, OSSL_PARAM *params)
423 xkey_dmsg(
D_XKEY,
"entry");
425 XKEY_KEYDATA *key = keydata;
426 if (!key || !key->pubkey)
431 return EVP_PKEY_get_params(key->pubkey, params);
438keymgmt_import_helper(XKEY_KEYDATA *key,
const OSSL_PARAM *params)
440 xkey_dmsg(
D_XKEY,
"entry");
443 EVP_PKEY *pkey = NULL;
447 ASSERT(key->origin != OPENSSL_NATIVE);
462 p = OSSL_PARAM_locate_const(params,
"pubkey");
463 if (p && p->data_type == OSSL_PARAM_OCTET_STRING
464 && p->data_size ==
sizeof(pkey))
466 pkey = *(EVP_PKEY **)p->data;
469 int id = EVP_PKEY_get_id(pkey);
470 if (
id != EVP_PKEY_RSA &&
id != EVP_PKEY_EC &&
id != EVP_PKEY_ED25519 &&
id != EVP_PKEY_ED448)
472 msg(
M_WARN,
"Error: xkey keymgmt_import: unknown key type (%d)",
id);
476 key->pubkey = EVP_PKEY_dup(pkey);
477 if (key->pubkey == NULL)
479 msg(
M_NONFATAL,
"Error: xkey keymgmt_import: duplicating pubkey failed.");
484 p = OSSL_PARAM_locate_const(params,
"handle");
485 if (p && p->data_type == OSSL_PARAM_OCTET_PTR
486 && p->data_size ==
sizeof(key->handle))
488 key->handle = *(
void **)p->data;
493 p = OSSL_PARAM_locate_const(params,
"sign_op");
494 if (p && p->data_type == OSSL_PARAM_OCTET_PTR
495 && p->data_size ==
sizeof(key->sign))
497 key->sign = *(
void **)p->data;
502 p = OSSL_PARAM_locate_const(params,
"free_op");
503 if (p && p->data_type == OSSL_PARAM_OCTET_PTR
504 && p->data_size ==
sizeof(key->free))
506 key->free = *(
void **)p->data;
508 xkey_dmsg(
D_XKEY,
"imported external %s key", EVP_PKEY_get0_type_name(key->pubkey));
525keymgmt_set_params(
void *keydata,
const OSSL_PARAM *params)
527 XKEY_KEYDATA *key = keydata;
530 xkey_dmsg(
D_XKEY,
"entry");
532 if (key->origin != OPENSSL_NATIVE)
534 return keymgmt_import_helper(key, params);
536 else if (key->handle == NULL)
539 return EVP_PKEY_set_params(key->pubkey, (OSSL_PARAM *)params);
543 msg(
M_WARN,
"xkey keymgmt_set_params: key is immutable");
549rsa_keymgmt_name(
int id)
551 xkey_dmsg(
D_XKEY,
"entry");
557ec_keymgmt_name(
int id)
559 xkey_dmsg(
D_XKEY,
"entry");
561 if (
id == OSSL_OP_SIGNATURE)
568 else if (
id == OSSL_OP_KEYEXCH)
573 msg(
D_XKEY,
"xkey ec_keymgmt_name called with op_id != SIGNATURE or KEYEXCH id=%d",
id);
577static const OSSL_DISPATCH rsa_keymgmt_functions[] = {
578 {OSSL_FUNC_KEYMGMT_NEW, (void (*)(void))keymgmt_new},
579 {OSSL_FUNC_KEYMGMT_FREE, (void (*)(void))keymgmt_free},
580 {OSSL_FUNC_KEYMGMT_LOAD, (void (*)(void))keymgmt_load},
581 {OSSL_FUNC_KEYMGMT_HAS, (void (*)(void))keymgmt_has},
582 {OSSL_FUNC_KEYMGMT_MATCH, (void (*)(void))keymgmt_match},
583 {OSSL_FUNC_KEYMGMT_IMPORT, (void (*)(void))rsa_keymgmt_import},
584 {OSSL_FUNC_KEYMGMT_IMPORT_TYPES, (void (*)(void))keymgmt_import_types},
585 {OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS, (void (*)(void))keymgmt_gettable_params},
586 {OSSL_FUNC_KEYMGMT_GET_PARAMS, (void (*)(void))keymgmt_get_params},
587 {OSSL_FUNC_KEYMGMT_SET_PARAMS, (void (*)(void))keymgmt_set_params},
588 {OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS, (void (*)(void))keymgmt_gettable_params},
589 {OSSL_FUNC_KEYMGMT_QUERY_OPERATION_NAME, (void (*)(void))rsa_keymgmt_name},
593static const OSSL_DISPATCH ec_keymgmt_functions[] = {
594 {OSSL_FUNC_KEYMGMT_NEW, (void (*)(void))keymgmt_new},
595 {OSSL_FUNC_KEYMGMT_FREE, (void (*)(void))keymgmt_free},
596 {OSSL_FUNC_KEYMGMT_LOAD, (void (*)(void))keymgmt_load},
597 {OSSL_FUNC_KEYMGMT_HAS, (void (*)(void))keymgmt_has},
598 {OSSL_FUNC_KEYMGMT_MATCH, (void (*)(void))keymgmt_match},
599 {OSSL_FUNC_KEYMGMT_IMPORT, (void (*)(void))ec_keymgmt_import},
600 {OSSL_FUNC_KEYMGMT_IMPORT_TYPES, (void (*)(void))keymgmt_import_types},
601 {OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS, (void (*)(void))keymgmt_gettable_params},
602 {OSSL_FUNC_KEYMGMT_GET_PARAMS, (void (*)(void))keymgmt_get_params},
603 {OSSL_FUNC_KEYMGMT_SET_PARAMS, (void (*)(void))keymgmt_set_params},
604 {OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS, (void (*)(void))keymgmt_gettable_params},
605 {OSSL_FUNC_KEYMGMT_QUERY_OPERATION_NAME, (void (*)(void))ec_keymgmt_name},
609static const OSSL_DISPATCH ed448_keymgmt_functions[] = {
610 {OSSL_FUNC_KEYMGMT_NEW, (void (*)(void))keymgmt_new},
611 {OSSL_FUNC_KEYMGMT_FREE, (void (*)(void))keymgmt_free},
612 {OSSL_FUNC_KEYMGMT_LOAD, (void (*)(void))keymgmt_load},
613 {OSSL_FUNC_KEYMGMT_HAS, (void (*)(void))keymgmt_has},
614 {OSSL_FUNC_KEYMGMT_MATCH, (void (*)(void))keymgmt_match},
615 {OSSL_FUNC_KEYMGMT_IMPORT, (void (*)(void))ed448_keymgmt_import},
616 {OSSL_FUNC_KEYMGMT_IMPORT_TYPES, (void (*)(void))keymgmt_import_types},
617 {OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS, (void (*)(void))keymgmt_gettable_params},
618 {OSSL_FUNC_KEYMGMT_GET_PARAMS, (void (*)(void))keymgmt_get_params},
619 {OSSL_FUNC_KEYMGMT_SET_PARAMS, (void (*)(void))keymgmt_set_params},
620 {OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS, (void (*)(void))keymgmt_gettable_params},
624static const OSSL_DISPATCH ed25519_keymgmt_functions[] = {
625 {OSSL_FUNC_KEYMGMT_NEW, (void (*)(void))keymgmt_new},
626 {OSSL_FUNC_KEYMGMT_FREE, (void (*)(void))keymgmt_free},
627 {OSSL_FUNC_KEYMGMT_LOAD, (void (*)(void))keymgmt_load},
628 {OSSL_FUNC_KEYMGMT_HAS, (void (*)(void))keymgmt_has},
629 {OSSL_FUNC_KEYMGMT_MATCH, (void (*)(void))keymgmt_match},
630 {OSSL_FUNC_KEYMGMT_IMPORT, (void (*)(void))ed25519_keymgmt_import},
631 {OSSL_FUNC_KEYMGMT_IMPORT_TYPES, (void (*)(void))keymgmt_import_types},
632 {OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS, (void (*)(void))keymgmt_gettable_params},
633 {OSSL_FUNC_KEYMGMT_GET_PARAMS, (void (*)(void))keymgmt_get_params},
634 {OSSL_FUNC_KEYMGMT_SET_PARAMS, (void (*)(void))keymgmt_set_params},
635 {OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS, (void (*)(void))keymgmt_gettable_params},
640const OSSL_ALGORITHM keymgmts[] = {
641 {
"RSA:rsaEncryption", XKEY_PROV_PROPS, rsa_keymgmt_functions,
"OpenVPN xkey RSA Key Manager"},
642 {
"RSA-PSS:RSASSA-PSS", XKEY_PROV_PROPS, rsa_keymgmt_functions,
"OpenVPN xkey RSA-PSS Key Manager"},
643 {
"EC:id-ecPublicKey", XKEY_PROV_PROPS, ec_keymgmt_functions,
"OpenVPN xkey EC Key Manager"},
644 {
"ED448", XKEY_PROV_PROPS, ed448_keymgmt_functions,
"OpenVPN xkey ED448 Key Manager"},
645 {
"ED25519", XKEY_PROV_PROPS, ed25519_keymgmt_functions,
"OpenVPN xkey ED25519 Key Manager"},
646 {NULL, NULL, NULL, NULL}
653static OSSL_FUNC_signature_newctx_fn signature_newctx;
654static OSSL_FUNC_signature_freectx_fn signature_freectx;
655static OSSL_FUNC_signature_sign_init_fn signature_sign_init;
656static OSSL_FUNC_signature_sign_fn signature_sign;
657static OSSL_FUNC_signature_digest_verify_init_fn signature_digest_verify_init;
658static OSSL_FUNC_signature_digest_verify_fn signature_digest_verify;
659static OSSL_FUNC_signature_digest_sign_init_fn signature_digest_sign_init;
660static OSSL_FUNC_signature_digest_sign_fn signature_digest_sign;
661static OSSL_FUNC_signature_set_ctx_params_fn signature_set_ctx_params;
662static OSSL_FUNC_signature_settable_ctx_params_fn signature_settable_ctx_params;
663static OSSL_FUNC_signature_get_ctx_params_fn signature_get_ctx_params;
664static OSSL_FUNC_signature_gettable_ctx_params_fn signature_gettable_ctx_params;
668 XKEY_PROVIDER_CTX *prov;
669 XKEY_KEYDATA *keydata;
673static const XKEY_SIGALG default_sigalg = { .mdname =
"MD5-SHA1", .saltlen =
"digest",
674 .padmode =
"pkcs1", .keytype =
"RSA"};
679} digest_names[] = {{NID_md5_sha1,
"MD5-SHA1"}, {NID_sha1,
"SHA1"},
680 {NID_sha224,
"SHA224",}, {NID_sha256,
"SHA256"}, {NID_sha384,
"SHA384"},
681 {NID_sha512,
"SHA512"}, {0, NULL}};
690} padmode_names[] = {{RSA_PKCS1_PADDING,
"pkcs1"},
691 {RSA_PKCS1_PSS_PADDING,
"pss"},
692 {RSA_NO_PADDING,
"none"},
695static const char *saltlen_names[] = {
"digest",
"max",
"auto", NULL};
701xkey_mdname(
const char *name)
710 int nid = EVP_MD_get_type(EVP_get_digestbyname(name));
712 while (digest_names[i].name && nid != digest_names[i].nid)
716 return digest_names[i].name ? digest_names[i].name :
"MD5-SHA1";
720signature_newctx(
void *provctx,
const char *propq)
722 xkey_dmsg(
D_XKEY,
"entry");
726 XKEY_SIGNATURE_CTX *sctx = OPENSSL_zalloc(
sizeof(*sctx));
733 sctx->prov = provctx;
734 sctx->sigalg = default_sigalg;
740signature_freectx(
void *ctx)
742 xkey_dmsg(
D_XKEY,
"entry");
744 XKEY_SIGNATURE_CTX *sctx = ctx;
746 keydata_free(sctx->keydata);
751static const OSSL_PARAM *
752signature_settable_ctx_params(
void *ctx,
void *provctx)
754 xkey_dmsg(
D_XKEY,
"entry");
756 static OSSL_PARAM settable[] = {
757 OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_PAD_MODE, NULL, 0),
758 OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST, NULL, 0),
759 OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_PSS_SALTLEN, NULL, 0),
767signature_set_ctx_params(
void *ctx,
const OSSL_PARAM params[])
769 xkey_dmsg(
D_XKEY,
"entry");
771 XKEY_SIGNATURE_CTX *sctx = ctx;
778 p = OSSL_PARAM_locate_const(params, OSSL_SIGNATURE_PARAM_PAD_MODE);
779 if (p && p->data_type == OSSL_PARAM_UTF8_STRING)
781 sctx->sigalg.padmode = NULL;
782 for (
int i = 0; padmode_names[i].id != 0; i++)
784 if (!strcmp(p->data, padmode_names[i].name))
786 sctx->sigalg.padmode = padmode_names[i].name;
790 if (sctx->sigalg.padmode == NULL)
792 msg(
M_WARN,
"xkey signature_ctx: padmode <%s>, treating as <none>",
794 sctx->sigalg.padmode =
"none";
796 xkey_dmsg(
D_XKEY,
"setting padmode as %s", sctx->sigalg.padmode);
798 else if (p && p->data_type == OSSL_PARAM_INTEGER)
800 sctx->sigalg.padmode = NULL;
802 if (OSSL_PARAM_get_int(p, &padmode))
804 for (
int i = 0; padmode_names[i].id != 0; i++)
806 if (padmode == padmode_names[i].
id)
808 sctx->sigalg.padmode = padmode_names[i].name;
813 if (padmode == 0 || sctx->sigalg.padmode == NULL)
815 msg(
M_WARN,
"xkey signature_ctx: padmode <%d>, treating as <none>", padmode);
816 sctx->sigalg.padmode =
"none";
818 xkey_dmsg(
D_XKEY,
"setting padmode <%s>", sctx->sigalg.padmode);
822 msg(
M_WARN,
"xkey_signature_params: unknown padmode ignored");
825 p = OSSL_PARAM_locate_const(params, OSSL_SIGNATURE_PARAM_DIGEST);
826 if (p && p->data_type == OSSL_PARAM_UTF8_STRING)
828 sctx->sigalg.mdname = xkey_mdname(p->data);
829 xkey_dmsg(
D_XKEY,
"setting hashalg as %s", sctx->sigalg.mdname);
833 msg(
M_WARN,
"xkey_signature_params: unknown digest type ignored");
836 p = OSSL_PARAM_locate_const(params, OSSL_SIGNATURE_PARAM_PSS_SALTLEN);
837 if (p && p->data_type == OSSL_PARAM_UTF8_STRING)
839 sctx->sigalg.saltlen = NULL;
840 for (
int i = 0; saltlen_names[i] != NULL; i++)
842 if (!strcmp(p->data, saltlen_names[i]))
844 sctx->sigalg.saltlen = saltlen_names[i];
848 if (sctx->sigalg.saltlen == NULL)
850 msg(
M_WARN,
"xkey_signature_params: unknown saltlen <%s>",
852 sctx->sigalg.saltlen =
"digest";
854 xkey_dmsg(
D_XKEY,
"setting saltlen to %s", sctx->sigalg.saltlen);
858 msg(
M_WARN,
"xkey_signature_params: unknown saltlen ignored");
864static const OSSL_PARAM *
865signature_gettable_ctx_params(
void *ctx,
void *provctx)
867 xkey_dmsg(
D_XKEY,
"entry");
869 static OSSL_PARAM gettable[] = { OSSL_PARAM_END };
875signature_get_ctx_params(
void *ctx, OSSL_PARAM params[])
877 xkey_dmsg(
D_XKEY,
"not implemented");
882signature_sign_init(
void *ctx,
void *provkey,
const OSSL_PARAM params[])
884 xkey_dmsg(
D_XKEY,
"entry");
886 XKEY_SIGNATURE_CTX *sctx = ctx;
890 keydata_free(sctx->keydata);
892 sctx->keydata = provkey;
893 sctx->keydata->refcount++;
894 sctx->sigalg.keytype = get_keytype(sctx->keydata);
896 signature_set_ctx_params(sctx, params);
903xkey_sign_dispatch(XKEY_SIGNATURE_CTX *sctx,
unsigned char *sig,
size_t *siglen,
904 const unsigned char *tbs,
size_t tbslen)
906 XKEY_EXTERNAL_SIGN_fn *sign = sctx->keydata->sign;
909 if (sctx->keydata->origin == OPENSSL_NATIVE)
911 ret = xkey_native_sign(sctx->keydata, sig, siglen, tbs, tbslen, sctx->sigalg);
915 ret = sign(sctx->keydata->handle, sig, siglen, tbs, tbslen, sctx->sigalg);
916 xkey_dmsg(
D_XKEY,
"xkey_provider: external sign op returned ret = %d siglen = %d",
ret, (
int) *siglen);
920 msg(
M_NONFATAL,
"xkey_provider: Internal error: No sign callback for external key.");
927signature_sign(
void *ctx,
unsigned char *sig,
size_t *siglen,
size_t sigsize,
928 const unsigned char *tbs,
size_t tbslen)
931 xkey_dmsg(
D_XKEY,
"entry with siglen = %u\n", (
int) *siglen);
933 xkey_dmsg(
D_XKEY,
"entry with siglen = %zu\n", *siglen);
936 XKEY_SIGNATURE_CTX *sctx = ctx;
938 ASSERT(sctx->keydata);
942 *siglen = KEYSIZE(sctx->keydata);
946 sctx->sigalg.op =
"Sign";
947 return xkey_sign_dispatch(sctx, sig, siglen, tbs, tbslen);
951signature_digest_verify_init(
void *ctx,
const char *mdname,
void *provkey,
952 const OSSL_PARAM params[])
954 xkey_dmsg(
D_XKEY,
"mdname <%s>", mdname);
956 msg(
M_WARN,
"xkey_provider: DigestVerifyInit is not implemented");
965signature_digest_verify(
void *ctx,
const unsigned char *sig,
size_t siglen,
966 const unsigned char *tbs,
size_t tbslen)
968 xkey_dmsg(
D_XKEY,
"entry");
970 msg(
M_WARN,
"xkey_provider: DigestVerify is not implemented");
975signature_digest_sign_init(
void *ctx,
const char *mdname,
976 void *provkey,
const OSSL_PARAM params[])
978 xkey_dmsg(
D_XKEY,
"mdname = <%s>", mdname);
980 XKEY_SIGNATURE_CTX *sctx = ctx;
988 keydata_free(sctx->keydata);
990 sctx->keydata = provkey;
991 sctx->keydata->refcount++;
992 sctx->sigalg.keytype = get_keytype(sctx->keydata);
994 signature_set_ctx_params(ctx, params);
995 if (!strcmp(sctx->sigalg.keytype,
"ED448") || !strcmp(sctx->sigalg.keytype,
"ED25519"))
1001 msg(
M_WARN,
"xkey digest_sign_init: mdname must be NULL for ED448/ED25519.");
1004 sctx->sigalg.mdname =
"none";
1008 sctx->sigalg.mdname = xkey_mdname(mdname);
1012 msg(
M_WARN,
"xkey digest_sign_init: mdname is NULL.");
1018signature_digest_sign(
void *ctx,
unsigned char *sig,
size_t *siglen,
1019 size_t sigsize,
const unsigned char *tbs,
size_t tbslen)
1021 xkey_dmsg(
D_XKEY,
"entry");
1023 XKEY_SIGNATURE_CTX *sctx = ctx;
1026 ASSERT(sctx->keydata);
1030 *siglen = KEYSIZE(sctx->keydata);
1034 if (sctx->keydata->origin != OPENSSL_NATIVE)
1037 sctx->sigalg.op =
"DigestSign";
1038 return xkey_sign_dispatch(ctx, sig, siglen, tbs, tbslen);
1043 const char *mdname = sctx->sigalg.mdname;
1044 EVP_MD *md =
EVP_MD_fetch(sctx->prov->libctx, mdname, NULL);
1047 msg(
M_WARN,
"WARN: xkey digest_sign_init: MD_fetch failed for <%s>", mdname);
1052 unsigned char buf[EVP_MAX_MD_SIZE];
1054 if (EVP_Digest(tbs, tbslen, buf, &sz, md, NULL) != 1)
1056 msg(
M_WARN,
"WARN: xkey digest_sign: EVP_Digest failed");
1062 return signature_sign(ctx, sig, siglen, sigsize, buf, sz);
1068xkey_native_sign(XKEY_KEYDATA *key,
unsigned char *sig,
size_t *siglen,
1069 const unsigned char *tbs,
size_t tbslen, XKEY_SIGALG sigalg)
1071 xkey_dmsg(
D_XKEY,
"entry");
1075 EVP_PKEY *pkey = key->handle;
1082 msg(
M_NONFATAL,
"Error: xkey provider: signature request with empty private key");
1086 const char *saltlen = sigalg.saltlen;
1087 const char *mdname = sigalg.mdname;
1088 const char *padmode = sigalg.padmode;
1090 xkey_dmsg(
D_XKEY,
"digest=<%s>, padmode=<%s>, saltlen=<%s>", mdname, padmode, saltlen);
1093 OSSL_PARAM params[6];
1094 if (EVP_PKEY_get_id(pkey) == EVP_PKEY_RSA)
1096 params[i++] = OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST, (
char *)mdname, 0);
1097 params[i++] = OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_PAD_MODE, (
char *)padmode, 0);
1098 if (!strcmp(sigalg.padmode,
"pss"))
1100 params[i++] = OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_PSS_SALTLEN, (
char *) saltlen, 0);
1102 params[i++] = OSSL_PARAM_construct_utf8_string(OSSL_SIGNATURE_PARAM_MGF1_DIGEST, (
char *) mdname, 0);
1105 params[i++] = OSSL_PARAM_construct_end();
1107 EVP_PKEY_CTX *ectx = EVP_PKEY_CTX_new_from_pkey(key->prov->libctx, pkey, NULL);
1111 msg(
M_WARN,
"WARN: xkey test_sign: call to EVP_PKEY_CTX_new...failed");
1115 if (EVP_PKEY_sign_init_ex(ectx, NULL) != 1)
1117 msg(
M_WARN,
"WARN: xkey test_sign: call to EVP_PKEY_sign_init failed");
1120 EVP_PKEY_CTX_set_params(ectx, params);
1122 ret = EVP_PKEY_sign(ectx, sig, siglen, tbs, tbslen);
1123 EVP_PKEY_CTX_free(ectx);
1128static const OSSL_DISPATCH signature_functions[] = {
1129 {OSSL_FUNC_SIGNATURE_NEWCTX, (void (*)(void))signature_newctx},
1130 {OSSL_FUNC_SIGNATURE_FREECTX, (void (*)(void))signature_freectx},
1131 {OSSL_FUNC_SIGNATURE_SIGN_INIT, (void (*)(void))signature_sign_init},
1132 {OSSL_FUNC_SIGNATURE_SIGN, (void (*)(void))signature_sign},
1133 {OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_INIT, (void (*)(void))signature_digest_verify_init},
1134 {OSSL_FUNC_SIGNATURE_DIGEST_VERIFY, (void (*)(void))signature_digest_verify},
1135 {OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT, (void (*)(void))signature_digest_sign_init},
1136 {OSSL_FUNC_SIGNATURE_DIGEST_SIGN, (void (*)(void))signature_digest_sign},
1137 {OSSL_FUNC_SIGNATURE_SET_CTX_PARAMS, (void (*)(void))signature_set_ctx_params},
1138 {OSSL_FUNC_SIGNATURE_SETTABLE_CTX_PARAMS, (void (*)(void))signature_settable_ctx_params},
1139 {OSSL_FUNC_SIGNATURE_GET_CTX_PARAMS, (void (*)(void))signature_get_ctx_params},
1140 {OSSL_FUNC_SIGNATURE_GETTABLE_CTX_PARAMS, (void (*)(void))signature_gettable_ctx_params},
1144const OSSL_ALGORITHM signatures[] = {
1145 {
"RSA:rsaEncryption", XKEY_PROV_PROPS, signature_functions,
"OpenVPN xkey RSA Signature"},
1146 {
"ECDSA", XKEY_PROV_PROPS, signature_functions,
"OpenVPN xkey ECDSA Signature"},
1147 {
"ED448", XKEY_PROV_PROPS, signature_functions,
"OpenVPN xkey Ed448 Signature"},
1148 {
"ED25519", XKEY_PROV_PROPS, signature_functions,
"OpenVPN xkey Ed25519 Signature"},
1149 {NULL, NULL, NULL, NULL}
1155static OSSL_FUNC_provider_query_operation_fn query_operation;
1156static OSSL_FUNC_provider_gettable_params_fn gettable_params;
1157static OSSL_FUNC_provider_get_params_fn get_params;
1158static OSSL_FUNC_provider_teardown_fn teardown;
1160static const OSSL_ALGORITHM *
1161query_operation(
void *provctx,
int op,
int *no_store)
1163 xkey_dmsg(
D_XKEY,
"op = %d", op);
1169 case OSSL_OP_SIGNATURE:
1172 case OSSL_OP_KEYMGMT:
1176 xkey_dmsg(
D_XKEY,
"op not supported");
1182static const OSSL_PARAM *
1183gettable_params(
void *provctx)
1185 xkey_dmsg(
D_XKEY,
"entry");
1187 static const OSSL_PARAM param_types[] = {
1188 OSSL_PARAM_DEFN(OSSL_PROV_PARAM_NAME, OSSL_PARAM_UTF8_PTR, NULL, 0),
1195get_params(
void *provctx, OSSL_PARAM params[])
1199 xkey_dmsg(
D_XKEY,
"entry");
1201 p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_NAME);
1204 return (OSSL_PARAM_set_utf8_ptr(p, provname) != 0);
1211teardown(
void *provctx)
1213 xkey_dmsg(
D_XKEY,
"entry");
1215 XKEY_PROVIDER_CTX *prov = provctx;
1216 if (prov && prov->libctx)
1223static const OSSL_DISPATCH dispatch_table[] = {
1224 {OSSL_FUNC_PROVIDER_GETTABLE_PARAMS, (void (*)(void))gettable_params},
1225 {OSSL_FUNC_PROVIDER_GET_PARAMS, (void (*)(void))get_params},
1226 {OSSL_FUNC_PROVIDER_QUERY_OPERATION, (void (*)(void))query_operation},
1227 {OSSL_FUNC_PROVIDER_TEARDOWN, (void (*)(void))teardown},
1232xkey_provider_init(
const OSSL_CORE_HANDLE *handle,
const OSSL_DISPATCH *in,
1233 const OSSL_DISPATCH **
out,
void **provctx)
1235 XKEY_PROVIDER_CTX *prov;
1237 xkey_dmsg(
D_XKEY,
"entry");
1239 prov = OPENSSL_zalloc(
sizeof(*prov));
1249 prov->libctx = OSSL_LIB_CTX_new_child(handle, in);
1251 EVP_set_default_properties(prov->libctx,
"provider!=ovpn.xkey");
1253 *
out = dispatch_table;
static void OSSL_LIB_CTX_free(void *libctx)
static void EVP_MD_free(const EVP_MD *md)
static const EVP_MD * EVP_MD_fetch(void *, const char *algorithm, const char *)
const char * name(const KeyDerivation kd)
static std::stringstream out