Skip to content

Commit cd59a30

Browse files
committed
Cleanup and add explicit ikme rejection
1 parent b75d07f commit cd59a30

File tree

6 files changed

+55
-20
lines changed

6 files changed

+55
-20
lines changed

SymCryptProvider/src/decoder/p_scossl_decode_mlkem.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ static SCOSSL_STATUS p_scossl_der_to_mlkem_export_object(_In_ SCOSSL_DECODE_CTX
142142
} \
143143
\
144144
static const SCOSSL_DECODE_KEYTYPE_DESC p_scossl_mlkem##bits##_##decoderType##_desc = { \
145-
"MLKEM"#bits, \
145+
"ML-KEM-"#bits, \
146146
select_##decoderType, \
147147
(PSCOSSL_DECODE_INTERNAL_FN)p_scossl_##decoderType##_to_mlkem##bits, \
148148
(OSSL_FUNC_keymgmt_free_fn *)p_scossl_mlkem_keymgmt_free_key_ctx}; \

SymCryptProvider/src/encoder/p_scossl_encode_mlkem.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ static SCOSSL_STATUS p_scossl_mlkem_to_text(ossl_unused SCOSSL_ENCODE_CTX *ctx,
332332
goto cleanup;
333333
}
334334

335-
if (!p_scossl_mlkem_keymgmt_get_encoded_key(keyCtx, keyCtx->format, &pbKey, &cbKey))
335+
if (p_scossl_mlkem_keymgmt_get_encoded_key(keyCtx, keyCtx->format, &pbKey, &cbKey) != SCOSSL_SUCCESS)
336336
{
337337
goto cleanup;
338338
}
@@ -363,13 +363,13 @@ static SCOSSL_STATUS p_scossl_mlkem_to_text(ossl_unused SCOSSL_ENCODE_CTX *ctx,
363363
pbKey = NULL;
364364
cbKey = 0;
365365

366-
if (!p_scossl_mlkem_keymgmt_get_encoded_key(keyCtx, OSSL_KEYMGMT_SELECT_PUBLIC_KEY, &pbKey, &cbKey))
366+
if (p_scossl_mlkem_keymgmt_get_encoded_key(keyCtx, OSSL_KEYMGMT_SELECT_PUBLIC_KEY, &pbKey, &cbKey) != SCOSSL_SUCCESS)
367367
{
368368
goto cleanup;
369369
}
370370

371371
if ((!printedPrivateKey && BIO_printf(out, "MLKEM Public-Key (%ld bit):\n", cbKey * 8) <= 0) ||
372-
BIO_printf(out, "encapsulation-key") <= 0)
372+
BIO_printf(out, "encapsulation-key") <= 0)
373373
{
374374
goto cleanup;
375375
}

SymCryptProvider/src/kem/p_scossl_mlkem.c

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,15 @@ typedef struct
2828
SCOSSL_MLKEM_KEY_CTX *keyCtx;
2929
} SCOSSL_MLKEM_CTX;
3030

31-
static const OSSL_PARAM p_scossl_mlkem_param_types[] = {
31+
static const OSSL_PARAM p_scossl_mlkem_settable_param_types[] = {
32+
OSSL_PARAM_octet_string(OSSL_KEM_PARAM_IKME, NULL, 0),
3233
OSSL_PARAM_END};
3334

35+
static const OSSL_PARAM p_scossl_mlkem_gettable_param_types[] = {
36+
OSSL_PARAM_END};
37+
38+
static SCOSSL_STATUS p_scossl_mlkem_set_ctx_params(_In_ SCOSSL_MLKEM_CTX *ctx, _In_ const OSSL_PARAM params[]);
39+
3440
/* Context management */
3541
static SCOSSL_MLKEM_CTX *p_scossl_mlkem_newctx(ossl_unused SCOSSL_PROVCTX *provctx)
3642
{
@@ -86,7 +92,12 @@ static SCOSSL_STATUS p_scossl_mlkem_init(_Inout_ SCOSSL_MLKEM_CTX *ctx, _In_ SCO
8692
static SCOSSL_STATUS p_scossl_mlkem_encapsulate_init(_Inout_ SCOSSL_MLKEM_CTX *ctx, _In_ SCOSSL_MLKEM_KEY_CTX *keyCtx,
8793
ossl_unused const OSSL_PARAM params[])
8894
{
89-
return p_scossl_mlkem_init(ctx, keyCtx, EVP_PKEY_OP_ENCAPSULATE);
95+
if (p_scossl_mlkem_init(ctx, keyCtx, EVP_PKEY_OP_ENCAPSULATE) != SCOSSL_SUCCESS)
96+
{
97+
return SCOSSL_FAILURE;
98+
}
99+
100+
return p_scossl_mlkem_set_ctx_params(ctx, params);
90101
}
91102

92103
static SCOSSL_STATUS p_scossl_mlkem_encapsulate(_In_ SCOSSL_MLKEM_CTX *ctx,
@@ -248,16 +259,35 @@ static SCOSSL_STATUS p_scossl_mlkem_decapsulate(_In_ SCOSSL_MLKEM_CTX *ctx,
248259
//
249260
// Parameters
250261
//
251-
static const OSSL_PARAM *p_scossl_mlkem_ctx_param_types(ossl_unused void *ctx, ossl_unused void *provctx)
262+
static const OSSL_PARAM *p_scossl_mlkem_settable_ctx_param_types(ossl_unused void *ctx, ossl_unused void *provctx)
252263
{
253-
return p_scossl_mlkem_param_types;
264+
return p_scossl_mlkem_settable_param_types;
254265
}
255266

256-
static SCOSSL_STATUS p_scossl_mlkem_set_ctx_params(ossl_unused void *ctx, ossl_unused const OSSL_PARAM params[])
267+
static SCOSSL_STATUS p_scossl_mlkem_set_ctx_params(_In_ SCOSSL_MLKEM_CTX *ctx, _In_ const OSSL_PARAM params[])
257268
{
269+
const OSSL_PARAM *p;
270+
271+
if (ctx == NULL)
272+
{
273+
return SCOSSL_FAILURE;
274+
}
275+
276+
if (ctx->operation == EVP_PKEY_OP_ENCAPSULATE &&
277+
(p = OSSL_PARAM_locate_const(params, OSSL_KEM_PARAM_IKME)) != NULL)
278+
{
279+
ERR_raise(ERR_LIB_PROV, PROV_R_NOT_SUPPORTED);
280+
return SCOSSL_FAILURE;
281+
}
282+
258283
return SCOSSL_SUCCESS;
259284
}
260285

286+
static const OSSL_PARAM *p_scossl_mlkem_gettable_ctx_param_types(ossl_unused void *ctx, ossl_unused void *provctx)
287+
{
288+
return p_scossl_mlkem_gettable_param_types;
289+
}
290+
261291
static SCOSSL_STATUS p_scossl_mlkem_get_ctx_params(ossl_unused void *ctx, ossl_unused OSSL_PARAM params[])
262292
{
263293
return SCOSSL_SUCCESS;
@@ -271,10 +301,10 @@ const OSSL_DISPATCH p_scossl_mlkem_functions[] = {
271301
{OSSL_FUNC_KEM_ENCAPSULATE, (void (*)(void))p_scossl_mlkem_encapsulate},
272302
{OSSL_FUNC_KEM_DECAPSULATE_INIT, (void (*)(void))p_scossl_mlkem_decapsulate_init},
273303
{OSSL_FUNC_KEM_DECAPSULATE, (void (*)(void))p_scossl_mlkem_decapsulate},
304+
{OSSL_FUNC_KEM_SETTABLE_CTX_PARAMS, (void (*)(void))p_scossl_mlkem_settable_ctx_param_types},
274305
{OSSL_FUNC_KEM_SET_CTX_PARAMS, (void (*)(void))p_scossl_mlkem_set_ctx_params},
275-
{OSSL_FUNC_KEM_SETTABLE_CTX_PARAMS, (void (*)(void))p_scossl_mlkem_ctx_param_types},
306+
{OSSL_FUNC_KEM_GETTABLE_CTX_PARAMS, (void (*)(void))p_scossl_mlkem_gettable_ctx_param_types},
276307
{OSSL_FUNC_KEM_GET_CTX_PARAMS, (void (*)(void))p_scossl_mlkem_get_ctx_params},
277-
{OSSL_FUNC_KEM_GETTABLE_CTX_PARAMS, (void (*)(void))p_scossl_mlkem_ctx_param_types},
278308
{0, NULL}};
279309

280310
_Use_decl_annotations_

SymCryptProvider/src/keymgmt/p_scossl_mlkem_hybrid_keymgmt.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -476,13 +476,15 @@ static BOOL p_scossl_mlkem_hybrid_keymgmt_match(_In_ SCOSSL_MLKEM_HYBRID_KEY_CTX
476476
BOOL ret = FALSE;
477477
SCOSSL_STATUS success;
478478

479-
if (keyCtx1->mlkemParams != keyCtx2->mlkemParams ||
479+
if (keyCtx1 == NULL ||
480+
keyCtx2 == NULL ||
481+
keyCtx1->mlkemParams != keyCtx2->mlkemParams ||
480482
keyCtx1->classicGroupNid != keyCtx2->classicGroupNid)
481483
{
482484
goto cleanup;
483485
}
484486

485-
if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR))
487+
if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0)
486488
{
487489
if (keyCtx1->key != NULL && keyCtx2->key != NULL)
488490
{
@@ -910,7 +912,11 @@ SCOSSL_STATUS p_scossl_mlkem_hybrid_keymgmt_set_encoded_key(SCOSSL_MLKEM_HYBRID_
910912
cleanup:
911913
if (ret != SCOSSL_SUCCESS && isNewKey)
912914
{
913-
SymCryptMlKemkeyFree(keyCtx->key);
915+
if (keyCtx->key != NULL)
916+
{
917+
SymCryptMlKemkeyFree(keyCtx->key);
918+
}
919+
914920
p_scossl_ecc_free_ctx(keyCtx->classicKeyCtx);
915921
keyCtx->key = NULL;
916922
keyCtx->classicKeyCtx = NULL;

SymCryptProvider/src/keymgmt/p_scossl_mlkem_keymgmt.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -496,12 +496,14 @@ static BOOL p_scossl_mlkem_keymgmt_match(_In_ SCOSSL_MLKEM_KEY_CTX *keyCtx1, _In
496496
BOOL ret = FALSE;
497497
SCOSSL_STATUS success;
498498

499-
if (keyCtx1->mlkemParams != keyCtx2->mlkemParams)
499+
if (keyCtx1 == NULL ||
500+
keyCtx2 == NULL ||
501+
keyCtx1->mlkemParams != keyCtx2->mlkemParams)
500502
{
501503
goto cleanup;
502504
}
503505

504-
if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR))
506+
if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0)
505507
{
506508
if (keyCtx1->key != NULL && keyCtx2->key != NULL)
507509
{
@@ -691,7 +693,7 @@ SCOSSL_STATUS p_scossl_mlkem_keymgmt_export(_In_ SCOSSL_MLKEM_KEY_CTX *keyCtx, i
691693
goto cleanup;
692694
}
693695

694-
__fallthrough;
696+
/* fall through */
695697
case SYMCRYPT_MLKEMKEY_FORMAT_DECAPSULATION_KEY:
696698
OPENSSL_secure_clear_free(pbKey, cbKey);
697699
pbKey = NULL;
@@ -937,8 +939,6 @@ SCOSSL_STATUS p_scossl_mlkem_keymgmt_set_encoded_key(SCOSSL_MLKEM_KEY_CTX *keyCt
937939
return ret;
938940
}
939941

940-
941-
942942
#ifdef __cplusplus
943943
}
944944
#endif

SymCryptProvider/src/keymgmt/p_scossl_mlkem_keymgmt.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
#pragma once
66

7-
#include "p_scossl_base.h"
87
#include "kem/p_scossl_mlkem.h"
98

109
#ifdef __cplusplus

0 commit comments

Comments
 (0)