crypto: skcipher - Add separate walker for AEAD decryption
The AEAD decrypt interface includes the authentication tag in req->cryptlen. Therefore we need to exlucde that when doing a walk over it. This patch adds separate walker functions for AEAD encryption and decryption. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
This commit is contained in:
parent
81126d1a8b
commit
34bc085c83
|
@ -500,8 +500,8 @@ int skcipher_walk_async(struct skcipher_walk *walk,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(skcipher_walk_async);
|
EXPORT_SYMBOL_GPL(skcipher_walk_async);
|
||||||
|
|
||||||
int skcipher_walk_aead(struct skcipher_walk *walk, struct aead_request *req,
|
static int skcipher_walk_aead_common(struct skcipher_walk *walk,
|
||||||
bool atomic)
|
struct aead_request *req, bool atomic)
|
||||||
{
|
{
|
||||||
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
|
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
|
||||||
int err;
|
int err;
|
||||||
|
@ -514,7 +514,6 @@ int skcipher_walk_aead(struct skcipher_walk *walk, struct aead_request *req,
|
||||||
scatterwalk_copychunks(NULL, &walk->in, req->assoclen, 2);
|
scatterwalk_copychunks(NULL, &walk->in, req->assoclen, 2);
|
||||||
scatterwalk_copychunks(NULL, &walk->out, req->assoclen, 2);
|
scatterwalk_copychunks(NULL, &walk->out, req->assoclen, 2);
|
||||||
|
|
||||||
walk->total = req->cryptlen;
|
|
||||||
walk->iv = req->iv;
|
walk->iv = req->iv;
|
||||||
walk->oiv = req->iv;
|
walk->oiv = req->iv;
|
||||||
|
|
||||||
|
@ -535,8 +534,36 @@ int skcipher_walk_aead(struct skcipher_walk *walk, struct aead_request *req,
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int skcipher_walk_aead(struct skcipher_walk *walk, struct aead_request *req,
|
||||||
|
bool atomic)
|
||||||
|
{
|
||||||
|
walk->total = req->cryptlen;
|
||||||
|
|
||||||
|
return skcipher_walk_aead_common(walk, req, atomic);
|
||||||
|
}
|
||||||
EXPORT_SYMBOL_GPL(skcipher_walk_aead);
|
EXPORT_SYMBOL_GPL(skcipher_walk_aead);
|
||||||
|
|
||||||
|
int skcipher_walk_aead_encrypt(struct skcipher_walk *walk,
|
||||||
|
struct aead_request *req, bool atomic)
|
||||||
|
{
|
||||||
|
walk->total = req->cryptlen;
|
||||||
|
|
||||||
|
return skcipher_walk_aead_common(walk, req, atomic);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(skcipher_walk_aead_encrypt);
|
||||||
|
|
||||||
|
int skcipher_walk_aead_decrypt(struct skcipher_walk *walk,
|
||||||
|
struct aead_request *req, bool atomic)
|
||||||
|
{
|
||||||
|
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
|
||||||
|
|
||||||
|
walk->total = req->cryptlen - crypto_aead_authsize(tfm);
|
||||||
|
|
||||||
|
return skcipher_walk_aead_common(walk, req, atomic);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(skcipher_walk_aead_decrypt);
|
||||||
|
|
||||||
static unsigned int crypto_skcipher_extsize(struct crypto_alg *alg)
|
static unsigned int crypto_skcipher_extsize(struct crypto_alg *alg)
|
||||||
{
|
{
|
||||||
if (alg->cra_type == &crypto_blkcipher_type)
|
if (alg->cra_type == &crypto_blkcipher_type)
|
||||||
|
|
|
@ -149,6 +149,10 @@ int skcipher_walk_async(struct skcipher_walk *walk,
|
||||||
struct skcipher_request *req);
|
struct skcipher_request *req);
|
||||||
int skcipher_walk_aead(struct skcipher_walk *walk, struct aead_request *req,
|
int skcipher_walk_aead(struct skcipher_walk *walk, struct aead_request *req,
|
||||||
bool atomic);
|
bool atomic);
|
||||||
|
int skcipher_walk_aead_encrypt(struct skcipher_walk *walk,
|
||||||
|
struct aead_request *req, bool atomic);
|
||||||
|
int skcipher_walk_aead_decrypt(struct skcipher_walk *walk,
|
||||||
|
struct aead_request *req, bool atomic);
|
||||||
void skcipher_walk_complete(struct skcipher_walk *walk, int err);
|
void skcipher_walk_complete(struct skcipher_walk *walk, int err);
|
||||||
|
|
||||||
static inline void ablkcipher_request_complete(struct ablkcipher_request *req,
|
static inline void ablkcipher_request_complete(struct ablkcipher_request *req,
|
||||||
|
|
Loading…
Reference in New Issue