forked from rpms/openssl
Pairwise consistency tests should use Digest+Sign/Verify
Resolves: rhbz#2178034
This commit is contained in:
parent
d2996a9b03
commit
fa195e46a2
@ -185,3 +185,266 @@ diff -up openssl-3.0.1/crypto/rsa/rsa_gen.c.fips3 openssl-3.0.1/crypto/rsa/rsa_g
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
diff -up openssl-3.0.7/providers/implementations/keymgmt/ec_kmgmt.c.pairwise openssl-3.0.7/providers/implementations/keymgmt/ec_kmgmt.c
|
||||||
|
--- openssl-3.0.7/providers/implementations/keymgmt/ec_kmgmt.c.pairwise 2023-02-20 11:44:18.451884117 +0100
|
||||||
|
+++ openssl-3.0.7/providers/implementations/keymgmt/ec_kmgmt.c 2023-02-20 12:39:46.037063842 +0100
|
||||||
|
@@ -982,8 +982,17 @@ struct ec_gen_ctx {
|
||||||
|
int selection;
|
||||||
|
int ecdh_mode;
|
||||||
|
EC_GROUP *gen_group;
|
||||||
|
+#ifdef FIPS_MODULE
|
||||||
|
+ void *ecdsa_sig_ctx;
|
||||||
|
+#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
+#ifdef FIPS_MODULE
|
||||||
|
+void *ecdsa_newctx(void *provctx, const char *propq);
|
||||||
|
+void ecdsa_freectx(void *vctx);
|
||||||
|
+int do_ec_pct(void *, const char *, void *);
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
static void *ec_gen_init(void *provctx, int selection,
|
||||||
|
const OSSL_PARAM params[])
|
||||||
|
{
|
||||||
|
@@ -1002,6 +1011,10 @@ static void *ec_gen_init(void *provctx,
|
||||||
|
OPENSSL_free(gctx);
|
||||||
|
gctx = NULL;
|
||||||
|
}
|
||||||
|
+#ifdef FIPS_MODULE
|
||||||
|
+ if (gctx != NULL)
|
||||||
|
+ gctx->ecdsa_sig_ctx = ecdsa_newctx(provctx, NULL);
|
||||||
|
+#endif
|
||||||
|
return gctx;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1272,6 +1285,12 @@ static void *ec_gen(void *genctx, OSSL_C
|
||||||
|
|
||||||
|
if (gctx->ecdh_mode != -1)
|
||||||
|
ret = ret && ossl_ec_set_ecdh_cofactor_mode(ec, gctx->ecdh_mode);
|
||||||
|
+#ifdef FIPS_MODULE
|
||||||
|
+ /* Pairwise consistency test */
|
||||||
|
+ if ((gctx->selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0
|
||||||
|
+ && do_ec_pct(gctx->ecdsa_sig_ctx, "sha256", ec) != 1)
|
||||||
|
+ goto err;
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
if (gctx->group_check != NULL)
|
||||||
|
ret = ret && ossl_ec_set_check_group_type_from_name(ec, gctx->group_check);
|
||||||
|
@@ -1341,7 +1359,10 @@ static void ec_gen_cleanup(void *genctx)
|
||||||
|
|
||||||
|
if (gctx == NULL)
|
||||||
|
return;
|
||||||
|
-
|
||||||
|
+#ifdef FIPS_MODULE
|
||||||
|
+ ecdsa_freectx(gctx->ecdsa_sig_ctx);
|
||||||
|
+ gctx->ecdsa_sig_ctx = NULL;
|
||||||
|
+#endif
|
||||||
|
EC_GROUP_free(gctx->gen_group);
|
||||||
|
BN_free(gctx->p);
|
||||||
|
BN_free(gctx->a);
|
||||||
|
diff -up openssl-3.0.7/providers/implementations/signature/ecdsa_sig.c.pairwise openssl-3.0.7/providers/implementations/signature/ecdsa_sig.c
|
||||||
|
--- openssl-3.0.7/providers/implementations/signature/ecdsa_sig.c.pairwise 2023-02-20 11:50:23.035194347 +0100
|
||||||
|
+++ openssl-3.0.7/providers/implementations/signature/ecdsa_sig.c 2023-02-20 12:19:10.809768979 +0100
|
||||||
|
@@ -32,7 +32,7 @@
|
||||||
|
#include "crypto/ec.h"
|
||||||
|
#include "prov/der_ec.h"
|
||||||
|
|
||||||
|
-static OSSL_FUNC_signature_newctx_fn ecdsa_newctx;
|
||||||
|
+OSSL_FUNC_signature_newctx_fn ecdsa_newctx;
|
||||||
|
static OSSL_FUNC_signature_sign_init_fn ecdsa_sign_init;
|
||||||
|
static OSSL_FUNC_signature_verify_init_fn ecdsa_verify_init;
|
||||||
|
static OSSL_FUNC_signature_sign_fn ecdsa_sign;
|
||||||
|
@@ -43,7 +43,7 @@ static OSSL_FUNC_signature_digest_sign_f
|
||||||
|
static OSSL_FUNC_signature_digest_verify_init_fn ecdsa_digest_verify_init;
|
||||||
|
static OSSL_FUNC_signature_digest_verify_update_fn ecdsa_digest_signverify_update;
|
||||||
|
static OSSL_FUNC_signature_digest_verify_final_fn ecdsa_digest_verify_final;
|
||||||
|
-static OSSL_FUNC_signature_freectx_fn ecdsa_freectx;
|
||||||
|
+OSSL_FUNC_signature_freectx_fn ecdsa_freectx;
|
||||||
|
static OSSL_FUNC_signature_dupctx_fn ecdsa_dupctx;
|
||||||
|
static OSSL_FUNC_signature_get_ctx_params_fn ecdsa_get_ctx_params;
|
||||||
|
static OSSL_FUNC_signature_gettable_ctx_params_fn ecdsa_gettable_ctx_params;
|
||||||
|
@@ -104,7 +104,7 @@ typedef struct {
|
||||||
|
#endif
|
||||||
|
} PROV_ECDSA_CTX;
|
||||||
|
|
||||||
|
-static void *ecdsa_newctx(void *provctx, const char *propq)
|
||||||
|
+void *ecdsa_newctx(void *provctx, const char *propq)
|
||||||
|
{
|
||||||
|
PROV_ECDSA_CTX *ctx;
|
||||||
|
|
||||||
|
@@ -370,7 +370,7 @@ int ecdsa_digest_verify_final(void *vctx
|
||||||
|
return ecdsa_verify(ctx, sig, siglen, digest, (size_t)dlen);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void ecdsa_freectx(void *vctx)
|
||||||
|
+void ecdsa_freectx(void *vctx)
|
||||||
|
{
|
||||||
|
PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
|
||||||
|
|
||||||
|
@@ -581,6 +581,35 @@ static const OSSL_PARAM *ecdsa_settable_
|
||||||
|
return EVP_MD_settable_ctx_params(ctx->md);
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifdef FIPS_MODULE
|
||||||
|
+int do_ec_pct(void *vctx, const char *mdname, void *ec)
|
||||||
|
+{
|
||||||
|
+ static const char data[32];
|
||||||
|
+ unsigned char sigbuf[256];
|
||||||
|
+ size_t siglen = sizeof(sigbuf);
|
||||||
|
+
|
||||||
|
+ if (ecdsa_digest_sign_init(vctx, mdname, ec, NULL) <= 0)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ if (ecdsa_digest_signverify_update(vctx, data, sizeof(data)) <= 0)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ if (ecdsa_digest_sign_final(vctx, sigbuf, &siglen, sizeof(sigbuf)) <= 0)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ if (ecdsa_digest_verify_init(vctx, mdname, ec, NULL) <= 0)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ if (ecdsa_digest_signverify_update(vctx, data, sizeof(data)) <= 0)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ if (ecdsa_digest_verify_final(vctx, sigbuf, siglen) <= 0)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ return 1;
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
const OSSL_DISPATCH ossl_ecdsa_signature_functions[] = {
|
||||||
|
{ OSSL_FUNC_SIGNATURE_NEWCTX, (void (*)(void))ecdsa_newctx },
|
||||||
|
{ OSSL_FUNC_SIGNATURE_SIGN_INIT, (void (*)(void))ecdsa_sign_init },
|
||||||
|
diff -up openssl-3.0.7/providers/implementations/keymgmt/rsa_kmgmt.c.pairwise openssl-3.0.7/providers/implementations/keymgmt/rsa_kmgmt.c
|
||||||
|
--- openssl-3.0.7/providers/implementations/keymgmt/rsa_kmgmt.c.pairwise 2023-02-20 16:04:27.103364713 +0100
|
||||||
|
+++ openssl-3.0.7/providers/implementations/keymgmt/rsa_kmgmt.c 2023-02-20 16:14:13.848119419 +0100
|
||||||
|
@@ -434,6 +434,7 @@ struct rsa_gen_ctx {
|
||||||
|
#if defined(FIPS_MODULE) && !defined(OPENSSL_NO_ACVP_TESTS)
|
||||||
|
/* ACVP test parameters */
|
||||||
|
OSSL_PARAM *acvp_test_params;
|
||||||
|
+ void *prov_rsa_ctx;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
@@ -447,6 +448,12 @@ static int rsa_gencb(int p, int n, BN_GE
|
||||||
|
return gctx->cb(params, gctx->cbarg);
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifdef FIPS_MODULE
|
||||||
|
+void *rsa_newctx(void *provctx, const char *propq);
|
||||||
|
+void rsa_freectx(void *vctx);
|
||||||
|
+int do_rsa_pct(void *, const char *, void *);
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
static void *gen_init(void *provctx, int selection, int rsa_type,
|
||||||
|
const OSSL_PARAM params[])
|
||||||
|
{
|
||||||
|
@@ -474,6 +481,10 @@ static void *gen_init(void *provctx, int
|
||||||
|
|
||||||
|
if (!rsa_gen_set_params(gctx, params))
|
||||||
|
goto err;
|
||||||
|
+#ifdef FIPS_MODULE
|
||||||
|
+ if (gctx != NULL)
|
||||||
|
+ gctx->prov_rsa_ctx = rsa_newctx(provctx, NULL);
|
||||||
|
+#endif
|
||||||
|
return gctx;
|
||||||
|
|
||||||
|
err:
|
||||||
|
@@ -630,6 +641,11 @@ static void *rsa_gen(void *genctx, OSSL_
|
||||||
|
|
||||||
|
rsa = rsa_tmp;
|
||||||
|
rsa_tmp = NULL;
|
||||||
|
+#ifdef FIPS_MODULE
|
||||||
|
+ /* Pairwise consistency test */
|
||||||
|
+ if (do_rsa_pct(gctx->prov_rsa_ctx, "sha256", rsa) != 1)
|
||||||
|
+ goto err;
|
||||||
|
+#endif
|
||||||
|
err:
|
||||||
|
BN_GENCB_free(gencb);
|
||||||
|
RSA_free(rsa_tmp);
|
||||||
|
@@ -645,6 +662,8 @@ static void rsa_gen_cleanup(void *genctx
|
||||||
|
#if defined(FIPS_MODULE) && !defined(OPENSSL_NO_ACVP_TESTS)
|
||||||
|
ossl_rsa_acvp_test_gen_params_free(gctx->acvp_test_params);
|
||||||
|
gctx->acvp_test_params = NULL;
|
||||||
|
+ rsa_freectx(gctx->prov_rsa_ctx);
|
||||||
|
+ gctx->prov_rsa_ctx = NULL;
|
||||||
|
#endif
|
||||||
|
BN_clear_free(gctx->pub_exp);
|
||||||
|
OPENSSL_free(gctx);
|
||||||
|
diff -up openssl-3.0.7/providers/implementations/signature/rsa_sig.c.pairwise openssl-3.0.7/providers/implementations/signature/rsa_sig.c
|
||||||
|
--- openssl-3.0.7/providers/implementations/signature/rsa_sig.c.pairwise 2023-02-20 16:04:22.548327811 +0100
|
||||||
|
+++ openssl-3.0.7/providers/implementations/signature/rsa_sig.c 2023-02-20 16:17:50.064871695 +0100
|
||||||
|
@@ -36,7 +36,7 @@
|
||||||
|
|
||||||
|
#define RSA_DEFAULT_DIGEST_NAME OSSL_DIGEST_NAME_SHA1
|
||||||
|
|
||||||
|
-static OSSL_FUNC_signature_newctx_fn rsa_newctx;
|
||||||
|
+OSSL_FUNC_signature_newctx_fn rsa_newctx;
|
||||||
|
static OSSL_FUNC_signature_sign_init_fn rsa_sign_init;
|
||||||
|
static OSSL_FUNC_signature_verify_init_fn rsa_verify_init;
|
||||||
|
static OSSL_FUNC_signature_verify_recover_init_fn rsa_verify_recover_init;
|
||||||
|
@@ -49,7 +49,7 @@ static OSSL_FUNC_signature_digest_sign_f
|
||||||
|
static OSSL_FUNC_signature_digest_verify_init_fn rsa_digest_verify_init;
|
||||||
|
static OSSL_FUNC_signature_digest_verify_update_fn rsa_digest_signverify_update;
|
||||||
|
static OSSL_FUNC_signature_digest_verify_final_fn rsa_digest_verify_final;
|
||||||
|
-static OSSL_FUNC_signature_freectx_fn rsa_freectx;
|
||||||
|
+OSSL_FUNC_signature_freectx_fn rsa_freectx;
|
||||||
|
static OSSL_FUNC_signature_dupctx_fn rsa_dupctx;
|
||||||
|
static OSSL_FUNC_signature_get_ctx_params_fn rsa_get_ctx_params;
|
||||||
|
static OSSL_FUNC_signature_gettable_ctx_params_fn rsa_gettable_ctx_params;
|
||||||
|
@@ -172,7 +172,7 @@ static int rsa_check_parameters(PROV_RSA
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void *rsa_newctx(void *provctx, const char *propq)
|
||||||
|
+void *rsa_newctx(void *provctx, const char *propq)
|
||||||
|
{
|
||||||
|
PROV_RSA_CTX *prsactx = NULL;
|
||||||
|
char *propq_copy = NULL;
|
||||||
|
@@ -990,7 +990,7 @@ int rsa_digest_verify_final(void *vprsac
|
||||||
|
return rsa_verify(vprsactx, sig, siglen, digest, (size_t)dlen);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void rsa_freectx(void *vprsactx)
|
||||||
|
+void rsa_freectx(void *vprsactx)
|
||||||
|
{
|
||||||
|
PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
|
||||||
|
|
||||||
|
@@ -1504,6 +1504,35 @@ static const OSSL_PARAM *rsa_settable_ct
|
||||||
|
return EVP_MD_settable_ctx_params(prsactx->md);
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifdef FIPS_MODULE
|
||||||
|
+int do_rsa_pct(void *vctx, const char *mdname, void *rsa)
|
||||||
|
+{
|
||||||
|
+ static const char data[32];
|
||||||
|
+ unsigned char sigbuf[256];
|
||||||
|
+ size_t siglen = sizeof(sigbuf);
|
||||||
|
+
|
||||||
|
+ if (rsa_digest_sign_init(vctx, mdname, rsa, NULL) <= 0)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ if (rsa_digest_signverify_update(vctx, data, sizeof(data)) <= 0)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ if (rsa_digest_sign_final(vctx, sigbuf, &siglen, sizeof(sigbuf)) <= 0)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ if (rsa_digest_verify_init(vctx, mdname, rsa, NULL) <= 0)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ if (rsa_digest_signverify_update(vctx, data, sizeof(data)) <= 0)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ if (rsa_digest_verify_final(vctx, sigbuf, siglen) <= 0)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ return 1;
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
const OSSL_DISPATCH ossl_rsa_signature_functions[] = {
|
||||||
|
{ OSSL_FUNC_SIGNATURE_NEWCTX, (void (*)(void))rsa_newctx },
|
||||||
|
{ OSSL_FUNC_SIGNATURE_SIGN_INIT, (void (*)(void))rsa_sign_init },
|
||||||
|
@ -399,7 +399,7 @@ index 325e855333..bea397f0c1 100644
|
|||||||
#define RSA_DEFAULT_DIGEST_NAME OSSL_DIGEST_NAME_SHA1
|
#define RSA_DEFAULT_DIGEST_NAME OSSL_DIGEST_NAME_SHA1
|
||||||
+#define RSA_DEFAULT_DIGEST_NAME_NONLEGACY OSSL_DIGEST_NAME_SHA2_256
|
+#define RSA_DEFAULT_DIGEST_NAME_NONLEGACY OSSL_DIGEST_NAME_SHA2_256
|
||||||
|
|
||||||
static OSSL_FUNC_signature_newctx_fn rsa_newctx;
|
OSSL_FUNC_signature_newctx_fn rsa_newctx;
|
||||||
static OSSL_FUNC_signature_sign_init_fn rsa_sign_init;
|
static OSSL_FUNC_signature_sign_init_fn rsa_sign_init;
|
||||||
@@ -289,10 +291,15 @@ static int rsa_setup_md(PROV_RSA_CTX *ctx, const char *mdname,
|
@@ -289,10 +291,15 @@ static int rsa_setup_md(PROV_RSA_CTX *ctx, const char *mdname,
|
||||||
|
|
||||||
|
@ -515,6 +515,8 @@ install -m644 %{SOURCE9} \
|
|||||||
Resolves: rhbz#2178137
|
Resolves: rhbz#2178137
|
||||||
- Limit RSA_NO_PADDING for encryption and signature in FIPS mode
|
- Limit RSA_NO_PADDING for encryption and signature in FIPS mode
|
||||||
Resolves: rhbz#2178029
|
Resolves: rhbz#2178029
|
||||||
|
- Pairwise consistency tests should use Digest+Sign/Verify
|
||||||
|
Resolves: rhbz#2178034
|
||||||
|
|
||||||
* Wed Mar 08 2023 Dmitry Belyavskiy <dbelyavs@redhat.com> - 1:3.0.7-6
|
* Wed Mar 08 2023 Dmitry Belyavskiy <dbelyavs@redhat.com> - 1:3.0.7-6
|
||||||
- Fixes RNG slowdown in FIPS mode
|
- Fixes RNG slowdown in FIPS mode
|
||||||
|
Loading…
Reference in New Issue
Block a user