@@ -898,6 +898,12 @@ static void ibmca_keymgmt_ec_gen_free_cb(struct ibmca_op_ctx *ctx)
898
898
899
899
ctx -> ec .gen .curve_nid = NID_undef ;
900
900
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 ;
901
907
}
902
908
903
909
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,
911
917
new_ctx -> ec .gen .curve_nid = ctx -> ec .gen .curve_nid ;
912
918
new_ctx -> ec .gen .format = ctx -> ec .gen .format ;
913
919
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
+
914
937
return 1 ;
915
938
}
916
939
@@ -996,6 +1019,10 @@ static int ibmca_keymgmt_ec_gen_set_params(void *vgenctx,
996
1019
const char * name ;
997
1020
EC_GROUP * group ;
998
1021
int rc , value ;
1022
+ #ifdef OSSL_PKEY_PARAM_DHKEM_IKM
1023
+ unsigned char * ptr = NULL ;
1024
+ size_t len = 0 ;
1025
+ #endif
999
1026
1000
1027
if (genctx == NULL )
1001
1028
return 0 ;
@@ -1081,11 +1108,17 @@ static int ibmca_keymgmt_ec_gen_set_params(void *vgenctx,
1081
1108
}
1082
1109
1083
1110
#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 )
1088
1115
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 ;
1089
1122
}
1090
1123
#endif
1091
1124
@@ -1125,6 +1158,9 @@ static int ibmca_keymgmt_ec_gen_fallback(struct ibmca_op_ctx *genctx,
1125
1158
struct ibmca_keygen_cb_data cbdata ;
1126
1159
EVP_PKEY_CTX * pctx = NULL ;
1127
1160
EVP_PKEY * pkey = NULL ;
1161
+ #ifdef OSSL_PKEY_PARAM_DHKEM_IKM
1162
+ OSSL_PARAM params [2 ];
1163
+ #endif
1128
1164
int rc = 0 ;
1129
1165
1130
1166
ibmca_debug_op_ctx (genctx , "genctx: %p" , genctx );
@@ -1154,6 +1190,22 @@ static int ibmca_keymgmt_ec_gen_fallback(struct ibmca_op_ctx *genctx,
1154
1190
goto out ;
1155
1191
}
1156
1192
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
+
1157
1209
if (osslcb != NULL ) {
1158
1210
cbdata .osslcb = osslcb ;
1159
1211
cbdata .cbarg = cbarg ;
@@ -1237,6 +1289,14 @@ static void *ibmca_keymgmt_ec_gen(void *vgenctx, OSSL_CALLBACK *osslcb,
1237
1289
if ((genctx -> ec .gen .selection & OSSL_KEYMGMT_SELECT_KEYPAIR ) == 0 )
1238
1290
goto out ;
1239
1291
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
+
1240
1300
key -> ec .key = ica_ec_key_new (key -> ec .curve_nid , & privlen );
1241
1301
if (key -> ec .key == NULL || key -> ec .prime_size != privlen ) {
1242
1302
ibmca_debug_op_ctx (genctx , "ica_ec_key_new failed" );
0 commit comments