aboutsummaryrefslogtreecommitdiff
path: root/test/acvp_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/acvp_test.c')
-rw-r--r--test/acvp_test.c389
1 files changed, 329 insertions, 60 deletions
diff --git a/test/acvp_test.c b/test/acvp_test.c
index eccf9d90a021..2bcc886fd290 100644
--- a/test/acvp_test.c
+++ b/test/acvp_test.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2020-2022 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 2020-2024 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
@@ -46,6 +46,14 @@ static OSSL_PROVIDER *prov_null = NULL;
static OSSL_LIB_CTX *libctx = NULL;
static SELF_TEST_ARGS self_test_args = { 0 };
static OSSL_CALLBACK self_test_events;
+static int pass_sig_gen_params = 1;
+static int rsa_sign_x931_pad_allowed = 1;
+#ifndef OPENSSL_NO_DSA
+static int dsasign_allowed = 1;
+#endif
+#ifndef OPENSSL_NO_EC
+static int ec_cofactors = 1;
+#endif
const OPTIONS *test_get_options(void)
{
@@ -93,12 +101,13 @@ static int sig_gen(EVP_PKEY *pkey, OSSL_PARAM *params, const char *digest_name,
unsigned char *sig = NULL;
size_t sig_len;
size_t sz = EVP_PKEY_get_size(pkey);
+ OSSL_PARAM *p = pass_sig_gen_params ? params : NULL;
sig_len = sz;
if (!TEST_ptr(sig = OPENSSL_malloc(sz))
|| !TEST_ptr(md_ctx = EVP_MD_CTX_new())
|| !TEST_int_eq(EVP_DigestSignInit_ex(md_ctx, NULL, digest_name, libctx,
- NULL, pkey, NULL), 1)
+ NULL, pkey, p), 1)
|| !TEST_int_gt(EVP_DigestSign(md_ctx, sig, &sig_len, msg, msg_len), 0))
goto err;
*sig_out = sig;
@@ -111,6 +120,25 @@ err:
return ret;
}
+static int check_verify_message(EVP_PKEY_CTX *pkey_ctx, int expected)
+{
+ OSSL_PARAM params[2], *p = params;
+ int verify_message = -1;
+
+ if (!OSSL_PROVIDER_available(libctx, "fips")
+ || fips_provider_version_match(libctx, "<3.4.0"))
+ return 1;
+
+ *p++ = OSSL_PARAM_construct_int(OSSL_SIGNATURE_PARAM_FIPS_VERIFY_MESSAGE,
+ &verify_message);
+ *p = OSSL_PARAM_construct_end();
+
+ if (!TEST_true(EVP_PKEY_CTX_get_params(pkey_ctx, params))
+ || !TEST_int_eq(verify_message, expected))
+ return 0;
+ return 1;
+}
+
#ifndef OPENSSL_NO_EC
static int ecdsa_keygen_test(int id)
{
@@ -276,6 +304,7 @@ static int ecdsa_sigver_test(int id)
int ret = 0;
EVP_MD_CTX *md_ctx = NULL;
EVP_PKEY *pkey = NULL;
+ EVP_PKEY_CTX *pkey_ctx;
ECDSA_SIG *sign = NULL;
size_t sig_len;
unsigned char *sig = NULL;
@@ -293,12 +322,20 @@ static int ecdsa_sigver_test(int id)
goto err;
rbn = sbn = NULL;
- ret = TEST_int_gt((sig_len = i2d_ECDSA_SIG(sign, &sig)), 0)
- && TEST_ptr(md_ctx = EVP_MD_CTX_new())
- && TEST_true(EVP_DigestVerifyInit_ex(md_ctx, NULL, tst->digest_alg,
- libctx, NULL, pkey, NULL)
- && TEST_int_eq(EVP_DigestVerify(md_ctx, sig, sig_len,
- tst->msg, tst->msg_len), tst->pass));
+ if (!TEST_int_gt((sig_len = i2d_ECDSA_SIG(sign, &sig)), 0)
+ || !TEST_ptr(md_ctx = EVP_MD_CTX_new())
+ || !TEST_true(EVP_DigestVerifyInit_ex(md_ctx, NULL, tst->digest_alg,
+ libctx, NULL, pkey, NULL))
+ || !TEST_ptr(pkey_ctx = EVP_MD_CTX_get_pkey_ctx(md_ctx))
+ || !check_verify_message(pkey_ctx, 1)
+ || !TEST_int_eq(EVP_DigestVerify(md_ctx, sig, sig_len,
+ tst->msg, tst->msg_len), tst->pass)
+ || !check_verify_message(pkey_ctx, 1)
+ || !TEST_true(EVP_PKEY_verify_init(pkey_ctx))
+ || !check_verify_message(pkey_ctx, 0))
+ goto err;
+
+ ret = 1;
err:
BN_free(rbn);
BN_free(sbn);
@@ -309,9 +346,71 @@ err:
return ret;
}
+
+static int ecdh_cofactor_derive_test(int tstid)
+{
+ int ret = 0;
+ const struct ecdh_cofactor_derive_st *t = &ecdh_cofactor_derive_data[tstid];
+ unsigned char secret1[16];
+ size_t secret1_len = sizeof(secret1);
+ const char *curve = "K-283"; /* A curve that has a cofactor that it not 1 */
+ EVP_PKEY *peer1 = NULL, *peer2 = NULL;
+ EVP_PKEY_CTX *p1ctx = NULL;
+ OSSL_PARAM params[2], *prms = NULL;
+ int use_cofactordh = t->key_cofactor;
+ int cofactor_mode = t->derive_cofactor_mode;
+
+ if (!ec_cofactors)
+ return TEST_skip("not supported by FIPS provider version");
+
+ if (!TEST_ptr(peer1 = EVP_PKEY_Q_keygen(libctx, NULL, "EC", curve)))
+ return TEST_skip("Curve %s not supported by the FIPS provider", curve);
+
+ if (!TEST_ptr(peer2 = EVP_PKEY_Q_keygen(libctx, NULL, "EC", curve)))
+ goto err;
+
+ params[1] = OSSL_PARAM_construct_end();
+
+ prms = NULL;
+ if (t->key_cofactor != COFACTOR_NOT_SET) {
+ params[0] = OSSL_PARAM_construct_int(OSSL_PKEY_PARAM_USE_COFACTOR_ECDH,
+ &use_cofactordh);
+ prms = params;
+ }
+ if (!TEST_int_eq(EVP_PKEY_set_params(peer1, prms), 1)
+ || !TEST_ptr(p1ctx = EVP_PKEY_CTX_new_from_pkey(libctx, peer1, NULL)))
+ goto err;
+
+ prms = NULL;
+ if (t->derive_cofactor_mode != COFACTOR_NOT_SET) {
+ params[0] = OSSL_PARAM_construct_int(OSSL_EXCHANGE_PARAM_EC_ECDH_COFACTOR_MODE,
+ &cofactor_mode);
+ prms = params;
+ }
+ if (!TEST_int_eq(EVP_PKEY_derive_init_ex(p1ctx, prms), 1)
+ || !TEST_int_eq(EVP_PKEY_derive_set_peer(p1ctx, peer2), 1)
+ || !TEST_int_eq(EVP_PKEY_derive(p1ctx, secret1, &secret1_len),
+ t->expected))
+ goto err;
+
+ ret = 1;
+err:
+ if (ret == 0) {
+ static const char *state[] = { "unset", "-1", "disabled", "enabled" };
+
+ TEST_note("ECDH derive() was expected to %s if key cofactor is"
+ "%s and derive mode is %s", t->expected ? "Pass" : "Fail",
+ state[2 + t->key_cofactor], state[2 + t->derive_cofactor_mode]);
+ }
+ EVP_PKEY_free(peer1);
+ EVP_PKEY_free(peer2);
+ EVP_PKEY_CTX_free(p1ctx);
+ return ret;
+}
+
#endif /* OPENSSL_NO_EC */
-#ifndef OPENSSL_NO_DSA
+#if !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_ECX)
static int pkey_get_octet_bytes(EVP_PKEY *pkey, const char *name,
unsigned char **out, size_t *out_len)
{
@@ -333,6 +432,91 @@ err:
OPENSSL_free(buf);
return 0;
}
+#endif /* !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_ECX) */
+
+#ifndef OPENSSL_NO_ECX
+static int eddsa_create_pkey(EVP_PKEY **pkey, const char *algname,
+ const unsigned char *pub, size_t pub_len,
+ int expected)
+{
+ int ret = 0;
+ EVP_PKEY_CTX *ctx = NULL;
+ OSSL_PARAM_BLD *bld = NULL;
+ OSSL_PARAM *params = NULL;
+
+ if (!TEST_ptr(bld = OSSL_PARAM_BLD_new())
+ || !TEST_true(OSSL_PARAM_BLD_push_octet_string(bld,
+ OSSL_PKEY_PARAM_PUB_KEY,
+ pub, pub_len) > 0)
+ || !TEST_ptr(params = OSSL_PARAM_BLD_to_param(bld))
+ || !TEST_ptr(ctx = EVP_PKEY_CTX_new_from_name(libctx, algname, NULL))
+ || !TEST_int_eq(EVP_PKEY_fromdata_init(ctx), 1)
+ || !TEST_int_eq(EVP_PKEY_fromdata(ctx, pkey, EVP_PKEY_PUBLIC_KEY,
+ params), expected))
+ goto err;
+
+ ret = 1;
+err:
+ OSSL_PARAM_free(params);
+ OSSL_PARAM_BLD_free(bld);
+ EVP_PKEY_CTX_free(ctx);
+ return ret;
+}
+
+static int eddsa_pub_verify_test(int id)
+{
+ const struct ecdsa_pub_verify_st *tst = &eddsa_pv_data[id];
+ int ret = 0;
+ EVP_PKEY_CTX *key_ctx = NULL;
+ EVP_PKEY *pkey = NULL;
+
+ if (!TEST_true(eddsa_create_pkey(&pkey, tst->curve_name,
+ tst->pub, tst->pub_len, 1)))
+ goto err;
+
+ if (!TEST_ptr(key_ctx = EVP_PKEY_CTX_new_from_pkey(libctx, pkey, ""))
+ || !TEST_int_eq(EVP_PKEY_public_check(key_ctx), tst->pass))
+ goto err;
+ ret = 1;
+err:
+ EVP_PKEY_free(pkey);
+ EVP_PKEY_CTX_free(key_ctx);
+ return ret;
+}
+
+static int eddsa_keygen_test(int id)
+{
+ int ret = 0;
+ EVP_PKEY *pkey = NULL;
+ unsigned char *priv = NULL, *pub = NULL;
+ size_t priv_len = 0, pub_len = 0;
+ const struct ecdsa_pub_verify_st *tst = &eddsa_pv_data[id];
+
+ self_test_args.called = 0;
+ self_test_args.enable = 1;
+ if (!TEST_ptr(pkey = EVP_PKEY_Q_keygen(libctx, NULL, tst->curve_name))
+ || !TEST_int_ge(self_test_args.called, 3)
+ || !TEST_true(pkey_get_octet_bytes(pkey, OSSL_PKEY_PARAM_PRIV_KEY,
+ &priv, &priv_len))
+ || !TEST_true(pkey_get_octet_bytes(pkey, OSSL_PKEY_PARAM_PUB_KEY, &pub,
+ &pub_len)))
+ goto err;
+
+ test_output_memory("q", pub, pub_len);
+ test_output_memory("d", priv, priv_len);
+ ret = 1;
+err:
+ self_test_args.enable = 0;
+ self_test_args.called = 0;
+ OPENSSL_clear_free(priv, priv_len);
+ OPENSSL_free(pub);
+ EVP_PKEY_free(pkey);
+ return ret;
+}
+
+#endif /* OPENSSL_NO_ECX */
+
+#ifndef OPENSSL_NO_DSA
static EVP_PKEY *dsa_paramgen(int L, int N)
{
@@ -344,7 +528,7 @@ static EVP_PKEY *dsa_paramgen(int L, int N)
|| !TEST_true(EVP_PKEY_CTX_set_dsa_paramgen_bits(paramgen_ctx, L))
|| !TEST_true(EVP_PKEY_CTX_set_dsa_paramgen_q_bits(paramgen_ctx, N))
|| !TEST_true(EVP_PKEY_paramgen(paramgen_ctx, &param_key)))
- return NULL;
+ TEST_info("dsa_paramgen failed");
EVP_PKEY_CTX_free(paramgen_ctx);
return param_key;
}
@@ -375,6 +559,8 @@ static int dsa_keygen_test(int id)
size_t priv_len = 0, pub_len = 0;
const struct dsa_paramgen_st *tst = &dsa_keygen_data[id];
+ if (!dsasign_allowed)
+ return TEST_skip("DSA signing is not allowed");
if (!TEST_ptr(param_key = dsa_paramgen(tst->L, tst->N))
|| !TEST_ptr(keygen_ctx = EVP_PKEY_CTX_new_from_pkey(libctx, param_key,
NULL))
@@ -418,23 +604,31 @@ static int dsa_paramgen_test(int id)
if (!TEST_ptr(paramgen_ctx = EVP_PKEY_CTX_new_from_name(libctx, "DSA", NULL))
|| !TEST_int_gt(EVP_PKEY_paramgen_init(paramgen_ctx), 0)
|| !TEST_true(EVP_PKEY_CTX_set_dsa_paramgen_bits(paramgen_ctx, tst->L))
- || !TEST_true(EVP_PKEY_CTX_set_dsa_paramgen_q_bits(paramgen_ctx, tst->N))
- || !TEST_true(EVP_PKEY_paramgen(paramgen_ctx, &param_key))
- || !TEST_true(pkey_get_bn_bytes(param_key, OSSL_PKEY_PARAM_FFC_P,
- &p, &plen))
- || !TEST_true(pkey_get_bn_bytes(param_key, OSSL_PKEY_PARAM_FFC_Q,
- &q, &qlen))
- || !TEST_true(pkey_get_octet_bytes(param_key, OSSL_PKEY_PARAM_FFC_SEED,
- &seed, &seedlen))
- || !TEST_true(EVP_PKEY_get_int_param(param_key,
- OSSL_PKEY_PARAM_FFC_PCOUNTER,
- &counter)))
- goto err;
-
- test_output_memory("p", p, plen);
- test_output_memory("q", q, qlen);
- test_output_memory("domainSeed", seed, seedlen);
- test_printf_stderr("%s: %d\n", "counter", counter);
+ || !TEST_true(EVP_PKEY_CTX_set_dsa_paramgen_q_bits(paramgen_ctx,
+ tst->N)))
+ goto err;
+
+ if (!dsasign_allowed) {
+ if (!TEST_false(EVP_PKEY_paramgen(paramgen_ctx, &param_key)))
+ goto err;
+ } else {
+ if (!TEST_true(EVP_PKEY_paramgen(paramgen_ctx, &param_key))
+ || !TEST_true(pkey_get_bn_bytes(param_key, OSSL_PKEY_PARAM_FFC_P,
+ &p, &plen))
+ || !TEST_true(pkey_get_bn_bytes(param_key, OSSL_PKEY_PARAM_FFC_Q,
+ &q, &qlen))
+ || !TEST_true(pkey_get_octet_bytes(param_key,
+ OSSL_PKEY_PARAM_FFC_SEED,
+ &seed, &seedlen))
+ || !TEST_true(EVP_PKEY_get_int_param(param_key,
+ OSSL_PKEY_PARAM_FFC_PCOUNTER,
+ &counter)))
+ goto err;
+ test_output_memory("p", p, plen);
+ test_output_memory("q", q, qlen);
+ test_output_memory("domainSeed", seed, seedlen);
+ test_printf_stderr("%s: %d\n", "counter", counter);
+ }
ret = 1;
err:
OPENSSL_free(p);
@@ -594,15 +788,19 @@ static int dsa_siggen_test(int id)
size_t sig_len = 0, rlen = 0, slen = 0;
const struct dsa_siggen_st *tst = &dsa_siggen_data[id];
- if (!TEST_ptr(pkey = dsa_keygen(tst->L, tst->N)))
- goto err;
-
- if (!TEST_true(sig_gen(pkey, NULL, tst->digest_alg, tst->msg, tst->msg_len,
- &sig, &sig_len))
- || !TEST_true(get_dsa_sig_rs_bytes(sig, sig_len, &r, &s, &rlen, &slen)))
- goto err;
- test_output_memory("r", r, rlen);
- test_output_memory("s", s, slen);
+ if (!dsasign_allowed) {
+ if (!TEST_ptr_null(pkey = dsa_keygen(tst->L, tst->N)))
+ goto err;
+ } else {
+ if (!TEST_ptr(pkey = dsa_keygen(tst->L, tst->N)))
+ goto err;
+ if (!TEST_true(sig_gen(pkey, NULL, tst->digest_alg, tst->msg, tst->msg_len,
+ &sig, &sig_len))
+ || !TEST_true(get_dsa_sig_rs_bytes(sig, sig_len, &r, &s, &rlen, &slen)))
+ goto err;
+ test_output_memory("r", r, rlen);
+ test_output_memory("s", s, slen);
+ }
ret = 1;
err:
OPENSSL_free(r);
@@ -807,13 +1005,14 @@ static int aes_gcm_enc_dec(const char *alg,
const unsigned char *aad, size_t aad_len,
const unsigned char *ct, size_t ct_len,
const unsigned char *tag, size_t tag_len,
- int enc, int pass)
+ int enc, int pass,
+ unsigned char *out, int *out_len,
+ unsigned char *outiv)
{
int ret = 0;
EVP_CIPHER_CTX *ctx;
EVP_CIPHER *cipher = NULL;
- int out_len, len;
- unsigned char out[1024];
+ int olen, len;
TEST_note("%s : %s : expected to %s", alg, enc ? "encrypt" : "decrypt",
pass ? "pass" : "fail");
@@ -831,9 +1030,9 @@ static int aes_gcm_enc_dec(const char *alg,
goto err;
}
/*
- * For testing purposes the IV it being set here. In a compliant application
- * the IV would be generated internally. A fake entropy source could also
- * be used to feed in the random IV bytes (see fake_random.c)
+ * For testing purposes the IV may be passed in here. In a compliant
+ * application the IV would be generated internally. A fake entropy source
+ * could also be used to feed in the random IV bytes (see fake_random.c)
*/
if (!TEST_true(EVP_CipherInit_ex(ctx, NULL, NULL, key, iv, enc))
|| !TEST_true(EVP_CIPHER_CTX_set_padding(ctx, 0))
@@ -841,23 +1040,46 @@ static int aes_gcm_enc_dec(const char *alg,
|| !TEST_true(EVP_CipherUpdate(ctx, out, &len, pt, pt_len)))
goto err;
- if (!TEST_int_eq(EVP_CipherFinal_ex(ctx, out + len, &out_len), pass))
+ if (!TEST_int_eq(EVP_CipherFinal_ex(ctx, out + len, &olen), pass))
goto err;
if (!pass) {
ret = 1;
goto err;
}
- out_len += len;
+ olen += len;
if (enc) {
- if (!TEST_mem_eq(out, out_len, ct, ct_len)
- || !TEST_int_gt(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG,
- tag_len, out + out_len), 0)
- || !TEST_mem_eq(out + out_len, tag_len, tag, tag_len))
- goto err;
+ if ((ct != NULL && !TEST_mem_eq(out, olen, ct, ct_len))
+ || !TEST_int_gt(EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG,
+ tag_len, out + olen), 0)
+ || (tag != NULL
+ && !TEST_mem_eq(out + olen, tag_len, tag, tag_len)))
+ goto err;
} else {
- if (!TEST_mem_eq(out, out_len, ct, ct_len))
+ if (ct != NULL && !TEST_mem_eq(out, olen, ct, ct_len))
+ goto err;
+ }
+
+ {
+ OSSL_PARAM params[] = { OSSL_PARAM_END, OSSL_PARAM_END, OSSL_PARAM_END };
+ OSSL_PARAM *p = params;
+ unsigned int iv_generated = -1;
+ const OSSL_PARAM *gettables = EVP_CIPHER_CTX_gettable_params(ctx);
+ const char *ivgenkey = OSSL_CIPHER_PARAM_AEAD_IV_GENERATED;
+ int ivgen = (OSSL_PARAM_locate_const(gettables, ivgenkey) != NULL);
+
+ if (ivgen != 0)
+ *p++ = OSSL_PARAM_construct_uint(ivgenkey, &iv_generated);
+ if (outiv != NULL)
+ *p = OSSL_PARAM_construct_octet_string(OSSL_CIPHER_PARAM_IV,
+ outiv, iv_len);
+ if (!TEST_true(EVP_CIPHER_CTX_get_params(ctx, params)))
+ goto err;
+ if (ivgen != 0
+ && !TEST_uint_eq(iv_generated, (enc == 0 || iv != NULL ? 0 : 1)))
goto err;
}
+ if (out_len != NULL)
+ *out_len = olen;
ret = 1;
err:
@@ -871,23 +1093,45 @@ static int aes_gcm_enc_dec_test(int id)
const struct cipher_gcm_st *tst = &aes_gcm_enc_data[id];
int enc = 1;
int pass = 1;
+ unsigned char out[1024];
return aes_gcm_enc_dec(tst->alg, tst->pt, tst->pt_len,
tst->key, tst->key_len,
tst->iv, tst->iv_len, tst->aad, tst->aad_len,
tst->ct, tst->ct_len, tst->tag, tst->tag_len,
- enc, pass)
+ enc, pass, out, NULL, NULL)
&& aes_gcm_enc_dec(tst->alg, tst->ct, tst->ct_len,
tst->key, tst->key_len,
tst->iv, tst->iv_len, tst->aad, tst->aad_len,
tst->pt, tst->pt_len, tst->tag, tst->tag_len,
- !enc, pass)
+ !enc, pass, out, NULL, NULL)
/* Fail if incorrect tag passed to decrypt */
&& aes_gcm_enc_dec(tst->alg, tst->ct, tst->ct_len,
tst->key, tst->key_len,
tst->iv, tst->iv_len, tst->aad, tst->aad_len,
tst->pt, tst->pt_len, tst->aad, tst->tag_len,
- !enc, !pass);
+ !enc, !pass, out, NULL, NULL);
+}
+
+static int aes_gcm_gen_iv_internal_test(void)
+{
+ const struct cipher_gcm_st *tst = &aes_gcm_enc_data[0];
+ int enc = 1;
+ int pass = 1;
+ int out_len = 0;
+ unsigned char out[1024];
+ unsigned char iv[16];
+
+ return aes_gcm_enc_dec(tst->alg, tst->pt, tst->pt_len,
+ tst->key, tst->key_len,
+ NULL, tst->iv_len, tst->aad, tst->aad_len,
+ NULL, tst->ct_len, NULL, tst->tag_len,
+ enc, pass, out, &out_len, iv)
+ && aes_gcm_enc_dec(tst->alg, out, out_len,
+ tst->key, tst->key_len,
+ iv, tst->iv_len, tst->aad, tst->aad_len,
+ tst->pt, tst->pt_len, out + out_len, tst->tag_len,
+ !enc, pass, out, NULL, NULL);
}
#ifndef OPENSSL_NO_DH
@@ -1165,6 +1409,10 @@ static int rsa_siggen_test(int id)
const struct rsa_siggen_st *tst = &rsa_siggen_data[id];
int salt_len = tst->pss_salt_len;
+ if (!rsa_sign_x931_pad_allowed
+ && (strcmp(tst->sig_pad_mode, OSSL_PKEY_RSA_PAD_MODE_X931) == 0))
+ return TEST_skip("x931 signing is not allowed");
+
TEST_note("RSA %s signature generation", tst->sig_pad_mode);
p = params;
@@ -1178,11 +1426,11 @@ static int rsa_siggen_test(int id)
*p++ = OSSL_PARAM_construct_end();
if (!TEST_ptr(pkey = EVP_PKEY_Q_keygen(libctx, NULL, "RSA", tst->mod))
- || !TEST_true(pkey_get_bn_bytes(pkey, OSSL_PKEY_PARAM_RSA_N, &n, &n_len))
- || !TEST_true(pkey_get_bn_bytes(pkey, OSSL_PKEY_PARAM_RSA_E, &e, &e_len))
- || !TEST_true(sig_gen(pkey, params, tst->digest_alg,
- tst->msg, tst->msg_len,
- &sig, &sig_len)))
+ || !TEST_true(pkey_get_bn_bytes(pkey, OSSL_PKEY_PARAM_RSA_N, &n, &n_len))
+ || !TEST_true(pkey_get_bn_bytes(pkey, OSSL_PKEY_PARAM_RSA_E, &e, &e_len))
+ || !TEST_true(sig_gen(pkey, params, tst->digest_alg,
+ tst->msg, tst->msg_len,
+ &sig, &sig_len)))
goto err;
test_output_memory("n", n, n_len);
test_output_memory("e", e, e_len);
@@ -1218,7 +1466,7 @@ static int rsa_sigver_test(int id)
if (salt_len >= 0)
*p++ = OSSL_PARAM_construct_int(OSSL_SIGNATURE_PARAM_PSS_SALTLEN,
&salt_len);
- *p++ = OSSL_PARAM_construct_end();
+ *p = OSSL_PARAM_construct_end();
if (!TEST_ptr(bn_ctx = BN_CTX_new())
|| !TEST_true(rsa_create_pkey(&pkey, tst->n, tst->n_len,
@@ -1227,10 +1475,15 @@ static int rsa_sigver_test(int id)
|| !TEST_true(EVP_DigestVerifyInit_ex(md_ctx, &pkey_ctx,
tst->digest_alg, libctx, NULL,
pkey, NULL))
+ || !check_verify_message(pkey_ctx, 1)
|| !TEST_true(EVP_PKEY_CTX_set_params(pkey_ctx, params))
|| !TEST_int_eq(EVP_DigestVerify(md_ctx, tst->sig, tst->sig_len,
- tst->msg, tst->msg_len), tst->pass))
+ tst->msg, tst->msg_len), tst->pass)
+ || !check_verify_message(pkey_ctx, 1)
+ || !TEST_true(EVP_PKEY_verify_init(pkey_ctx))
+ || !check_verify_message(pkey_ctx, 0))
goto err;
+
ret = 1;
err:
EVP_PKEY_free(pkey);
@@ -1381,6 +1634,8 @@ static int drbg_test(int id)
res = 1;
err:
EVP_RAND_CTX_free(ctx);
+ /* Coverity is confused by the upref/free in EVP_RAND_CTX_new() subdue it */
+ /* coverity[pass_freed_arg] */
EVP_RAND_CTX_free(parent);
EVP_RAND_free(rand);
return res;
@@ -1462,7 +1717,11 @@ int setup_tests(void)
ADD_ALL_TESTS(cipher_enc_dec_test, OSSL_NELEM(cipher_enc_data));
ADD_ALL_TESTS(aes_ccm_enc_dec_test, OSSL_NELEM(aes_ccm_enc_data));
ADD_ALL_TESTS(aes_gcm_enc_dec_test, OSSL_NELEM(aes_gcm_enc_data));
+ if (fips_provider_version_ge(libctx, 3, 4, 0))
+ ADD_TEST(aes_gcm_gen_iv_internal_test);
+ pass_sig_gen_params = fips_provider_version_ge(libctx, 3, 4, 0);
+ rsa_sign_x931_pad_allowed = fips_provider_version_lt(libctx, 3, 4, 0);
ADD_ALL_TESTS(rsa_keygen_test, OSSL_NELEM(rsa_keygen_data));
ADD_ALL_TESTS(rsa_siggen_test, OSSL_NELEM(rsa_siggen_data));
ADD_ALL_TESTS(rsa_sigver_test, OSSL_NELEM(rsa_sigver_data));
@@ -1477,6 +1736,7 @@ int setup_tests(void)
#endif /* OPENSSL_NO_DH */
#ifndef OPENSSL_NO_DSA
+ dsasign_allowed = fips_provider_version_lt(libctx, 3, 4, 0);
ADD_ALL_TESTS(dsa_keygen_test, OSSL_NELEM(dsa_keygen_data));
ADD_ALL_TESTS(dsa_paramgen_test, OSSL_NELEM(dsa_paramgen_data));
ADD_ALL_TESTS(dsa_pqver_test, OSSL_NELEM(dsa_pqver_data));
@@ -1485,12 +1745,21 @@ int setup_tests(void)
#endif /* OPENSSL_NO_DSA */
#ifndef OPENSSL_NO_EC
+ ec_cofactors = fips_provider_version_ge(libctx, 3, 4, 0);
ADD_ALL_TESTS(ecdsa_keygen_test, OSSL_NELEM(ecdsa_keygen_data));
ADD_ALL_TESTS(ecdsa_pub_verify_test, OSSL_NELEM(ecdsa_pv_data));
ADD_ALL_TESTS(ecdsa_siggen_test, OSSL_NELEM(ecdsa_siggen_data));
ADD_ALL_TESTS(ecdsa_sigver_test, OSSL_NELEM(ecdsa_sigver_data));
+ ADD_ALL_TESTS(ecdh_cofactor_derive_test,
+ OSSL_NELEM(ecdh_cofactor_derive_data));
#endif /* OPENSSL_NO_EC */
+#ifndef OPENSSL_NO_ECX
+ if (fips_provider_version_ge(libctx, 3, 4, 0)) {
+ ADD_ALL_TESTS(eddsa_keygen_test, OSSL_NELEM(eddsa_pv_data));
+ ADD_ALL_TESTS(eddsa_pub_verify_test, OSSL_NELEM(eddsa_pv_data));
+ }
+#endif
ADD_ALL_TESTS(drbg_test, OSSL_NELEM(drbg_data));
return 1;
}