Skip to content

Commit e818aee

Browse files
committed
provider: Allow the DHKEM-IKM option for EC keygen, but use fallback provider
Tolerate the use of DKHEM-IKM EC key generation (OSSL_PKEY_PARAM_DHKEM_IKM set to a non-empty buffer), but use the fallback provider for generating the EC key. Signed-off-by: Ingo Franzki <ifranzki@linux.ibm.com>
1 parent 4a17200 commit e818aee

File tree

2 files changed

+66
-4
lines changed

2 files changed

+66
-4
lines changed

src/provider/ec_keymgmt.c

Lines changed: 64 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -898,6 +898,12 @@ static void ibmca_keymgmt_ec_gen_free_cb(struct ibmca_op_ctx *ctx)
898898

899899
ctx->ec.gen.curve_nid = NID_undef;
900900
ctx->ec.gen.format = POINT_CONVERSION_UNCOMPRESSED;
901+
902+
if (ctx->ec.gen.dhkem_ikm != NULL)
903+
P_CLEAR_FREE(ctx->provctx, ctx->ec.gen.dhkem_ikm,
904+
ctx->ec.gen.dhkem_ikmlen);
905+
ctx->ec.gen.dhkem_ikm = NULL;
906+
ctx->ec.gen.dhkem_ikmlen = 0;
901907
}
902908

903909
static int ibmca_keymgmt_ec_gen_dup_cb(const struct ibmca_op_ctx *ctx,
@@ -911,6 +917,23 @@ static int ibmca_keymgmt_ec_gen_dup_cb(const struct ibmca_op_ctx *ctx,
911917
new_ctx->ec.gen.curve_nid = ctx->ec.gen.curve_nid;
912918
new_ctx->ec.gen.format = ctx->ec.gen.format;
913919

920+
if (ctx->ec.gen.dhkem_ikm != NULL)
921+
P_CLEAR_FREE(ctx->provctx, ctx->ec.gen.dhkem_ikm,
922+
ctx->ec.gen.dhkem_ikmlen);
923+
new_ctx->ec.gen.dhkem_ikm = NULL;
924+
new_ctx->ec.gen.dhkem_ikmlen = 0;
925+
if (ctx->ec.gen.dhkem_ikm != NULL) {
926+
new_ctx->ec.gen.dhkem_ikm = P_MEMDUP(ctx->provctx,
927+
ctx->ec.gen.dhkem_ikm,
928+
ctx->ec.gen.dhkem_ikmlen);
929+
if (new_ctx->ec.gen.dhkem_ikm == NULL) {
930+
put_error_op_ctx(ctx, IBMCA_ERR_MALLOC_FAILED,
931+
"Failed to duplicate DHKEM-IKM buffer");
932+
return 0;
933+
}
934+
new_ctx->ec.gen.dhkem_ikmlen = ctx->ec.gen.dhkem_ikmlen;
935+
}
936+
914937
return 1;
915938
}
916939

@@ -996,6 +1019,10 @@ static int ibmca_keymgmt_ec_gen_set_params(void *vgenctx,
9961019
const char *name;
9971020
EC_GROUP *group;
9981021
int rc, value;
1022+
#ifdef OSSL_PKEY_PARAM_DHKEM_IKM
1023+
unsigned char *ptr = NULL;
1024+
size_t len = 0;
1025+
#endif
9991026

10001027
if (genctx == NULL)
10011028
return 0;
@@ -1081,11 +1108,17 @@ static int ibmca_keymgmt_ec_gen_set_params(void *vgenctx,
10811108
}
10821109

10831110
#ifdef OSSL_PKEY_PARAM_DHKEM_IKM
1084-
if (OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_DHKEM_IKM) != NULL) {
1085-
put_error_op_ctx(genctx, IBMCA_ERR_INVALID_PARAM,
1086-
"EC parameter '%s' is not supported",
1087-
OSSL_PKEY_PARAM_DHKEM_IKM);
1111+
rc = ibmca_param_get_octet_string(genctx->provctx, params,
1112+
OSSL_PKEY_PARAM_DHKEM_IKM,
1113+
(void **)&ptr, &len);
1114+
if (rc == 0)
10881115
return 0;
1116+
if (rc > 0) {
1117+
if (genctx->ec.gen.dhkem_ikm != NULL)
1118+
P_CLEAR_FREE(genctx->provctx, genctx->ec.gen.dhkem_ikm,
1119+
genctx->ec.gen.dhkem_ikmlen);
1120+
genctx->ec.gen.dhkem_ikm = ptr;
1121+
genctx->ec.gen.dhkem_ikmlen = len;
10891122
}
10901123
#endif
10911124

@@ -1125,6 +1158,9 @@ static int ibmca_keymgmt_ec_gen_fallback(struct ibmca_op_ctx *genctx,
11251158
struct ibmca_keygen_cb_data cbdata;
11261159
EVP_PKEY_CTX *pctx = NULL;
11271160
EVP_PKEY *pkey = NULL;
1161+
#ifdef OSSL_PKEY_PARAM_DHKEM_IKM
1162+
OSSL_PARAM params[2];
1163+
#endif
11281164
int rc = 0;
11291165

11301166
ibmca_debug_op_ctx(genctx, "genctx: %p", genctx);
@@ -1154,6 +1190,22 @@ static int ibmca_keymgmt_ec_gen_fallback(struct ibmca_op_ctx *genctx,
11541190
goto out;
11551191
}
11561192

1193+
#ifdef OSSL_PKEY_PARAM_DHKEM_IKM
1194+
if (genctx->ec.gen.dhkem_ikm != NULL && genctx->ec.gen.dhkem_ikmlen > 0) {
1195+
params[0] = OSSL_PARAM_construct_octet_string(
1196+
OSSL_PKEY_PARAM_DHKEM_IKM,
1197+
genctx->ec.gen.dhkem_ikm,
1198+
genctx->ec.gen.dhkem_ikmlen);
1199+
params[1] = OSSL_PARAM_construct_end();
1200+
1201+
if (EVP_PKEY_CTX_set_params(pctx, params) != 1) {
1202+
put_error_op_ctx(genctx, IBMCA_ERR_INTERNAL_ERROR,
1203+
"EVP_PKEY_CTX_set_params failed");
1204+
goto out;
1205+
}
1206+
}
1207+
#endif
1208+
11571209
if (osslcb != NULL) {
11581210
cbdata.osslcb = osslcb;
11591211
cbdata.cbarg = cbarg;
@@ -1237,6 +1289,14 @@ static void *ibmca_keymgmt_ec_gen(void *vgenctx, OSSL_CALLBACK *osslcb,
12371289
if ((genctx->ec.gen.selection & OSSL_KEYMGMT_SELECT_KEYPAIR) == 0)
12381290
goto out;
12391291

1292+
ibmca_debug_op_ctx(genctx, "dhkem_ikm: %p", genctx->ec.gen.dhkem_ikm);
1293+
ibmca_debug_op_ctx(genctx, "dhkem_ikmlen: %u", genctx->ec.gen.dhkem_ikmlen);
1294+
1295+
if (genctx->ec.gen.dhkem_ikm != NULL && genctx->ec.gen.dhkem_ikmlen > 0) {
1296+
ibmca_debug_op_ctx(genctx, "DHKEM-IKM is set, force use of fallback");
1297+
fallback = true;
1298+
}
1299+
12401300
key->ec.key = ica_ec_key_new(key->ec.curve_nid, &privlen);
12411301
if (key->ec.key == NULL || key->ec.prime_size != privlen) {
12421302
ibmca_debug_op_ctx(genctx, "ica_ec_key_new failed");

src/provider/p_ibmca.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,8 @@ struct ibmca_op_ctx {
233233
int selection;
234234
int curve_nid;
235235
point_conversion_form_t format;
236+
unsigned char *dhkem_ikm;
237+
size_t dhkem_ikmlen;
236238
} gen; /* For operation EVP_PKEY_OP_KEYGEN */
237239
struct {
238240
EVP_MD *md;

0 commit comments

Comments
 (0)