]> git.ipfire.org Git - thirdparty/openssl.git/blobdiff - test/evp_test.c
providers: add Argon2 KDF
[thirdparty/openssl.git] / test / evp_test.c
index 44bba48fd27b2bb0b31f9765326580ef849f3f0f..b783ab7ddfd2a98a09122eebdb9d6d2742c4cc62 100644 (file)
@@ -22,6 +22,7 @@
 #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"
@@ -335,6 +336,8 @@ typedef struct digest_data_st {
     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)
@@ -358,6 +361,7 @@ 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;
@@ -387,6 +391,8 @@ static int digest_test_parse(EVP_TEST *t,
         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;
 }
 
@@ -424,7 +430,7 @@ static int digest_test_run(EVP_TEST *t)
     unsigned int got_len;
     size_t size = 0;
     int xof = 0;
-    OSSL_PARAM params[2];
+    OSSL_PARAM params[3], *p = &params[0];
 
     t->err = "TEST_FAILURE";
     if (!TEST_ptr(mctx = EVP_MD_CTX_new()))
@@ -435,25 +441,27 @@ static int digest_test_run(EVP_TEST *t)
     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;
 
@@ -2777,6 +2785,48 @@ static int kdf_test_ctrl(EVP_TEST *t, EVP_KDF_CTX *kctx,
         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();
@@ -3341,6 +3391,12 @@ static int digestsigver_test_parse(EVP_TEST *t,
             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(&params[0]))
+                t->err = "nonce_type_not_modified_ERROR";
+            else if (nonce_type != 1)
+                t->err = "nonce_type_value_ERROR";
         }
         return 1;
     }
@@ -3557,6 +3613,10 @@ static void clear_test(EVP_TEST *t)
     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. */
@@ -3942,6 +4002,12 @@ start:
                 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);
@@ -4132,6 +4198,10 @@ static int is_kdf_disabled(const char *name)
 #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;
 }