aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-11-06 12:05:03 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2017-11-06 12:05:03 -0500
commitaf903dcd31e1b345d858ca2af9a84ed61c960b57 (patch)
treed355ee40aa413a22e45df97ac1a3527aa8eacd37
parent39dae59d66acd86d1de24294bd2f343fd5e7a625 (diff)
parent441f99c90497e15aa3ad1dbabd56187e29614348 (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.S12
-rw-r--r--arch/x86/crypto/sha256-mb/sha256_mb_mgr_flush_avx2.S12
-rw-r--r--crypto/ccm.c4
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);