X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=providers%2Fimplementations%2Fkeymgmt%2Fecx_kmgmt.c;h=b078c6de58d5eea854cd0a58aae1c0ae03342baa;hp=cbb302efc4c4f6ace2af261ac8bc9c7a4cb0695c;hb=af6d8dd30ff48046f5af7d84095f30356c33264a;hpb=90d3cb57c6caafbe031e32a99051386b8c5a90c0 diff --git a/providers/implementations/keymgmt/ecx_kmgmt.c b/providers/implementations/keymgmt/ecx_kmgmt.c index cbb302efc4..b078c6de58 100644 --- a/providers/implementations/keymgmt/ecx_kmgmt.c +++ b/providers/implementations/keymgmt/ecx_kmgmt.c @@ -18,8 +18,12 @@ static OSSL_OP_keymgmt_new_fn x25519_new_key; static OSSL_OP_keymgmt_new_fn x448_new_key; +static OSSL_OP_keymgmt_new_fn ed25519_new_key; +static OSSL_OP_keymgmt_new_fn ed448_new_key; static OSSL_OP_keymgmt_get_params_fn x25519_get_params; static OSSL_OP_keymgmt_get_params_fn x448_get_params; +static OSSL_OP_keymgmt_get_params_fn ed25519_get_params; +static OSSL_OP_keymgmt_get_params_fn ed448_get_params; static OSSL_OP_keymgmt_gettable_params_fn ecx_gettable_params; static OSSL_OP_keymgmt_has_fn ecx_has; static OSSL_OP_keymgmt_import_fn ecx_import; @@ -27,6 +31,8 @@ static OSSL_OP_keymgmt_import_types_fn ecx_imexport_types; static OSSL_OP_keymgmt_export_fn ecx_export; static OSSL_OP_keymgmt_export_types_fn ecx_imexport_types; +#define ECX_POSSIBLE_SELECTIONS (OSSL_KEYMGMT_SELECT_KEYPAIR) + static void *x25519_new_key(void *provctx) { return ecx_key_new(X25519_KEYLEN, 0); @@ -37,15 +43,22 @@ static void *x448_new_key(void *provctx) return ecx_key_new(X448_KEYLEN, 0); } +static void *ed25519_new_key(void *provctx) +{ + return ecx_key_new(ED25519_KEYLEN, 0); +} + +static void *ed448_new_key(void *provctx) +{ + return ecx_key_new(ED448_KEYLEN, 0); +} + static int ecx_has(void *keydata, int selection) { ECX_KEY *key = keydata; - const int ecx_selections = OSSL_KEYMGMT_SELECT_PUBLIC_KEY - | OSSL_KEYMGMT_SELECT_PRIVATE_KEY; int ok = 1; - if ((selection & ~ecx_selections) != 0 - || (selection & ecx_selections) == 0) + if ((selection & ECX_POSSIBLE_SELECTIONS) == 0) return 0; if ((selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) != 0) @@ -63,29 +76,24 @@ static int ecx_import(void *keydata, int selection, const OSSL_PARAM params[]) size_t privkeylen = 0, pubkeylen; const OSSL_PARAM *param_priv_key = NULL, *param_pub_key; unsigned char *pubkey; - const int ecx_selections = OSSL_KEYMGMT_SELECT_PUBLIC_KEY - | OSSL_KEYMGMT_SELECT_PRIVATE_KEY; if (key == NULL) return 0; - if ((selection & ~ecx_selections) != 0 - || (selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) == 0) + if ((selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) == 0) return 0; - if ((selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0) - param_priv_key = - OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_PRIV_KEY); param_pub_key = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_PUB_KEY); + if ((selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0) + param_priv_key = + OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_PRIV_KEY); /* * If a private key is present then a public key must also be present. * Alternatively we've just got a public key. */ - if (param_pub_key == NULL - || (param_priv_key == NULL - && (selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0)) + if (param_pub_key == NULL) return 0; if (param_priv_key != NULL @@ -154,8 +162,8 @@ static int ecx_export(void *keydata, int selection, OSSL_CALLBACK *param_cb, } static const OSSL_PARAM ecx_key_types[] = { - OSSL_PARAM_BN(OSSL_PKEY_PARAM_PUB_KEY, NULL, 0), - OSSL_PARAM_BN(OSSL_PKEY_PARAM_PRIV_KEY, NULL, 0), + OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PUB_KEY, NULL, 0), + OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PRIV_KEY, NULL, 0), OSSL_PARAM_END }; static const OSSL_PARAM *ecx_imexport_types(int selection) @@ -192,6 +200,16 @@ static int x448_get_params(void *key, OSSL_PARAM params[]) return ecx_get_params(params, X448_BITS, X448_SECURITY_BITS, X448_KEYLEN); } +static int ed25519_get_params(void *key, OSSL_PARAM params[]) +{ + return ecx_get_params(params, ED25519_BITS, ED25519_SECURITY_BITS, ED25519_KEYLEN); +} + +static int ed448_get_params(void *key, OSSL_PARAM params[]) +{ + return ecx_get_params(params, ED448_BITS, ED448_SECURITY_BITS, ED448_KEYLEN); +} + static const OSSL_PARAM ecx_params[] = { OSSL_PARAM_int(OSSL_PKEY_PARAM_BITS, NULL), OSSL_PARAM_int(OSSL_PKEY_PARAM_SECURITY_BITS, NULL), @@ -204,28 +222,21 @@ static const OSSL_PARAM *ecx_gettable_params(void) return ecx_params; } -const OSSL_DISPATCH x25519_keymgmt_functions[] = { - { OSSL_FUNC_KEYMGMT_NEW, (void (*)(void))x25519_new_key }, - { OSSL_FUNC_KEYMGMT_FREE, (void (*)(void))ecx_key_free }, - { OSSL_FUNC_KEYMGMT_GET_PARAMS, (void (*) (void))x25519_get_params }, - { OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS, (void (*) (void))ecx_gettable_params }, - { OSSL_FUNC_KEYMGMT_HAS, (void (*)(void))ecx_has }, - { OSSL_FUNC_KEYMGMT_IMPORT, (void (*)(void))ecx_import }, - { OSSL_FUNC_KEYMGMT_IMPORT_TYPES, (void (*)(void))ecx_imexport_types }, - { OSSL_FUNC_KEYMGMT_EXPORT, (void (*)(void))ecx_export }, - { OSSL_FUNC_KEYMGMT_EXPORT_TYPES, (void (*)(void))ecx_imexport_types }, - { 0, NULL } -}; - -const OSSL_DISPATCH x448_keymgmt_functions[] = { - { OSSL_FUNC_KEYMGMT_NEW, (void (*)(void))x448_new_key }, - { OSSL_FUNC_KEYMGMT_FREE, (void (*)(void))ecx_key_free }, - { OSSL_FUNC_KEYMGMT_GET_PARAMS, (void (*) (void))x448_get_params }, - { OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS, (void (*) (void))ecx_gettable_params }, - { OSSL_FUNC_KEYMGMT_HAS, (void (*)(void))ecx_has }, - { OSSL_FUNC_KEYMGMT_IMPORT, (void (*)(void))ecx_import }, - { OSSL_FUNC_KEYMGMT_IMPORT_TYPES, (void (*)(void))ecx_imexport_types }, - { OSSL_FUNC_KEYMGMT_EXPORT, (void (*)(void))ecx_export }, - { OSSL_FUNC_KEYMGMT_EXPORT_TYPES, (void (*)(void))ecx_imexport_types }, - { 0, NULL } -}; +#define MAKE_KEYMGMT_FUNCTIONS(alg) \ + const OSSL_DISPATCH alg##_keymgmt_functions[] = { \ + { OSSL_FUNC_KEYMGMT_NEW, (void (*)(void))alg##_new_key }, \ + { OSSL_FUNC_KEYMGMT_FREE, (void (*)(void))ecx_key_free }, \ + { OSSL_FUNC_KEYMGMT_GET_PARAMS, (void (*) (void))alg##_get_params }, \ + { OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS, (void (*) (void))ecx_gettable_params }, \ + { OSSL_FUNC_KEYMGMT_HAS, (void (*)(void))ecx_has }, \ + { OSSL_FUNC_KEYMGMT_IMPORT, (void (*)(void))ecx_import }, \ + { OSSL_FUNC_KEYMGMT_IMPORT_TYPES, (void (*)(void))ecx_imexport_types }, \ + { OSSL_FUNC_KEYMGMT_EXPORT, (void (*)(void))ecx_export }, \ + { OSSL_FUNC_KEYMGMT_EXPORT_TYPES, (void (*)(void))ecx_imexport_types }, \ + { 0, NULL } \ + }; + +MAKE_KEYMGMT_FUNCTIONS(x25519) +MAKE_KEYMGMT_FUNCTIONS(x448) +MAKE_KEYMGMT_FUNCTIONS(ed25519) +MAKE_KEYMGMT_FUNCTIONS(ed448)