#include <openssl/params.h>
#include <openssl/core_names.h>
#include <openssl/fips_names.h>
+#include <openssl/thread.h>
#include "internal/numbers.h"
#include "internal/nelem.h"
#include "crypto/evp.h"
size_t output_len;
/* Padding type */
int pad_type;
+ /* XOF mode? */
+ int xof;
} DIGEST_DATA;
static int digest_test_init(EVP_TEST *t, const char *alg)
mdat->digest = digest;
mdat->fetched_digest = fetched_digest;
mdat->pad_type = 0;
+ mdat->xof = 0;
if (fetched_digest != NULL)
TEST_info("%s is fetched", alg);
return 1;
return evp_test_buffer_ncopy(value, mdata->input);
if (strcmp(keyword, "Padding") == 0)
return (mdata->pad_type = atoi(value)) > 0;
+ if (strcmp(keyword, "XOF") == 0)
+ return (mdata->xof = atoi(value)) > 0;
return 0;
}
unsigned int got_len;
size_t size = 0;
int xof = 0;
- OSSL_PARAM params[2];
+ OSSL_PARAM params[3], *p = ¶ms[0];
t->err = "TEST_FAILURE";
if (!TEST_ptr(mctx = EVP_MD_CTX_new()))
if (!TEST_ptr(got))
goto err;
- if (!EVP_DigestInit_ex(mctx, expected->digest, NULL)) {
+ if (expected->xof > 0) {
+ xof |= 1;
+ *p++ = OSSL_PARAM_construct_size_t(OSSL_DIGEST_PARAM_XOFLEN,
+ &expected->output_len);
+ }
+ if (expected->pad_type > 0)
+ *p++ = OSSL_PARAM_construct_int(OSSL_DIGEST_PARAM_PAD_TYPE,
+ &expected->pad_type);
+ *p++ = OSSL_PARAM_construct_end();
+
+ if (!EVP_DigestInit_ex2(mctx, expected->digest, params)) {
t->err = "DIGESTINIT_ERROR";
goto err;
}
- if (expected->pad_type > 0) {
- params[0] = OSSL_PARAM_construct_int(OSSL_DIGEST_PARAM_PAD_TYPE,
- &expected->pad_type);
- params[1] = OSSL_PARAM_construct_end();
- if (!TEST_int_gt(EVP_MD_CTX_set_params(mctx, params), 0)) {
- t->err = "PARAMS_ERROR";
- goto err;
- }
- }
+
if (!evp_test_buffer_do(expected->input, digest_update_fn, mctx)) {
t->err = "DIGESTUPDATE_ERROR";
goto err;
}
- xof = (EVP_MD_get_flags(expected->digest) & EVP_MD_FLAG_XOF) != 0;
+ xof |= (EVP_MD_get_flags(expected->digest) & EVP_MD_FLAG_XOF) != 0;
if (xof) {
EVP_MD_CTX *mctx_cpy;
goto end;
}
+ if (strcmp(name, "lanes") == 0
+ && OSSL_PARAM_locate_const(defs, name) == NULL) {
+ TEST_info("skipping, setting 'lanes' is unsupported");
+ t->skip = 1;
+ goto end;
+ }
+
+ if (strcmp(name, "iter") == 0
+ && OSSL_PARAM_locate_const(defs, name) == NULL) {
+ TEST_info("skipping, setting 'iter' is unsupported");
+ t->skip = 1;
+ goto end;
+ }
+
+ if (strcmp(name, "memcost") == 0
+ && OSSL_PARAM_locate_const(defs, name) == NULL) {
+ TEST_info("skipping, setting 'memcost' is unsupported");
+ t->skip = 1;
+ goto end;
+ }
+
+ if (strcmp(name, "secret") == 0
+ && OSSL_PARAM_locate_const(defs, name) == NULL) {
+ TEST_info("skipping, setting 'secret' is unsupported");
+ t->skip = 1;
+ goto end;
+ }
+
+ if (strcmp(name, "pass") == 0
+ && OSSL_PARAM_locate_const(defs, name) == NULL) {
+ TEST_info("skipping, setting 'pass' is unsupported");
+ t->skip = 1;
+ goto end;
+ }
+
+ if (strcmp(name, "ad") == 0
+ && OSSL_PARAM_locate_const(defs, name) == NULL) {
+ TEST_info("skipping, setting 'ad' is unsupported");
+ t->skip = 1;
+ goto end;
+ }
+
rv = OSSL_PARAM_allocate_from_text(kdata->p, defs, name, p,
p != NULL ? strlen(p) : 0, NULL);
*++kdata->p = OSSL_PARAM_construct_end();
params[1] = OSSL_PARAM_construct_end();
if (!EVP_PKEY_CTX_set_params(mdata->pctx, params))
t->err = "EVP_PKEY_CTX_set_params_ERROR";
+ else if (!EVP_PKEY_CTX_get_params(mdata->pctx, params))
+ t->err = "EVP_PKEY_CTX_get_params_ERROR";
+ else if (!OSSL_PARAM_modified(¶ms[0]))
+ t->err = "nonce_type_not_modified_ERROR";
+ else if (nonce_type != 1)
+ t->err = "nonce_type_value_ERROR";
}
return 1;
}
t->err = NULL;
t->skip = 0;
t->meth = NULL;
+
+#if !defined(OPENSSL_NO_DEFAULT_THREAD_POOL)
+ OSSL_set_max_threads(libctx, 0);
+#endif
}
/* Check for errors in the test structure; return 1 if okay, else 0. */
return 0;
}
t->reason = take_value(pp);
+ } else if (strcmp(pp->key, "Threads") == 0) {
+ if (OSSL_set_max_threads(libctx, atoi(pp->value)) == 0) {
+ TEST_info("skipping, '%s' threads not available: %s:%d",
+ pp->value, t->s.test_file, t->s.start);
+ t->skip = 1;
+ }
} else {
/* Must be test specific line: try to parse it */
int rv = t->meth->parse(t, pp->key, pp->value);
#ifdef OPENSSL_NO_SCRYPT
if (HAS_CASE_SUFFIX(name, "SCRYPT"))
return 1;
+#endif
+#ifdef OPENSSL_NO_ARGON2
+ if (HAS_CASE_SUFFIX(name, "ARGON2"))
+ return 1;
#endif
return 0;
}