]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Merge remote-tracking branch 'crypto/master'
authorMark Brown <broonie@linaro.org>
Thu, 17 Oct 2013 13:29:04 +0000 (14:29 +0100)
committerMark Brown <broonie@linaro.org>
Thu, 17 Oct 2013 13:29:04 +0000 (14:29 +0100)
1  2 
crypto/Kconfig
crypto/Makefile
drivers/char/hw_random/Kconfig
drivers/char/hw_random/Makefile
drivers/crypto/ixp4xx_crypto.c

diff --combined crypto/Kconfig
index 71f337aefa3905feaca892b7ac3b49b4bcb411e3,7c0a4c5de07599c9c2666b1a70e22e3d4bdcce17..05cdf4a2b94ee72324eb967932b31fa23b684207
@@@ -174,9 -174,8 +174,8 @@@ config CRYPTO_TES
        help
          Quick & dirty crypto test module.
  
- config CRYPTO_ABLK_HELPER_X86
+ config CRYPTO_ABLK_HELPER
        tristate
-       depends on X86
        select CRYPTO_CRYPTD
  
  config CRYPTO_GLUE_HELPER_X86
@@@ -695,7 -694,7 +694,7 @@@ config CRYPTO_AES_NI_INTE
        select CRYPTO_AES_X86_64 if 64BIT
        select CRYPTO_AES_586 if !64BIT
        select CRYPTO_CRYPTD
-       select CRYPTO_ABLK_HELPER_X86
+       select CRYPTO_ABLK_HELPER
        select CRYPTO_ALGAPI
        select CRYPTO_GLUE_HELPER_X86 if 64BIT
        select CRYPTO_LRW
@@@ -776,22 -775,6 +775,22 @@@ config CRYPTO_AES_AR
  
          See <http://csrc.nist.gov/encryption/aes/> for more information.
  
 +config CRYPTO_AES_ARM_BS
 +      tristate "Bit sliced AES using NEON instructions"
 +      depends on ARM && KERNEL_MODE_NEON
 +      select CRYPTO_ALGAPI
 +      select CRYPTO_AES_ARM
 +      select CRYPTO_ABLK_HELPER
 +      help
 +        Use a faster and more secure NEON based implementation of AES in CBC,
 +        CTR and XTS modes
 +
 +        Bit sliced AES gives around 45% speedup on Cortex-A15 for CTR mode
 +        and for XTS mode encryption, CBC and XTS mode decryption speedup is
 +        around 25%. (CBC encryption speed is not affected by this driver.)
 +        This implementation does not rely on any lookup tables so it is
 +        believed to be invulnerable to cache timing attacks.
 +
  config CRYPTO_ANUBIS
        tristate "Anubis cipher algorithm"
        select CRYPTO_ALGAPI
@@@ -895,7 -878,7 +894,7 @@@ config CRYPTO_CAMELLIA_AESNI_AVX_X86_6
        depends on CRYPTO
        select CRYPTO_ALGAPI
        select CRYPTO_CRYPTD
-       select CRYPTO_ABLK_HELPER_X86
+       select CRYPTO_ABLK_HELPER
        select CRYPTO_GLUE_HELPER_X86
        select CRYPTO_CAMELLIA_X86_64
        select CRYPTO_LRW
@@@ -917,7 -900,7 +916,7 @@@ config CRYPTO_CAMELLIA_AESNI_AVX2_X86_6
        depends on CRYPTO
        select CRYPTO_ALGAPI
        select CRYPTO_CRYPTD
-       select CRYPTO_ABLK_HELPER_X86
+       select CRYPTO_ABLK_HELPER
        select CRYPTO_GLUE_HELPER_X86
        select CRYPTO_CAMELLIA_X86_64
        select CRYPTO_CAMELLIA_AESNI_AVX_X86_64
@@@ -969,7 -952,7 +968,7 @@@ config CRYPTO_CAST5_AVX_X86_6
        depends on X86 && 64BIT
        select CRYPTO_ALGAPI
        select CRYPTO_CRYPTD
-       select CRYPTO_ABLK_HELPER_X86
+       select CRYPTO_ABLK_HELPER
        select CRYPTO_CAST_COMMON
        select CRYPTO_CAST5
        help
@@@ -992,7 -975,7 +991,7 @@@ config CRYPTO_CAST6_AVX_X86_6
        depends on X86 && 64BIT
        select CRYPTO_ALGAPI
        select CRYPTO_CRYPTD
-       select CRYPTO_ABLK_HELPER_X86
+       select CRYPTO_ABLK_HELPER
        select CRYPTO_GLUE_HELPER_X86
        select CRYPTO_CAST_COMMON
        select CRYPTO_CAST6
@@@ -1110,7 -1093,7 +1109,7 @@@ config CRYPTO_SERPENT_SSE2_X86_6
        depends on X86 && 64BIT
        select CRYPTO_ALGAPI
        select CRYPTO_CRYPTD
-       select CRYPTO_ABLK_HELPER_X86
+       select CRYPTO_ABLK_HELPER
        select CRYPTO_GLUE_HELPER_X86
        select CRYPTO_SERPENT
        select CRYPTO_LRW
@@@ -1132,7 -1115,7 +1131,7 @@@ config CRYPTO_SERPENT_SSE2_58
        depends on X86 && !64BIT
        select CRYPTO_ALGAPI
        select CRYPTO_CRYPTD
-       select CRYPTO_ABLK_HELPER_X86
+       select CRYPTO_ABLK_HELPER
        select CRYPTO_GLUE_HELPER_X86
        select CRYPTO_SERPENT
        select CRYPTO_LRW
@@@ -1154,7 -1137,7 +1153,7 @@@ config CRYPTO_SERPENT_AVX_X86_6
        depends on X86 && 64BIT
        select CRYPTO_ALGAPI
        select CRYPTO_CRYPTD
-       select CRYPTO_ABLK_HELPER_X86
+       select CRYPTO_ABLK_HELPER
        select CRYPTO_GLUE_HELPER_X86
        select CRYPTO_SERPENT
        select CRYPTO_LRW
@@@ -1176,7 -1159,7 +1175,7 @@@ config CRYPTO_SERPENT_AVX2_X86_6
        depends on X86 && 64BIT
        select CRYPTO_ALGAPI
        select CRYPTO_CRYPTD
-       select CRYPTO_ABLK_HELPER_X86
+       select CRYPTO_ABLK_HELPER
        select CRYPTO_GLUE_HELPER_X86
        select CRYPTO_SERPENT
        select CRYPTO_SERPENT_AVX_X86_64
@@@ -1292,7 -1275,7 +1291,7 @@@ config CRYPTO_TWOFISH_AVX_X86_6
        depends on X86 && 64BIT
        select CRYPTO_ALGAPI
        select CRYPTO_CRYPTD
-       select CRYPTO_ABLK_HELPER_X86
+       select CRYPTO_ABLK_HELPER
        select CRYPTO_GLUE_HELPER_X86
        select CRYPTO_TWOFISH_COMMON
        select CRYPTO_TWOFISH_X86_64
diff --combined crypto/Makefile
index 80019ba8da3a2113ce8a48bf924bba9ca7d96e50,d6a401c58d17699e77f198a447aa67fd75e71cc4..e0b7cf4e18b689a8c8a61a985c1fca06738e7412
@@@ -2,8 -2,13 +2,13 @@@
  # Cryptographic API
  #
  
+ # memneq MUST be built with -Os or -O0 to prevent early-return optimizations
+ # that will defeat memneq's actual purpose to prevent timing attacks.
+ CFLAGS_REMOVE_memneq.o := -O1 -O2 -O3
+ CFLAGS_memneq.o := -Os
  obj-$(CONFIG_CRYPTO) += crypto.o
- crypto-y := api.o cipher.o compress.o
+ crypto-y := api.o cipher.o compress.o memneq.o
  
  obj-$(CONFIG_CRYPTO_WORKQUEUE) += crypto_wq.o
  
@@@ -83,7 -88,7 +88,7 @@@ obj-$(CONFIG_CRYPTO_ZLIB) += zlib.
  obj-$(CONFIG_CRYPTO_MICHAEL_MIC) += michael_mic.o
  obj-$(CONFIG_CRYPTO_CRC32C) += crc32c.o
  obj-$(CONFIG_CRYPTO_CRC32) += crc32.o
 -obj-$(CONFIG_CRYPTO_CRCT10DIF) += crct10dif.o
 +obj-$(CONFIG_CRYPTO_CRCT10DIF) += crct10dif_common.o crct10dif_generic.o
  obj-$(CONFIG_CRYPTO_AUTHENC) += authenc.o authencesn.o
  obj-$(CONFIG_CRYPTO_LZO) += lzo.o
  obj-$(CONFIG_CRYPTO_LZ4) += lz4.o
@@@ -104,3 -109,4 +109,4 @@@ obj-$(CONFIG_CRYPTO_USER_API_SKCIPHER) 
  obj-$(CONFIG_XOR_BLOCKS) += xor.o
  obj-$(CONFIG_ASYNC_CORE) += async_tx/
  obj-$(CONFIG_ASYMMETRIC_KEY_TYPE) += asymmetric_keys/
+ obj-$(CONFIG_CRYPTO_ABLK_HELPER) += ablk_helper.o
index c206de2951f20f086c099ab69e8a1a48286465be,0a331c341fffe372daa72e23f0410ecc1e771b95..d4cfddd456e0900c17cdfc42fffb1da158e82c7e
@@@ -165,6 -165,19 +165,19 @@@ config HW_RANDOM_OMA
  
          If unsure, say Y.
  
+ config HW_RANDOM_OMAP3_ROM
+       tristate "OMAP3 ROM Random Number Generator support"
+       depends on HW_RANDOM && ARCH_OMAP3
+       default HW_RANDOM
+       ---help---
+         This driver provides kernel-side support for the Random Number
+         Generator hardware found on OMAP34xx processors.
+         To compile this driver as a module, choose M here: the
+         module will be called omap3-rom-rng.
+         If unsure, say Y.
  config HW_RANDOM_OCTEON
        tristate "Octeon Random Number Generator support"
        depends on HW_RANDOM && CAVIUM_OCTEON_SOC
@@@ -290,19 -303,6 +303,19 @@@ config HW_RANDOM_PSERIE
  
          If unsure, say Y.
  
 +config HW_RANDOM_POWERNV
 +      tristate "PowerNV Random Number Generator support"
 +      depends on HW_RANDOM && PPC_POWERNV
 +      default HW_RANDOM
 +      ---help---
 +        This is the driver for Random Number Generator hardware found
 +        in POWER7+ and above machines for PowerNV platform.
 +
 +        To compile this driver as a module, choose M here: the
 +        module will be called powernv-rng.
 +
 +        If unsure, say Y.
 +
  config HW_RANDOM_EXYNOS
        tristate "EXYNOS HW random number generator support"
        depends on HW_RANDOM && HAS_IOMEM && HAVE_CLK
index d7d2435ff7fa8d38cd129d327c59ded717e3682a,7c8aa8077f5e67e19aee67c651484320ba42328a..0a9af90489f97a2e6b594ccbc641bcf47625be9a
@@@ -15,6 -15,7 +15,7 @@@ n2-rng-y := n2-drv.o n2-asm.
  obj-$(CONFIG_HW_RANDOM_VIA) += via-rng.o
  obj-$(CONFIG_HW_RANDOM_IXP4XX) += ixp4xx-rng.o
  obj-$(CONFIG_HW_RANDOM_OMAP) += omap-rng.o
+ obj-$(CONFIG_HW_RANDOM_OMAP3_ROM) += omap3-rom-rng.o
  obj-$(CONFIG_HW_RANDOM_PASEMI) += pasemi-rng.o
  obj-$(CONFIG_HW_RANDOM_VIRTIO) += virtio-rng.o
  obj-$(CONFIG_HW_RANDOM_TX4939) += tx4939-rng.o
@@@ -24,7 -25,6 +25,7 @@@ obj-$(CONFIG_HW_RANDOM_NOMADIK) += noma
  obj-$(CONFIG_HW_RANDOM_PICOXCELL) += picoxcell-rng.o
  obj-$(CONFIG_HW_RANDOM_PPC4XX) += ppc4xx-rng.o
  obj-$(CONFIG_HW_RANDOM_PSERIES) += pseries-rng.o
 +obj-$(CONFIG_HW_RANDOM_POWERNV) += powernv-rng.o
  obj-$(CONFIG_HW_RANDOM_EXYNOS)        += exynos-rng.o
  obj-$(CONFIG_HW_RANDOM_TPM) += tpm-rng.o
  obj-$(CONFIG_HW_RANDOM_BCM2835) += bcm2835-rng.o
index 214357e12dc0b5469bb3c9daae5904ef3a618845,153f73c12d3e7895dfdaa078543d801238536fa8..9dd6e01eac33050b8304c5f8758440e7286606f2
@@@ -218,9 -218,23 +218,9 @@@ static dma_addr_t crypt_phys
  
  static int support_aes = 1;
  
 -static void dev_release(struct device *dev)
 -{
 -      return;
 -}
 -
  #define DRIVER_NAME "ixp4xx_crypto"
 -static struct platform_device pseudo_dev = {
 -      .name = DRIVER_NAME,
 -      .id   = 0,
 -      .num_resources = 0,
 -      .dev  = {
 -              .coherent_dma_mask = DMA_BIT_MASK(32),
 -              .release = dev_release,
 -      }
 -};
  
 -static struct device *dev = &pseudo_dev.dev;
 +static struct platform_device *pdev;
  
  static inline dma_addr_t crypt_virt2phys(struct crypt_ctl *virt)
  {
@@@ -249,7 -263,6 +249,7 @@@ static inline const struct ix_hash_alg
  
  static int setup_crypt_desc(void)
  {
 +      struct device *dev = &pdev->dev;
        BUILD_BUG_ON(sizeof(struct crypt_ctl) != 64);
        crypt_virt = dma_alloc_coherent(dev,
                        NPE_QLEN * sizeof(struct crypt_ctl),
@@@ -350,7 -363,6 +350,7 @@@ static void finish_scattered_hmac(struc
  
  static void one_packet(dma_addr_t phys)
  {
 +      struct device *dev = &pdev->dev;
        struct crypt_ctl *crypt;
        struct ixp_ctx *ctx;
        int failed;
@@@ -420,7 -432,7 +420,7 @@@ static void crypto_done_action(unsigne
        tasklet_schedule(&crypto_done_tasklet);
  }
  
 -static int init_ixp_crypto(void)
 +static int init_ixp_crypto(struct device *dev)
  {
        int ret = -ENODEV;
        u32 msg[2] = { 0, 0 };
@@@ -507,7 -519,7 +507,7 @@@ err
        return ret;
  }
  
 -static void release_ixp_crypto(void)
 +static void release_ixp_crypto(struct device *dev)
  {
        qmgr_disable_irq(RECV_QID);
        tasklet_kill(&crypto_done_tasklet);
@@@ -874,7 -886,6 +874,7 @@@ static int ablk_perform(struct ablkciph
        enum dma_data_direction src_direction = DMA_BIDIRECTIONAL;
        struct ablk_ctx *req_ctx = ablkcipher_request_ctx(req);
        struct buffer_desc src_hook;
 +      struct device *dev = &pdev->dev;
        gfp_t flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP ?
                                GFP_KERNEL : GFP_ATOMIC;
  
@@@ -999,7 -1010,6 +999,7 @@@ static int aead_perform(struct aead_req
        unsigned int cryptlen;
        struct buffer_desc *buf, src_hook;
        struct aead_ctx *req_ctx = aead_request_ctx(req);
 +      struct device *dev = &pdev->dev;
        gfp_t flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP ?
                                GFP_KERNEL : GFP_ATOMIC;
  
@@@ -1149,32 -1159,24 +1149,24 @@@ static int aead_setkey(struct crypto_ae
                        unsigned int keylen)
  {
        struct ixp_ctx *ctx = crypto_aead_ctx(tfm);
-       struct rtattr *rta = (struct rtattr *)key;
-       struct crypto_authenc_key_param *param;
+       struct crypto_authenc_keys keys;
  
-       if (!RTA_OK(rta, keylen))
-               goto badkey;
-       if (rta->rta_type != CRYPTO_AUTHENC_KEYA_PARAM)
-               goto badkey;
-       if (RTA_PAYLOAD(rta) < sizeof(*param))
+       if (crypto_authenc_extractkeys(&keys, key, keylen) != 0)
                goto badkey;
  
-       param = RTA_DATA(rta);
-       ctx->enckey_len = be32_to_cpu(param->enckeylen);
-       key += RTA_ALIGN(rta->rta_len);
-       keylen -= RTA_ALIGN(rta->rta_len);
+       if (keys.authkeylen > sizeof(ctx->authkey))
+               goto badkey;
  
-       if (keylen < ctx->enckey_len)
+       if (keys.enckeylen > sizeof(ctx->enckey))
                goto badkey;
  
-       ctx->authkey_len = keylen - ctx->enckey_len;
-       memcpy(ctx->enckey, key + ctx->authkey_len, ctx->enckey_len);
-       memcpy(ctx->authkey, key, ctx->authkey_len);
+       memcpy(ctx->authkey, keys.authkey, keys.authkeylen);
+       memcpy(ctx->enckey, keys.enckey, keys.enckeylen);
+       ctx->authkey_len = keys.authkeylen;
+       ctx->enckey_len = keys.enckeylen;
  
        return aead_setup(tfm, crypto_aead_authsize(tfm));
  badkey:
-       ctx->enckey_len = 0;
        crypto_aead_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN);
        return -EINVAL;
  }
@@@ -1408,30 -1410,20 +1400,30 @@@ static struct ixp_alg ixp4xx_algos[] = 
  } };
  
  #define IXP_POSTFIX "-ixp4xx"
 +
 +static const struct platform_device_info ixp_dev_info __initdata = {
 +      .name           = DRIVER_NAME,
 +      .id             = 0,
 +      .dma_mask       = DMA_BIT_MASK(32),
 +};
 +
  static int __init ixp_module_init(void)
  {
        int num = ARRAY_SIZE(ixp4xx_algos);
 -      int i,err ;
 +      int i, err ;
  
 -      if (platform_device_register(&pseudo_dev))
 -              return -ENODEV;
 +      pdev = platform_device_register_full(&ixp_dev_info);
 +      if (IS_ERR(pdev))
 +              return PTR_ERR(pdev);
 +
 +      dev = &pdev->dev;
  
        spin_lock_init(&desc_lock);
        spin_lock_init(&emerg_lock);
  
 -      err = init_ixp_crypto();
 +      err = init_ixp_crypto(&pdev->dev);
        if (err) {
 -              platform_device_unregister(&pseudo_dev);
 +              platform_device_unregister(pdev);
                return err;
        }
        for (i=0; i< num; i++) {
@@@ -1495,8 -1487,8 +1487,8 @@@ static void __exit ixp_module_exit(void
                if (ixp4xx_algos[i].registered)
                        crypto_unregister_alg(&ixp4xx_algos[i].crypto);
        }
 -      release_ixp_crypto();
 -      platform_device_unregister(&pseudo_dev);
 +      release_ixp_crypto(&pdev->dev);
 +      platform_device_unregister(pdev);
  }
  
  module_init(ixp_module_init);