linux/include/crypto/internal/skcipher.h
<<
>>
Prefs
   1/*
   2 * Symmetric key ciphers.
   3 * 
   4 * Copyright (c) 2007 Herbert Xu <herbert@gondor.apana.org.au>
   5 *
   6 * This program is free software; you can redistribute it and/or modify it
   7 * under the terms of the GNU General Public License as published by the Free
   8 * Software Foundation; either version 2 of the License, or (at your option) 
   9 * any later version.
  10 *
  11 */
  12
  13#ifndef _CRYPTO_INTERNAL_SKCIPHER_H
  14#define _CRYPTO_INTERNAL_SKCIPHER_H
  15
  16#include <crypto/algapi.h>
  17#include <crypto/skcipher.h>
  18#include <linux/list.h>
  19#include <linux/types.h>
  20
  21struct aead_request;
  22struct rtattr;
  23
  24struct skcipher_instance {
  25        void (*free)(struct skcipher_instance *inst);
  26        union {
  27                struct {
  28                        char head[offsetof(struct skcipher_alg, base)];
  29                        struct crypto_instance base;
  30                } s;
  31                struct skcipher_alg alg;
  32        };
  33};
  34
  35struct crypto_skcipher_spawn {
  36        struct crypto_spawn base;
  37};
  38
  39struct skcipher_walk {
  40        union {
  41                struct {
  42                        struct page *page;
  43                        unsigned long offset;
  44                } phys;
  45
  46                struct {
  47                        u8 *page;
  48                        void *addr;
  49                } virt;
  50        } src, dst;
  51
  52        struct scatter_walk in;
  53        unsigned int nbytes;
  54
  55        struct scatter_walk out;
  56        unsigned int total;
  57
  58        struct list_head buffers;
  59
  60        u8 *page;
  61        u8 *buffer;
  62        u8 *oiv;
  63        void *iv;
  64
  65        unsigned int ivsize;
  66
  67        int flags;
  68        unsigned int blocksize;
  69        unsigned int stride;
  70        unsigned int alignmask;
  71};
  72
  73extern const struct crypto_type crypto_givcipher_type;
  74
  75static inline struct crypto_instance *skcipher_crypto_instance(
  76        struct skcipher_instance *inst)
  77{
  78        return &inst->s.base;
  79}
  80
  81static inline struct skcipher_instance *skcipher_alg_instance(
  82        struct crypto_skcipher *skcipher)
  83{
  84        return container_of(crypto_skcipher_alg(skcipher),
  85                            struct skcipher_instance, alg);
  86}
  87
  88static inline void *skcipher_instance_ctx(struct skcipher_instance *inst)
  89{
  90        return crypto_instance_ctx(skcipher_crypto_instance(inst));
  91}
  92
  93static inline void skcipher_request_complete(struct skcipher_request *req, int err)
  94{
  95        req->base.complete(&req->base, err);
  96}
  97
  98static inline void crypto_set_skcipher_spawn(
  99        struct crypto_skcipher_spawn *spawn, struct crypto_instance *inst)
 100{
 101        crypto_set_spawn(&spawn->base, inst);
 102}
 103
 104int crypto_grab_skcipher(struct crypto_skcipher_spawn *spawn, const char *name,
 105                         u32 type, u32 mask);
 106
 107static inline void crypto_drop_skcipher(struct crypto_skcipher_spawn *spawn)
 108{
 109        crypto_drop_spawn(&spawn->base);
 110}
 111
 112static inline struct skcipher_alg *crypto_skcipher_spawn_alg(
 113        struct crypto_skcipher_spawn *spawn)
 114{
 115        return container_of(spawn->base.alg, struct skcipher_alg, base);
 116}
 117
 118static inline struct skcipher_alg *crypto_spawn_skcipher_alg(
 119        struct crypto_skcipher_spawn *spawn)
 120{
 121        return crypto_skcipher_spawn_alg(spawn);
 122}
 123
 124static inline struct crypto_skcipher *crypto_spawn_skcipher(
 125        struct crypto_skcipher_spawn *spawn)
 126{
 127        return crypto_spawn_tfm2(&spawn->base);
 128}
 129
 130static inline void crypto_skcipher_set_reqsize(
 131        struct crypto_skcipher *skcipher, unsigned int reqsize)
 132{
 133        skcipher->reqsize = reqsize;
 134}
 135
 136int crypto_register_skcipher(struct skcipher_alg *alg);
 137void crypto_unregister_skcipher(struct skcipher_alg *alg);
 138int crypto_register_skciphers(struct skcipher_alg *algs, int count);
 139void crypto_unregister_skciphers(struct skcipher_alg *algs, int count);
 140int skcipher_register_instance(struct crypto_template *tmpl,
 141                               struct skcipher_instance *inst);
 142
 143int skcipher_walk_done(struct skcipher_walk *walk, int err);
 144int skcipher_walk_virt(struct skcipher_walk *walk,
 145                       struct skcipher_request *req,
 146                       bool atomic);
 147void skcipher_walk_atomise(struct skcipher_walk *walk);
 148int skcipher_walk_async(struct skcipher_walk *walk,
 149                        struct skcipher_request *req);
 150int skcipher_walk_aead(struct skcipher_walk *walk, struct aead_request *req,
 151                       bool atomic);
 152int skcipher_walk_aead_encrypt(struct skcipher_walk *walk,
 153                               struct aead_request *req, bool atomic);
 154int skcipher_walk_aead_decrypt(struct skcipher_walk *walk,
 155                               struct aead_request *req, bool atomic);
 156void skcipher_walk_complete(struct skcipher_walk *walk, int err);
 157
 158static inline void ablkcipher_request_complete(struct ablkcipher_request *req,
 159                                               int err)
 160{
 161        req->base.complete(&req->base, err);
 162}
 163
 164static inline u32 ablkcipher_request_flags(struct ablkcipher_request *req)
 165{
 166        return req->base.flags;
 167}
 168
 169static inline void *crypto_skcipher_ctx(struct crypto_skcipher *tfm)
 170{
 171        return crypto_tfm_ctx(&tfm->base);
 172}
 173
 174static inline void *skcipher_request_ctx(struct skcipher_request *req)
 175{
 176        return req->__ctx;
 177}
 178
 179static inline u32 skcipher_request_flags(struct skcipher_request *req)
 180{
 181        return req->base.flags;
 182}
 183
 184static inline unsigned int crypto_skcipher_alg_min_keysize(
 185        struct skcipher_alg *alg)
 186{
 187        if ((alg->base.cra_flags & CRYPTO_ALG_TYPE_MASK) ==
 188            CRYPTO_ALG_TYPE_BLKCIPHER)
 189                return alg->base.cra_blkcipher.min_keysize;
 190
 191        if (alg->base.cra_ablkcipher.encrypt)
 192                return alg->base.cra_ablkcipher.min_keysize;
 193
 194        return alg->min_keysize;
 195}
 196
 197static inline unsigned int crypto_skcipher_alg_max_keysize(
 198        struct skcipher_alg *alg)
 199{
 200        if ((alg->base.cra_flags & CRYPTO_ALG_TYPE_MASK) ==
 201            CRYPTO_ALG_TYPE_BLKCIPHER)
 202                return alg->base.cra_blkcipher.max_keysize;
 203
 204        if (alg->base.cra_ablkcipher.encrypt)
 205                return alg->base.cra_ablkcipher.max_keysize;
 206
 207        return alg->max_keysize;
 208}
 209
 210#endif  /* _CRYPTO_INTERNAL_SKCIPHER_H */
 211
 212