Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 5 Jun 2018 22:51:21 +0000 (15:51 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 5 Jun 2018 22:51:21 +0000 (15:51 -0700)
Pull crypto updates from Herbert Xu:
 "API:

   - Decryption test vectors are now automatically generated from
     encryption test vectors.

  Algorithms:

   - Fix unaligned access issues in crc32/crc32c.

   - Add zstd compression algorithm.

   - Add AEGIS.

   - Add MORUS.

  Drivers:

   - Add accelerated AEGIS/MORUS on x86.

   - Add accelerated SM4 on arm64.

   - Removed x86 assembly salsa implementation as it is slower than C.

   - Add authenc(hmac(sha*), cbc(aes)) support in inside-secure.

   - Add ctr(aes) support in crypto4xx.

   - Add hardware key support in ccree.

   - Add support for new Centaur CPU in via-rng"

* 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6: (112 commits)
  crypto: chtls - free beyond end rspq_skb_cache
  crypto: chtls - kbuild warnings
  crypto: chtls - dereference null variable
  crypto: chtls - wait for memory sendmsg, sendpage
  crypto: chtls - key len correction
  crypto: salsa20 - Revert "crypto: salsa20 - export generic helpers"
  crypto: x86/salsa20 - remove x86 salsa20 implementations
  crypto: ccp - Add GET_ID SEV command
  crypto: ccp - Add DOWNLOAD_FIRMWARE SEV command
  crypto: qat - Add MODULE_FIRMWARE for all qat drivers
  crypto: ccree - silence debug prints
  crypto: ccree - better clock handling
  crypto: ccree - correct host regs offset
  crypto: chelsio - Remove separate buffer used for DMA map B0 block in CCM
  crypt: chelsio - Send IV as Immediate for cipher algo
  crypto: chelsio - Return -ENOSPC for transient busy indication.
  crypto: caam/qi - fix warning in init_cgr()
  crypto: caam - fix rfc4543 descriptors
  crypto: caam - fix MC firmware detection
  crypto: clarify licensing of OpenSSL asm code
  ...

1  2 
drivers/crypto/inside-secure/safexcel.c

@@@ -20,6 -20,7 +20,7 @@@
  #include <linux/platform_device.h>
  #include <linux/workqueue.h>
  
+ #include <crypto/internal/aead.h>
  #include <crypto/internal/hash.h>
  #include <crypto/internal/skcipher.h>
  
@@@ -152,8 -153,8 +153,8 @@@ static int eip197_load_firmwares(struc
               EIP197_PE_ICE_SCRATCH_CTRL_CHANGE_ACCESS;
        writel(val, EIP197_PE(priv) + EIP197_PE_ICE_SCRATCH_CTRL);
  
 -      memset(EIP197_PE(priv) + EIP197_PE_ICE_SCRATCH_RAM, 0,
 -             EIP197_NUM_OF_SCRATCH_BLOCKS * sizeof(u32));
 +      memset_io(EIP197_PE(priv) + EIP197_PE_ICE_SCRATCH_RAM, 0,
 +                EIP197_NUM_OF_SCRATCH_BLOCKS * sizeof(u32));
  
        eip197_write_firmware(priv, fw[FW_IFPP], EIP197_PE_ICE_FPP_CTRL,
                              EIP197_PE_ICE_RAM_CTRL_FPP_PROG_EN);
@@@ -352,6 -353,7 +353,7 @@@ static int safexcel_hw_init(struct safe
        /* H/W capabilities selection */
        val = EIP197_FUNCTION_RSVD;
        val |= EIP197_PROTOCOL_ENCRYPT_ONLY | EIP197_PROTOCOL_HASH_ONLY;
+       val |= EIP197_PROTOCOL_ENCRYPT_HASH | EIP197_PROTOCOL_HASH_DECRYPT;
        val |= EIP197_ALG_AES_ECB | EIP197_ALG_AES_CBC;
        val |= EIP197_ALG_SHA1 | EIP197_ALG_HMAC_SHA1;
        val |= EIP197_ALG_SHA2 | EIP197_ALG_HMAC_SHA2;
@@@ -537,6 -539,27 +539,27 @@@ finalize
               EIP197_HIA_CDR(priv, ring) + EIP197_HIA_xDR_PREP_COUNT);
  }
  
+ inline int safexcel_rdesc_check_errors(struct safexcel_crypto_priv *priv,
+                                      struct safexcel_result_desc *rdesc)
+ {
+       if (likely(!rdesc->result_data.error_code))
+               return 0;
+       if (rdesc->result_data.error_code & 0x407f) {
+               /* Fatal error (bits 0-7, 14) */
+               dev_err(priv->dev,
+                       "cipher: result: result descriptor error (%d)\n",
+                       rdesc->result_data.error_code);
+               return -EIO;
+       } else if (rdesc->result_data.error_code == BIT(9)) {
+               /* Authentication failed */
+               return -EBADMSG;
+       }
+       /* All other non-fatal errors */
+       return -EINVAL;
+ }
  void safexcel_complete(struct safexcel_crypto_priv *priv, int ring)
  {
        struct safexcel_command_desc *cdesc;
@@@ -770,6 -793,9 +793,9 @@@ static struct safexcel_alg_template *sa
        &safexcel_alg_hmac_sha1,
        &safexcel_alg_hmac_sha224,
        &safexcel_alg_hmac_sha256,
+       &safexcel_alg_authenc_hmac_sha1_cbc_aes,
+       &safexcel_alg_authenc_hmac_sha224_cbc_aes,
+       &safexcel_alg_authenc_hmac_sha256_cbc_aes,
  };
  
  static int safexcel_register_algorithms(struct safexcel_crypto_priv *priv)
  
                if (safexcel_algs[i]->type == SAFEXCEL_ALG_TYPE_SKCIPHER)
                        ret = crypto_register_skcipher(&safexcel_algs[i]->alg.skcipher);
+               else if (safexcel_algs[i]->type == SAFEXCEL_ALG_TYPE_AEAD)
+                       ret = crypto_register_aead(&safexcel_algs[i]->alg.aead);
                else
                        ret = crypto_register_ahash(&safexcel_algs[i]->alg.ahash);
  
@@@ -794,6 -822,8 +822,8 @@@ fail
        for (j = 0; j < i; j++) {
                if (safexcel_algs[j]->type == SAFEXCEL_ALG_TYPE_SKCIPHER)
                        crypto_unregister_skcipher(&safexcel_algs[j]->alg.skcipher);
+               else if (safexcel_algs[j]->type == SAFEXCEL_ALG_TYPE_AEAD)
+                       crypto_unregister_aead(&safexcel_algs[j]->alg.aead);
                else
                        crypto_unregister_ahash(&safexcel_algs[j]->alg.ahash);
        }
@@@ -808,6 -838,8 +838,8 @@@ static void safexcel_unregister_algorit
        for (i = 0; i < ARRAY_SIZE(safexcel_algs); i++) {
                if (safexcel_algs[i]->type == SAFEXCEL_ALG_TYPE_SKCIPHER)
                        crypto_unregister_skcipher(&safexcel_algs[i]->alg.skcipher);
+               else if (safexcel_algs[i]->type == SAFEXCEL_ALG_TYPE_AEAD)
+                       crypto_unregister_aead(&safexcel_algs[i]->alg.aead);
                else
                        crypto_unregister_ahash(&safexcel_algs[i]->alg.ahash);
        }