summaryrefslogtreecommitdiff
path: root/crypto/hash.h
blob: 93f6ba0df263e51e8b4c35927c2873cdb565c138 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Cryptographic API.
 *
 * Copyright (c) 2023 Herbert Xu <herbert@gondor.apana.org.au>
 */
#ifndef _LOCAL_CRYPTO_HASH_H
#define _LOCAL_CRYPTO_HASH_H

#include <crypto/internal/hash.h>
#include <linux/cryptouser.h>

#include "internal.h"

static inline struct crypto_istat_hash *hash_get_stat(
	struct hash_alg_common *alg)
{
#ifdef CONFIG_CRYPTO_STATS
	return &alg->stat;
#else
	return NULL;
#endif
}

static inline int crypto_hash_report_stat(struct sk_buff *skb,
					  struct crypto_alg *alg,
					  const char *type)
{
	struct hash_alg_common *halg = __crypto_hash_alg_common(alg);
	struct crypto_istat_hash *istat = hash_get_stat(halg);
	struct crypto_stat_hash rhash;

	memset(&rhash, 0, sizeof(rhash));

	strscpy(rhash.type, type, sizeof(rhash.type));

	rhash.stat_hash_cnt = atomic64_read(&istat->hash_cnt);
	rhash.stat_hash_tlen = atomic64_read(&istat->hash_tlen);
	rhash.stat_err_cnt = atomic64_read(&istat->err_cnt);

	return nla_put(skb, CRYPTOCFGA_STAT_HASH, sizeof(rhash), &rhash);
}

extern const struct crypto_type crypto_shash_type;

int hash_prepare_alg(struct hash_alg_common *alg);

#endif	/* _LOCAL_CRYPTO_HASH_H */