mirror of https://github.com/openssl/openssl.git
ecx (fips): add PCT for key import
FIPS 140-3 IG 10.3.A additional comment 1 mandates a PCT on key import. Fixes #26572
This commit is contained in:
parent
df44c5b970
commit
337244f8a2
|
|
@ -17,6 +17,7 @@
|
|||
#include <openssl/evp.h>
|
||||
#include <openssl/rand.h>
|
||||
#include <openssl/self_test.h>
|
||||
#include "internal/fips.h"
|
||||
#include "internal/param_build_set.h"
|
||||
#include <openssl/param_build.h>
|
||||
#include "crypto/ecx.h"
|
||||
|
|
@ -92,6 +93,15 @@ static void *s390x_ecd_keygen25519(struct ecx_gen_ctx *gctx);
|
|||
static void *s390x_ecd_keygen448(struct ecx_gen_ctx *gctx);
|
||||
#endif
|
||||
|
||||
#ifdef FIPS_MODULE
|
||||
static int ecd_fips140_pairwise_test(const ECX_KEY *ecx, int type, int self_test);
|
||||
#endif /* FIPS_MODULE */
|
||||
|
||||
static ossl_inline int ecx_key_type_is_ed(ECX_KEY_TYPE type)
|
||||
{
|
||||
return type == ECX_KEY_TYPE_ED25519 || type == ECX_KEY_TYPE_ED448;
|
||||
}
|
||||
|
||||
static void *x25519_new_key(void *provctx)
|
||||
{
|
||||
if (!ossl_prov_is_running())
|
||||
|
|
@ -208,6 +218,14 @@ static int ecx_import(void *keydata, int selection, const OSSL_PARAM params[])
|
|||
include_private = selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY ? 1 : 0;
|
||||
ok = ok && ossl_ecx_key_fromdata(key, params, include_private);
|
||||
|
||||
#ifdef FIPS_MODULE
|
||||
if (ok > 0 && ecx_key_type_is_ed(key->type) && !ossl_fips_self_testing())
|
||||
if (key->haspubkey && key->privkey != NULL) {
|
||||
ok = ecd_fips140_pairwise_test(key, key->type, 1);
|
||||
if (ok <= 0)
|
||||
ossl_set_error_state(OSSL_SELF_TEST_TYPE_PCT);
|
||||
}
|
||||
#endif /* FIPS_MODULE */
|
||||
return ok;
|
||||
}
|
||||
|
||||
|
|
@ -716,8 +734,7 @@ static void *ecx_gen(struct ecx_gen_ctx *gctx)
|
|||
}
|
||||
#ifndef FIPS_MODULE
|
||||
if (gctx->dhkem_ikm != NULL && gctx->dhkem_ikmlen != 0) {
|
||||
if (gctx->type == ECX_KEY_TYPE_ED25519
|
||||
|| gctx->type == ECX_KEY_TYPE_ED448)
|
||||
if (ecx_key_type_is_ed(gctx->type))
|
||||
goto err;
|
||||
if (!ossl_ecx_dhkem_derive_private(key, privkey,
|
||||
gctx->dhkem_ikm, gctx->dhkem_ikmlen))
|
||||
|
|
@ -981,7 +998,7 @@ static int ecx_validate(const void *keydata, int selection, int type,
|
|||
if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != OSSL_KEYMGMT_SELECT_KEYPAIR)
|
||||
return ok;
|
||||
|
||||
if (type == ECX_KEY_TYPE_ED25519 || type == ECX_KEY_TYPE_ED448)
|
||||
if (ecx_key_type_is_ed(type))
|
||||
ok = ok && ecd_key_pairwise_check(ecx, type);
|
||||
else
|
||||
ok = ok && ecx_key_pairwise_check(ecx, type);
|
||||
|
|
|
|||
Loading…
Reference in New Issue