162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Hash algorithms. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef _CRYPTO_INTERNAL_HASH_H 962306a36Sopenharmony_ci#define _CRYPTO_INTERNAL_HASH_H 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <crypto/algapi.h> 1262306a36Sopenharmony_ci#include <crypto/hash.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_cistruct ahash_request; 1562306a36Sopenharmony_cistruct scatterlist; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cistruct crypto_hash_walk { 1862306a36Sopenharmony_ci char *data; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci unsigned int offset; 2162306a36Sopenharmony_ci unsigned int alignmask; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci struct page *pg; 2462306a36Sopenharmony_ci unsigned int entrylen; 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci unsigned int total; 2762306a36Sopenharmony_ci struct scatterlist *sg; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci unsigned int flags; 3062306a36Sopenharmony_ci}; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_cistruct ahash_instance { 3362306a36Sopenharmony_ci void (*free)(struct ahash_instance *inst); 3462306a36Sopenharmony_ci union { 3562306a36Sopenharmony_ci struct { 3662306a36Sopenharmony_ci char head[offsetof(struct ahash_alg, halg.base)]; 3762306a36Sopenharmony_ci struct crypto_instance base; 3862306a36Sopenharmony_ci } s; 3962306a36Sopenharmony_ci struct ahash_alg alg; 4062306a36Sopenharmony_ci }; 4162306a36Sopenharmony_ci}; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistruct shash_instance { 4462306a36Sopenharmony_ci void (*free)(struct shash_instance *inst); 4562306a36Sopenharmony_ci union { 4662306a36Sopenharmony_ci struct { 4762306a36Sopenharmony_ci char head[offsetof(struct shash_alg, base)]; 4862306a36Sopenharmony_ci struct crypto_instance base; 4962306a36Sopenharmony_ci } s; 5062306a36Sopenharmony_ci struct shash_alg alg; 5162306a36Sopenharmony_ci }; 5262306a36Sopenharmony_ci}; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_cistruct crypto_ahash_spawn { 5562306a36Sopenharmony_ci struct crypto_spawn base; 5662306a36Sopenharmony_ci}; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistruct crypto_shash_spawn { 5962306a36Sopenharmony_ci struct crypto_spawn base; 6062306a36Sopenharmony_ci}; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ciint crypto_hash_walk_done(struct crypto_hash_walk *walk, int err); 6362306a36Sopenharmony_ciint crypto_hash_walk_first(struct ahash_request *req, 6462306a36Sopenharmony_ci struct crypto_hash_walk *walk); 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_cistatic inline int crypto_hash_walk_last(struct crypto_hash_walk *walk) 6762306a36Sopenharmony_ci{ 6862306a36Sopenharmony_ci return !(walk->entrylen | walk->total); 6962306a36Sopenharmony_ci} 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ciint crypto_register_ahash(struct ahash_alg *alg); 7262306a36Sopenharmony_civoid crypto_unregister_ahash(struct ahash_alg *alg); 7362306a36Sopenharmony_ciint crypto_register_ahashes(struct ahash_alg *algs, int count); 7462306a36Sopenharmony_civoid crypto_unregister_ahashes(struct ahash_alg *algs, int count); 7562306a36Sopenharmony_ciint ahash_register_instance(struct crypto_template *tmpl, 7662306a36Sopenharmony_ci struct ahash_instance *inst); 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ciint shash_no_setkey(struct crypto_shash *tfm, const u8 *key, 7962306a36Sopenharmony_ci unsigned int keylen); 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_cistatic inline bool crypto_shash_alg_has_setkey(struct shash_alg *alg) 8262306a36Sopenharmony_ci{ 8362306a36Sopenharmony_ci return alg->setkey != shash_no_setkey; 8462306a36Sopenharmony_ci} 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_cistatic inline bool crypto_shash_alg_needs_key(struct shash_alg *alg) 8762306a36Sopenharmony_ci{ 8862306a36Sopenharmony_ci return crypto_shash_alg_has_setkey(alg) && 8962306a36Sopenharmony_ci !(alg->base.cra_flags & CRYPTO_ALG_OPTIONAL_KEY); 9062306a36Sopenharmony_ci} 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_cibool crypto_hash_alg_has_setkey(struct hash_alg_common *halg); 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ciint crypto_grab_ahash(struct crypto_ahash_spawn *spawn, 9562306a36Sopenharmony_ci struct crypto_instance *inst, 9662306a36Sopenharmony_ci const char *name, u32 type, u32 mask); 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_cistatic inline void crypto_drop_ahash(struct crypto_ahash_spawn *spawn) 9962306a36Sopenharmony_ci{ 10062306a36Sopenharmony_ci crypto_drop_spawn(&spawn->base); 10162306a36Sopenharmony_ci} 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_cistatic inline struct hash_alg_common *crypto_spawn_ahash_alg( 10462306a36Sopenharmony_ci struct crypto_ahash_spawn *spawn) 10562306a36Sopenharmony_ci{ 10662306a36Sopenharmony_ci return __crypto_hash_alg_common(spawn->base.alg); 10762306a36Sopenharmony_ci} 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ciint crypto_register_shash(struct shash_alg *alg); 11062306a36Sopenharmony_civoid crypto_unregister_shash(struct shash_alg *alg); 11162306a36Sopenharmony_ciint crypto_register_shashes(struct shash_alg *algs, int count); 11262306a36Sopenharmony_civoid crypto_unregister_shashes(struct shash_alg *algs, int count); 11362306a36Sopenharmony_ciint shash_register_instance(struct crypto_template *tmpl, 11462306a36Sopenharmony_ci struct shash_instance *inst); 11562306a36Sopenharmony_civoid shash_free_singlespawn_instance(struct shash_instance *inst); 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ciint crypto_grab_shash(struct crypto_shash_spawn *spawn, 11862306a36Sopenharmony_ci struct crypto_instance *inst, 11962306a36Sopenharmony_ci const char *name, u32 type, u32 mask); 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_cistatic inline void crypto_drop_shash(struct crypto_shash_spawn *spawn) 12262306a36Sopenharmony_ci{ 12362306a36Sopenharmony_ci crypto_drop_spawn(&spawn->base); 12462306a36Sopenharmony_ci} 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_cistatic inline struct shash_alg *crypto_spawn_shash_alg( 12762306a36Sopenharmony_ci struct crypto_shash_spawn *spawn) 12862306a36Sopenharmony_ci{ 12962306a36Sopenharmony_ci return __crypto_shash_alg(spawn->base.alg); 13062306a36Sopenharmony_ci} 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ciint shash_ahash_update(struct ahash_request *req, struct shash_desc *desc); 13362306a36Sopenharmony_ciint shash_ahash_finup(struct ahash_request *req, struct shash_desc *desc); 13462306a36Sopenharmony_ciint shash_ahash_digest(struct ahash_request *req, struct shash_desc *desc); 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_cistatic inline void *crypto_ahash_ctx(struct crypto_ahash *tfm) 13762306a36Sopenharmony_ci{ 13862306a36Sopenharmony_ci return crypto_tfm_ctx(crypto_ahash_tfm(tfm)); 13962306a36Sopenharmony_ci} 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_cistatic inline void *crypto_ahash_ctx_dma(struct crypto_ahash *tfm) 14262306a36Sopenharmony_ci{ 14362306a36Sopenharmony_ci return crypto_tfm_ctx_dma(crypto_ahash_tfm(tfm)); 14462306a36Sopenharmony_ci} 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_cistatic inline struct ahash_alg *__crypto_ahash_alg(struct crypto_alg *alg) 14762306a36Sopenharmony_ci{ 14862306a36Sopenharmony_ci return container_of(__crypto_hash_alg_common(alg), struct ahash_alg, 14962306a36Sopenharmony_ci halg); 15062306a36Sopenharmony_ci} 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_cistatic inline struct ahash_alg *crypto_ahash_alg(struct crypto_ahash *hash) 15362306a36Sopenharmony_ci{ 15462306a36Sopenharmony_ci return container_of(crypto_hash_alg_common(hash), struct ahash_alg, 15562306a36Sopenharmony_ci halg); 15662306a36Sopenharmony_ci} 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_cistatic inline void crypto_ahash_set_statesize(struct crypto_ahash *tfm, 15962306a36Sopenharmony_ci unsigned int size) 16062306a36Sopenharmony_ci{ 16162306a36Sopenharmony_ci tfm->statesize = size; 16262306a36Sopenharmony_ci} 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_cistatic inline void crypto_ahash_set_reqsize(struct crypto_ahash *tfm, 16562306a36Sopenharmony_ci unsigned int reqsize) 16662306a36Sopenharmony_ci{ 16762306a36Sopenharmony_ci tfm->reqsize = reqsize; 16862306a36Sopenharmony_ci} 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_cistatic inline void crypto_ahash_set_reqsize_dma(struct crypto_ahash *ahash, 17162306a36Sopenharmony_ci unsigned int reqsize) 17262306a36Sopenharmony_ci{ 17362306a36Sopenharmony_ci reqsize += crypto_dma_align() & ~(crypto_tfm_ctx_alignment() - 1); 17462306a36Sopenharmony_ci ahash->reqsize = reqsize; 17562306a36Sopenharmony_ci} 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_cistatic inline struct crypto_instance *ahash_crypto_instance( 17862306a36Sopenharmony_ci struct ahash_instance *inst) 17962306a36Sopenharmony_ci{ 18062306a36Sopenharmony_ci return &inst->s.base; 18162306a36Sopenharmony_ci} 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_cistatic inline struct ahash_instance *ahash_instance( 18462306a36Sopenharmony_ci struct crypto_instance *inst) 18562306a36Sopenharmony_ci{ 18662306a36Sopenharmony_ci return container_of(inst, struct ahash_instance, s.base); 18762306a36Sopenharmony_ci} 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_cistatic inline struct ahash_instance *ahash_alg_instance( 19062306a36Sopenharmony_ci struct crypto_ahash *ahash) 19162306a36Sopenharmony_ci{ 19262306a36Sopenharmony_ci return ahash_instance(crypto_tfm_alg_instance(&ahash->base)); 19362306a36Sopenharmony_ci} 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_cistatic inline void *ahash_instance_ctx(struct ahash_instance *inst) 19662306a36Sopenharmony_ci{ 19762306a36Sopenharmony_ci return crypto_instance_ctx(ahash_crypto_instance(inst)); 19862306a36Sopenharmony_ci} 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_cistatic inline void *ahash_request_ctx_dma(struct ahash_request *req) 20162306a36Sopenharmony_ci{ 20262306a36Sopenharmony_ci unsigned int align = crypto_dma_align(); 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci if (align <= crypto_tfm_ctx_alignment()) 20562306a36Sopenharmony_ci align = 1; 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci return PTR_ALIGN(ahash_request_ctx(req), align); 20862306a36Sopenharmony_ci} 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_cistatic inline void ahash_request_complete(struct ahash_request *req, int err) 21162306a36Sopenharmony_ci{ 21262306a36Sopenharmony_ci crypto_request_complete(&req->base, err); 21362306a36Sopenharmony_ci} 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_cistatic inline u32 ahash_request_flags(struct ahash_request *req) 21662306a36Sopenharmony_ci{ 21762306a36Sopenharmony_ci return req->base.flags; 21862306a36Sopenharmony_ci} 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_cistatic inline struct crypto_ahash *crypto_spawn_ahash( 22162306a36Sopenharmony_ci struct crypto_ahash_spawn *spawn) 22262306a36Sopenharmony_ci{ 22362306a36Sopenharmony_ci return crypto_spawn_tfm2(&spawn->base); 22462306a36Sopenharmony_ci} 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_cistatic inline int ahash_enqueue_request(struct crypto_queue *queue, 22762306a36Sopenharmony_ci struct ahash_request *request) 22862306a36Sopenharmony_ci{ 22962306a36Sopenharmony_ci return crypto_enqueue_request(queue, &request->base); 23062306a36Sopenharmony_ci} 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_cistatic inline struct ahash_request *ahash_dequeue_request( 23362306a36Sopenharmony_ci struct crypto_queue *queue) 23462306a36Sopenharmony_ci{ 23562306a36Sopenharmony_ci return ahash_request_cast(crypto_dequeue_request(queue)); 23662306a36Sopenharmony_ci} 23762306a36Sopenharmony_ci 23862306a36Sopenharmony_cistatic inline void *crypto_shash_ctx(struct crypto_shash *tfm) 23962306a36Sopenharmony_ci{ 24062306a36Sopenharmony_ci return crypto_tfm_ctx(&tfm->base); 24162306a36Sopenharmony_ci} 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_cistatic inline struct crypto_instance *shash_crypto_instance( 24462306a36Sopenharmony_ci struct shash_instance *inst) 24562306a36Sopenharmony_ci{ 24662306a36Sopenharmony_ci return &inst->s.base; 24762306a36Sopenharmony_ci} 24862306a36Sopenharmony_ci 24962306a36Sopenharmony_cistatic inline struct shash_instance *shash_instance( 25062306a36Sopenharmony_ci struct crypto_instance *inst) 25162306a36Sopenharmony_ci{ 25262306a36Sopenharmony_ci return container_of(inst, struct shash_instance, s.base); 25362306a36Sopenharmony_ci} 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_cistatic inline struct shash_instance *shash_alg_instance( 25662306a36Sopenharmony_ci struct crypto_shash *shash) 25762306a36Sopenharmony_ci{ 25862306a36Sopenharmony_ci return shash_instance(crypto_tfm_alg_instance(&shash->base)); 25962306a36Sopenharmony_ci} 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_cistatic inline void *shash_instance_ctx(struct shash_instance *inst) 26262306a36Sopenharmony_ci{ 26362306a36Sopenharmony_ci return crypto_instance_ctx(shash_crypto_instance(inst)); 26462306a36Sopenharmony_ci} 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_cistatic inline struct crypto_shash *crypto_spawn_shash( 26762306a36Sopenharmony_ci struct crypto_shash_spawn *spawn) 26862306a36Sopenharmony_ci{ 26962306a36Sopenharmony_ci return crypto_spawn_tfm2(&spawn->base); 27062306a36Sopenharmony_ci} 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_cistatic inline void *crypto_shash_ctx_aligned(struct crypto_shash *tfm) 27362306a36Sopenharmony_ci{ 27462306a36Sopenharmony_ci return crypto_tfm_ctx_aligned(&tfm->base); 27562306a36Sopenharmony_ci} 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_cistatic inline struct crypto_shash *__crypto_shash_cast(struct crypto_tfm *tfm) 27862306a36Sopenharmony_ci{ 27962306a36Sopenharmony_ci return container_of(tfm, struct crypto_shash, base); 28062306a36Sopenharmony_ci} 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_ci#endif /* _CRYPTO_INTERNAL_HASH_H */ 28362306a36Sopenharmony_ci 284