diff options
| author | Herbert Xu <herbert@gondor.apana.org.au> | 2016-11-30 19:53:12 +0800 | 
|---|---|---|
| committer | Herbert Xu <herbert@gondor.apana.org.au> | 2016-11-30 19:53:12 +0800 | 
| commit | 479d014de544a0916037fcf77e873f815545cd5e (patch) | |
| tree | 6752a8184e2f2696c31ab141576e9902410c6c75 | |
| parent | 585b5fa63da92b2d46d5c1735a5c46e9a1486bbe (diff) | |
| parent | 57891633eeef60e732e045731cf20e50ee80acb4 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
Merge the crypto tree to pull in chelsio chcr fix.
| -rw-r--r-- | crypto/Makefile | 1 | ||||
| -rw-r--r-- | crypto/algif_hash.c | 17 | ||||
| -rw-r--r-- | crypto/drbg.c | 29 | ||||
| -rw-r--r-- | crypto/scatterwalk.c | 4 | ||||
| -rw-r--r-- | drivers/crypto/caam/caamalg.c | 9 | ||||
| -rw-r--r-- | drivers/crypto/chelsio/chcr_algo.h | 3 | ||||
| -rw-r--r-- | include/crypto/drbg.h | 2 | 
7 files changed, 48 insertions, 17 deletions
| diff --git a/crypto/Makefile b/crypto/Makefile index a05590efe2e8..b8f0e3eb0791 100644 --- a/crypto/Makefile +++ b/crypto/Makefile @@ -40,6 +40,7 @@ obj-$(CONFIG_CRYPTO_ECDH) += ecdh_generic.o  $(obj)/rsapubkey-asn1.o: $(obj)/rsapubkey-asn1.c $(obj)/rsapubkey-asn1.h  $(obj)/rsaprivkey-asn1.o: $(obj)/rsaprivkey-asn1.c $(obj)/rsaprivkey-asn1.h +$(obj)/rsa_helper.o: $(obj)/rsapubkey-asn1.h $(obj)/rsaprivkey-asn1.h  clean-files += rsapubkey-asn1.c rsapubkey-asn1.h  clean-files += rsaprivkey-asn1.c rsaprivkey-asn1.h diff --git a/crypto/algif_hash.c b/crypto/algif_hash.c index 2d8466f9e49b..d19b09cdf284 100644 --- a/crypto/algif_hash.c +++ b/crypto/algif_hash.c @@ -214,23 +214,26 @@ static int hash_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,  	ahash_request_set_crypt(&ctx->req, NULL, ctx->result, 0); -	if (ctx->more) { +	if (!result && !ctx->more) { +		err = af_alg_wait_for_completion( +				crypto_ahash_init(&ctx->req), +				&ctx->completion); +		if (err) +			goto unlock; +	} + +	if (!result || ctx->more) {  		ctx->more = 0;  		err = af_alg_wait_for_completion(crypto_ahash_final(&ctx->req),  						 &ctx->completion);  		if (err)  			goto unlock; -	} else if (!result) { -		err = af_alg_wait_for_completion( -				crypto_ahash_digest(&ctx->req), -				&ctx->completion);  	}  	err = memcpy_to_msg(msg, ctx->result, len); -	hash_free_result(sk, ctx); -  unlock: +	hash_free_result(sk, ctx);  	release_sock(sk);  	return err ?: len; diff --git a/crypto/drbg.c b/crypto/drbg.c index 9a95b619e19a..8a4d98b4adba 100644 --- a/crypto/drbg.c +++ b/crypto/drbg.c @@ -262,6 +262,7 @@ static int drbg_kcapi_sym_ctr(struct drbg_state *drbg,  			      u8 *inbuf, u32 inbuflen,  			      u8 *outbuf, u32 outlen);  #define DRBG_CTR_NULL_LEN 128 +#define DRBG_OUTSCRATCHLEN DRBG_CTR_NULL_LEN  /* BCC function for CTR DRBG as defined in 10.4.3 */  static int drbg_ctr_bcc(struct drbg_state *drbg, @@ -1644,6 +1645,9 @@ static int drbg_fini_sym_kernel(struct drbg_state *drbg)  	kfree(drbg->ctr_null_value_buf);  	drbg->ctr_null_value = NULL; +	kfree(drbg->outscratchpadbuf); +	drbg->outscratchpadbuf = NULL; +  	return 0;  } @@ -1708,6 +1712,15 @@ static int drbg_init_sym_kernel(struct drbg_state *drbg)  	drbg->ctr_null_value = (u8 *)PTR_ALIGN(drbg->ctr_null_value_buf,  					       alignmask + 1); +	drbg->outscratchpadbuf = kmalloc(DRBG_OUTSCRATCHLEN + alignmask, +					 GFP_KERNEL); +	if (!drbg->outscratchpadbuf) { +		drbg_fini_sym_kernel(drbg); +		return -ENOMEM; +	} +	drbg->outscratchpad = (u8 *)PTR_ALIGN(drbg->outscratchpadbuf, +					      alignmask + 1); +  	return alignmask;  } @@ -1737,15 +1750,16 @@ static int drbg_kcapi_sym_ctr(struct drbg_state *drbg,  			      u8 *outbuf, u32 outlen)  {  	struct scatterlist sg_in; +	int ret;  	sg_init_one(&sg_in, inbuf, inlen);  	while (outlen) { -		u32 cryptlen = min_t(u32, inlen, outlen); +		u32 cryptlen = min3(inlen, outlen, (u32)DRBG_OUTSCRATCHLEN);  		struct scatterlist sg_out; -		int ret; -		sg_init_one(&sg_out, outbuf, cryptlen); +		/* Output buffer may not be valid for SGL, use scratchpad */ +		sg_init_one(&sg_out, drbg->outscratchpad, cryptlen);  		skcipher_request_set_crypt(drbg->ctr_req, &sg_in, &sg_out,  					   cryptlen, drbg->V);  		ret = crypto_skcipher_encrypt(drbg->ctr_req); @@ -1761,15 +1775,20 @@ static int drbg_kcapi_sym_ctr(struct drbg_state *drbg,  				break;  			}  		default: -			return ret; +			goto out;  		}  		init_completion(&drbg->ctr_completion); +		memcpy(outbuf, drbg->outscratchpad, cryptlen); +  		outlen -= cryptlen;  		outbuf += cryptlen;  	} +	ret = 0; -	return 0; +out: +	memzero_explicit(drbg->outscratchpad, DRBG_OUTSCRATCHLEN); +	return ret;  }  #endif /* CONFIG_CRYPTO_DRBG_CTR */ diff --git a/crypto/scatterwalk.c b/crypto/scatterwalk.c index 52ce17a3dd63..c16c94f88733 100644 --- a/crypto/scatterwalk.c +++ b/crypto/scatterwalk.c @@ -68,10 +68,6 @@ void scatterwalk_map_and_copy(void *buf, struct scatterlist *sg,  	sg = scatterwalk_ffwd(tmp, sg, start); -	if (sg_page(sg) == virt_to_page(buf) && -	    sg->offset == offset_in_page(buf)) -		return; -  	scatterwalk_start(&walk, sg);  	scatterwalk_copychunks(buf, &walk, nbytes, out);  	scatterwalk_done(&walk, out, 0); diff --git a/drivers/crypto/caam/caamalg.c b/drivers/crypto/caam/caamalg.c index 767ffaea9649..37f0540d4694 100644 --- a/drivers/crypto/caam/caamalg.c +++ b/drivers/crypto/caam/caamalg.c @@ -3568,6 +3568,15 @@ static int __init caam_algapi_init(void)  		if (!aes_inst && (alg_sel == OP_ALG_ALGSEL_AES))  				continue; +		/* +		 * Check support for AES modes not available +		 * on LP devices. +		 */ +		if ((cha_vid & CHA_ID_LS_AES_MASK) == CHA_ID_LS_AES_LP) +			if ((alg->class1_alg_type & OP_ALG_AAI_MASK) == +			     OP_ALG_AAI_XTS) +				continue; +  		t_alg = caam_alg_alloc(alg);  		if (IS_ERR(t_alg)) {  			err = PTR_ERR(t_alg); diff --git a/drivers/crypto/chelsio/chcr_algo.h b/drivers/crypto/chelsio/chcr_algo.h index ec64fbcdeb49..199b0bb69b89 100644 --- a/drivers/crypto/chelsio/chcr_algo.h +++ b/drivers/crypto/chelsio/chcr_algo.h @@ -422,7 +422,7 @@ static inline void get_aes_decrypt_key(unsigned char *dec_key,  {  	u32 temp;  	u32 w_ring[MAX_NK]; -	int i, j, k = 0; +	int i, j, k;  	u8  nr, nk;  	switch (keylength) { @@ -460,6 +460,7 @@ static inline void get_aes_decrypt_key(unsigned char *dec_key,  		temp = w_ring[i % nk];  		i++;  	} +	i--;  	for (k = 0, j = i % nk; k < nk; k++) {  		*((u32 *)dec_key + k) = htonl(w_ring[j]);  		j--; diff --git a/include/crypto/drbg.h b/include/crypto/drbg.h index 61580b19f9f6..22f884c97387 100644 --- a/include/crypto/drbg.h +++ b/include/crypto/drbg.h @@ -124,6 +124,8 @@ struct drbg_state {  	struct skcipher_request *ctr_req;	/* CTR mode request handle */  	__u8 *ctr_null_value_buf;		/* CTR mode unaligned buffer */  	__u8 *ctr_null_value;			/* CTR mode aligned zero buf */ +	__u8 *outscratchpadbuf;			/* CTR mode output scratchpad */ +        __u8 *outscratchpad;			/* CTR mode aligned outbuf */  	struct completion ctr_completion;	/* CTR mode async handler */  	int ctr_async_err;			/* CTR mode async error */ | 
