Line data Source code
1 : /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 : /* 3 : * Hash algorithms. 4 : * 5 : * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au> 6 : */ 7 : 8 : #ifndef _CRYPTO_INTERNAL_HASH_H 9 : #define _CRYPTO_INTERNAL_HASH_H 10 : 11 : #include <crypto/algapi.h> 12 : #include <crypto/hash.h> 13 : 14 : struct ahash_request; 15 : struct scatterlist; 16 : 17 : struct crypto_hash_walk { 18 : char *data; 19 : 20 : unsigned int offset; 21 : unsigned int alignmask; 22 : 23 : struct page *pg; 24 : unsigned int entrylen; 25 : 26 : unsigned int total; 27 : struct scatterlist *sg; 28 : 29 : unsigned int flags; 30 : }; 31 : 32 : struct ahash_instance { 33 : void (*free)(struct ahash_instance *inst); 34 : union { 35 : struct { 36 : char head[offsetof(struct ahash_alg, halg.base)]; 37 : struct crypto_instance base; 38 : } s; 39 : struct ahash_alg alg; 40 : }; 41 : }; 42 : 43 : struct shash_instance { 44 : void (*free)(struct shash_instance *inst); 45 : union { 46 : struct { 47 : char head[offsetof(struct shash_alg, base)]; 48 : struct crypto_instance base; 49 : } s; 50 : struct shash_alg alg; 51 : }; 52 : }; 53 : 54 : struct crypto_ahash_spawn { 55 : struct crypto_spawn base; 56 : }; 57 : 58 : struct crypto_shash_spawn { 59 : struct crypto_spawn base; 60 : }; 61 : 62 : int crypto_hash_walk_done(struct crypto_hash_walk *walk, int err); 63 : int crypto_hash_walk_first(struct ahash_request *req, 64 : struct crypto_hash_walk *walk); 65 : 66 0 : static inline int crypto_hash_walk_last(struct crypto_hash_walk *walk) 67 : { 68 0 : return !(walk->entrylen | walk->total); 69 : } 70 : 71 : int crypto_register_ahash(struct ahash_alg *alg); 72 : void crypto_unregister_ahash(struct ahash_alg *alg); 73 : int crypto_register_ahashes(struct ahash_alg *algs, int count); 74 : void crypto_unregister_ahashes(struct ahash_alg *algs, int count); 75 : int ahash_register_instance(struct crypto_template *tmpl, 76 : struct ahash_instance *inst); 77 : 78 : int shash_no_setkey(struct crypto_shash *tfm, const u8 *key, 79 : unsigned int keylen); 80 : 81 2 : static inline bool crypto_shash_alg_has_setkey(struct shash_alg *alg) 82 : { 83 0 : return alg->setkey != shash_no_setkey; 84 : } 85 : 86 2 : static inline bool crypto_shash_alg_needs_key(struct shash_alg *alg) 87 : { 88 4 : return crypto_shash_alg_has_setkey(alg) && 89 2 : !(alg->base.cra_flags & CRYPTO_ALG_OPTIONAL_KEY); 90 : } 91 : 92 : bool crypto_hash_alg_has_setkey(struct hash_alg_common *halg); 93 : 94 : int crypto_grab_ahash(struct crypto_ahash_spawn *spawn, 95 : struct crypto_instance *inst, 96 : const char *name, u32 type, u32 mask); 97 : 98 : static inline void crypto_drop_ahash(struct crypto_ahash_spawn *spawn) 99 : { 100 : crypto_drop_spawn(&spawn->base); 101 : } 102 : 103 : static inline struct hash_alg_common *crypto_spawn_ahash_alg( 104 : struct crypto_ahash_spawn *spawn) 105 : { 106 : return __crypto_hash_alg_common(spawn->base.alg); 107 : } 108 : 109 : int crypto_register_shash(struct shash_alg *alg); 110 : void crypto_unregister_shash(struct shash_alg *alg); 111 : int crypto_register_shashes(struct shash_alg *algs, int count); 112 : void crypto_unregister_shashes(struct shash_alg *algs, int count); 113 : int shash_register_instance(struct crypto_template *tmpl, 114 : struct shash_instance *inst); 115 : void shash_free_singlespawn_instance(struct shash_instance *inst); 116 : 117 : int crypto_grab_shash(struct crypto_shash_spawn *spawn, 118 : struct crypto_instance *inst, 119 : const char *name, u32 type, u32 mask); 120 : 121 : static inline void crypto_drop_shash(struct crypto_shash_spawn *spawn) 122 : { 123 : crypto_drop_spawn(&spawn->base); 124 : } 125 : 126 : static inline struct shash_alg *crypto_spawn_shash_alg( 127 : struct crypto_shash_spawn *spawn) 128 : { 129 : return __crypto_shash_alg(spawn->base.alg); 130 : } 131 : 132 : int shash_ahash_update(struct ahash_request *req, struct shash_desc *desc); 133 : int shash_ahash_finup(struct ahash_request *req, struct shash_desc *desc); 134 : int shash_ahash_digest(struct ahash_request *req, struct shash_desc *desc); 135 : 136 : int crypto_init_shash_ops_async(struct crypto_tfm *tfm); 137 : 138 0 : static inline void *crypto_ahash_ctx(struct crypto_ahash *tfm) 139 : { 140 0 : return crypto_tfm_ctx(crypto_ahash_tfm(tfm)); 141 : } 142 : 143 0 : static inline struct ahash_alg *__crypto_ahash_alg(struct crypto_alg *alg) 144 : { 145 0 : return container_of(__crypto_hash_alg_common(alg), struct ahash_alg, 146 : halg); 147 : } 148 : 149 : static inline void crypto_ahash_set_reqsize(struct crypto_ahash *tfm, 150 : unsigned int reqsize) 151 : { 152 : tfm->reqsize = reqsize; 153 : } 154 : 155 0 : static inline struct crypto_instance *ahash_crypto_instance( 156 : struct ahash_instance *inst) 157 : { 158 0 : return &inst->s.base; 159 : } 160 : 161 0 : static inline struct ahash_instance *ahash_instance( 162 : struct crypto_instance *inst) 163 : { 164 0 : return container_of(inst, struct ahash_instance, s.base); 165 : } 166 : 167 : static inline struct ahash_instance *ahash_alg_instance( 168 : struct crypto_ahash *ahash) 169 : { 170 : return ahash_instance(crypto_tfm_alg_instance(&ahash->base)); 171 : } 172 : 173 : static inline void *ahash_instance_ctx(struct ahash_instance *inst) 174 : { 175 : return crypto_instance_ctx(ahash_crypto_instance(inst)); 176 : } 177 : 178 : static inline void ahash_request_complete(struct ahash_request *req, int err) 179 : { 180 : req->base.complete(&req->base, err); 181 : } 182 : 183 : static inline u32 ahash_request_flags(struct ahash_request *req) 184 : { 185 : return req->base.flags; 186 : } 187 : 188 : static inline struct crypto_ahash *crypto_spawn_ahash( 189 : struct crypto_ahash_spawn *spawn) 190 : { 191 : return crypto_spawn_tfm2(&spawn->base); 192 : } 193 : 194 : static inline int ahash_enqueue_request(struct crypto_queue *queue, 195 : struct ahash_request *request) 196 : { 197 : return crypto_enqueue_request(queue, &request->base); 198 : } 199 : 200 : static inline struct ahash_request *ahash_dequeue_request( 201 : struct crypto_queue *queue) 202 : { 203 : return ahash_request_cast(crypto_dequeue_request(queue)); 204 : } 205 : 206 0 : static inline void *crypto_shash_ctx(struct crypto_shash *tfm) 207 : { 208 0 : return crypto_tfm_ctx(&tfm->base); 209 : } 210 : 211 0 : static inline struct crypto_instance *shash_crypto_instance( 212 : struct shash_instance *inst) 213 : { 214 0 : return &inst->s.base; 215 : } 216 : 217 0 : static inline struct shash_instance *shash_instance( 218 : struct crypto_instance *inst) 219 : { 220 0 : return container_of(inst, struct shash_instance, s.base); 221 : } 222 : 223 : static inline struct shash_instance *shash_alg_instance( 224 : struct crypto_shash *shash) 225 : { 226 : return shash_instance(crypto_tfm_alg_instance(&shash->base)); 227 : } 228 : 229 0 : static inline void *shash_instance_ctx(struct shash_instance *inst) 230 : { 231 0 : return crypto_instance_ctx(shash_crypto_instance(inst)); 232 : } 233 : 234 : static inline struct crypto_shash *crypto_spawn_shash( 235 : struct crypto_shash_spawn *spawn) 236 : { 237 : return crypto_spawn_tfm2(&spawn->base); 238 : } 239 : 240 : static inline void *crypto_shash_ctx_aligned(struct crypto_shash *tfm) 241 : { 242 : return crypto_tfm_ctx_aligned(&tfm->base); 243 : } 244 : 245 2 : static inline struct crypto_shash *__crypto_shash_cast(struct crypto_tfm *tfm) 246 : { 247 2 : return container_of(tfm, struct crypto_shash, base); 248 : } 249 : 250 : #endif /* _CRYPTO_INTERNAL_HASH_H */ 251 :