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

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
Loading
Loading
Loading
Loading
+22 −20
Original line number Diff line number Diff line
@@ -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;

@@ -214,13 +213,19 @@ 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;
@@ -228,34 +233,31 @@ static int shash_async_digest(struct ahash_request *req)
	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)
+3 −0
Original line number Diff line number Diff line
@@ -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);