162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Cryptographic API.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
662306a36Sopenharmony_ci * Copyright (c) 2005 Herbert Xu <herbert@gondor.apana.org.au>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci#ifndef _CRYPTO_INTERNAL_H
962306a36Sopenharmony_ci#define _CRYPTO_INTERNAL_H
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <crypto/algapi.h>
1262306a36Sopenharmony_ci#include <linux/completion.h>
1362306a36Sopenharmony_ci#include <linux/err.h>
1462306a36Sopenharmony_ci#include <linux/jump_label.h>
1562306a36Sopenharmony_ci#include <linux/list.h>
1662306a36Sopenharmony_ci#include <linux/module.h>
1762306a36Sopenharmony_ci#include <linux/notifier.h>
1862306a36Sopenharmony_ci#include <linux/numa.h>
1962306a36Sopenharmony_ci#include <linux/refcount.h>
2062306a36Sopenharmony_ci#include <linux/rwsem.h>
2162306a36Sopenharmony_ci#include <linux/scatterlist.h>
2262306a36Sopenharmony_ci#include <linux/sched.h>
2362306a36Sopenharmony_ci#include <linux/types.h>
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cistruct akcipher_request;
2662306a36Sopenharmony_cistruct crypto_akcipher;
2762306a36Sopenharmony_cistruct crypto_instance;
2862306a36Sopenharmony_cistruct crypto_template;
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_cistruct crypto_larval {
3162306a36Sopenharmony_ci	struct crypto_alg alg;
3262306a36Sopenharmony_ci	struct crypto_alg *adult;
3362306a36Sopenharmony_ci	struct completion completion;
3462306a36Sopenharmony_ci	u32 mask;
3562306a36Sopenharmony_ci	bool test_started;
3662306a36Sopenharmony_ci};
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cistruct crypto_akcipher_sync_data {
3962306a36Sopenharmony_ci	struct crypto_akcipher *tfm;
4062306a36Sopenharmony_ci	const void *src;
4162306a36Sopenharmony_ci	void *dst;
4262306a36Sopenharmony_ci	unsigned int slen;
4362306a36Sopenharmony_ci	unsigned int dlen;
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	struct akcipher_request *req;
4662306a36Sopenharmony_ci	struct crypto_wait cwait;
4762306a36Sopenharmony_ci	struct scatterlist sg;
4862306a36Sopenharmony_ci	u8 *buf;
4962306a36Sopenharmony_ci};
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cienum {
5262306a36Sopenharmony_ci	CRYPTOA_UNSPEC,
5362306a36Sopenharmony_ci	CRYPTOA_ALG,
5462306a36Sopenharmony_ci	CRYPTOA_TYPE,
5562306a36Sopenharmony_ci	__CRYPTOA_MAX,
5662306a36Sopenharmony_ci};
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci#define CRYPTOA_MAX (__CRYPTOA_MAX - 1)
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci/* Maximum number of (rtattr) parameters for each template. */
6162306a36Sopenharmony_ci#define CRYPTO_MAX_ATTRS 32
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ciextern struct list_head crypto_alg_list;
6462306a36Sopenharmony_ciextern struct rw_semaphore crypto_alg_sem;
6562306a36Sopenharmony_ciextern struct blocking_notifier_head crypto_chain;
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ciint alg_test(const char *driver, const char *alg, u32 type, u32 mask);
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci#ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTS
7062306a36Sopenharmony_cistatic inline bool crypto_boot_test_finished(void)
7162306a36Sopenharmony_ci{
7262306a36Sopenharmony_ci	return true;
7362306a36Sopenharmony_ci}
7462306a36Sopenharmony_cistatic inline void set_crypto_boot_test_finished(void)
7562306a36Sopenharmony_ci{
7662306a36Sopenharmony_ci}
7762306a36Sopenharmony_ci#else
7862306a36Sopenharmony_ciDECLARE_STATIC_KEY_FALSE(__crypto_boot_test_finished);
7962306a36Sopenharmony_cistatic inline bool crypto_boot_test_finished(void)
8062306a36Sopenharmony_ci{
8162306a36Sopenharmony_ci	return static_branch_likely(&__crypto_boot_test_finished);
8262306a36Sopenharmony_ci}
8362306a36Sopenharmony_cistatic inline void set_crypto_boot_test_finished(void)
8462306a36Sopenharmony_ci{
8562306a36Sopenharmony_ci	static_branch_enable(&__crypto_boot_test_finished);
8662306a36Sopenharmony_ci}
8762306a36Sopenharmony_ci#endif /* !CONFIG_CRYPTO_MANAGER_DISABLE_TESTS */
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci#ifdef CONFIG_PROC_FS
9062306a36Sopenharmony_civoid __init crypto_init_proc(void);
9162306a36Sopenharmony_civoid __exit crypto_exit_proc(void);
9262306a36Sopenharmony_ci#else
9362306a36Sopenharmony_cistatic inline void crypto_init_proc(void)
9462306a36Sopenharmony_ci{ }
9562306a36Sopenharmony_cistatic inline void crypto_exit_proc(void)
9662306a36Sopenharmony_ci{ }
9762306a36Sopenharmony_ci#endif
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_cistatic inline unsigned int crypto_cipher_ctxsize(struct crypto_alg *alg)
10062306a36Sopenharmony_ci{
10162306a36Sopenharmony_ci	return alg->cra_ctxsize;
10262306a36Sopenharmony_ci}
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_cistatic inline unsigned int crypto_compress_ctxsize(struct crypto_alg *alg)
10562306a36Sopenharmony_ci{
10662306a36Sopenharmony_ci	return alg->cra_ctxsize;
10762306a36Sopenharmony_ci}
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_cistruct crypto_alg *crypto_mod_get(struct crypto_alg *alg);
11062306a36Sopenharmony_cistruct crypto_alg *crypto_alg_mod_lookup(const char *name, u32 type, u32 mask);
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_cistruct crypto_larval *crypto_larval_alloc(const char *name, u32 type, u32 mask);
11362306a36Sopenharmony_civoid crypto_larval_kill(struct crypto_alg *alg);
11462306a36Sopenharmony_civoid crypto_wait_for_test(struct crypto_larval *larval);
11562306a36Sopenharmony_civoid crypto_alg_tested(const char *name, int err);
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_civoid crypto_remove_spawns(struct crypto_alg *alg, struct list_head *list,
11862306a36Sopenharmony_ci			  struct crypto_alg *nalg);
11962306a36Sopenharmony_civoid crypto_remove_final(struct list_head *list);
12062306a36Sopenharmony_civoid crypto_shoot_alg(struct crypto_alg *alg);
12162306a36Sopenharmony_cistruct crypto_tfm *__crypto_alloc_tfmgfp(struct crypto_alg *alg, u32 type,
12262306a36Sopenharmony_ci					 u32 mask, gfp_t gfp);
12362306a36Sopenharmony_cistruct crypto_tfm *__crypto_alloc_tfm(struct crypto_alg *alg, u32 type,
12462306a36Sopenharmony_ci				      u32 mask);
12562306a36Sopenharmony_civoid *crypto_create_tfm_node(struct crypto_alg *alg,
12662306a36Sopenharmony_ci			const struct crypto_type *frontend, int node);
12762306a36Sopenharmony_civoid *crypto_clone_tfm(const struct crypto_type *frontend,
12862306a36Sopenharmony_ci		       struct crypto_tfm *otfm);
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ciint crypto_akcipher_sync_prep(struct crypto_akcipher_sync_data *data);
13162306a36Sopenharmony_ciint crypto_akcipher_sync_post(struct crypto_akcipher_sync_data *data, int err);
13262306a36Sopenharmony_ciint crypto_init_akcipher_ops_sig(struct crypto_tfm *tfm);
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_cistatic inline void *crypto_create_tfm(struct crypto_alg *alg,
13562306a36Sopenharmony_ci			const struct crypto_type *frontend)
13662306a36Sopenharmony_ci{
13762306a36Sopenharmony_ci	return crypto_create_tfm_node(alg, frontend, NUMA_NO_NODE);
13862306a36Sopenharmony_ci}
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_cistruct crypto_alg *crypto_find_alg(const char *alg_name,
14162306a36Sopenharmony_ci				   const struct crypto_type *frontend,
14262306a36Sopenharmony_ci				   u32 type, u32 mask);
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_civoid *crypto_alloc_tfm_node(const char *alg_name,
14562306a36Sopenharmony_ci		       const struct crypto_type *frontend, u32 type, u32 mask,
14662306a36Sopenharmony_ci		       int node);
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_cistatic inline void *crypto_alloc_tfm(const char *alg_name,
14962306a36Sopenharmony_ci		       const struct crypto_type *frontend, u32 type, u32 mask)
15062306a36Sopenharmony_ci{
15162306a36Sopenharmony_ci	return crypto_alloc_tfm_node(alg_name, frontend, type, mask, NUMA_NO_NODE);
15262306a36Sopenharmony_ci}
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ciint crypto_probing_notify(unsigned long val, void *v);
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_ciunsigned int crypto_alg_extsize(struct crypto_alg *alg);
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ciint crypto_type_has_alg(const char *name, const struct crypto_type *frontend,
15962306a36Sopenharmony_ci			u32 type, u32 mask);
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_cistatic inline struct crypto_alg *crypto_alg_get(struct crypto_alg *alg)
16262306a36Sopenharmony_ci{
16362306a36Sopenharmony_ci	refcount_inc(&alg->cra_refcnt);
16462306a36Sopenharmony_ci	return alg;
16562306a36Sopenharmony_ci}
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_cistatic inline void crypto_alg_put(struct crypto_alg *alg)
16862306a36Sopenharmony_ci{
16962306a36Sopenharmony_ci	if (refcount_dec_and_test(&alg->cra_refcnt) && alg->cra_destroy)
17062306a36Sopenharmony_ci		alg->cra_destroy(alg);
17162306a36Sopenharmony_ci}
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_cistatic inline int crypto_tmpl_get(struct crypto_template *tmpl)
17462306a36Sopenharmony_ci{
17562306a36Sopenharmony_ci	return try_module_get(tmpl->module);
17662306a36Sopenharmony_ci}
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_cistatic inline void crypto_tmpl_put(struct crypto_template *tmpl)
17962306a36Sopenharmony_ci{
18062306a36Sopenharmony_ci	module_put(tmpl->module);
18162306a36Sopenharmony_ci}
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_cistatic inline int crypto_is_larval(struct crypto_alg *alg)
18462306a36Sopenharmony_ci{
18562306a36Sopenharmony_ci	return alg->cra_flags & CRYPTO_ALG_LARVAL;
18662306a36Sopenharmony_ci}
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_cistatic inline int crypto_is_dead(struct crypto_alg *alg)
18962306a36Sopenharmony_ci{
19062306a36Sopenharmony_ci	return alg->cra_flags & CRYPTO_ALG_DEAD;
19162306a36Sopenharmony_ci}
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_cistatic inline int crypto_is_moribund(struct crypto_alg *alg)
19462306a36Sopenharmony_ci{
19562306a36Sopenharmony_ci	return alg->cra_flags & (CRYPTO_ALG_DEAD | CRYPTO_ALG_DYING);
19662306a36Sopenharmony_ci}
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_cistatic inline void crypto_notify(unsigned long val, void *v)
19962306a36Sopenharmony_ci{
20062306a36Sopenharmony_ci	blocking_notifier_call_chain(&crypto_chain, val, v);
20162306a36Sopenharmony_ci}
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_cistatic inline void crypto_yield(u32 flags)
20462306a36Sopenharmony_ci{
20562306a36Sopenharmony_ci	if (flags & CRYPTO_TFM_REQ_MAY_SLEEP)
20662306a36Sopenharmony_ci		cond_resched();
20762306a36Sopenharmony_ci}
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_cistatic inline int crypto_is_test_larval(struct crypto_larval *larval)
21062306a36Sopenharmony_ci{
21162306a36Sopenharmony_ci	return larval->alg.cra_driver_name[0];
21262306a36Sopenharmony_ci}
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_cistatic inline struct crypto_tfm *crypto_tfm_get(struct crypto_tfm *tfm)
21562306a36Sopenharmony_ci{
21662306a36Sopenharmony_ci	return refcount_inc_not_zero(&tfm->refcnt) ? tfm : ERR_PTR(-EOVERFLOW);
21762306a36Sopenharmony_ci}
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_ci#endif	/* _CRYPTO_INTERNAL_H */
22062306a36Sopenharmony_ci
221