Commit 7eddf95e authored by Herbert Xu's avatar Herbert Xu

crypto: shash - Export async functions

This patch exports the async functions so that they can be reused
by cryptd when it switches over to using shash.
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 6941c3a0
...@@ -202,9 +202,8 @@ static int shash_async_init(struct ahash_request *req) ...@@ -202,9 +202,8 @@ static int shash_async_init(struct ahash_request *req)
return crypto_shash_init(desc); return crypto_shash_init(desc);
} }
static int shash_async_update(struct ahash_request *req) int shash_ahash_update(struct ahash_request *req, struct shash_desc *desc)
{ {
struct shash_desc *desc = ahash_request_ctx(req);
struct crypto_hash_walk walk; struct crypto_hash_walk walk;
int nbytes; int nbytes;
...@@ -214,13 +213,19 @@ static int shash_async_update(struct ahash_request *req) ...@@ -214,13 +213,19 @@ static int shash_async_update(struct ahash_request *req)
return nbytes; return nbytes;
} }
EXPORT_SYMBOL_GPL(shash_ahash_update);
static int shash_async_update(struct ahash_request *req)
{
return shash_ahash_update(req, ahash_request_ctx(req));
}
static int shash_async_final(struct ahash_request *req) static int shash_async_final(struct ahash_request *req)
{ {
return crypto_shash_final(ahash_request_ctx(req), req->result); return crypto_shash_final(ahash_request_ctx(req), req->result);
} }
static int shash_async_digest(struct ahash_request *req) int shash_ahash_digest(struct ahash_request *req, struct shash_desc *desc)
{ {
struct scatterlist *sg = req->src; struct scatterlist *sg = req->src;
unsigned int offset = sg->offset; unsigned int offset = sg->offset;
...@@ -228,34 +233,31 @@ static int shash_async_digest(struct ahash_request *req) ...@@ -228,34 +233,31 @@ static int shash_async_digest(struct ahash_request *req)
int err; int err;
if (nbytes < min(sg->length, ((unsigned int)(PAGE_SIZE)) - offset)) { if (nbytes < min(sg->length, ((unsigned int)(PAGE_SIZE)) - offset)) {
struct crypto_shash **ctx =
crypto_ahash_ctx(crypto_ahash_reqtfm(req));
struct shash_desc *desc = ahash_request_ctx(req);
void *data; void *data;
desc->tfm = *ctx;
desc->flags = req->base.flags;
data = crypto_kmap(sg_page(sg), 0); data = crypto_kmap(sg_page(sg), 0);
err = crypto_shash_digest(desc, data + offset, nbytes, err = crypto_shash_digest(desc, data + offset, nbytes,
req->result); req->result);
crypto_kunmap(data, 0); crypto_kunmap(data, 0);
crypto_yield(desc->flags); crypto_yield(desc->flags);
goto out; } else
} err = crypto_shash_init(desc) ?:
shash_ahash_update(req, desc) ?:
crypto_shash_final(desc, req->result);
err = shash_async_init(req); return err;
if (err) }
goto out; EXPORT_SYMBOL_GPL(shash_ahash_digest);
err = shash_async_update(req); static int shash_async_digest(struct ahash_request *req)
if (err) {
goto out; struct crypto_shash **ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(req));
struct shash_desc *desc = ahash_request_ctx(req);
err = shash_async_final(req); desc->tfm = *ctx;
desc->flags = req->base.flags;
out: return shash_ahash_digest(req, desc);
return err;
} }
static void crypto_exit_shash_ops_async(struct crypto_tfm *tfm) static void crypto_exit_shash_ops_async(struct crypto_tfm *tfm)
......
...@@ -63,6 +63,9 @@ int crypto_init_shash_spawn(struct crypto_shash_spawn *spawn, ...@@ -63,6 +63,9 @@ int crypto_init_shash_spawn(struct crypto_shash_spawn *spawn,
struct shash_alg *shash_attr_alg(struct rtattr *rta, u32 type, u32 mask); struct shash_alg *shash_attr_alg(struct rtattr *rta, u32 type, u32 mask);
int shash_ahash_update(struct ahash_request *req, struct shash_desc *desc);
int shash_ahash_digest(struct ahash_request *req, struct shash_desc *desc);
static inline void *crypto_ahash_ctx(struct crypto_ahash *tfm) static inline void *crypto_ahash_ctx(struct crypto_ahash *tfm)
{ {
return crypto_tfm_ctx(&tfm->base); return crypto_tfm_ctx(&tfm->base);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment