LCOV - code coverage report
Current view: top level - include/crypto - algapi.h (source / functions) Hit Total Coverage
Test: landlock.info Lines: 0 13 0.0 %
Date: 2021-04-22 12:43:58 Functions: 0 0 -

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

Generated by: LCOV version 1.14