|
@@ -40,6 +40,7 @@ struct crypto_gcm_req_priv_ctx {
|
|
u8 iauth_tag[16];
|
|
u8 iauth_tag[16];
|
|
u8 counter[16];
|
|
u8 counter[16];
|
|
struct crypto_gcm_ghash_ctx ghash;
|
|
struct crypto_gcm_ghash_ctx ghash;
|
|
|
|
+ struct ablkcipher_request abreq;
|
|
};
|
|
};
|
|
|
|
|
|
static void crypto_gcm_ghash_init(struct crypto_gcm_ghash_ctx *ctx, u32 flags,
|
|
static void crypto_gcm_ghash_init(struct crypto_gcm_ghash_ctx *ctx, u32 flags,
|
|
@@ -280,16 +281,17 @@ static void crypto_gcm_encrypt_done(struct crypto_async_request *areq, int err)
|
|
|
|
|
|
static int crypto_gcm_encrypt(struct aead_request *req)
|
|
static int crypto_gcm_encrypt(struct aead_request *req)
|
|
{
|
|
{
|
|
- struct ablkcipher_request abreq;
|
|
|
|
|
|
+ struct crypto_gcm_req_priv_ctx *pctx = aead_request_ctx(req);
|
|
|
|
+ struct ablkcipher_request *abreq = &pctx->abreq;
|
|
int err = 0;
|
|
int err = 0;
|
|
|
|
|
|
- err = crypto_gcm_init_crypt(&abreq, req, req->cryptlen,
|
|
|
|
|
|
+ err = crypto_gcm_init_crypt(abreq, req, req->cryptlen,
|
|
crypto_gcm_encrypt_done);
|
|
crypto_gcm_encrypt_done);
|
|
if (err)
|
|
if (err)
|
|
return err;
|
|
return err;
|
|
|
|
|
|
if (req->cryptlen) {
|
|
if (req->cryptlen) {
|
|
- err = crypto_ablkcipher_encrypt(&abreq);
|
|
|
|
|
|
+ err = crypto_ablkcipher_encrypt(abreq);
|
|
if (err)
|
|
if (err)
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
@@ -304,9 +306,9 @@ static void crypto_gcm_decrypt_done(struct crypto_async_request *areq, int err)
|
|
|
|
|
|
static int crypto_gcm_decrypt(struct aead_request *req)
|
|
static int crypto_gcm_decrypt(struct aead_request *req)
|
|
{
|
|
{
|
|
- struct ablkcipher_request abreq;
|
|
|
|
struct crypto_aead *aead = crypto_aead_reqtfm(req);
|
|
struct crypto_aead *aead = crypto_aead_reqtfm(req);
|
|
struct crypto_gcm_req_priv_ctx *pctx = aead_request_ctx(req);
|
|
struct crypto_gcm_req_priv_ctx *pctx = aead_request_ctx(req);
|
|
|
|
+ struct ablkcipher_request *abreq = &pctx->abreq;
|
|
u8 *auth_tag = pctx->auth_tag;
|
|
u8 *auth_tag = pctx->auth_tag;
|
|
u8 *iauth_tag = pctx->iauth_tag;
|
|
u8 *iauth_tag = pctx->iauth_tag;
|
|
struct crypto_gcm_ghash_ctx *ghash = &pctx->ghash;
|
|
struct crypto_gcm_ghash_ctx *ghash = &pctx->ghash;
|
|
@@ -318,7 +320,7 @@ static int crypto_gcm_decrypt(struct aead_request *req)
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
cryptlen -= authsize;
|
|
cryptlen -= authsize;
|
|
|
|
|
|
- err = crypto_gcm_init_crypt(&abreq, req, cryptlen,
|
|
|
|
|
|
+ err = crypto_gcm_init_crypt(abreq, req, cryptlen,
|
|
crypto_gcm_decrypt_done);
|
|
crypto_gcm_decrypt_done);
|
|
if (err)
|
|
if (err)
|
|
return err;
|
|
return err;
|
|
@@ -330,7 +332,7 @@ static int crypto_gcm_decrypt(struct aead_request *req)
|
|
if (memcmp(iauth_tag, auth_tag, authsize))
|
|
if (memcmp(iauth_tag, auth_tag, authsize))
|
|
return -EBADMSG;
|
|
return -EBADMSG;
|
|
|
|
|
|
- return crypto_ablkcipher_decrypt(&abreq);
|
|
|
|
|
|
+ return crypto_ablkcipher_decrypt(abreq);
|
|
}
|
|
}
|
|
|
|
|
|
static int crypto_gcm_init_tfm(struct crypto_tfm *tfm)
|
|
static int crypto_gcm_init_tfm(struct crypto_tfm *tfm)
|
|
@@ -353,7 +355,9 @@ static int crypto_gcm_init_tfm(struct crypto_tfm *tfm)
|
|
align = max_t(unsigned long, crypto_ablkcipher_alignmask(ctr),
|
|
align = max_t(unsigned long, crypto_ablkcipher_alignmask(ctr),
|
|
__alignof__(u32) - 1);
|
|
__alignof__(u32) - 1);
|
|
align &= ~(crypto_tfm_ctx_alignment() - 1);
|
|
align &= ~(crypto_tfm_ctx_alignment() - 1);
|
|
- tfm->crt_aead.reqsize = align + sizeof(struct crypto_gcm_req_priv_ctx);
|
|
|
|
|
|
+ tfm->crt_aead.reqsize = align +
|
|
|
|
+ sizeof(struct crypto_gcm_req_priv_ctx) +
|
|
|
|
+ crypto_ablkcipher_reqsize(ctr);
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|