diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2007-12-12 14:16:38 +0300 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2008-01-11 00:16:40 +0300 |
commit | 2589469d7bc69bdfad4e05d88a0d2748f92ef0f3 (patch) | |
tree | 40103b6e4b2e36be3bf9b47df5eeafe885fe15b2 /crypto/gcm.c | |
parent | 68b6c7d6919be7c732fc6229c55e35d0166e9258 (diff) | |
download | linux-2589469d7bc69bdfad4e05d88a0d2748f92ef0f3.tar.xz |
[CRYPTO] gcm: Fix request context alignment
This patch fixes the request context alignment so that it is actually
aligned to the value required by the algorithm.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto/gcm.c')
-rw-r--r-- | crypto/gcm.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/crypto/gcm.c b/crypto/gcm.c index 73565d607ee7..08183171913c 100644 --- a/crypto/gcm.c +++ b/crypto/gcm.c @@ -43,6 +43,14 @@ struct crypto_gcm_req_priv_ctx { struct ablkcipher_request abreq; }; +static inline struct crypto_gcm_req_priv_ctx *crypto_gcm_reqctx( + struct aead_request *req) +{ + unsigned long align = crypto_aead_alignmask(crypto_aead_reqtfm(req)); + + return (void *)PTR_ALIGN((u8 *)aead_request_ctx(req), align + 1); +} + static void crypto_gcm_ghash_init(struct crypto_gcm_ghash_ctx *ctx, u32 flags, struct gf128mul_4k *gf128) { @@ -224,7 +232,7 @@ static int crypto_gcm_init_crypt(struct ablkcipher_request *ablk_req, { struct crypto_aead *aead = crypto_aead_reqtfm(req); struct crypto_gcm_ctx *ctx = crypto_aead_ctx(aead); - struct crypto_gcm_req_priv_ctx *pctx = aead_request_ctx(req); + struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); u32 flags = req->base.tfm->crt_flags; u8 *auth_tag = pctx->auth_tag; u8 *counter = pctx->counter; @@ -256,7 +264,7 @@ static int crypto_gcm_init_crypt(struct ablkcipher_request *ablk_req, static int crypto_gcm_hash(struct aead_request *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 = crypto_gcm_reqctx(req); u8 *auth_tag = pctx->auth_tag; struct crypto_gcm_ghash_ctx *ghash = &pctx->ghash; @@ -281,7 +289,7 @@ static void crypto_gcm_encrypt_done(struct crypto_async_request *areq, int err) static int crypto_gcm_encrypt(struct aead_request *req) { - struct crypto_gcm_req_priv_ctx *pctx = aead_request_ctx(req); + struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); struct ablkcipher_request *abreq = &pctx->abreq; int err = 0; @@ -307,7 +315,7 @@ static void crypto_gcm_decrypt_done(struct crypto_async_request *areq, int err) static int crypto_gcm_decrypt(struct aead_request *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 = crypto_gcm_reqctx(req); struct ablkcipher_request *abreq = &pctx->abreq; u8 *auth_tag = pctx->auth_tag; u8 *iauth_tag = pctx->iauth_tag; @@ -352,8 +360,7 @@ static int crypto_gcm_init_tfm(struct crypto_tfm *tfm) ctx->ctr = ctr; ctx->gf128 = NULL; - align = max_t(unsigned long, crypto_ablkcipher_alignmask(ctr), - __alignof__(u32) - 1); + align = crypto_tfm_alg_alignmask(tfm); align &= ~(crypto_tfm_ctx_alignment() - 1); tfm->crt_aead.reqsize = align + sizeof(struct crypto_gcm_req_priv_ctx) + @@ -428,7 +435,7 @@ static struct crypto_instance *crypto_gcm_alloc(struct rtattr **tb) inst->alg.cra_flags = CRYPTO_ALG_TYPE_AEAD | CRYPTO_ALG_ASYNC; inst->alg.cra_priority = ctr->cra_priority; inst->alg.cra_blocksize = 16; - inst->alg.cra_alignmask = __alignof__(u32) - 1; + inst->alg.cra_alignmask = ctr->cra_alignmask | (__alignof__(u64) - 1); inst->alg.cra_type = &crypto_aead_type; inst->alg.cra_aead.ivsize = 12; inst->alg.cra_aead.maxauthsize = 16; |