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 21 struct aead_request; 22 struct rtattr; 23 24 struct 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 35 struct crypto_skcipher_spawn { 36 struct crypto_spawn base; 37 }; 38 39 struct 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 73 extern const struct crypto_type crypto_givcipher_type; 74 75 static inline struct crypto_instance *skcipher_crypto_instance( 76 struct skcipher_instance *inst) 77 { 78 return &inst->s.base; 79 } 80 81 static 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 88 static inline void *skcipher_instance_ctx(struct skcipher_instance *inst) 89 { 90 return crypto_instance_ctx(skcipher_crypto_instance(inst)); 91 } 92 93 static inline void skcipher_request_complete(struct skcipher_request *req, int err) 94 { 95 req->base.complete(&req->base, err); 96 } 97 98 static 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 104 int crypto_grab_skcipher(struct crypto_skcipher_spawn *spawn, const char *name, 105 u32 type, u32 mask); 106 107 static inline void crypto_drop_skcipher(struct crypto_skcipher_spawn *spawn) 108 { 109 crypto_drop_spawn(&spawn->base); 110 } 111 112 static 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 118 static inline struct skcipher_alg *crypto_spawn_skcipher_alg( 119 struct crypto_skcipher_spawn *spawn) 120 { 121 return crypto_skcipher_spawn_alg(spawn); 122 } 123 124 static inline struct crypto_skcipher *crypto_spawn_skcipher( 125 struct crypto_skcipher_spawn *spawn) 126 { 127 return crypto_spawn_tfm2(&spawn->base); 128 } 129 130 static inline void crypto_skcipher_set_reqsize( 131 struct crypto_skcipher *skcipher, unsigned int reqsize) 132 { 133 skcipher->reqsize = reqsize; 134 } 135 136 int crypto_register_skcipher(struct skcipher_alg *alg); 137 void crypto_unregister_skcipher(struct skcipher_alg *alg); 138 int crypto_register_skciphers(struct skcipher_alg *algs, int count); 139 void crypto_unregister_skciphers(struct skcipher_alg *algs, int count); 140 int skcipher_register_instance(struct crypto_template *tmpl, 141 struct skcipher_instance *inst); 142 143 int skcipher_walk_done(struct skcipher_walk *walk, int err); 144 int skcipher_walk_virt(struct skcipher_walk *walk, 145 struct skcipher_request *req, 146 bool atomic); 147 void skcipher_walk_atomise(struct skcipher_walk *walk); 148 int skcipher_walk_async(struct skcipher_walk *walk, 149 struct skcipher_request *req); 150 int skcipher_walk_aead(struct skcipher_walk *walk, struct aead_request *req, 151 bool atomic); 152 int skcipher_walk_aead_encrypt(struct skcipher_walk *walk, 153 struct aead_request *req, bool atomic); 154 int skcipher_walk_aead_decrypt(struct skcipher_walk *walk, 155 struct aead_request *req, bool atomic); 156 void skcipher_walk_complete(struct skcipher_walk *walk, int err); 157 158 static inline void ablkcipher_request_complete(struct ablkcipher_request *req, 159 int err) 160 { 161 req->base.complete(&req->base, err); 162 } 163 164 static inline u32 ablkcipher_request_flags(struct ablkcipher_request *req) 165 { 166 return req->base.flags; 167 } 168 169 static inline void *crypto_skcipher_ctx(struct crypto_skcipher *tfm) 170 { 171 return crypto_tfm_ctx(&tfm->base); 172 } 173 174 static inline void *skcipher_request_ctx(struct skcipher_request *req) 175 { 176 return req->__ctx; 177 } 178 179 static inline u32 skcipher_request_flags(struct skcipher_request *req) 180 { 181 return req->base.flags; 182 } 183 184 static 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 197 static 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