diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-11-06 12:05:03 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-11-06 12:05:03 -0500 |
| commit | af903dcd31e1b345d858ca2af9a84ed61c960b57 (patch) | |
| tree | d355ee40aa413a22e45df97ac1a3527aa8eacd37 | |
| parent | 39dae59d66acd86d1de24294bd2f343fd5e7a625 (diff) | |
| parent | 441f99c90497e15aa3ad1dbabd56187e29614348 (diff) | |
Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
Pull crypto fixes from Herbert Xu:
"This fixes an unaligned panic in x86/sha-mb and a bug in ccm that
triggers with certain underlying implementations"
* 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6:
crypto: ccm - preserve the IV buffer
crypto: x86/sha1-mb - fix panic due to unaligned access
crypto: x86/sha256-mb - fix panic due to unaligned access
| -rw-r--r-- | arch/x86/crypto/sha1-mb/sha1_mb_mgr_flush_avx2.S | 12 | ||||
| -rw-r--r-- | arch/x86/crypto/sha256-mb/sha256_mb_mgr_flush_avx2.S | 12 | ||||
| -rw-r--r-- | crypto/ccm.c | 4 |
3 files changed, 15 insertions, 13 deletions
diff --git a/arch/x86/crypto/sha1-mb/sha1_mb_mgr_flush_avx2.S b/arch/x86/crypto/sha1-mb/sha1_mb_mgr_flush_avx2.S index 93b945597ecf..7cfba738f104 100644 --- a/arch/x86/crypto/sha1-mb/sha1_mb_mgr_flush_avx2.S +++ b/arch/x86/crypto/sha1-mb/sha1_mb_mgr_flush_avx2.S | |||
| @@ -157,8 +157,8 @@ LABEL skip_ %I | |||
| 157 | .endr | 157 | .endr |
| 158 | 158 | ||
| 159 | # Find min length | 159 | # Find min length |
| 160 | vmovdqa _lens+0*16(state), %xmm0 | 160 | vmovdqu _lens+0*16(state), %xmm0 |
| 161 | vmovdqa _lens+1*16(state), %xmm1 | 161 | vmovdqu _lens+1*16(state), %xmm1 |
| 162 | 162 | ||
| 163 | vpminud %xmm1, %xmm0, %xmm2 # xmm2 has {D,C,B,A} | 163 | vpminud %xmm1, %xmm0, %xmm2 # xmm2 has {D,C,B,A} |
| 164 | vpalignr $8, %xmm2, %xmm3, %xmm3 # xmm3 has {x,x,D,C} | 164 | vpalignr $8, %xmm2, %xmm3, %xmm3 # xmm3 has {x,x,D,C} |
| @@ -178,8 +178,8 @@ LABEL skip_ %I | |||
| 178 | vpsubd %xmm2, %xmm0, %xmm0 | 178 | vpsubd %xmm2, %xmm0, %xmm0 |
| 179 | vpsubd %xmm2, %xmm1, %xmm1 | 179 | vpsubd %xmm2, %xmm1, %xmm1 |
| 180 | 180 | ||
| 181 | vmovdqa %xmm0, _lens+0*16(state) | 181 | vmovdqu %xmm0, _lens+0*16(state) |
| 182 | vmovdqa %xmm1, _lens+1*16(state) | 182 | vmovdqu %xmm1, _lens+1*16(state) |
| 183 | 183 | ||
| 184 | # "state" and "args" are the same address, arg1 | 184 | # "state" and "args" are the same address, arg1 |
| 185 | # len is arg2 | 185 | # len is arg2 |
| @@ -235,8 +235,8 @@ ENTRY(sha1_mb_mgr_get_comp_job_avx2) | |||
| 235 | jc .return_null | 235 | jc .return_null |
| 236 | 236 | ||
| 237 | # Find min length | 237 | # Find min length |
| 238 | vmovdqa _lens(state), %xmm0 | 238 | vmovdqu _lens(state), %xmm0 |
| 239 | vmovdqa _lens+1*16(state), %xmm1 | 239 | vmovdqu _lens+1*16(state), %xmm1 |
| 240 | 240 | ||
| 241 | vpminud %xmm1, %xmm0, %xmm2 # xmm2 has {D,C,B,A} | 241 | vpminud %xmm1, %xmm0, %xmm2 # xmm2 has {D,C,B,A} |
| 242 | vpalignr $8, %xmm2, %xmm3, %xmm3 # xmm3 has {x,x,D,C} | 242 | vpalignr $8, %xmm2, %xmm3, %xmm3 # xmm3 has {x,x,D,C} |
diff --git a/arch/x86/crypto/sha256-mb/sha256_mb_mgr_flush_avx2.S b/arch/x86/crypto/sha256-mb/sha256_mb_mgr_flush_avx2.S index 8fe6338bcc84..16c4ccb1f154 100644 --- a/arch/x86/crypto/sha256-mb/sha256_mb_mgr_flush_avx2.S +++ b/arch/x86/crypto/sha256-mb/sha256_mb_mgr_flush_avx2.S | |||
| @@ -155,8 +155,8 @@ LABEL skip_ %I | |||
| 155 | .endr | 155 | .endr |
| 156 | 156 | ||
| 157 | # Find min length | 157 | # Find min length |
| 158 | vmovdqa _lens+0*16(state), %xmm0 | 158 | vmovdqu _lens+0*16(state), %xmm0 |
| 159 | vmovdqa _lens+1*16(state), %xmm1 | 159 | vmovdqu _lens+1*16(state), %xmm1 |
| 160 | 160 | ||
| 161 | vpminud %xmm1, %xmm0, %xmm2 # xmm2 has {D,C,B,A} | 161 | vpminud %xmm1, %xmm0, %xmm2 # xmm2 has {D,C,B,A} |
| 162 | vpalignr $8, %xmm2, %xmm3, %xmm3 # xmm3 has {x,x,D,C} | 162 | vpalignr $8, %xmm2, %xmm3, %xmm3 # xmm3 has {x,x,D,C} |
| @@ -176,8 +176,8 @@ LABEL skip_ %I | |||
| 176 | vpsubd %xmm2, %xmm0, %xmm0 | 176 | vpsubd %xmm2, %xmm0, %xmm0 |
| 177 | vpsubd %xmm2, %xmm1, %xmm1 | 177 | vpsubd %xmm2, %xmm1, %xmm1 |
| 178 | 178 | ||
| 179 | vmovdqa %xmm0, _lens+0*16(state) | 179 | vmovdqu %xmm0, _lens+0*16(state) |
| 180 | vmovdqa %xmm1, _lens+1*16(state) | 180 | vmovdqu %xmm1, _lens+1*16(state) |
| 181 | 181 | ||
| 182 | # "state" and "args" are the same address, arg1 | 182 | # "state" and "args" are the same address, arg1 |
| 183 | # len is arg2 | 183 | # len is arg2 |
| @@ -234,8 +234,8 @@ ENTRY(sha256_mb_mgr_get_comp_job_avx2) | |||
| 234 | jc .return_null | 234 | jc .return_null |
| 235 | 235 | ||
| 236 | # Find min length | 236 | # Find min length |
| 237 | vmovdqa _lens(state), %xmm0 | 237 | vmovdqu _lens(state), %xmm0 |
| 238 | vmovdqa _lens+1*16(state), %xmm1 | 238 | vmovdqu _lens+1*16(state), %xmm1 |
| 239 | 239 | ||
| 240 | vpminud %xmm1, %xmm0, %xmm2 # xmm2 has {D,C,B,A} | 240 | vpminud %xmm1, %xmm0, %xmm2 # xmm2 has {D,C,B,A} |
| 241 | vpalignr $8, %xmm2, %xmm3, %xmm3 # xmm3 has {x,x,D,C} | 241 | vpalignr $8, %xmm2, %xmm3, %xmm3 # xmm3 has {x,x,D,C} |
diff --git a/crypto/ccm.c b/crypto/ccm.c index 1ce37ae0ce56..0a083342ec8c 100644 --- a/crypto/ccm.c +++ b/crypto/ccm.c | |||
| @@ -363,7 +363,7 @@ static int crypto_ccm_decrypt(struct aead_request *req) | |||
| 363 | unsigned int cryptlen = req->cryptlen; | 363 | unsigned int cryptlen = req->cryptlen; |
| 364 | u8 *authtag = pctx->auth_tag; | 364 | u8 *authtag = pctx->auth_tag; |
| 365 | u8 *odata = pctx->odata; | 365 | u8 *odata = pctx->odata; |
| 366 | u8 *iv = req->iv; | 366 | u8 *iv = pctx->idata; |
| 367 | int err; | 367 | int err; |
| 368 | 368 | ||
| 369 | cryptlen -= authsize; | 369 | cryptlen -= authsize; |
| @@ -379,6 +379,8 @@ static int crypto_ccm_decrypt(struct aead_request *req) | |||
| 379 | if (req->src != req->dst) | 379 | if (req->src != req->dst) |
| 380 | dst = pctx->dst; | 380 | dst = pctx->dst; |
| 381 | 381 | ||
| 382 | memcpy(iv, req->iv, 16); | ||
| 383 | |||
| 382 | skcipher_request_set_tfm(skreq, ctx->ctr); | 384 | skcipher_request_set_tfm(skreq, ctx->ctr); |
| 383 | skcipher_request_set_callback(skreq, pctx->flags, | 385 | skcipher_request_set_callback(skreq, pctx->flags, |
| 384 | crypto_ccm_decrypt_done, req); | 386 | crypto_ccm_decrypt_done, req); |
