* valid - but for this mode of operation it forces a failure instead.
*/
unsigned int kattest;
+#endif
+#ifdef FIPS_MODULE
+ /*
+ * FIPS 140-3 IG 2.4.B mandates that verification based on a digest of a
+ * message is not permitted. However, signing based on a digest is still
+ * permitted.
+ */
+ int verify_message;
#endif
/* If this is set then the generated k is not random */
unsigned int nonce_type;
OSSL_FIPS_IND_INIT(ctx)
ctx->flag_allow_md = 1;
+#ifdef FIPS_MODULE
+ ctx->verify_message = 1;
+#endif
ctx->libctx = PROV_LIBCTX_OF(provctx);
if (propq != NULL && (ctx->propq = OPENSSL_strdup(propq)) == NULL) {
OPENSSL_free(ctx);
return ctx;
}
-static int ecdsa_signverify_init(void *vctx, void *ec,
+static int ecdsa_signverify_init(PROV_ECDSA_CTX *ctx, void *ec,
const OSSL_PARAM params[], int operation,
const char *desc)
{
- PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
-
if (!ossl_prov_is_running()
|| ctx == NULL)
return 0;
static int ecdsa_sign_init(void *vctx, void *ec, const OSSL_PARAM params[])
{
- return ecdsa_signverify_init(vctx, ec, params, EVP_PKEY_OP_SIGN,
+ PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
+
+#ifdef FIPS_MODULE
+ ctx->verify_message = 1;
+#endif
+ return ecdsa_signverify_init(ctx, ec, params, EVP_PKEY_OP_SIGN,
"ECDSA Sign Init");
}
static int ecdsa_verify_init(void *vctx, void *ec, const OSSL_PARAM params[])
{
- return ecdsa_signverify_init(vctx, ec, params, EVP_PKEY_OP_VERIFY,
+ PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
+
+#ifdef FIPS_MODULE
+ ctx->verify_message = 0;
+#endif
+ return ecdsa_signverify_init(ctx, ec, params, EVP_PKEY_OP_VERIFY,
"ECDSA Verify Init");
}
if (!ossl_prov_is_running())
return 0;
- if (!ecdsa_signverify_init(vctx, ec, params, operation, desc)
+#ifdef FIPS_MODULE
+ ctx->verify_message = 1;
+#endif
+ if (!ecdsa_signverify_init(ctx, ec, params, operation, desc)
|| !ecdsa_setup_md(ctx, mdname, NULL, desc))
return 0;
p = OSSL_PARAM_locate(params, OSSL_SIGNATURE_PARAM_NONCE_TYPE);
if (p != NULL && !OSSL_PARAM_set_uint(p, ctx->nonce_type))
return 0;
+
+#ifdef FIPS_MODULE
+ p = OSSL_PARAM_locate(params, OSSL_SIGNATURE_PARAM_FIPS_VERIFY_MESSAGE);
+ if (p != NULL && !OSSL_PARAM_set_uint(p, ctx->verify_message))
+ return 0;
+#endif
+
if (!OSSL_FIPS_IND_GET_CTX_PARAM(ctx, params))
return 0;
return 1;
OSSL_PARAM_size_t(OSSL_SIGNATURE_PARAM_DIGEST_SIZE, NULL),
OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST, NULL, 0),
OSSL_PARAM_uint(OSSL_SIGNATURE_PARAM_NONCE_TYPE, NULL),
+#ifdef FIPS_MODULE
+ OSSL_PARAM_uint(OSSL_SIGNATURE_PARAM_FIPS_VERIFY_MESSAGE, NULL),
+#endif
OSSL_FIPS_IND_GETTABLE_CTX_PARAM()
OSSL_PARAM_END
};
if (!OSSL_FIPS_IND_SET_CTX_PARAM(ctx, OSSL_FIPS_IND_SETTABLE0, params,
OSSL_SIGNATURE_PARAM_FIPS_KEY_CHECK))
- return 0;
+ return 0;
if (!OSSL_FIPS_IND_SET_CTX_PARAM(ctx, OSSL_FIPS_IND_SETTABLE1, params,
OSSL_SIGNATURE_PARAM_FIPS_DIGEST_CHECK))
- return 0;
+ return 0;
#if !defined(OPENSSL_NO_ACVP_TESTS)
p = OSSL_PARAM_locate_const(params, OSSL_SIGNATURE_PARAM_KAT);