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

Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6

Merge the crypto tree to pull in chelsio chcr fix.

+48 -17
+1
crypto/Makefile
··· 40 40 41 41 $(obj)/rsapubkey-asn1.o: $(obj)/rsapubkey-asn1.c $(obj)/rsapubkey-asn1.h 42 42 $(obj)/rsaprivkey-asn1.o: $(obj)/rsaprivkey-asn1.c $(obj)/rsaprivkey-asn1.h 43 + $(obj)/rsa_helper.o: $(obj)/rsapubkey-asn1.h $(obj)/rsaprivkey-asn1.h 43 44 clean-files += rsapubkey-asn1.c rsapubkey-asn1.h 44 45 clean-files += rsaprivkey-asn1.c rsaprivkey-asn1.h 45 46
+10 -7
crypto/algif_hash.c
··· 214 214 215 215 ahash_request_set_crypt(&ctx->req, NULL, ctx->result, 0); 216 216 217 - if (ctx->more) { 217 + if (!result && !ctx->more) { 218 + err = af_alg_wait_for_completion( 219 + crypto_ahash_init(&ctx->req), 220 + &ctx->completion); 221 + if (err) 222 + goto unlock; 223 + } 224 + 225 + if (!result || ctx->more) { 218 226 ctx->more = 0; 219 227 err = af_alg_wait_for_completion(crypto_ahash_final(&ctx->req), 220 228 &ctx->completion); 221 229 if (err) 222 230 goto unlock; 223 - } else if (!result) { 224 - err = af_alg_wait_for_completion( 225 - crypto_ahash_digest(&ctx->req), 226 - &ctx->completion); 227 231 } 228 232 229 233 err = memcpy_to_msg(msg, ctx->result, len); 230 234 231 - hash_free_result(sk, ctx); 232 - 233 235 unlock: 236 + hash_free_result(sk, ctx); 234 237 release_sock(sk); 235 238 236 239 return err ?: len;
+24 -5
crypto/drbg.c
··· 262 262 u8 *inbuf, u32 inbuflen, 263 263 u8 *outbuf, u32 outlen); 264 264 #define DRBG_CTR_NULL_LEN 128 265 + #define DRBG_OUTSCRATCHLEN DRBG_CTR_NULL_LEN 265 266 266 267 /* BCC function for CTR DRBG as defined in 10.4.3 */ 267 268 static int drbg_ctr_bcc(struct drbg_state *drbg, ··· 1645 1644 kfree(drbg->ctr_null_value_buf); 1646 1645 drbg->ctr_null_value = NULL; 1647 1646 1647 + kfree(drbg->outscratchpadbuf); 1648 + drbg->outscratchpadbuf = NULL; 1649 + 1648 1650 return 0; 1649 1651 } 1650 1652 ··· 1712 1708 drbg->ctr_null_value = (u8 *)PTR_ALIGN(drbg->ctr_null_value_buf, 1713 1709 alignmask + 1); 1714 1710 1711 + drbg->outscratchpadbuf = kmalloc(DRBG_OUTSCRATCHLEN + alignmask, 1712 + GFP_KERNEL); 1713 + if (!drbg->outscratchpadbuf) { 1714 + drbg_fini_sym_kernel(drbg); 1715 + return -ENOMEM; 1716 + } 1717 + drbg->outscratchpad = (u8 *)PTR_ALIGN(drbg->outscratchpadbuf, 1718 + alignmask + 1); 1719 + 1715 1720 return alignmask; 1716 1721 } 1717 1722 ··· 1750 1737 u8 *outbuf, u32 outlen) 1751 1738 { 1752 1739 struct scatterlist sg_in; 1740 + int ret; 1753 1741 1754 1742 sg_init_one(&sg_in, inbuf, inlen); 1755 1743 1756 1744 while (outlen) { 1757 - u32 cryptlen = min_t(u32, inlen, outlen); 1745 + u32 cryptlen = min3(inlen, outlen, (u32)DRBG_OUTSCRATCHLEN); 1758 1746 struct scatterlist sg_out; 1759 - int ret; 1760 1747 1761 - sg_init_one(&sg_out, outbuf, cryptlen); 1748 + /* Output buffer may not be valid for SGL, use scratchpad */ 1749 + sg_init_one(&sg_out, drbg->outscratchpad, cryptlen); 1762 1750 skcipher_request_set_crypt(drbg->ctr_req, &sg_in, &sg_out, 1763 1751 cryptlen, drbg->V); 1764 1752 ret = crypto_skcipher_encrypt(drbg->ctr_req); ··· 1775 1761 break; 1776 1762 } 1777 1763 default: 1778 - return ret; 1764 + goto out; 1779 1765 } 1780 1766 init_completion(&drbg->ctr_completion); 1767 + 1768 + memcpy(outbuf, drbg->outscratchpad, cryptlen); 1781 1769 1782 1770 outlen -= cryptlen; 1783 1771 outbuf += cryptlen; 1784 1772 } 1773 + ret = 0; 1785 1774 1786 - return 0; 1775 + out: 1776 + memzero_explicit(drbg->outscratchpad, DRBG_OUTSCRATCHLEN); 1777 + return ret; 1787 1778 } 1788 1779 #endif /* CONFIG_CRYPTO_DRBG_CTR */ 1789 1780
-4
crypto/scatterwalk.c
··· 68 68 69 69 sg = scatterwalk_ffwd(tmp, sg, start); 70 70 71 - if (sg_page(sg) == virt_to_page(buf) && 72 - sg->offset == offset_in_page(buf)) 73 - return; 74 - 75 71 scatterwalk_start(&walk, sg); 76 72 scatterwalk_copychunks(buf, &walk, nbytes, out); 77 73 scatterwalk_done(&walk, out, 0);
+9
drivers/crypto/caam/caamalg.c
··· 3568 3568 if (!aes_inst && (alg_sel == OP_ALG_ALGSEL_AES)) 3569 3569 continue; 3570 3570 3571 + /* 3572 + * Check support for AES modes not available 3573 + * on LP devices. 3574 + */ 3575 + if ((cha_vid & CHA_ID_LS_AES_MASK) == CHA_ID_LS_AES_LP) 3576 + if ((alg->class1_alg_type & OP_ALG_AAI_MASK) == 3577 + OP_ALG_AAI_XTS) 3578 + continue; 3579 + 3571 3580 t_alg = caam_alg_alloc(alg); 3572 3581 if (IS_ERR(t_alg)) { 3573 3582 err = PTR_ERR(t_alg);
+2 -1
drivers/crypto/chelsio/chcr_algo.h
··· 422 422 { 423 423 u32 temp; 424 424 u32 w_ring[MAX_NK]; 425 - int i, j, k = 0; 425 + int i, j, k; 426 426 u8 nr, nk; 427 427 428 428 switch (keylength) { ··· 460 460 temp = w_ring[i % nk]; 461 461 i++; 462 462 } 463 + i--; 463 464 for (k = 0, j = i % nk; k < nk; k++) { 464 465 *((u32 *)dec_key + k) = htonl(w_ring[j]); 465 466 j--;
+2
include/crypto/drbg.h
··· 124 124 struct skcipher_request *ctr_req; /* CTR mode request handle */ 125 125 __u8 *ctr_null_value_buf; /* CTR mode unaligned buffer */ 126 126 __u8 *ctr_null_value; /* CTR mode aligned zero buf */ 127 + __u8 *outscratchpadbuf; /* CTR mode output scratchpad */ 128 + __u8 *outscratchpad; /* CTR mode aligned outbuf */ 127 129 struct completion ctr_completion; /* CTR mode async handler */ 128 130 int ctr_async_err; /* CTR mode async error */ 129 131