Commit 36f87a4a29cb8cd291169483079fde34bad4ef16
Committed by
Herbert Xu
1 parent
4e4ed83be6
crypto: xcbc - Fix alignment calculation of xcbc_tfm_ctx
The alignment calculation of xcbc_tfm_ctx uses alg->cra_alignmask and not alg->cra_alignmask + 1 as it should. This led to frequent crashes during the selftest of xcbc(aes-asm) on x86_64 machines. This patch fixes this. Also we use the alignmask of xcbc and not the alignmask of the underlying algorithm for the alignmnent calculation in xcbc_create now. Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Showing 1 changed file with 5 additions and 3 deletions Side-by-side Diff
crypto/xcbc.c
... | ... | @@ -199,6 +199,7 @@ |
199 | 199 | { |
200 | 200 | struct shash_instance *inst; |
201 | 201 | struct crypto_alg *alg; |
202 | + unsigned long alignmask; | |
202 | 203 | int err; |
203 | 204 | |
204 | 205 | err = crypto_check_attr_type(tb, CRYPTO_ALG_TYPE_SHASH); |
205 | 206 | |
206 | 207 | |
207 | 208 | |
... | ... | @@ -228,19 +229,20 @@ |
228 | 229 | if (err) |
229 | 230 | goto out_free_inst; |
230 | 231 | |
232 | + alignmask = alg->cra_alignmask | 3; | |
233 | + inst->alg.base.cra_alignmask = alignmask; | |
231 | 234 | inst->alg.base.cra_priority = alg->cra_priority; |
232 | 235 | inst->alg.base.cra_blocksize = alg->cra_blocksize; |
233 | - inst->alg.base.cra_alignmask = alg->cra_alignmask | 3; | |
234 | 236 | |
235 | 237 | inst->alg.digestsize = alg->cra_blocksize; |
236 | 238 | inst->alg.descsize = ALIGN(sizeof(struct xcbc_desc_ctx), |
237 | 239 | crypto_tfm_ctx_alignment()) + |
238 | - (alg->cra_alignmask & | |
240 | + (alignmask & | |
239 | 241 | ~(crypto_tfm_ctx_alignment() - 1)) + |
240 | 242 | alg->cra_blocksize * 2; |
241 | 243 | |
242 | 244 | inst->alg.base.cra_ctxsize = ALIGN(sizeof(struct xcbc_tfm_ctx), |
243 | - alg->cra_alignmask) + | |
245 | + alignmask + 1) + | |
244 | 246 | alg->cra_blocksize * 2; |
245 | 247 | inst->alg.base.cra_init = xcbc_init_tfm; |
246 | 248 | inst->alg.base.cra_exit = xcbc_exit_tfm; |