···1717 */18181919#include <crypto/aead.h>2020-#include <crypto/hash.h>2020+#include <crypto/acompress.h>2121+#include <crypto/akcipher.h>2222+#include <crypto/drbg.h>2323+#include <crypto/internal/cipher.h>2424+#include <crypto/internal/hash.h>2525+#include <crypto/internal/simd.h>2626+#include <crypto/kpp.h>2727+#include <crypto/rng.h>2828+#include <crypto/sig.h>2129#include <crypto/skcipher.h>2230#include <linux/err.h>2331#include <linux/fips.h>3232+#include <linux/kernel.h>2433#include <linux/module.h>2534#include <linux/once.h>2635#include <linux/prandom.h>···3728#include <linux/slab.h>3829#include <linux/string.h>3930#include <linux/uio.h>4040-#include <crypto/rng.h>4141-#include <crypto/drbg.h>4242-#include <crypto/akcipher.h>4343-#include <crypto/kpp.h>4444-#include <crypto/acompress.h>4545-#include <crypto/sig.h>4646-#include <crypto/internal/cipher.h>4747-#include <crypto/internal/simd.h>48314932#include "internal.h"5033···14651464 return 0;14661465}1467146614671467+static int check_ahash_export(struct ahash_request *req,14681468+ const struct hash_testvec *vec,14691469+ const char *vec_name,14701470+ const struct testvec_config *cfg,14711471+ const char *driver, u8 *hashstate)14721472+{14731473+ struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);14741474+ const unsigned int digestsize = crypto_ahash_digestsize(tfm);14751475+ HASH_FBREQ_ON_STACK(fbreq, req);14761476+ int err;14771477+14781478+ if (!vec->state)14791479+ return 0;14801480+14811481+ err = crypto_ahash_export(req, hashstate);14821482+ if (err) {14831483+ pr_err("alg: ahash: %s mixed export() failed with err %d on test vector %s, cfg=\"%s\"\n",14841484+ driver, err, vec_name, cfg->name);14851485+ return err;14861486+ }14871487+ err = crypto_ahash_import(req, vec->state);14881488+ if (err) {14891489+ pr_err("alg: ahash: %s mixed import() failed with err %d on test vector %s, cfg=\"%s\"\n",14901490+ driver, err, vec_name, cfg->name);14911491+ return err;14921492+ }14931493+ err = crypto_ahash_import(fbreq, hashstate);14941494+ if (err) {14951495+ pr_err("alg: ahash: %s fallback import() failed with err %d on test vector %s, cfg=\"%s\"\n",14961496+ crypto_ahash_driver_name(crypto_ahash_reqtfm(fbreq)), err, vec_name, cfg->name);14971497+ return err;14981498+ }14991499+ ahash_request_set_crypt(fbreq, NULL, hashstate, 0);15001500+ testmgr_poison(hashstate, digestsize + TESTMGR_POISON_LEN);15011501+ err = crypto_ahash_final(fbreq);15021502+ if (err) {15031503+ pr_err("alg: ahash: %s fallback final() failed with err %d on test vector %s, cfg=\"%s\"\n",15041504+ crypto_ahash_driver_name(crypto_ahash_reqtfm(fbreq)), err, vec_name, cfg->name);15051505+ return err;15061506+ }15071507+ return check_hash_result("ahash export", hashstate, digestsize, vec, vec_name, driver, cfg);15081508+}15091509+14681510/* Test one hash test vector in one configuration, using the ahash API */14691511static int test_ahash_vec_cfg(const struct hash_testvec *vec,14701512 const char *vec_name,···16531609 driver, vec_name, cfg);16541610 if (err)16551611 return err;16121612+ err = check_ahash_export(req, vec, vec_name, cfg,16131613+ driver, hashstate);16141614+ if (err)16151615+ return err;16561616 err = do_ahash_op(crypto_ahash_final, req, &wait, cfg->nosimd);16571617 if (err) {16581618 pr_err("alg: ahash: %s final() failed with err %d on test vector %s, cfg=\"%s\"\n",···17801732 vec->digest_error = crypto_hash_digest(17811733 crypto_ahash_reqtfm(req), vec->plaintext,17821734 vec->psize, (u8 *)vec->digest);17351735+17361736+ if (vec->digest_error || !vec->state)17371737+ goto done;17381738+17391739+ ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP, NULL, NULL);17401740+ ahash_request_set_virt(req, vec->plaintext, (u8 *)vec->digest,17411741+ vec->psize);17421742+ crypto_ahash_init(req);17431743+ crypto_ahash_update(req);17441744+ crypto_ahash_export(req, (u8 *)vec->state);17451745+17831746done:17841747 snprintf(name, max_namelen, "\"random: psize=%u ksize=%u\"",17851748 vec->psize, vec->ksize);···18091750{18101751 struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);18111752 const unsigned int digestsize = crypto_ahash_digestsize(tfm);17531753+ const unsigned int statesize = crypto_ahash_statesize(tfm);18121754 const unsigned int blocksize = crypto_ahash_blocksize(tfm);18131755 const unsigned int maxdatasize = (2 * PAGE_SIZE) - TESTMGR_POISON_LEN;18141756 const char *algname = crypto_hash_alg_common(tfm)->base.cra_name;···18821822 goto out;18831823 }1884182418251825+ if (crypto_hash_no_export_core(tfm) ||18261826+ crypto_hash_no_export_core(generic_tfm))18271827+ ;18281828+ else if (statesize != crypto_ahash_statesize(generic_tfm)) {18291829+ pr_err("alg: hash: statesize for %s (%u) doesn't match generic impl (%u)\n",18301830+ driver, statesize,18311831+ crypto_ahash_statesize(generic_tfm));18321832+ err = -EINVAL;18331833+ goto out;18341834+ } else {18351835+ vec.state = kmalloc(statesize, GFP_KERNEL);18361836+ err = -ENOMEM;18371837+ if (!vec.state)18381838+ goto out;18391839+ }18401840+18851841 /*18861842 * Now generate test vectors using the generic implementation, and test18871843 * the other implementation against them.···19301854 kfree(vec.key);19311855 kfree(vec.plaintext);19321856 kfree(vec.digest);18571857+ kfree(vec.state);19331858 ahash_request_free(generic_req);19341859 crypto_free_ahash(generic_tfm);19351860 return err;
+2
crypto/testmgr.h
···2929 * hash_testvec: structure to describe a hash (message digest) test3030 * @key: Pointer to key (NULL if none)3131 * @plaintext: Pointer to source data3232+ * @state: Pointer to expected state3233 * @digest: Pointer to expected digest3334 * @psize: Length of source data in bytes3435 * @ksize: Length of @key in bytes (0 if no key)···4039struct hash_testvec {4140 const char *key;4241 const char *plaintext;4242+ const char *state;4343 const char *digest;4444 unsigned int psize;4545 unsigned short ksize;