Branch data 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 : : struct ahash_alg alg; 34 : : }; 35 : : 36 : : struct shash_instance { 37 : : struct shash_alg alg; 38 : : }; 39 : : 40 : : struct crypto_ahash_spawn { 41 : : struct crypto_spawn base; 42 : : }; 43 : : 44 : : struct crypto_shash_spawn { 45 : : struct crypto_spawn base; 46 : : }; 47 : : 48 : : extern const struct crypto_type crypto_ahash_type; 49 : : 50 : : int crypto_hash_walk_done(struct crypto_hash_walk *walk, int err); 51 : : int crypto_hash_walk_first(struct ahash_request *req, 52 : : struct crypto_hash_walk *walk); 53 : : int crypto_ahash_walk_first(struct ahash_request *req, 54 : : struct crypto_hash_walk *walk); 55 : : 56 : : static inline int crypto_ahash_walk_done(struct crypto_hash_walk *walk, 57 : : int err) 58 : : { 59 : : return crypto_hash_walk_done(walk, err); 60 : : } 61 : : 62 : : static inline int crypto_hash_walk_last(struct crypto_hash_walk *walk) 63 : : { 64 : 0 : return !(walk->entrylen | walk->total); 65 : : } 66 : : 67 : : static inline int crypto_ahash_walk_last(struct crypto_hash_walk *walk) 68 : : { 69 : : return crypto_hash_walk_last(walk); 70 : : } 71 : : 72 : : int crypto_register_ahash(struct ahash_alg *alg); 73 : : int crypto_unregister_ahash(struct ahash_alg *alg); 74 : : int crypto_register_ahashes(struct ahash_alg *algs, int count); 75 : : void crypto_unregister_ahashes(struct ahash_alg *algs, int count); 76 : : int ahash_register_instance(struct crypto_template *tmpl, 77 : : struct ahash_instance *inst); 78 : : void ahash_free_instance(struct crypto_instance *inst); 79 : : 80 : : int shash_no_setkey(struct crypto_shash *tfm, const u8 *key, 81 : : unsigned int keylen); 82 : : 83 : : static inline bool crypto_shash_alg_has_setkey(struct shash_alg *alg) 84 : : { 85 : 3 : return alg->setkey != shash_no_setkey; 86 : : } 87 : : 88 : : bool crypto_hash_alg_has_setkey(struct hash_alg_common *halg); 89 : : 90 : : int crypto_init_ahash_spawn(struct crypto_ahash_spawn *spawn, 91 : : struct hash_alg_common *alg, 92 : : struct crypto_instance *inst); 93 : : 94 : : static inline void crypto_drop_ahash(struct crypto_ahash_spawn *spawn) 95 : : { 96 : : crypto_drop_spawn(&spawn->base); 97 : : } 98 : : 99 : : struct hash_alg_common *ahash_attr_alg(struct rtattr *rta, u32 type, u32 mask); 100 : : 101 : : int crypto_register_shash(struct shash_alg *alg); 102 : : int crypto_unregister_shash(struct shash_alg *alg); 103 : : int crypto_register_shashes(struct shash_alg *algs, int count); 104 : : int crypto_unregister_shashes(struct shash_alg *algs, int count); 105 : : int shash_register_instance(struct crypto_template *tmpl, 106 : : struct shash_instance *inst); 107 : : void shash_free_instance(struct crypto_instance *inst); 108 : : 109 : : int crypto_init_shash_spawn(struct crypto_shash_spawn *spawn, 110 : : struct shash_alg *alg, 111 : : struct crypto_instance *inst); 112 : : 113 : : static inline void crypto_drop_shash(struct crypto_shash_spawn *spawn) 114 : : { 115 : : crypto_drop_spawn(&spawn->base); 116 : : } 117 : : 118 : : struct shash_alg *shash_attr_alg(struct rtattr *rta, u32 type, u32 mask); 119 : : 120 : : int shash_ahash_update(struct ahash_request *req, struct shash_desc *desc); 121 : : int shash_ahash_finup(struct ahash_request *req, struct shash_desc *desc); 122 : : int shash_ahash_digest(struct ahash_request *req, struct shash_desc *desc); 123 : : 124 : : int crypto_init_shash_ops_async(struct crypto_tfm *tfm); 125 : : 126 : : static inline void *crypto_ahash_ctx(struct crypto_ahash *tfm) 127 : : { 128 : : return crypto_tfm_ctx(crypto_ahash_tfm(tfm)); 129 : : } 130 : : 131 : : static inline struct ahash_alg *__crypto_ahash_alg(struct crypto_alg *alg) 132 : : { 133 : : return container_of(__crypto_hash_alg_common(alg), struct ahash_alg, 134 : : halg); 135 : : } 136 : : 137 : : static inline void crypto_ahash_set_reqsize(struct crypto_ahash *tfm, 138 : : unsigned int reqsize) 139 : : { 140 : : tfm->reqsize = reqsize; 141 : : } 142 : : 143 : : static inline struct crypto_instance *ahash_crypto_instance( 144 : : struct ahash_instance *inst) 145 : : { 146 : 0 : return container_of(&inst->alg.halg.base, struct crypto_instance, alg); 147 : : } 148 : : 149 : : static inline struct ahash_instance *ahash_instance( 150 : : struct crypto_instance *inst) 151 : : { 152 : 0 : return container_of(&inst->alg, struct ahash_instance, alg.halg.base); 153 : : } 154 : : 155 : : static inline void *ahash_instance_ctx(struct ahash_instance *inst) 156 : : { 157 : : return crypto_instance_ctx(ahash_crypto_instance(inst)); 158 : : } 159 : : 160 : : static inline unsigned int ahash_instance_headroom(void) 161 : : { 162 : : return sizeof(struct ahash_alg) - sizeof(struct crypto_alg); 163 : : } 164 : : 165 : : static inline struct ahash_instance *ahash_alloc_instance( 166 : : const char *name, struct crypto_alg *alg) 167 : : { 168 : : return crypto_alloc_instance(name, alg, ahash_instance_headroom()); 169 : : } 170 : : 171 : : static inline void ahash_request_complete(struct ahash_request *req, int err) 172 : : { 173 : : req->base.complete(&req->base, err); 174 : : } 175 : : 176 : : static inline u32 ahash_request_flags(struct ahash_request *req) 177 : : { 178 : : return req->base.flags; 179 : : } 180 : : 181 : : static inline struct crypto_ahash *crypto_spawn_ahash( 182 : : struct crypto_ahash_spawn *spawn) 183 : : { 184 : : return crypto_spawn_tfm2(&spawn->base); 185 : : } 186 : : 187 : : static inline int ahash_enqueue_request(struct crypto_queue *queue, 188 : : struct ahash_request *request) 189 : : { 190 : : return crypto_enqueue_request(queue, &request->base); 191 : : } 192 : : 193 : : static inline struct ahash_request *ahash_dequeue_request( 194 : : struct crypto_queue *queue) 195 : : { 196 : : return ahash_request_cast(crypto_dequeue_request(queue)); 197 : : } 198 : : 199 : : static inline void *crypto_shash_ctx(struct crypto_shash *tfm) 200 : : { 201 : : return crypto_tfm_ctx(&tfm->base); 202 : : } 203 : : 204 : : static inline struct crypto_instance *shash_crypto_instance( 205 : : struct shash_instance *inst) 206 : : { 207 : 0 : return container_of(&inst->alg.base, struct crypto_instance, alg); 208 : : } 209 : : 210 : : static inline struct shash_instance *shash_instance( 211 : : struct crypto_instance *inst) 212 : : { 213 : : return container_of(__crypto_shash_alg(&inst->alg), 214 : : struct shash_instance, alg); 215 : : } 216 : : 217 : : static inline void *shash_instance_ctx(struct shash_instance *inst) 218 : : { 219 : : return crypto_instance_ctx(shash_crypto_instance(inst)); 220 : : } 221 : : 222 : : static inline struct shash_instance *shash_alloc_instance( 223 : : const char *name, struct crypto_alg *alg) 224 : : { 225 : 0 : return crypto_alloc_instance(name, alg, 226 : : sizeof(struct shash_alg) - sizeof(*alg)); 227 : : } 228 : : 229 : : static inline struct crypto_shash *crypto_spawn_shash( 230 : : struct crypto_shash_spawn *spawn) 231 : : { 232 : 0 : return crypto_spawn_tfm2(&spawn->base); 233 : : } 234 : : 235 : : static inline void *crypto_shash_ctx_aligned(struct crypto_shash *tfm) 236 : : { 237 : : return crypto_tfm_ctx_aligned(&tfm->base); 238 : : } 239 : : 240 : : static inline struct crypto_shash *__crypto_shash_cast(struct crypto_tfm *tfm) 241 : : { 242 : : return container_of(tfm, struct crypto_shash, base); 243 : : } 244 : : 245 : : #endif /* _CRYPTO_INTERNAL_HASH_H */ 246 : :