]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
authorHerbert Xu <herbert@gondor.apana.org.au>
Wed, 30 Nov 2016 11:53:12 +0000 (19:53 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Wed, 30 Nov 2016 11:53:12 +0000 (19:53 +0800)
Merge the crypto tree to pull in chelsio chcr fix.

crypto/Makefile
crypto/algif_hash.c
crypto/drbg.c
crypto/scatterwalk.c
drivers/crypto/caam/caamalg.c
drivers/crypto/chelsio/chcr_algo.h
include/crypto/drbg.h

index a05590efe2e8933d73b3aa9849078fa3564e2d0a..b8f0e3eb079108ffe14ad247c6e6ed9663736ea7 100644 (file)
@@ -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
 
index 2d8466f9e49b8632527ed1e2f35617ff02f5fac1..d19b09cdf284d93dc63820a7cfc648217b220a7d 100644 (file)
@@ -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;
index 9a95b619e19a85e854dc6d6781f596388e89ffd0..8a4d98b4adba46bafb30928cc6b28426427802ce 100644 (file)
@@ -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 */
 
index 52ce17a3dd63079c3f5bb6eacde40ec1a61aa2ab..c16c94f88733e738f4ee1dff7a1334f9c2e39eb4 100644 (file)
@@ -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);
index 767ffaea9649f1994ddf58c80271209b1083211f..37f0540d46941823732a880c142075171375f378 100644 (file)
@@ -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);
index ec64fbcdeb49230d10fce5cda83dc238dbb45500..199b0bb69b89bcd5c96af1a9355208b367737089 100644 (file)
@@ -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--;
index 61580b19f9f6e1e31e42fc6afcd0f416cc2c5f2a..22f884c97387e9929a4fb19e7ee5328bccb34c8d 100644 (file)
@@ -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 */