LCOV - code coverage report
Current view: top level - include/crypto/internal - skcipher.h (source / functions) Hit Total Coverage
Test: landlock.info Lines: 0 19 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             :  * Symmetric key ciphers.
       4             :  * 
       5             :  * Copyright (c) 2007 Herbert Xu <herbert@gondor.apana.org.au>
       6             :  */
       7             : 
       8             : #ifndef _CRYPTO_INTERNAL_SKCIPHER_H
       9             : #define _CRYPTO_INTERNAL_SKCIPHER_H
      10             : 
      11             : #include <crypto/algapi.h>
      12             : #include <crypto/internal/cipher.h>
      13             : #include <crypto/skcipher.h>
      14             : #include <linux/list.h>
      15             : #include <linux/types.h>
      16             : 
      17             : struct aead_request;
      18             : struct rtattr;
      19             : 
      20             : struct skcipher_instance {
      21             :         void (*free)(struct skcipher_instance *inst);
      22             :         union {
      23             :                 struct {
      24             :                         char head[offsetof(struct skcipher_alg, base)];
      25             :                         struct crypto_instance base;
      26             :                 } s;
      27             :                 struct skcipher_alg alg;
      28             :         };
      29             : };
      30             : 
      31             : struct crypto_skcipher_spawn {
      32             :         struct crypto_spawn base;
      33             : };
      34             : 
      35             : struct skcipher_walk {
      36             :         union {
      37             :                 struct {
      38             :                         struct page *page;
      39             :                         unsigned long offset;
      40             :                 } phys;
      41             : 
      42             :                 struct {
      43             :                         u8 *page;
      44             :                         void *addr;
      45             :                 } virt;
      46             :         } src, dst;
      47             : 
      48             :         struct scatter_walk in;
      49             :         unsigned int nbytes;
      50             : 
      51             :         struct scatter_walk out;
      52             :         unsigned int total;
      53             : 
      54             :         struct list_head buffers;
      55             : 
      56             :         u8 *page;
      57             :         u8 *buffer;
      58             :         u8 *oiv;
      59             :         void *iv;
      60             : 
      61             :         unsigned int ivsize;
      62             : 
      63             :         int flags;
      64             :         unsigned int blocksize;
      65             :         unsigned int stride;
      66             :         unsigned int alignmask;
      67             : };
      68             : 
      69           0 : static inline struct crypto_instance *skcipher_crypto_instance(
      70             :         struct skcipher_instance *inst)
      71             : {
      72           0 :         return &inst->s.base;
      73             : }
      74             : 
      75           0 : static inline struct skcipher_instance *skcipher_alg_instance(
      76             :         struct crypto_skcipher *skcipher)
      77             : {
      78           0 :         return container_of(crypto_skcipher_alg(skcipher),
      79             :                             struct skcipher_instance, alg);
      80             : }
      81             : 
      82           0 : static inline void *skcipher_instance_ctx(struct skcipher_instance *inst)
      83             : {
      84           0 :         return crypto_instance_ctx(skcipher_crypto_instance(inst));
      85             : }
      86             : 
      87             : static inline void skcipher_request_complete(struct skcipher_request *req, int err)
      88             : {
      89             :         req->base.complete(&req->base, err);
      90             : }
      91             : 
      92             : int crypto_grab_skcipher(struct crypto_skcipher_spawn *spawn,
      93             :                          struct crypto_instance *inst,
      94             :                          const char *name, u32 type, u32 mask);
      95             : 
      96             : static inline void crypto_drop_skcipher(struct crypto_skcipher_spawn *spawn)
      97             : {
      98             :         crypto_drop_spawn(&spawn->base);
      99             : }
     100             : 
     101             : static inline struct skcipher_alg *crypto_skcipher_spawn_alg(
     102             :         struct crypto_skcipher_spawn *spawn)
     103             : {
     104             :         return container_of(spawn->base.alg, struct skcipher_alg, base);
     105             : }
     106             : 
     107             : static inline struct skcipher_alg *crypto_spawn_skcipher_alg(
     108             :         struct crypto_skcipher_spawn *spawn)
     109             : {
     110             :         return crypto_skcipher_spawn_alg(spawn);
     111             : }
     112             : 
     113             : static inline struct crypto_skcipher *crypto_spawn_skcipher(
     114             :         struct crypto_skcipher_spawn *spawn)
     115             : {
     116             :         return crypto_spawn_tfm2(&spawn->base);
     117             : }
     118             : 
     119           0 : static inline void crypto_skcipher_set_reqsize(
     120             :         struct crypto_skcipher *skcipher, unsigned int reqsize)
     121             : {
     122           0 :         skcipher->reqsize = reqsize;
     123             : }
     124             : 
     125             : int crypto_register_skcipher(struct skcipher_alg *alg);
     126             : void crypto_unregister_skcipher(struct skcipher_alg *alg);
     127             : int crypto_register_skciphers(struct skcipher_alg *algs, int count);
     128             : void crypto_unregister_skciphers(struct skcipher_alg *algs, int count);
     129             : int skcipher_register_instance(struct crypto_template *tmpl,
     130             :                                struct skcipher_instance *inst);
     131             : 
     132             : int skcipher_walk_done(struct skcipher_walk *walk, int err);
     133             : int skcipher_walk_virt(struct skcipher_walk *walk,
     134             :                        struct skcipher_request *req,
     135             :                        bool atomic);
     136             : int skcipher_walk_async(struct skcipher_walk *walk,
     137             :                         struct skcipher_request *req);
     138             : int skcipher_walk_aead_encrypt(struct skcipher_walk *walk,
     139             :                                struct aead_request *req, bool atomic);
     140             : int skcipher_walk_aead_decrypt(struct skcipher_walk *walk,
     141             :                                struct aead_request *req, bool atomic);
     142             : void skcipher_walk_complete(struct skcipher_walk *walk, int err);
     143             : 
     144             : static inline void skcipher_walk_abort(struct skcipher_walk *walk)
     145             : {
     146             :         skcipher_walk_done(walk, -ECANCELED);
     147             : }
     148             : 
     149           0 : static inline void *crypto_skcipher_ctx(struct crypto_skcipher *tfm)
     150             : {
     151           0 :         return crypto_tfm_ctx(&tfm->base);
     152             : }
     153             : 
     154           0 : static inline void *skcipher_request_ctx(struct skcipher_request *req)
     155             : {
     156           0 :         return req->__ctx;
     157             : }
     158             : 
     159             : static inline u32 skcipher_request_flags(struct skcipher_request *req)
     160             : {
     161             :         return req->base.flags;
     162             : }
     163             : 
     164             : static inline unsigned int crypto_skcipher_alg_min_keysize(
     165             :         struct skcipher_alg *alg)
     166             : {
     167             :         return alg->min_keysize;
     168             : }
     169             : 
     170             : static inline unsigned int crypto_skcipher_alg_max_keysize(
     171             :         struct skcipher_alg *alg)
     172             : {
     173             :         return alg->max_keysize;
     174             : }
     175             : 
     176           0 : static inline unsigned int crypto_skcipher_alg_walksize(
     177             :         struct skcipher_alg *alg)
     178             : {
     179           0 :         return alg->walksize;
     180             : }
     181             : 
     182             : /**
     183             :  * crypto_skcipher_walksize() - obtain walk size
     184             :  * @tfm: cipher handle
     185             :  *
     186             :  * In some cases, algorithms can only perform optimally when operating on
     187             :  * multiple blocks in parallel. This is reflected by the walksize, which
     188             :  * must be a multiple of the chunksize (or equal if the concern does not
     189             :  * apply)
     190             :  *
     191             :  * Return: walk size in bytes
     192             :  */
     193           0 : static inline unsigned int crypto_skcipher_walksize(
     194             :         struct crypto_skcipher *tfm)
     195             : {
     196           0 :         return crypto_skcipher_alg_walksize(crypto_skcipher_alg(tfm));
     197             : }
     198             : 
     199             : /* Helpers for simple block cipher modes of operation */
     200             : struct skcipher_ctx_simple {
     201             :         struct crypto_cipher *cipher;   /* underlying block cipher */
     202             : };
     203             : static inline struct crypto_cipher *
     204           0 : skcipher_cipher_simple(struct crypto_skcipher *tfm)
     205             : {
     206           0 :         struct skcipher_ctx_simple *ctx = crypto_skcipher_ctx(tfm);
     207             : 
     208           0 :         return ctx->cipher;
     209             : }
     210             : 
     211             : struct skcipher_instance *skcipher_alloc_instance_simple(
     212             :         struct crypto_template *tmpl, struct rtattr **tb);
     213             : 
     214             : static inline struct crypto_alg *skcipher_ialg_simple(
     215             :         struct skcipher_instance *inst)
     216             : {
     217             :         struct crypto_cipher_spawn *spawn = skcipher_instance_ctx(inst);
     218             : 
     219             :         return crypto_spawn_cipher_alg(spawn);
     220             : }
     221             : 
     222             : #endif  /* _CRYPTO_INTERNAL_SKCIPHER_H */
     223             : 

Generated by: LCOV version 1.14