Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

+15 -13
+6 -6
arch/x86/crypto/sha1-mb/sha1_mb_mgr_flush_avx2.S
··· 157 157 .endr 158 158 159 159 # Find min length 160 - vmovdqa _lens+0*16(state), %xmm0 161 - vmovdqa _lens+1*16(state), %xmm1 160 + vmovdqu _lens+0*16(state), %xmm0 161 + vmovdqu _lens+1*16(state), %xmm1 162 162 163 163 vpminud %xmm1, %xmm0, %xmm2 # xmm2 has {D,C,B,A} 164 164 vpalignr $8, %xmm2, %xmm3, %xmm3 # xmm3 has {x,x,D,C} ··· 178 178 vpsubd %xmm2, %xmm0, %xmm0 179 179 vpsubd %xmm2, %xmm1, %xmm1 180 180 181 - vmovdqa %xmm0, _lens+0*16(state) 182 - vmovdqa %xmm1, _lens+1*16(state) 181 + vmovdqu %xmm0, _lens+0*16(state) 182 + vmovdqu %xmm1, _lens+1*16(state) 183 183 184 184 # "state" and "args" are the same address, arg1 185 185 # len is arg2 ··· 235 235 jc .return_null 236 236 237 237 # Find min length 238 - vmovdqa _lens(state), %xmm0 239 - vmovdqa _lens+1*16(state), %xmm1 238 + vmovdqu _lens(state), %xmm0 239 + vmovdqu _lens+1*16(state), %xmm1 240 240 241 241 vpminud %xmm1, %xmm0, %xmm2 # xmm2 has {D,C,B,A} 242 242 vpalignr $8, %xmm2, %xmm3, %xmm3 # xmm3 has {x,x,D,C}
+6 -6
arch/x86/crypto/sha256-mb/sha256_mb_mgr_flush_avx2.S
··· 155 155 .endr 156 156 157 157 # Find min length 158 - vmovdqa _lens+0*16(state), %xmm0 159 - vmovdqa _lens+1*16(state), %xmm1 158 + vmovdqu _lens+0*16(state), %xmm0 159 + vmovdqu _lens+1*16(state), %xmm1 160 160 161 161 vpminud %xmm1, %xmm0, %xmm2 # xmm2 has {D,C,B,A} 162 162 vpalignr $8, %xmm2, %xmm3, %xmm3 # xmm3 has {x,x,D,C} ··· 176 176 vpsubd %xmm2, %xmm0, %xmm0 177 177 vpsubd %xmm2, %xmm1, %xmm1 178 178 179 - vmovdqa %xmm0, _lens+0*16(state) 180 - vmovdqa %xmm1, _lens+1*16(state) 179 + vmovdqu %xmm0, _lens+0*16(state) 180 + vmovdqu %xmm1, _lens+1*16(state) 181 181 182 182 # "state" and "args" are the same address, arg1 183 183 # len is arg2 ··· 234 234 jc .return_null 235 235 236 236 # Find min length 237 - vmovdqa _lens(state), %xmm0 238 - vmovdqa _lens+1*16(state), %xmm1 237 + vmovdqu _lens(state), %xmm0 238 + vmovdqu _lens+1*16(state), %xmm1 239 239 240 240 vpminud %xmm1, %xmm0, %xmm2 # xmm2 has {D,C,B,A} 241 241 vpalignr $8, %xmm2, %xmm3, %xmm3 # xmm3 has {x,x,D,C}
+3 -1
crypto/ccm.c
··· 363 363 unsigned int cryptlen = req->cryptlen; 364 364 u8 *authtag = pctx->auth_tag; 365 365 u8 *odata = pctx->odata; 366 - u8 *iv = req->iv; 366 + u8 *iv = pctx->idata; 367 367 int err; 368 368 369 369 cryptlen -= authsize; ··· 378 378 dst = pctx->src; 379 379 if (req->src != req->dst) 380 380 dst = pctx->dst; 381 + 382 + memcpy(iv, req->iv, 16); 381 383 382 384 skcipher_request_set_tfm(skreq, ctx->ctr); 383 385 skcipher_request_set_callback(skreq, pctx->flags,