cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

algapi.h (7563B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/*
      3 * Cryptographic API for algorithms (i.e., low-level API).
      4 *
      5 * Copyright (c) 2006 Herbert Xu <herbert@gondor.apana.org.au>
      6 */
      7#ifndef _CRYPTO_ALGAPI_H
      8#define _CRYPTO_ALGAPI_H
      9
     10#include <linux/align.h>
     11#include <linux/crypto.h>
     12#include <linux/kconfig.h>
     13#include <linux/list.h>
     14#include <linux/types.h>
     15
     16#include <asm/unaligned.h>
     17
     18/*
     19 * Maximum values for blocksize and alignmask, used to allocate
     20 * static buffers that are big enough for any combination of
     21 * algs and architectures. Ciphers have a lower maximum size.
     22 */
     23#define MAX_ALGAPI_BLOCKSIZE		160
     24#define MAX_ALGAPI_ALIGNMASK		63
     25#define MAX_CIPHER_BLOCKSIZE		16
     26#define MAX_CIPHER_ALIGNMASK		15
     27
     28struct crypto_aead;
     29struct crypto_instance;
     30struct module;
     31struct notifier_block;
     32struct rtattr;
     33struct seq_file;
     34struct sk_buff;
     35
     36struct crypto_type {
     37	unsigned int (*ctxsize)(struct crypto_alg *alg, u32 type, u32 mask);
     38	unsigned int (*extsize)(struct crypto_alg *alg);
     39	int (*init)(struct crypto_tfm *tfm, u32 type, u32 mask);
     40	int (*init_tfm)(struct crypto_tfm *tfm);
     41	void (*show)(struct seq_file *m, struct crypto_alg *alg);
     42	int (*report)(struct sk_buff *skb, struct crypto_alg *alg);
     43	void (*free)(struct crypto_instance *inst);
     44
     45	unsigned int type;
     46	unsigned int maskclear;
     47	unsigned int maskset;
     48	unsigned int tfmsize;
     49};
     50
     51struct crypto_instance {
     52	struct crypto_alg alg;
     53
     54	struct crypto_template *tmpl;
     55
     56	union {
     57		/* Node in list of instances after registration. */
     58		struct hlist_node list;
     59		/* List of attached spawns before registration. */
     60		struct crypto_spawn *spawns;
     61	};
     62
     63	void *__ctx[] CRYPTO_MINALIGN_ATTR;
     64};
     65
     66struct crypto_template {
     67	struct list_head list;
     68	struct hlist_head instances;
     69	struct module *module;
     70
     71	int (*create)(struct crypto_template *tmpl, struct rtattr **tb);
     72
     73	char name[CRYPTO_MAX_ALG_NAME];
     74};
     75
     76struct crypto_spawn {
     77	struct list_head list;
     78	struct crypto_alg *alg;
     79	union {
     80		/* Back pointer to instance after registration.*/
     81		struct crypto_instance *inst;
     82		/* Spawn list pointer prior to registration. */
     83		struct crypto_spawn *next;
     84	};
     85	const struct crypto_type *frontend;
     86	u32 mask;
     87	bool dead;
     88	bool registered;
     89};
     90
     91struct crypto_queue {
     92	struct list_head list;
     93	struct list_head *backlog;
     94
     95	unsigned int qlen;
     96	unsigned int max_qlen;
     97};
     98
     99struct scatter_walk {
    100	struct scatterlist *sg;
    101	unsigned int offset;
    102};
    103
    104struct crypto_attr_alg {
    105	char name[CRYPTO_MAX_ALG_NAME];
    106};
    107
    108struct crypto_attr_type {
    109	u32 type;
    110	u32 mask;
    111};
    112
    113void crypto_mod_put(struct crypto_alg *alg);
    114
    115int crypto_register_template(struct crypto_template *tmpl);
    116int crypto_register_templates(struct crypto_template *tmpls, int count);
    117void crypto_unregister_template(struct crypto_template *tmpl);
    118void crypto_unregister_templates(struct crypto_template *tmpls, int count);
    119struct crypto_template *crypto_lookup_template(const char *name);
    120
    121int crypto_register_instance(struct crypto_template *tmpl,
    122			     struct crypto_instance *inst);
    123void crypto_unregister_instance(struct crypto_instance *inst);
    124
    125int crypto_grab_spawn(struct crypto_spawn *spawn, struct crypto_instance *inst,
    126		      const char *name, u32 type, u32 mask);
    127void crypto_drop_spawn(struct crypto_spawn *spawn);
    128struct crypto_tfm *crypto_spawn_tfm(struct crypto_spawn *spawn, u32 type,
    129				    u32 mask);
    130void *crypto_spawn_tfm2(struct crypto_spawn *spawn);
    131
    132struct crypto_attr_type *crypto_get_attr_type(struct rtattr **tb);
    133int crypto_check_attr_type(struct rtattr **tb, u32 type, u32 *mask_ret);
    134const char *crypto_attr_alg_name(struct rtattr *rta);
    135int crypto_inst_setname(struct crypto_instance *inst, const char *name,
    136			struct crypto_alg *alg);
    137
    138void crypto_init_queue(struct crypto_queue *queue, unsigned int max_qlen);
    139int crypto_enqueue_request(struct crypto_queue *queue,
    140			   struct crypto_async_request *request);
    141void crypto_enqueue_request_head(struct crypto_queue *queue,
    142				 struct crypto_async_request *request);
    143struct crypto_async_request *crypto_dequeue_request(struct crypto_queue *queue);
    144static inline unsigned int crypto_queue_len(struct crypto_queue *queue)
    145{
    146	return queue->qlen;
    147}
    148
    149void crypto_inc(u8 *a, unsigned int size);
    150void __crypto_xor(u8 *dst, const u8 *src1, const u8 *src2, unsigned int size);
    151
    152static inline void crypto_xor(u8 *dst, const u8 *src, unsigned int size)
    153{
    154	if (IS_ENABLED(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) &&
    155	    __builtin_constant_p(size) &&
    156	    (size % sizeof(unsigned long)) == 0) {
    157		unsigned long *d = (unsigned long *)dst;
    158		unsigned long *s = (unsigned long *)src;
    159		unsigned long l;
    160
    161		while (size > 0) {
    162			l = get_unaligned(d) ^ get_unaligned(s++);
    163			put_unaligned(l, d++);
    164			size -= sizeof(unsigned long);
    165		}
    166	} else {
    167		__crypto_xor(dst, dst, src, size);
    168	}
    169}
    170
    171static inline void crypto_xor_cpy(u8 *dst, const u8 *src1, const u8 *src2,
    172				  unsigned int size)
    173{
    174	if (IS_ENABLED(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) &&
    175	    __builtin_constant_p(size) &&
    176	    (size % sizeof(unsigned long)) == 0) {
    177		unsigned long *d = (unsigned long *)dst;
    178		unsigned long *s1 = (unsigned long *)src1;
    179		unsigned long *s2 = (unsigned long *)src2;
    180		unsigned long l;
    181
    182		while (size > 0) {
    183			l = get_unaligned(s1++) ^ get_unaligned(s2++);
    184			put_unaligned(l, d++);
    185			size -= sizeof(unsigned long);
    186		}
    187	} else {
    188		__crypto_xor(dst, src1, src2, size);
    189	}
    190}
    191
    192static inline void *crypto_tfm_ctx_aligned(struct crypto_tfm *tfm)
    193{
    194	return PTR_ALIGN(crypto_tfm_ctx(tfm),
    195			 crypto_tfm_alg_alignmask(tfm) + 1);
    196}
    197
    198static inline struct crypto_instance *crypto_tfm_alg_instance(
    199	struct crypto_tfm *tfm)
    200{
    201	return container_of(tfm->__crt_alg, struct crypto_instance, alg);
    202}
    203
    204static inline void *crypto_instance_ctx(struct crypto_instance *inst)
    205{
    206	return inst->__ctx;
    207}
    208
    209static inline struct crypto_async_request *crypto_get_backlog(
    210	struct crypto_queue *queue)
    211{
    212	return queue->backlog == &queue->list ? NULL :
    213	       container_of(queue->backlog, struct crypto_async_request, list);
    214}
    215
    216static inline u32 crypto_requires_off(struct crypto_attr_type *algt, u32 off)
    217{
    218	return (algt->type ^ off) & algt->mask & off;
    219}
    220
    221/*
    222 * When an algorithm uses another algorithm (e.g., if it's an instance of a
    223 * template), these are the flags that should always be set on the "outer"
    224 * algorithm if any "inner" algorithm has them set.
    225 */
    226#define CRYPTO_ALG_INHERITED_FLAGS	\
    227	(CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK |	\
    228	 CRYPTO_ALG_ALLOCATES_MEMORY)
    229
    230/*
    231 * Given the type and mask that specify the flags restrictions on a template
    232 * instance being created, return the mask that should be passed to
    233 * crypto_grab_*() (along with type=0) to honor any request the user made to
    234 * have any of the CRYPTO_ALG_INHERITED_FLAGS clear.
    235 */
    236static inline u32 crypto_algt_inherited_mask(struct crypto_attr_type *algt)
    237{
    238	return crypto_requires_off(algt, CRYPTO_ALG_INHERITED_FLAGS);
    239}
    240
    241noinline unsigned long __crypto_memneq(const void *a, const void *b, size_t size);
    242
    243/**
    244 * crypto_memneq - Compare two areas of memory without leaking
    245 *		   timing information.
    246 *
    247 * @a: One area of memory
    248 * @b: Another area of memory
    249 * @size: The size of the area.
    250 *
    251 * Returns 0 when data is equal, 1 otherwise.
    252 */
    253static inline int crypto_memneq(const void *a, const void *b, size_t size)
    254{
    255	return __crypto_memneq(a, b, size) != 0UL ? 1 : 0;
    256}
    257
    258int crypto_register_notifier(struct notifier_block *nb);
    259int crypto_unregister_notifier(struct notifier_block *nb);
    260
    261/* Crypto notification events. */
    262enum {
    263	CRYPTO_MSG_ALG_REQUEST,
    264	CRYPTO_MSG_ALG_REGISTER,
    265	CRYPTO_MSG_ALG_LOADED,
    266};
    267
    268#endif	/* _CRYPTO_ALGAPI_H */