Skip to content

Commit

Permalink
crypto: shash - Export async functions
Browse files Browse the repository at this point in the history
This patch exports the async functions so that they can be reused
by cryptd when it switches over to using shash.

Signed-off-by: Herbert Xu <[email protected]>
  • Loading branch information
herbertx committed Jul 14, 2009
1 parent 6941c3a commit 7eddf95
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 20 deletions.
42 changes: 22 additions & 20 deletions crypto/shash.c
Original file line number Diff line number Diff line change
Expand Up @@ -202,9 +202,8 @@ static int shash_async_init(struct ahash_request *req)
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;
int nbytes;

Expand All @@ -214,48 +213,51 @@ static int shash_async_update(struct ahash_request *req)

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)
{
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;
unsigned int offset = sg->offset;
unsigned int nbytes = req->nbytes;
int err;

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;

desc->tfm = *ctx;
desc->flags = req->base.flags;

data = crypto_kmap(sg_page(sg), 0);
err = crypto_shash_digest(desc, data + offset, nbytes,
req->result);
crypto_kunmap(data, 0);
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);
if (err)
goto out;
return err;
}
EXPORT_SYMBOL_GPL(shash_ahash_digest);

err = shash_async_update(req);
if (err)
goto out;
static int shash_async_digest(struct ahash_request *req)
{
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 err;
return shash_ahash_digest(req, desc);
}

static void crypto_exit_shash_ops_async(struct crypto_tfm *tfm)
Expand Down
3 changes: 3 additions & 0 deletions include/crypto/internal/hash.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

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)
{
return crypto_tfm_ctx(&tfm->base);
Expand Down

0 comments on commit 7eddf95

Please sign in to comment.