Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6 into next
authorLinus Torvalds <torvalds@linux-foundation.org>
Sun, 8 Jun 2014 02:44:40 +0000 (19:44 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sun, 8 Jun 2014 02:44:40 +0000 (19:44 -0700)
Pull crypto updates from Herbert Xu:
 "Here is the crypto update for 3.16:

   - Added test vectors for SHA/AES-CCM/DES-CBC/3DES-CBC.
   - Fixed a number of error-path memory leaks in tcrypt.
   - Fixed error-path memory leak in caam.
   - Removed unnecessary global mutex from mxs-dcp.
   - Added ahash walk interface that can actually be asynchronous.
   - Cleaned up caam error reporting.
   - Allow crypto_user get operation to be used by non-root users.
   - Add support for SSS module on Exynos.
   - Misc fixes"

* git://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6: (60 commits)
  crypto: testmgr - add aead cbc des, des3_ede tests
  crypto: testmgr - Fix DMA-API warning
  crypto: cesa - tfm->__crt_alg->cra_type directly
  crypto: sahara - tfm->__crt_alg->cra_name directly
  crypto: padlock - tfm->__crt_alg->cra_name directly
  crypto: n2 - tfm->__crt_alg->cra_name directly
  crypto: dcp - tfm->__crt_alg->cra_name directly
  crypto: cesa - tfm->__crt_alg->cra_name directly
  crypto: ccp - tfm->__crt_alg->cra_name directly
  crypto: geode - Don't use tfm->__crt_alg->cra_name directly
  crypto: geode - Weed out printk() from probe()
  crypto: geode - Consistently use AES_KEYSIZE_128
  crypto: geode - Kill AES_IV_LENGTH
  crypto: geode - Kill AES_MIN_BLOCK_SIZE
  crypto: mxs-dcp - Remove global mutex
  crypto: hash - Add real ahash walk interface
  hwrng: n2-drv - Introduce the use of the managed version of kzalloc
  crypto: caam - reinitialize keys_fit_inline for decrypt and givencrypt
  crypto: s5p-sss - fix multiplatform build
  hwrng: timeriomem - remove unnecessary OOM messages
  ...

37 files changed:
Documentation/devicetree/bindings/crypto/samsung-sss.txt [new file with mode: 0644]
arch/x86/crypto/ghash-clmulni-intel_asm.S
arch/x86/crypto/ghash-clmulni-intel_glue.c
crypto/ahash.c
crypto/crypto_user.c
crypto/tcrypt.c
crypto/testmgr.c
crypto/testmgr.h
drivers/char/hw_random/Kconfig
drivers/char/hw_random/Makefile
drivers/char/hw_random/n2-drv.c
drivers/char/hw_random/omap-rng.c
drivers/char/hw_random/picoxcell-rng.c [deleted file]
drivers/char/hw_random/timeriomem-rng.c
drivers/crypto/Kconfig
drivers/crypto/atmel-aes.c
drivers/crypto/bfin_crc.c
drivers/crypto/bfin_crc.h [new file with mode: 0644]
drivers/crypto/caam/caamalg.c
drivers/crypto/caam/caamhash.c
drivers/crypto/caam/caamrng.c
drivers/crypto/caam/error.c
drivers/crypto/caam/error.h
drivers/crypto/caam/key_gen.c
drivers/crypto/ccp/ccp-crypto-aes-xts.c
drivers/crypto/ccp/ccp-pci.c
drivers/crypto/geode-aes.c
drivers/crypto/geode-aes.h
drivers/crypto/mv_cesa.c
drivers/crypto/mxs-dcp.c
drivers/crypto/n2_core.c
drivers/crypto/nx/nx-842.c
drivers/crypto/omap-des.c
drivers/crypto/padlock-sha.c
drivers/crypto/s5p-sss.c
drivers/crypto/sahara.c
include/crypto/internal/hash.h

diff --git a/Documentation/devicetree/bindings/crypto/samsung-sss.txt b/Documentation/devicetree/bindings/crypto/samsung-sss.txt
new file mode 100644 (file)
index 0000000..a6dafa8
--- /dev/null
@@ -0,0 +1,34 @@
+Samsung SoC SSS (Security SubSystem) module
+
+The SSS module in S5PV210 SoC supports the following:
+-- Feeder (FeedCtrl)
+-- Advanced Encryption Standard (AES)
+-- Data Encryption Standard (DES)/3DES
+-- Public Key Accelerator (PKA)
+-- SHA-1/SHA-256/MD5/HMAC (SHA-1/SHA-256/MD5)/PRNG
+-- PRNG: Pseudo Random Number Generator
+
+The SSS module in Exynos4 (Exynos4210) and
+Exynos5 (Exynos5420 and Exynos5250) SoCs
+supports the following also:
+-- ARCFOUR (ARC4)
+-- True Random Number Generator (TRNG)
+-- Secure Key Manager
+
+Required properties:
+
+- compatible : Should contain entries for this and backward compatible
+  SSS versions:
+  - "samsung,s5pv210-secss" for S5PV210 SoC.
+  - "samsung,exynos4210-secss" for Exynos4210, Exynos4212, Exynos4412, Exynos5250,
+               Exynos5260 and Exynos5420 SoCs.
+- reg : Offset and length of the register set for the module
+- interrupts : interrupt specifiers of SSS module interrupts, should contain
+               following entries:
+               - first : feed control interrupt (required for all variants),
+               - second : hash interrupt (required only for samsung,s5pv210-secss).
+
+- clocks : list of clock phandle and specifier pairs for all clocks  listed in
+               clock-names property.
+- clock-names : list of device clock input names; should contain one entry
+               "secss".
index 185fad49d86f0c114411f4f4bc879bdbd9102874..5d1e0075ac24fa5eae975930647f6fc14c5b256d 100644 (file)
@@ -92,7 +92,7 @@ __clmul_gf128mul_ble:
        ret
 ENDPROC(__clmul_gf128mul_ble)
 
-/* void clmul_ghash_mul(char *dst, const be128 *shash) */
+/* void clmul_ghash_mul(char *dst, const u128 *shash) */
 ENTRY(clmul_ghash_mul)
        movups (%rdi), DATA
        movups (%rsi), SHASH
@@ -106,7 +106,7 @@ ENDPROC(clmul_ghash_mul)
 
 /*
  * void clmul_ghash_update(char *dst, const char *src, unsigned int srclen,
- *                        const be128 *shash);
+ *                        const u128 *shash);
  */
 ENTRY(clmul_ghash_update)
        cmp $16, %rdx
index d785cf2c529c720ae2bdfce7a592aae643aa71cf..88bb7ba8b1753e56b59c5a755e3cde4fefe5e78e 100644 (file)
 #define GHASH_BLOCK_SIZE       16
 #define GHASH_DIGEST_SIZE      16
 
-void clmul_ghash_mul(char *dst, const be128 *shash);
+void clmul_ghash_mul(char *dst, const u128 *shash);
 
 void clmul_ghash_update(char *dst, const char *src, unsigned int srclen,
-                       const be128 *shash);
+                       const u128 *shash);
 
 struct ghash_async_ctx {
        struct cryptd_ahash *cryptd_tfm;
 };
 
 struct ghash_ctx {
-       be128 shash;
+       u128 shash;
 };
 
 struct ghash_desc_ctx {
@@ -68,11 +68,11 @@ static int ghash_setkey(struct crypto_shash *tfm,
        a = be64_to_cpu(x->a);
        b = be64_to_cpu(x->b);
 
-       ctx->shash.a = (__be64)((b << 1) | (a >> 63));
-       ctx->shash.b = (__be64)((a << 1) | (b >> 63));
+       ctx->shash.a = (b << 1) | (a >> 63);
+       ctx->shash.b = (a << 1) | (b >> 63);
 
        if (a >> 63)
-               ctx->shash.b ^= cpu_to_be64(0xc2);
+               ctx->shash.b ^= ((u64)0xc2) << 56;
 
        return 0;
 }
index 6e7223392e800c583f16925c32cf2c82c9fe3fa2..f2a5d8f656ff44dea2c78aa1b31add76796cb3c5 100644 (file)
@@ -15,6 +15,7 @@
 
 #include <crypto/internal/hash.h>
 #include <crypto/scatterwalk.h>
+#include <linux/bug.h>
 #include <linux/err.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
@@ -46,7 +47,10 @@ static int hash_walk_next(struct crypto_hash_walk *walk)
        unsigned int nbytes = min(walk->entrylen,
                                  ((unsigned int)(PAGE_SIZE)) - offset);
 
-       walk->data = kmap_atomic(walk->pg);
+       if (walk->flags & CRYPTO_ALG_ASYNC)
+               walk->data = kmap(walk->pg);
+       else
+               walk->data = kmap_atomic(walk->pg);
        walk->data += offset;
 
        if (offset & alignmask) {
@@ -93,8 +97,16 @@ int crypto_hash_walk_done(struct crypto_hash_walk *walk, int err)
                return nbytes;
        }
 
-       kunmap_atomic(walk->data);
-       crypto_yield(walk->flags);
+       if (walk->flags & CRYPTO_ALG_ASYNC)
+               kunmap(walk->pg);
+       else {
+               kunmap_atomic(walk->data);
+               /*
+                * The may sleep test only makes sense for sync users.
+                * Async users don't need to sleep here anyway.
+                */
+               crypto_yield(walk->flags);
+       }
 
        if (err)
                return err;
@@ -124,12 +136,31 @@ int crypto_hash_walk_first(struct ahash_request *req,
 
        walk->alignmask = crypto_ahash_alignmask(crypto_ahash_reqtfm(req));
        walk->sg = req->src;
-       walk->flags = req->base.flags;
+       walk->flags = req->base.flags & CRYPTO_TFM_REQ_MASK;
 
        return hash_walk_new_entry(walk);
 }
 EXPORT_SYMBOL_GPL(crypto_hash_walk_first);
 
+int crypto_ahash_walk_first(struct ahash_request *req,
+                           struct crypto_hash_walk *walk)
+{
+       walk->total = req->nbytes;
+
+       if (!walk->total)
+               return 0;
+
+       walk->alignmask = crypto_ahash_alignmask(crypto_ahash_reqtfm(req));
+       walk->sg = req->src;
+       walk->flags = req->base.flags & CRYPTO_TFM_REQ_MASK;
+       walk->flags |= CRYPTO_ALG_ASYNC;
+
+       BUILD_BUG_ON(CRYPTO_TFM_REQ_MASK & CRYPTO_ALG_ASYNC);
+
+       return hash_walk_new_entry(walk);
+}
+EXPORT_SYMBOL_GPL(crypto_ahash_walk_first);
+
 int crypto_hash_walk_first_compat(struct hash_desc *hdesc,
                                  struct crypto_hash_walk *walk,
                                  struct scatterlist *sg, unsigned int len)
@@ -141,7 +172,7 @@ int crypto_hash_walk_first_compat(struct hash_desc *hdesc,
 
        walk->alignmask = crypto_hash_alignmask(hdesc->tfm);
        walk->sg = sg;
-       walk->flags = hdesc->flags;
+       walk->flags = hdesc->flags & CRYPTO_TFM_REQ_MASK;
 
        return hash_walk_new_entry(walk);
 }
index 43665d0d0905ddddf018fe68655c1ff7685b0b9e..e2a34feec7a4cf80199e651032c70eee8d94460b 100644 (file)
@@ -265,6 +265,9 @@ static int crypto_update_alg(struct sk_buff *skb, struct nlmsghdr *nlh,
        struct nlattr *priority = attrs[CRYPTOCFGA_PRIORITY_VAL];
        LIST_HEAD(list);
 
+       if (!netlink_capable(skb, CAP_NET_ADMIN))
+               return -EPERM;
+
        if (!null_terminated(p->cru_name) || !null_terminated(p->cru_driver_name))
                return -EINVAL;
 
@@ -295,6 +298,9 @@ static int crypto_del_alg(struct sk_buff *skb, struct nlmsghdr *nlh,
        struct crypto_alg *alg;
        struct crypto_user_alg *p = nlmsg_data(nlh);
 
+       if (!netlink_capable(skb, CAP_NET_ADMIN))
+               return -EPERM;
+
        if (!null_terminated(p->cru_name) || !null_terminated(p->cru_driver_name))
                return -EINVAL;
 
@@ -379,6 +385,9 @@ static int crypto_add_alg(struct sk_buff *skb, struct nlmsghdr *nlh,
        struct crypto_user_alg *p = nlmsg_data(nlh);
        struct nlattr *priority = attrs[CRYPTOCFGA_PRIORITY_VAL];
 
+       if (!netlink_capable(skb, CAP_NET_ADMIN))
+               return -EPERM;
+
        if (!null_terminated(p->cru_name) || !null_terminated(p->cru_driver_name))
                return -EINVAL;
 
@@ -466,9 +475,6 @@ static int crypto_user_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
        type -= CRYPTO_MSG_BASE;
        link = &crypto_dispatch[type];
 
-       if (!netlink_capable(skb, CAP_NET_ADMIN))
-               return -EPERM;
-
        if ((type == (CRYPTO_MSG_GETALG - CRYPTO_MSG_BASE) &&
            (nlh->nlmsg_flags & NLM_F_DUMP))) {
                struct crypto_alg *alg;
index 870be7b4dc0529b1a9722e569eaccd71092623e3..ba247cf30858e3d98dabdbb89063543ccb0dbdcd 100644 (file)
@@ -282,6 +282,11 @@ static void test_aead_speed(const char *algo, int enc, unsigned int sec,
        unsigned int *b_size;
        unsigned int iv_len;
 
+       if (aad_size >= PAGE_SIZE) {
+               pr_err("associate data length (%u) too big\n", aad_size);
+               return;
+       }
+
        if (enc == ENCRYPT)
                e = "encryption";
        else
@@ -308,14 +313,14 @@ static void test_aead_speed(const char *algo, int enc, unsigned int sec,
        if (IS_ERR(tfm)) {
                pr_err("alg: aead: Failed to load transform for %s: %ld\n", algo,
                       PTR_ERR(tfm));
-               return;
+               goto out_notfm;
        }
 
        req = aead_request_alloc(tfm, GFP_KERNEL);
        if (!req) {
                pr_err("alg: aead: Failed to allocate request for %s\n",
                       algo);
-               goto out;
+               goto out_noreq;
        }
 
        i = 0;
@@ -323,14 +328,7 @@ static void test_aead_speed(const char *algo, int enc, unsigned int sec,
                b_size = aead_sizes;
                do {
                        assoc = axbuf[0];
-
-                       if (aad_size < PAGE_SIZE)
-                               memset(assoc, 0xff, aad_size);
-                       else {
-                               pr_err("associate data length (%u) too big\n",
-                                       aad_size);
-                               goto out_nosg;
-                       }
+                       memset(assoc, 0xff, aad_size);
                        sg_init_one(&asg[0], assoc, aad_size);
 
                        if ((*keysize + *b_size) > TVMEMSIZE * PAGE_SIZE) {
@@ -392,7 +390,10 @@ static void test_aead_speed(const char *algo, int enc, unsigned int sec,
        } while (*keysize);
 
 out:
+       aead_request_free(req);
+out_noreq:
        crypto_free_aead(tfm);
+out_notfm:
        kfree(sg);
 out_nosg:
        testmgr_free_buf(xoutbuf);
@@ -1518,7 +1519,36 @@ static int do_test(int m)
        case 157:
                ret += tcrypt_test("authenc(hmac(sha1),ecb(cipher_null))");
                break;
-
+       case 181:
+               ret += tcrypt_test("authenc(hmac(sha1),cbc(des))");
+               break;
+       case 182:
+               ret += tcrypt_test("authenc(hmac(sha1),cbc(des3_ede))");
+               break;
+       case 183:
+               ret += tcrypt_test("authenc(hmac(sha224),cbc(des))");
+               break;
+       case 184:
+               ret += tcrypt_test("authenc(hmac(sha224),cbc(des3_ede))");
+               break;
+       case 185:
+               ret += tcrypt_test("authenc(hmac(sha256),cbc(des))");
+               break;
+       case 186:
+               ret += tcrypt_test("authenc(hmac(sha256),cbc(des3_ede))");
+               break;
+       case 187:
+               ret += tcrypt_test("authenc(hmac(sha384),cbc(des))");
+               break;
+       case 188:
+               ret += tcrypt_test("authenc(hmac(sha384),cbc(des3_ede))");
+               break;
+       case 189:
+               ret += tcrypt_test("authenc(hmac(sha512),cbc(des))");
+               break;
+       case 190:
+               ret += tcrypt_test("authenc(hmac(sha512),cbc(des3_ede))");
+               break;
        case 200:
                test_cipher_speed("ecb(aes)", ENCRYPT, sec, NULL, 0,
                                speed_template_16_24_32);
index dc3cf3535ef034065752bb820fa6797628935c09..498649ac1953a619a2c35b3b87433cd6ac4bbd74 100644 (file)
@@ -414,16 +414,18 @@ static int __test_aead(struct crypto_aead *tfm, int enc,
        void *input;
        void *output;
        void *assoc;
-       char iv[MAX_IVLEN];
+       char *iv;
        char *xbuf[XBUFSIZE];
        char *xoutbuf[XBUFSIZE];
        char *axbuf[XBUFSIZE];
 
+       iv = kzalloc(MAX_IVLEN, GFP_KERNEL);
+       if (!iv)
+               return ret;
        if (testmgr_alloc_buf(xbuf))
                goto out_noxbuf;
        if (testmgr_alloc_buf(axbuf))
                goto out_noaxbuf;
-
        if (diff_dst && testmgr_alloc_buf(xoutbuf))
                goto out_nooutbuf;
 
@@ -767,6 +769,7 @@ out_nooutbuf:
 out_noaxbuf:
        testmgr_free_buf(xbuf);
 out_noxbuf:
+       kfree(iv);
        return ret;
 }
 
@@ -1831,8 +1834,38 @@ static const struct alg_test_desc alg_test_descs[] = {
                .suite = {
                        .aead = {
                                .enc = {
-                                       .vecs = hmac_sha1_aes_cbc_enc_tv_template,
-                                       .count = HMAC_SHA1_AES_CBC_ENC_TEST_VECTORS
+                                       .vecs =
+                                       hmac_sha1_aes_cbc_enc_tv_temp,
+                                       .count =
+                                       HMAC_SHA1_AES_CBC_ENC_TEST_VEC
+                               }
+                       }
+               }
+       }, {
+               .alg = "authenc(hmac(sha1),cbc(des))",
+               .test = alg_test_aead,
+               .fips_allowed = 1,
+               .suite = {
+                       .aead = {
+                               .enc = {
+                                       .vecs =
+                                       hmac_sha1_des_cbc_enc_tv_temp,
+                                       .count =
+                                       HMAC_SHA1_DES_CBC_ENC_TEST_VEC
+                               }
+                       }
+               }
+       }, {
+               .alg = "authenc(hmac(sha1),cbc(des3_ede))",
+               .test = alg_test_aead,
+               .fips_allowed = 1,
+               .suite = {
+                       .aead = {
+                               .enc = {
+                                       .vecs =
+                                       hmac_sha1_des3_ede_cbc_enc_tv_temp,
+                                       .count =
+                                       HMAC_SHA1_DES3_EDE_CBC_ENC_TEST_VEC
                                }
                        }
                }
@@ -1843,12 +1876,44 @@ static const struct alg_test_desc alg_test_descs[] = {
                .suite = {
                        .aead = {
                                .enc = {
-                                       .vecs = hmac_sha1_ecb_cipher_null_enc_tv_template,
-                                       .count = HMAC_SHA1_ECB_CIPHER_NULL_ENC_TEST_VECTORS
+                                       .vecs =
+                                       hmac_sha1_ecb_cipher_null_enc_tv_temp,
+                                       .count =
+                                       HMAC_SHA1_ECB_CIPHER_NULL_ENC_TEST_VEC
                                },
                                .dec = {
-                                       .vecs = hmac_sha1_ecb_cipher_null_dec_tv_template,
-                                       .count = HMAC_SHA1_ECB_CIPHER_NULL_DEC_TEST_VECTORS
+                                       .vecs =
+                                       hmac_sha1_ecb_cipher_null_dec_tv_temp,
+                                       .count =
+                                       HMAC_SHA1_ECB_CIPHER_NULL_DEC_TEST_VEC
+                               }
+                       }
+               }
+       }, {
+               .alg = "authenc(hmac(sha224),cbc(des))",
+               .test = alg_test_aead,
+               .fips_allowed = 1,
+               .suite = {
+                       .aead = {
+                               .enc = {
+                                       .vecs =
+                                       hmac_sha224_des_cbc_enc_tv_temp,
+                                       .count =
+                                       HMAC_SHA224_DES_CBC_ENC_TEST_VEC
+                               }
+                       }
+               }
+       }, {
+               .alg = "authenc(hmac(sha224),cbc(des3_ede))",
+               .test = alg_test_aead,
+               .fips_allowed = 1,
+               .suite = {
+                       .aead = {
+                               .enc = {
+                                       .vecs =
+                                       hmac_sha224_des3_ede_cbc_enc_tv_temp,
+                                       .count =
+                                       HMAC_SHA224_DES3_EDE_CBC_ENC_TEST_VEC
                                }
                        }
                }
@@ -1859,8 +1924,66 @@ static const struct alg_test_desc alg_test_descs[] = {
                .suite = {
                        .aead = {
                                .enc = {
-                                       .vecs = hmac_sha256_aes_cbc_enc_tv_template,
-                                       .count = HMAC_SHA256_AES_CBC_ENC_TEST_VECTORS
+                                       .vecs =
+                                       hmac_sha256_aes_cbc_enc_tv_temp,
+                                       .count =
+                                       HMAC_SHA256_AES_CBC_ENC_TEST_VEC
+                               }
+                       }
+               }
+       }, {
+               .alg = "authenc(hmac(sha256),cbc(des))",
+               .test = alg_test_aead,
+               .fips_allowed = 1,
+               .suite = {
+                       .aead = {
+                               .enc = {
+                                       .vecs =
+                                       hmac_sha256_des_cbc_enc_tv_temp,
+                                       .count =
+                                       HMAC_SHA256_DES_CBC_ENC_TEST_VEC
+                               }
+                       }
+               }
+       }, {
+               .alg = "authenc(hmac(sha256),cbc(des3_ede))",
+               .test = alg_test_aead,
+               .fips_allowed = 1,
+               .suite = {
+                       .aead = {
+                               .enc = {
+                                       .vecs =
+                                       hmac_sha256_des3_ede_cbc_enc_tv_temp,
+                                       .count =
+                                       HMAC_SHA256_DES3_EDE_CBC_ENC_TEST_VEC
+                               }
+                       }
+               }
+       }, {
+               .alg = "authenc(hmac(sha384),cbc(des))",
+               .test = alg_test_aead,
+               .fips_allowed = 1,
+               .suite = {
+                       .aead = {
+                               .enc = {
+                                       .vecs =
+                                       hmac_sha384_des_cbc_enc_tv_temp,
+                                       .count =
+                                       HMAC_SHA384_DES_CBC_ENC_TEST_VEC
+                               }
+                       }
+               }
+       }, {
+               .alg = "authenc(hmac(sha384),cbc(des3_ede))",
+               .test = alg_test_aead,
+               .fips_allowed = 1,
+               .suite = {
+                       .aead = {
+                               .enc = {
+                                       .vecs =
+                                       hmac_sha384_des3_ede_cbc_enc_tv_temp,
+                                       .count =
+                                       HMAC_SHA384_DES3_EDE_CBC_ENC_TEST_VEC
                                }
                        }
                }
@@ -1871,8 +1994,38 @@ static const struct alg_test_desc alg_test_descs[] = {
                .suite = {
                        .aead = {
                                .enc = {
-                                       .vecs = hmac_sha512_aes_cbc_enc_tv_template,
-                                       .count = HMAC_SHA512_AES_CBC_ENC_TEST_VECTORS
+                                       .vecs =
+                                       hmac_sha512_aes_cbc_enc_tv_temp,
+                                       .count =
+                                       HMAC_SHA512_AES_CBC_ENC_TEST_VEC
+                               }
+                       }
+               }
+       }, {
+               .alg = "authenc(hmac(sha512),cbc(des))",
+               .test = alg_test_aead,
+               .fips_allowed = 1,
+               .suite = {
+                       .aead = {
+                               .enc = {
+                                       .vecs =
+                                       hmac_sha512_des_cbc_enc_tv_temp,
+                                       .count =
+                                       HMAC_SHA512_DES_CBC_ENC_TEST_VEC
+                               }
+                       }
+               }
+       }, {
+               .alg = "authenc(hmac(sha512),cbc(des3_ede))",
+               .test = alg_test_aead,
+               .fips_allowed = 1,
+               .suite = {
+                       .aead = {
+                               .enc = {
+                                       .vecs =
+                                       hmac_sha512_des3_ede_cbc_enc_tv_temp,
+                                       .count =
+                                       HMAC_SHA512_DES3_EDE_CBC_ENC_TEST_VEC
                                }
                        }
                }
@@ -3273,8 +3426,8 @@ test_done:
                panic("%s: %s alg self test failed in fips mode!\n", driver, alg);
 
        if (fips_enabled && !rc)
-               printk(KERN_INFO "alg: self-tests for %s (%s) passed\n",
-                      driver, alg);
+               pr_info(KERN_INFO "alg: self-tests for %s (%s) passed\n",
+                       driver, alg);
 
        return rc;
 
index 3db83dbba1d939d19800cb2d7439417ddfece4ff..69d0dd8ef27e92450b88eb624436d25c52561aec 100644 (file)
@@ -487,10 +487,15 @@ static struct hash_testvec crct10dif_tv_template[] = {
  * SHA1 test vectors  from from FIPS PUB 180-1
  * Long vector from CAVS 5.0
  */
-#define SHA1_TEST_VECTORS      3
+#define SHA1_TEST_VECTORS      6
 
 static struct hash_testvec sha1_tv_template[] = {
        {
+               .plaintext = "",
+               .psize  = 0,
+               .digest = "\xda\x39\xa3\xee\x5e\x6b\x4b\x0d\x32\x55"
+                         "\xbf\xef\x95\x60\x18\x90\xaf\xd8\x07\x09",
+       }, {
                .plaintext = "abc",
                .psize  = 3,
                .digest = "\xa9\x99\x3e\x36\x47\x06\x81\x6a\xba\x3e"
@@ -529,6 +534,144 @@ static struct hash_testvec sha1_tv_template[] = {
                          "\x45\x9c\x02\xb6\x9b\x4a\xa8\xf5\x82\x17",
                .np     = 4,
                .tap    = { 63, 64, 31, 5 }
+       }, {
+               .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-",
+               .psize  = 64,
+               .digest = "\xc8\x71\xf6\x9a\x63\xcc\xa9\x84\x84\x82"
+                         "\x64\xe7\x79\x95\x5d\xd7\x19\x41\x7c\x91",
+       }, {
+               .plaintext = "\x08\x9f\x13\xaa\x41\xd8\x4c\xe3"
+                            "\x7a\x11\x85\x1c\xb3\x27\xbe\x55"
+                            "\xec\x60\xf7\x8e\x02\x99\x30\xc7"
+                            "\x3b\xd2\x69\x00\x74\x0b\xa2\x16"
+                            "\xad\x44\xdb\x4f\xe6\x7d\x14\x88"
+                            "\x1f\xb6\x2a\xc1\x58\xef\x63\xfa"
+                            "\x91\x05\x9c\x33\xca\x3e\xd5\x6c"
+                            "\x03\x77\x0e\xa5\x19\xb0\x47\xde"
+                            "\x52\xe9\x80\x17\x8b\x22\xb9\x2d"
+                            "\xc4\x5b\xf2\x66\xfd\x94\x08\x9f"
+                            "\x36\xcd\x41\xd8\x6f\x06\x7a\x11"
+                            "\xa8\x1c\xb3\x4a\xe1\x55\xec\x83"
+                            "\x1a\x8e\x25\xbc\x30\xc7\x5e\xf5"
+                            "\x69\x00\x97\x0b\xa2\x39\xd0\x44"
+                            "\xdb\x72\x09\x7d\x14\xab\x1f\xb6"
+                            "\x4d\xe4\x58\xef\x86\x1d\x91\x28"
+                            "\xbf\x33\xca\x61\xf8\x6c\x03\x9a"
+                            "\x0e\xa5\x3c\xd3\x47\xde\x75\x0c"
+                            "\x80\x17\xae\x22\xb9\x50\xe7\x5b"
+                            "\xf2\x89\x20\x94\x2b\xc2\x36\xcd"
+                            "\x64\xfb\x6f\x06\x9d\x11\xa8\x3f"
+                            "\xd6\x4a\xe1\x78\x0f\x83\x1a\xb1"
+                            "\x25\xbc\x53\xea\x5e\xf5\x8c\x00"
+                            "\x97\x2e\xc5\x39\xd0\x67\xfe\x72"
+                            "\x09\xa0\x14\xab\x42\xd9\x4d\xe4"
+                            "\x7b\x12\x86\x1d\xb4\x28\xbf\x56"
+                            "\xed\x61\xf8\x8f\x03\x9a\x31\xc8"
+                            "\x3c\xd3\x6a\x01\x75\x0c\xa3\x17"
+                            "\xae\x45\xdc\x50\xe7\x7e\x15\x89"
+                            "\x20\xb7\x2b\xc2\x59\xf0\x64\xfb"
+                            "\x92\x06\x9d\x34\xcb\x3f\xd6\x6d"
+                            "\x04\x78\x0f\xa6\x1a\xb1\x48\xdf"
+                            "\x53\xea\x81\x18\x8c\x23\xba\x2e"
+                            "\xc5\x5c\xf3\x67\xfe\x95\x09\xa0"
+                            "\x37\xce\x42\xd9\x70\x07\x7b\x12"
+                            "\xa9\x1d\xb4\x4b\xe2\x56\xed\x84"
+                            "\x1b\x8f\x26\xbd\x31\xc8\x5f\xf6"
+                            "\x6a\x01\x98\x0c\xa3\x3a\xd1\x45"
+                            "\xdc\x73\x0a\x7e\x15\xac\x20\xb7"
+                            "\x4e\xe5\x59\xf0\x87\x1e\x92\x29"
+                            "\xc0\x34\xcb\x62\xf9\x6d\x04\x9b"
+                            "\x0f\xa6\x3d\xd4\x48\xdf\x76\x0d"
+                            "\x81\x18\xaf\x23\xba\x51\xe8\x5c"
+                            "\xf3\x8a\x21\x95\x2c\xc3\x37\xce"
+                            "\x65\xfc\x70\x07\x9e\x12\xa9\x40"
+                            "\xd7\x4b\xe2\x79\x10\x84\x1b\xb2"
+                            "\x26\xbd\x54\xeb\x5f\xf6\x8d\x01"
+                            "\x98\x2f\xc6\x3a\xd1\x68\xff\x73"
+                            "\x0a\xa1\x15\xac\x43\xda\x4e\xe5"
+                            "\x7c\x13\x87\x1e\xb5\x29\xc0\x57"
+                            "\xee\x62\xf9\x90\x04\x9b\x32\xc9"
+                            "\x3d\xd4\x6b\x02\x76\x0d\xa4\x18"
+                            "\xaf\x46\xdd\x51\xe8\x7f\x16\x8a"
+                            "\x21\xb8\x2c\xc3\x5a\xf1\x65\xfc"
+                            "\x93\x07\x9e\x35\xcc\x40\xd7\x6e"
+                            "\x05\x79\x10\xa7\x1b\xb2\x49\xe0"
+                            "\x54\xeb\x82\x19\x8d\x24\xbb\x2f"
+                            "\xc6\x5d\xf4\x68\xff\x96\x0a\xa1"
+                            "\x38\xcf\x43\xda\x71\x08\x7c\x13"
+                            "\xaa\x1e\xb5\x4c\xe3\x57\xee\x85"
+                            "\x1c\x90\x27\xbe\x32\xc9\x60\xf7"
+                            "\x6b\x02\x99\x0d\xa4\x3b\xd2\x46"
+                            "\xdd\x74\x0b\x7f\x16\xad\x21\xb8"
+                            "\x4f\xe6\x5a\xf1\x88\x1f\x93\x2a"
+                            "\xc1\x35\xcc\x63\xfa\x6e\x05\x9c"
+                            "\x10\xa7\x3e\xd5\x49\xe0\x77\x0e"
+                            "\x82\x19\xb0\x24\xbb\x52\xe9\x5d"
+                            "\xf4\x8b\x22\x96\x2d\xc4\x38\xcf"
+                            "\x66\xfd\x71\x08\x9f\x13\xaa\x41"
+                            "\xd8\x4c\xe3\x7a\x11\x85\x1c\xb3"
+                            "\x27\xbe\x55\xec\x60\xf7\x8e\x02"
+                            "\x99\x30\xc7\x3b\xd2\x69\x00\x74"
+                            "\x0b\xa2\x16\xad\x44\xdb\x4f\xe6"
+                            "\x7d\x14\x88\x1f\xb6\x2a\xc1\x58"
+                            "\xef\x63\xfa\x91\x05\x9c\x33\xca"
+                            "\x3e\xd5\x6c\x03\x77\x0e\xa5\x19"
+                            "\xb0\x47\xde\x52\xe9\x80\x17\x8b"
+                            "\x22\xb9\x2d\xc4\x5b\xf2\x66\xfd"
+                            "\x94\x08\x9f\x36\xcd\x41\xd8\x6f"
+                            "\x06\x7a\x11\xa8\x1c\xb3\x4a\xe1"
+                            "\x55\xec\x83\x1a\x8e\x25\xbc\x30"
+                            "\xc7\x5e\xf5\x69\x00\x97\x0b\xa2"
+                            "\x39\xd0\x44\xdb\x72\x09\x7d\x14"
+                            "\xab\x1f\xb6\x4d\xe4\x58\xef\x86"
+                            "\x1d\x91\x28\xbf\x33\xca\x61\xf8"
+                            "\x6c\x03\x9a\x0e\xa5\x3c\xd3\x47"
+                            "\xde\x75\x0c\x80\x17\xae\x22\xb9"
+                            "\x50\xe7\x5b\xf2\x89\x20\x94\x2b"
+                            "\xc2\x36\xcd\x64\xfb\x6f\x06\x9d"
+                            "\x11\xa8\x3f\xd6\x4a\xe1\x78\x0f"
+                            "\x83\x1a\xb1\x25\xbc\x53\xea\x5e"
+                            "\xf5\x8c\x00\x97\x2e\xc5\x39\xd0"
+                            "\x67\xfe\x72\x09\xa0\x14\xab\x42"
+                            "\xd9\x4d\xe4\x7b\x12\x86\x1d\xb4"
+                            "\x28\xbf\x56\xed\x61\xf8\x8f\x03"
+                            "\x9a\x31\xc8\x3c\xd3\x6a\x01\x75"
+                            "\x0c\xa3\x17\xae\x45\xdc\x50\xe7"
+                            "\x7e\x15\x89\x20\xb7\x2b\xc2\x59"
+                            "\xf0\x64\xfb\x92\x06\x9d\x34\xcb"
+                            "\x3f\xd6\x6d\x04\x78\x0f\xa6\x1a"
+                            "\xb1\x48\xdf\x53\xea\x81\x18\x8c"
+                            "\x23\xba\x2e\xc5\x5c\xf3\x67\xfe"
+                            "\x95\x09\xa0\x37\xce\x42\xd9\x70"
+                            "\x07\x7b\x12\xa9\x1d\xb4\x4b\xe2"
+                            "\x56\xed\x84\x1b\x8f\x26\xbd\x31"
+                            "\xc8\x5f\xf6\x6a\x01\x98\x0c\xa3"
+                            "\x3a\xd1\x45\xdc\x73\x0a\x7e\x15"
+                            "\xac\x20\xb7\x4e\xe5\x59\xf0\x87"
+                            "\x1e\x92\x29\xc0\x34\xcb\x62\xf9"
+                            "\x6d\x04\x9b\x0f\xa6\x3d\xd4\x48"
+                            "\xdf\x76\x0d\x81\x18\xaf\x23\xba"
+                            "\x51\xe8\x5c\xf3\x8a\x21\x95\x2c"
+                            "\xc3\x37\xce\x65\xfc\x70\x07\x9e"
+                            "\x12\xa9\x40\xd7\x4b\xe2\x79\x10"
+                            "\x84\x1b\xb2\x26\xbd\x54\xeb\x5f"
+                            "\xf6\x8d\x01\x98\x2f\xc6\x3a\xd1"
+                            "\x68\xff\x73\x0a\xa1\x15\xac\x43"
+                            "\xda\x4e\xe5\x7c\x13\x87\x1e\xb5"
+                            "\x29\xc0\x57\xee\x62\xf9\x90\x04"
+                            "\x9b\x32\xc9\x3d\xd4\x6b\x02\x76"
+                            "\x0d\xa4\x18\xaf\x46\xdd\x51\xe8"
+                            "\x7f\x16\x8a\x21\xb8\x2c\xc3\x5a"
+                            "\xf1\x65\xfc\x93\x07\x9e\x35\xcc"
+                            "\x40\xd7\x6e\x05\x79\x10\xa7\x1b"
+                            "\xb2\x49\xe0\x54\xeb\x82\x19\x8d"
+                            "\x24\xbb\x2f\xc6\x5d\xf4\x68\xff"
+                            "\x96\x0a\xa1\x38\xcf\x43\xda\x71"
+                            "\x08\x7c\x13\xaa\x1e\xb5\x4c",
+               .psize     = 1023,
+               .digest    = "\xb8\xe3\x54\xed\xc5\xfc\xef\xa4"
+                            "\x55\x73\x4a\x81\x99\xe4\x47\x2a"
+                            "\x30\xd6\xc9\x85",
        }
 };
 
@@ -536,10 +679,17 @@ static struct hash_testvec sha1_tv_template[] = {
 /*
  * SHA224 test vectors from from FIPS PUB 180-2
  */
-#define SHA224_TEST_VECTORS     2
+#define SHA224_TEST_VECTORS     5
 
 static struct hash_testvec sha224_tv_template[] = {
        {
+               .plaintext = "",
+               .psize  = 0,
+               .digest = "\xd1\x4a\x02\x8c\x2a\x3a\x2b\xc9"
+                         "\x47\x61\x02\xbb\x28\x82\x34\xc4"
+                         "\x15\xa2\xb0\x1f\x82\x8e\xa6\x2a"
+                         "\xc5\xb3\xe4\x2f",
+       }, {
                .plaintext = "abc",
                .psize  = 3,
                .digest = "\x23\x09\x7D\x22\x34\x05\xD8\x22"
@@ -556,16 +706,164 @@ static struct hash_testvec sha224_tv_template[] = {
                          "\x52\x52\x25\x25",
                .np     = 2,
                .tap    = { 28, 28 }
+       }, {
+               .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-",
+               .psize  = 64,
+               .digest = "\xc4\xdb\x2b\x3a\x58\xc3\x99\x01"
+                         "\x42\xfd\x10\x92\xaa\x4e\x04\x08"
+                         "\x58\xbb\xbb\xe8\xf8\x14\xa7\x0c"
+                         "\xef\x3b\xcb\x0e",
+       }, {
+               .plaintext = "\x08\x9f\x13\xaa\x41\xd8\x4c\xe3"
+                            "\x7a\x11\x85\x1c\xb3\x27\xbe\x55"
+                            "\xec\x60\xf7\x8e\x02\x99\x30\xc7"
+                            "\x3b\xd2\x69\x00\x74\x0b\xa2\x16"
+                            "\xad\x44\xdb\x4f\xe6\x7d\x14\x88"
+                            "\x1f\xb6\x2a\xc1\x58\xef\x63\xfa"
+                            "\x91\x05\x9c\x33\xca\x3e\xd5\x6c"
+                            "\x03\x77\x0e\xa5\x19\xb0\x47\xde"
+                            "\x52\xe9\x80\x17\x8b\x22\xb9\x2d"
+                            "\xc4\x5b\xf2\x66\xfd\x94\x08\x9f"
+                            "\x36\xcd\x41\xd8\x6f\x06\x7a\x11"
+                            "\xa8\x1c\xb3\x4a\xe1\x55\xec\x83"
+                            "\x1a\x8e\x25\xbc\x30\xc7\x5e\xf5"
+                            "\x69\x00\x97\x0b\xa2\x39\xd0\x44"
+                            "\xdb\x72\x09\x7d\x14\xab\x1f\xb6"
+                            "\x4d\xe4\x58\xef\x86\x1d\x91\x28"
+                            "\xbf\x33\xca\x61\xf8\x6c\x03\x9a"
+                            "\x0e\xa5\x3c\xd3\x47\xde\x75\x0c"
+                            "\x80\x17\xae\x22\xb9\x50\xe7\x5b"
+                            "\xf2\x89\x20\x94\x2b\xc2\x36\xcd"
+                            "\x64\xfb\x6f\x06\x9d\x11\xa8\x3f"
+                            "\xd6\x4a\xe1\x78\x0f\x83\x1a\xb1"
+                            "\x25\xbc\x53\xea\x5e\xf5\x8c\x00"
+                            "\x97\x2e\xc5\x39\xd0\x67\xfe\x72"
+                            "\x09\xa0\x14\xab\x42\xd9\x4d\xe4"
+                            "\x7b\x12\x86\x1d\xb4\x28\xbf\x56"
+                            "\xed\x61\xf8\x8f\x03\x9a\x31\xc8"
+                            "\x3c\xd3\x6a\x01\x75\x0c\xa3\x17"
+                            "\xae\x45\xdc\x50\xe7\x7e\x15\x89"
+                            "\x20\xb7\x2b\xc2\x59\xf0\x64\xfb"
+                            "\x92\x06\x9d\x34\xcb\x3f\xd6\x6d"
+                            "\x04\x78\x0f\xa6\x1a\xb1\x48\xdf"
+                            "\x53\xea\x81\x18\x8c\x23\xba\x2e"
+                            "\xc5\x5c\xf3\x67\xfe\x95\x09\xa0"
+                            "\x37\xce\x42\xd9\x70\x07\x7b\x12"
+                            "\xa9\x1d\xb4\x4b\xe2\x56\xed\x84"
+                            "\x1b\x8f\x26\xbd\x31\xc8\x5f\xf6"
+                            "\x6a\x01\x98\x0c\xa3\x3a\xd1\x45"
+                            "\xdc\x73\x0a\x7e\x15\xac\x20\xb7"
+                            "\x4e\xe5\x59\xf0\x87\x1e\x92\x29"
+                            "\xc0\x34\xcb\x62\xf9\x6d\x04\x9b"
+                            "\x0f\xa6\x3d\xd4\x48\xdf\x76\x0d"
+                            "\x81\x18\xaf\x23\xba\x51\xe8\x5c"
+                            "\xf3\x8a\x21\x95\x2c\xc3\x37\xce"
+                            "\x65\xfc\x70\x07\x9e\x12\xa9\x40"
+                            "\xd7\x4b\xe2\x79\x10\x84\x1b\xb2"
+                            "\x26\xbd\x54\xeb\x5f\xf6\x8d\x01"
+                            "\x98\x2f\xc6\x3a\xd1\x68\xff\x73"
+                            "\x0a\xa1\x15\xac\x43\xda\x4e\xe5"
+                            "\x7c\x13\x87\x1e\xb5\x29\xc0\x57"
+                            "\xee\x62\xf9\x90\x04\x9b\x32\xc9"
+                            "\x3d\xd4\x6b\x02\x76\x0d\xa4\x18"
+                            "\xaf\x46\xdd\x51\xe8\x7f\x16\x8a"
+                            "\x21\xb8\x2c\xc3\x5a\xf1\x65\xfc"
+                            "\x93\x07\x9e\x35\xcc\x40\xd7\x6e"
+                            "\x05\x79\x10\xa7\x1b\xb2\x49\xe0"
+                            "\x54\xeb\x82\x19\x8d\x24\xbb\x2f"
+                            "\xc6\x5d\xf4\x68\xff\x96\x0a\xa1"
+                            "\x38\xcf\x43\xda\x71\x08\x7c\x13"
+                            "\xaa\x1e\xb5\x4c\xe3\x57\xee\x85"
+                            "\x1c\x90\x27\xbe\x32\xc9\x60\xf7"
+                            "\x6b\x02\x99\x0d\xa4\x3b\xd2\x46"
+                            "\xdd\x74\x0b\x7f\x16\xad\x21\xb8"
+                            "\x4f\xe6\x5a\xf1\x88\x1f\x93\x2a"
+                            "\xc1\x35\xcc\x63\xfa\x6e\x05\x9c"
+                            "\x10\xa7\x3e\xd5\x49\xe0\x77\x0e"
+                            "\x82\x19\xb0\x24\xbb\x52\xe9\x5d"
+                            "\xf4\x8b\x22\x96\x2d\xc4\x38\xcf"
+                            "\x66\xfd\x71\x08\x9f\x13\xaa\x41"
+                            "\xd8\x4c\xe3\x7a\x11\x85\x1c\xb3"
+                            "\x27\xbe\x55\xec\x60\xf7\x8e\x02"
+                            "\x99\x30\xc7\x3b\xd2\x69\x00\x74"
+                            "\x0b\xa2\x16\xad\x44\xdb\x4f\xe6"
+                            "\x7d\x14\x88\x1f\xb6\x2a\xc1\x58"
+                            "\xef\x63\xfa\x91\x05\x9c\x33\xca"
+                            "\x3e\xd5\x6c\x03\x77\x0e\xa5\x19"
+                            "\xb0\x47\xde\x52\xe9\x80\x17\x8b"
+                            "\x22\xb9\x2d\xc4\x5b\xf2\x66\xfd"
+                            "\x94\x08\x9f\x36\xcd\x41\xd8\x6f"
+                            "\x06\x7a\x11\xa8\x1c\xb3\x4a\xe1"
+                            "\x55\xec\x83\x1a\x8e\x25\xbc\x30"
+                            "\xc7\x5e\xf5\x69\x00\x97\x0b\xa2"
+                            "\x39\xd0\x44\xdb\x72\x09\x7d\x14"
+                            "\xab\x1f\xb6\x4d\xe4\x58\xef\x86"
+                            "\x1d\x91\x28\xbf\x33\xca\x61\xf8"
+                            "\x6c\x03\x9a\x0e\xa5\x3c\xd3\x47"
+                            "\xde\x75\x0c\x80\x17\xae\x22\xb9"
+                            "\x50\xe7\x5b\xf2\x89\x20\x94\x2b"
+                            "\xc2\x36\xcd\x64\xfb\x6f\x06\x9d"
+                            "\x11\xa8\x3f\xd6\x4a\xe1\x78\x0f"
+                            "\x83\x1a\xb1\x25\xbc\x53\xea\x5e"
+                            "\xf5\x8c\x00\x97\x2e\xc5\x39\xd0"
+                            "\x67\xfe\x72\x09\xa0\x14\xab\x42"
+                            "\xd9\x4d\xe4\x7b\x12\x86\x1d\xb4"
+                            "\x28\xbf\x56\xed\x61\xf8\x8f\x03"
+                            "\x9a\x31\xc8\x3c\xd3\x6a\x01\x75"
+                            "\x0c\xa3\x17\xae\x45\xdc\x50\xe7"
+                            "\x7e\x15\x89\x20\xb7\x2b\xc2\x59"
+                            "\xf0\x64\xfb\x92\x06\x9d\x34\xcb"
+                            "\x3f\xd6\x6d\x04\x78\x0f\xa6\x1a"
+                            "\xb1\x48\xdf\x53\xea\x81\x18\x8c"
+                            "\x23\xba\x2e\xc5\x5c\xf3\x67\xfe"
+                            "\x95\x09\xa0\x37\xce\x42\xd9\x70"
+                            "\x07\x7b\x12\xa9\x1d\xb4\x4b\xe2"
+                            "\x56\xed\x84\x1b\x8f\x26\xbd\x31"
+                            "\xc8\x5f\xf6\x6a\x01\x98\x0c\xa3"
+                            "\x3a\xd1\x45\xdc\x73\x0a\x7e\x15"
+                            "\xac\x20\xb7\x4e\xe5\x59\xf0\x87"
+                            "\x1e\x92\x29\xc0\x34\xcb\x62\xf9"
+                            "\x6d\x04\x9b\x0f\xa6\x3d\xd4\x48"
+                            "\xdf\x76\x0d\x81\x18\xaf\x23\xba"
+                            "\x51\xe8\x5c\xf3\x8a\x21\x95\x2c"
+                            "\xc3\x37\xce\x65\xfc\x70\x07\x9e"
+                            "\x12\xa9\x40\xd7\x4b\xe2\x79\x10"
+                            "\x84\x1b\xb2\x26\xbd\x54\xeb\x5f"
+                            "\xf6\x8d\x01\x98\x2f\xc6\x3a\xd1"
+                            "\x68\xff\x73\x0a\xa1\x15\xac\x43"
+                            "\xda\x4e\xe5\x7c\x13\x87\x1e\xb5"
+                            "\x29\xc0\x57\xee\x62\xf9\x90\x04"
+                            "\x9b\x32\xc9\x3d\xd4\x6b\x02\x76"
+                            "\x0d\xa4\x18\xaf\x46\xdd\x51\xe8"
+                            "\x7f\x16\x8a\x21\xb8\x2c\xc3\x5a"
+                            "\xf1\x65\xfc\x93\x07\x9e\x35\xcc"
+                            "\x40\xd7\x6e\x05\x79\x10\xa7\x1b"
+                            "\xb2\x49\xe0\x54\xeb\x82\x19\x8d"
+                            "\x24\xbb\x2f\xc6\x5d\xf4\x68\xff"
+                            "\x96\x0a\xa1\x38\xcf\x43\xda\x71"
+                            "\x08\x7c\x13\xaa\x1e\xb5\x4c",
+               .psize     = 1023,
+               .digest    = "\x98\x43\x07\x63\x75\xe0\xa7\x1c"
+                            "\x78\xb1\x8b\xfd\x04\xf5\x2d\x91"
+                            "\x20\x48\xa4\x28\xff\x55\xb1\xd3"
+                            "\xe6\xf9\x4f\xcc",
        }
 };
 
 /*
  * SHA256 test vectors from from NIST
  */
-#define SHA256_TEST_VECTORS    2
+#define SHA256_TEST_VECTORS    5
 
 static struct hash_testvec sha256_tv_template[] = {
        {
+               .plaintext = "",
+               .psize  = 0,
+               .digest = "\xe3\xb0\xc4\x42\x98\xfc\x1c\x14"
+                         "\x9a\xfb\xf4\xc8\x99\x6f\xb9\x24"
+                         "\x27\xae\x41\xe4\x64\x9b\x93\x4c"
+                         "\xa4\x95\x99\x1b\x78\x52\xb8\x55",
+       }, {
                .plaintext = "abc",
                .psize  = 3,
                .digest = "\xba\x78\x16\xbf\x8f\x01\xcf\xea"
@@ -581,16 +879,166 @@ static struct hash_testvec sha256_tv_template[] = {
                          "\xf6\xec\xed\xd4\x19\xdb\x06\xc1",
                .np     = 2,
                .tap    = { 28, 28 }
-       },
+       }, {
+               .plaintext = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-",
+               .psize  = 64,
+               .digest = "\xb5\xfe\xad\x56\x7d\xff\xcb\xa4"
+                         "\x2c\x32\x29\x32\x19\xbb\xfb\xfa"
+                         "\xd6\xff\x94\xa3\x72\x91\x85\x66"
+                         "\x3b\xa7\x87\x77\x58\xa3\x40\x3a",
+       }, {
+               .plaintext = "\x08\x9f\x13\xaa\x41\xd8\x4c\xe3"
+                            "\x7a\x11\x85\x1c\xb3\x27\xbe\x55"
+                            "\xec\x60\xf7\x8e\x02\x99\x30\xc7"
+                            "\x3b\xd2\x69\x00\x74\x0b\xa2\x16"
+                            "\xad\x44\xdb\x4f\xe6\x7d\x14\x88"
+                            "\x1f\xb6\x2a\xc1\x58\xef\x63\xfa"
+                            "\x91\x05\x9c\x33\xca\x3e\xd5\x6c"
+                            "\x03\x77\x0e\xa5\x19\xb0\x47\xde"
+                            "\x52\xe9\x80\x17\x8b\x22\xb9\x2d"
+                            "\xc4\x5b\xf2\x66\xfd\x94\x08\x9f"
+                            "\x36\xcd\x41\xd8\x6f\x06\x7a\x11"
+                            "\xa8\x1c\xb3\x4a\xe1\x55\xec\x83"
+                            "\x1a\x8e\x25\xbc\x30\xc7\x5e\xf5"
+                            "\x69\x00\x97\x0b\xa2\x39\xd0\x44"
+                            "\xdb\x72\x09\x7d\x14\xab\x1f\xb6"
+                            "\x4d\xe4\x58\xef\x86\x1d\x91\x28"
+                            "\xbf\x33\xca\x61\xf8\x6c\x03\x9a"
+                            "\x0e\xa5\x3c\xd3\x47\xde\x75\x0c"
+                            "\x80\x17\xae\x22\xb9\x50\xe7\x5b"
+                            "\xf2\x89\x20\x94\x2b\xc2\x36\xcd"
+                            "\x64\xfb\x6f\x06\x9d\x11\xa8\x3f"
+                            "\xd6\x4a\xe1\x78\x0f\x83\x1a\xb1"
+                            "\x25\xbc\x53\xea\x5e\xf5\x8c\x00"
+                            "\x97\x2e\xc5\x39\xd0\x67\xfe\x72"
+                            "\x09\xa0\x14\xab\x42\xd9\x4d\xe4"
+                            "\x7b\x12\x86\x1d\xb4\x28\xbf\x56"
+                            "\xed\x61\xf8\x8f\x03\x9a\x31\xc8"
+                            "\x3c\xd3\x6a\x01\x75\x0c\xa3\x17"
+                            "\xae\x45\xdc\x50\xe7\x7e\x15\x89"
+                            "\x20\xb7\x2b\xc2\x59\xf0\x64\xfb"
+                            "\x92\x06\x9d\x34\xcb\x3f\xd6\x6d"
+                            "\x04\x78\x0f\xa6\x1a\xb1\x48\xdf"
+                            "\x53\xea\x81\x18\x8c\x23\xba\x2e"
+                            "\xc5\x5c\xf3\x67\xfe\x95\x09\xa0"
+                            "\x37\xce\x42\xd9\x70\x07\x7b\x12"
+                            "\xa9\x1d\xb4\x4b\xe2\x56\xed\x84"
+                            "\x1b\x8f\x26\xbd\x31\xc8\x5f\xf6"
+                            "\x6a\x01\x98\x0c\xa3\x3a\xd1\x45"
+                            "\xdc\x73\x0a\x7e\x15\xac\x20\xb7"
+                            "\x4e\xe5\x59\xf0\x87\x1e\x92\x29"
+                            "\xc0\x34\xcb\x62\xf9\x6d\x04\x9b"
+                            "\x0f\xa6\x3d\xd4\x48\xdf\x76\x0d"
+                            "\x81\x18\xaf\x23\xba\x51\xe8\x5c"
+                            "\xf3\x8a\x21\x95\x2c\xc3\x37\xce"
+                            "\x65\xfc\x70\x07\x9e\x12\xa9\x40"
+                            "\xd7\x4b\xe2\x79\x10\x84\x1b\xb2"
+                            "\x26\xbd\x54\xeb\x5f\xf6\x8d\x01"
+                            "\x98\x2f\xc6\x3a\xd1\x68\xff\x73"
+                            "\x0a\xa1\x15\xac\x43\xda\x4e\xe5"
+                            "\x7c\x13\x87\x1e\xb5\x29\xc0\x57"
+                            "\xee\x62\xf9\x90\x04\x9b\x32\xc9"
+                            "\x3d\xd4\x6b\x02\x76\x0d\xa4\x18"
+                            "\xaf\x46\xdd\x51\xe8\x7f\x16\x8a"
+                            "\x21\xb8\x2c\xc3\x5a\xf1\x65\xfc"
+                            "\x93\x07\x9e\x35\xcc\x40\xd7\x6e"
+                            "\x05\x79\x10\xa7\x1b\xb2\x49\xe0"
+                            "\x54\xeb\x82\x19\x8d\x24\xbb\x2f"
+                            "\xc6\x5d\xf4\x68\xff\x96\x0a\xa1"
+                            "\x38\xcf\x43\xda\x71\x08\x7c\x13"
+                            "\xaa\x1e\xb5\x4c\xe3\x57\xee\x85"
+                            "\x1c\x90\x27\xbe\x32\xc9\x60\xf7"
+                            "\x6b\x02\x99\x0d\xa4\x3b\xd2\x46"
+                            "\xdd\x74\x0b\x7f\x16\xad\x21\xb8"
+                            "\x4f\xe6\x5a\xf1\x88\x1f\x93\x2a"
+                            "\xc1\x35\xcc\x63\xfa\x6e\x05\x9c"
+                            "\x10\xa7\x3e\xd5\x49\xe0\x77\x0e"
+                            "\x82\x19\xb0\x24\xbb\x52\xe9\x5d"
+                            "\xf4\x8b\x22\x96\x2d\xc4\x38\xcf"
+                            "\x66\xfd\x71\x08\x9f\x13\xaa\x41"
+                            "\xd8\x4c\xe3\x7a\x11\x85\x1c\xb3"
+                            "\x27\xbe\x55\xec\x60\xf7\x8e\x02"
+                            "\x99\x30\xc7\x3b\xd2\x69\x00\x74"
+                            "\x0b\xa2\x16\xad\x44\xdb\x4f\xe6"
+                            "\x7d\x14\x88\x1f\xb6\x2a\xc1\x58"
+                            "\xef\x63\xfa\x91\x05\x9c\x33\xca"
+                            "\x3e\xd5\x6c\x03\x77\x0e\xa5\x19"
+                            "\xb0\x47\xde\x52\xe9\x80\x17\x8b"
+                            "\x22\xb9\x2d\xc4\x5b\xf2\x66\xfd"
+                            "\x94\x08\x9f\x36\xcd\x41\xd8\x6f"
+                            "\x06\x7a\x11\xa8\x1c\xb3\x4a\xe1"
+                            "\x55\xec\x83\x1a\x8e\x25\xbc\x30"
+                            "\xc7\x5e\xf5\x69\x00\x97\x0b\xa2"
+                            "\x39\xd0\x44\xdb\x72\x09\x7d\x14"
+                            "\xab\x1f\xb6\x4d\xe4\x58\xef\x86"
+                            "\x1d\x91\x28\xbf\x33\xca\x61\xf8"
+                            "\x6c\x03\x9a\x0e\xa5\x3c\xd3\x47"
+                            "\xde\x75\x0c\x80\x17\xae\x22\xb9"
+                            "\x50\xe7\x5b\xf2\x89\x20\x94\x2b"
+                            "\xc2\x36\xcd\x64\xfb\x6f\x06\x9d"
+                            "\x11\xa8\x3f\xd6\x4a\xe1\x78\x0f"
+                            "\x83\x1a\xb1\x25\xbc\x53\xea\x5e"
+                            "\xf5\x8c\x00\x97\x2e\xc5\x39\xd0"
+                            "\x67\xfe\x72\x09\xa0\x14\xab\x42"
+                            "\xd9\x4d\xe4\x7b\x12\x86\x1d\xb4"
+                            "\x28\xbf\x56\xed\x61\xf8\x8f\x03"
+                            "\x9a\x31\xc8\x3c\xd3\x6a\x01\x75"
+                            "\x0c\xa3\x17\xae\x45\xdc\x50\xe7"
+                            "\x7e\x15\x89\x20\xb7\x2b\xc2\x59"
+                            "\xf0\x64\xfb\x92\x06\x9d\x34\xcb"
+                            "\x3f\xd6\x6d\x04\x78\x0f\xa6\x1a"
+                            "\xb1\x48\xdf\x53\xea\x81\x18\x8c"
+                            "\x23\xba\x2e\xc5\x5c\xf3\x67\xfe"
+                            "\x95\x09\xa0\x37\xce\x42\xd9\x70"
+                            "\x07\x7b\x12\xa9\x1d\xb4\x4b\xe2"
+                            "\x56\xed\x84\x1b\x8f\x26\xbd\x31"
+                            "\xc8\x5f\xf6\x6a\x01\x98\x0c\xa3"
+                            "\x3a\xd1\x45\xdc\x73\x0a\x7e\x15"
+                            "\xac\x20\xb7\x4e\xe5\x59\xf0\x87"
+                            "\x1e\x92\x29\xc0\x34\xcb\x62\xf9"
+                            "\x6d\x04\x9b\x0f\xa6\x3d\xd4\x48"
+                            "\xdf\x76\x0d\x81\x18\xaf\x23\xba"
+                            "\x51\xe8\x5c\xf3\x8a\x21\x95\x2c"
+                            "\xc3\x37\xce\x65\xfc\x70\x07\x9e"
+                            "\x12\xa9\x40\xd7\x4b\xe2\x79\x10"
+                            "\x84\x1b\xb2\x26\xbd\x54\xeb\x5f"
+                            "\xf6\x8d\x01\x98\x2f\xc6\x3a\xd1"
+                            "\x68\xff\x73\x0a\xa1\x15\xac\x43"
+                            "\xda\x4e\xe5\x7c\x13\x87\x1e\xb5"
+                            "\x29\xc0\x57\xee\x62\xf9\x90\x04"
+                            "\x9b\x32\xc9\x3d\xd4\x6b\x02\x76"
+                            "\x0d\xa4\x18\xaf\x46\xdd\x51\xe8"
+                            "\x7f\x16\x8a\x21\xb8\x2c\xc3\x5a"
+                            "\xf1\x65\xfc\x93\x07\x9e\x35\xcc"
+                            "\x40\xd7\x6e\x05\x79\x10\xa7\x1b"
+                            "\xb2\x49\xe0\x54\xeb\x82\x19\x8d"
+                            "\x24\xbb\x2f\xc6\x5d\xf4\x68\xff"
+                            "\x96\x0a\xa1\x38\xcf\x43\xda\x71"
+                            "\x08\x7c\x13\xaa\x1e\xb5\x4c",
+               .psize     = 1023,
+               .digest    = "\xc5\xce\x0c\xca\x01\x4f\x53\x3a"
+                            "\x32\x32\x17\xcc\xd4\x6a\x71\xa9"
+                            "\xf3\xed\x50\x10\x64\x8e\x06\xbe"
+                            "\x9b\x4a\xa6\xbb\x05\x89\x59\x51",
+       }
 };
 
 /*
  * SHA384 test vectors from from NIST and kerneli
  */
-#define SHA384_TEST_VECTORS    4
+#define SHA384_TEST_VECTORS    6
 
 static struct hash_testvec sha384_tv_template[] = {
        {
+               .plaintext = "",
+               .psize  = 0,
+               .digest = "\x38\xb0\x60\xa7\x51\xac\x96\x38"
+                         "\x4c\xd9\x32\x7e\xb1\xb1\xe3\x6a"
+                         "\x21\xfd\xb7\x11\x14\xbe\x07\x43"
+                         "\x4c\x0c\xc7\xbf\x63\xf6\xe1\xda"
+                         "\x27\x4e\xde\xbf\xe7\x6f\x65\xfb"
+                         "\xd5\x1a\xd2\xf1\x48\x98\xb9\x5b",
+       }, {
                .plaintext= "abc",
                .psize  = 3,
                .digest = "\xcb\x00\x75\x3f\x45\xa3\x5e\x8b"
@@ -630,16 +1078,163 @@ static struct hash_testvec sha384_tv_template[] = {
                          "\xc9\x38\xe2\xd1\x99\xe8\xbe\xa4",
                .np     = 4,
                .tap    = { 26, 26, 26, 26 }
-       },
+       }, {
+               .plaintext = "\x08\x9f\x13\xaa\x41\xd8\x4c\xe3"
+                            "\x7a\x11\x85\x1c\xb3\x27\xbe\x55"
+                            "\xec\x60\xf7\x8e\x02\x99\x30\xc7"
+                            "\x3b\xd2\x69\x00\x74\x0b\xa2\x16"
+                            "\xad\x44\xdb\x4f\xe6\x7d\x14\x88"
+                            "\x1f\xb6\x2a\xc1\x58\xef\x63\xfa"
+                            "\x91\x05\x9c\x33\xca\x3e\xd5\x6c"
+                            "\x03\x77\x0e\xa5\x19\xb0\x47\xde"
+                            "\x52\xe9\x80\x17\x8b\x22\xb9\x2d"
+                            "\xc4\x5b\xf2\x66\xfd\x94\x08\x9f"
+                            "\x36\xcd\x41\xd8\x6f\x06\x7a\x11"
+                            "\xa8\x1c\xb3\x4a\xe1\x55\xec\x83"
+                            "\x1a\x8e\x25\xbc\x30\xc7\x5e\xf5"
+                            "\x69\x00\x97\x0b\xa2\x39\xd0\x44"
+                            "\xdb\x72\x09\x7d\x14\xab\x1f\xb6"
+                            "\x4d\xe4\x58\xef\x86\x1d\x91\x28"
+                            "\xbf\x33\xca\x61\xf8\x6c\x03\x9a"
+                            "\x0e\xa5\x3c\xd3\x47\xde\x75\x0c"
+                            "\x80\x17\xae\x22\xb9\x50\xe7\x5b"
+                            "\xf2\x89\x20\x94\x2b\xc2\x36\xcd"
+                            "\x64\xfb\x6f\x06\x9d\x11\xa8\x3f"
+                            "\xd6\x4a\xe1\x78\x0f\x83\x1a\xb1"
+                            "\x25\xbc\x53\xea\x5e\xf5\x8c\x00"
+                            "\x97\x2e\xc5\x39\xd0\x67\xfe\x72"
+                            "\x09\xa0\x14\xab\x42\xd9\x4d\xe4"
+                            "\x7b\x12\x86\x1d\xb4\x28\xbf\x56"
+                            "\xed\x61\xf8\x8f\x03\x9a\x31\xc8"
+                            "\x3c\xd3\x6a\x01\x75\x0c\xa3\x17"
+                            "\xae\x45\xdc\x50\xe7\x7e\x15\x89"
+                            "\x20\xb7\x2b\xc2\x59\xf0\x64\xfb"
+                            "\x92\x06\x9d\x34\xcb\x3f\xd6\x6d"
+                            "\x04\x78\x0f\xa6\x1a\xb1\x48\xdf"
+                            "\x53\xea\x81\x18\x8c\x23\xba\x2e"
+                            "\xc5\x5c\xf3\x67\xfe\x95\x09\xa0"
+                            "\x37\xce\x42\xd9\x70\x07\x7b\x12"
+                            "\xa9\x1d\xb4\x4b\xe2\x56\xed\x84"
+                            "\x1b\x8f\x26\xbd\x31\xc8\x5f\xf6"
+                            "\x6a\x01\x98\x0c\xa3\x3a\xd1\x45"
+                            "\xdc\x73\x0a\x7e\x15\xac\x20\xb7"
+                            "\x4e\xe5\x59\xf0\x87\x1e\x92\x29"
+                            "\xc0\x34\xcb\x62\xf9\x6d\x04\x9b"
+                            "\x0f\xa6\x3d\xd4\x48\xdf\x76\x0d"
+                            "\x81\x18\xaf\x23\xba\x51\xe8\x5c"
+                            "\xf3\x8a\x21\x95\x2c\xc3\x37\xce"
+                            "\x65\xfc\x70\x07\x9e\x12\xa9\x40"
+                            "\xd7\x4b\xe2\x79\x10\x84\x1b\xb2"
+                            "\x26\xbd\x54\xeb\x5f\xf6\x8d\x01"
+                            "\x98\x2f\xc6\x3a\xd1\x68\xff\x73"
+                            "\x0a\xa1\x15\xac\x43\xda\x4e\xe5"
+                            "\x7c\x13\x87\x1e\xb5\x29\xc0\x57"
+                            "\xee\x62\xf9\x90\x04\x9b\x32\xc9"
+                            "\x3d\xd4\x6b\x02\x76\x0d\xa4\x18"
+                            "\xaf\x46\xdd\x51\xe8\x7f\x16\x8a"
+                            "\x21\xb8\x2c\xc3\x5a\xf1\x65\xfc"
+                            "\x93\x07\x9e\x35\xcc\x40\xd7\x6e"
+                            "\x05\x79\x10\xa7\x1b\xb2\x49\xe0"
+                            "\x54\xeb\x82\x19\x8d\x24\xbb\x2f"
+                            "\xc6\x5d\xf4\x68\xff\x96\x0a\xa1"
+                            "\x38\xcf\x43\xda\x71\x08\x7c\x13"
+                            "\xaa\x1e\xb5\x4c\xe3\x57\xee\x85"
+                            "\x1c\x90\x27\xbe\x32\xc9\x60\xf7"
+                            "\x6b\x02\x99\x0d\xa4\x3b\xd2\x46"
+                            "\xdd\x74\x0b\x7f\x16\xad\x21\xb8"
+                            "\x4f\xe6\x5a\xf1\x88\x1f\x93\x2a"
+                            "\xc1\x35\xcc\x63\xfa\x6e\x05\x9c"
+                            "\x10\xa7\x3e\xd5\x49\xe0\x77\x0e"
+                            "\x82\x19\xb0\x24\xbb\x52\xe9\x5d"
+                            "\xf4\x8b\x22\x96\x2d\xc4\x38\xcf"
+                            "\x66\xfd\x71\x08\x9f\x13\xaa\x41"
+                            "\xd8\x4c\xe3\x7a\x11\x85\x1c\xb3"
+                            "\x27\xbe\x55\xec\x60\xf7\x8e\x02"
+                            "\x99\x30\xc7\x3b\xd2\x69\x00\x74"
+                            "\x0b\xa2\x16\xad\x44\xdb\x4f\xe6"
+                            "\x7d\x14\x88\x1f\xb6\x2a\xc1\x58"
+                            "\xef\x63\xfa\x91\x05\x9c\x33\xca"
+                            "\x3e\xd5\x6c\x03\x77\x0e\xa5\x19"
+                            "\xb0\x47\xde\x52\xe9\x80\x17\x8b"
+                            "\x22\xb9\x2d\xc4\x5b\xf2\x66\xfd"
+                            "\x94\x08\x9f\x36\xcd\x41\xd8\x6f"
+                            "\x06\x7a\x11\xa8\x1c\xb3\x4a\xe1"
+                            "\x55\xec\x83\x1a\x8e\x25\xbc\x30"
+                            "\xc7\x5e\xf5\x69\x00\x97\x0b\xa2"
+                            "\x39\xd0\x44\xdb\x72\x09\x7d\x14"
+                            "\xab\x1f\xb6\x4d\xe4\x58\xef\x86"
+                            "\x1d\x91\x28\xbf\x33\xca\x61\xf8"
+                            "\x6c\x03\x9a\x0e\xa5\x3c\xd3\x47"
+                            "\xde\x75\x0c\x80\x17\xae\x22\xb9"
+                            "\x50\xe7\x5b\xf2\x89\x20\x94\x2b"
+                            "\xc2\x36\xcd\x64\xfb\x6f\x06\x9d"
+                            "\x11\xa8\x3f\xd6\x4a\xe1\x78\x0f"
+                            "\x83\x1a\xb1\x25\xbc\x53\xea\x5e"
+                            "\xf5\x8c\x00\x97\x2e\xc5\x39\xd0"
+                            "\x67\xfe\x72\x09\xa0\x14\xab\x42"
+                            "\xd9\x4d\xe4\x7b\x12\x86\x1d\xb4"
+                            "\x28\xbf\x56\xed\x61\xf8\x8f\x03"
+                            "\x9a\x31\xc8\x3c\xd3\x6a\x01\x75"
+                            "\x0c\xa3\x17\xae\x45\xdc\x50\xe7"
+                            "\x7e\x15\x89\x20\xb7\x2b\xc2\x59"
+                            "\xf0\x64\xfb\x92\x06\x9d\x34\xcb"
+                            "\x3f\xd6\x6d\x04\x78\x0f\xa6\x1a"
+                            "\xb1\x48\xdf\x53\xea\x81\x18\x8c"
+                            "\x23\xba\x2e\xc5\x5c\xf3\x67\xfe"
+                            "\x95\x09\xa0\x37\xce\x42\xd9\x70"
+                            "\x07\x7b\x12\xa9\x1d\xb4\x4b\xe2"
+                            "\x56\xed\x84\x1b\x8f\x26\xbd\x31"
+                            "\xc8\x5f\xf6\x6a\x01\x98\x0c\xa3"
+                            "\x3a\xd1\x45\xdc\x73\x0a\x7e\x15"
+                            "\xac\x20\xb7\x4e\xe5\x59\xf0\x87"
+                            "\x1e\x92\x29\xc0\x34\xcb\x62\xf9"
+                            "\x6d\x04\x9b\x0f\xa6\x3d\xd4\x48"
+                            "\xdf\x76\x0d\x81\x18\xaf\x23\xba"
+                            "\x51\xe8\x5c\xf3\x8a\x21\x95\x2c"
+                            "\xc3\x37\xce\x65\xfc\x70\x07\x9e"
+                            "\x12\xa9\x40\xd7\x4b\xe2\x79\x10"
+                            "\x84\x1b\xb2\x26\xbd\x54\xeb\x5f"
+                            "\xf6\x8d\x01\x98\x2f\xc6\x3a\xd1"
+                            "\x68\xff\x73\x0a\xa1\x15\xac\x43"
+                            "\xda\x4e\xe5\x7c\x13\x87\x1e\xb5"
+                            "\x29\xc0\x57\xee\x62\xf9\x90\x04"
+                            "\x9b\x32\xc9\x3d\xd4\x6b\x02\x76"
+                            "\x0d\xa4\x18\xaf\x46\xdd\x51\xe8"
+                            "\x7f\x16\x8a\x21\xb8\x2c\xc3\x5a"
+                            "\xf1\x65\xfc\x93\x07\x9e\x35\xcc"
+                            "\x40\xd7\x6e\x05\x79\x10\xa7\x1b"
+                            "\xb2\x49\xe0\x54\xeb\x82\x19\x8d"
+                            "\x24\xbb\x2f\xc6\x5d\xf4\x68\xff"
+                            "\x96\x0a\xa1\x38\xcf\x43\xda\x71"
+                            "\x08\x7c\x13\xaa\x1e\xb5\x4c",
+               .psize     = 1023,
+               .digest    = "\x4d\x97\x23\xc8\xea\x7a\x7c\x15"
+                            "\xb8\xff\x97\x9c\xf5\x13\x4f\x31"
+                            "\xde\x67\xf7\x24\x73\xcd\x70\x1c"
+                            "\x03\x4a\xba\x8a\x87\x49\xfe\xdc"
+                            "\x75\x29\x62\x83\xae\x3f\x17\xab"
+                            "\xfd\x10\x4d\x8e\x17\x1c\x1f\xca",
+       }
 };
 
 /*
  * SHA512 test vectors from from NIST and kerneli
  */
-#define SHA512_TEST_VECTORS    4
+#define SHA512_TEST_VECTORS    6
 
 static struct hash_testvec sha512_tv_template[] = {
        {
+               .plaintext = "",
+               .psize  = 0,
+               .digest = "\xcf\x83\xe1\x35\x7e\xef\xb8\xbd"
+                         "\xf1\x54\x28\x50\xd6\x6d\x80\x07"
+                         "\xd6\x20\xe4\x05\x0b\x57\x15\xdc"
+                         "\x83\xf4\xa9\x21\xd3\x6c\xe9\xce"
+                         "\x47\xd0\xd1\x3c\x5d\x85\xf2\xb0"
+                         "\xff\x83\x18\xd2\x87\x7e\xec\x2f"
+                         "\x63\xb9\x31\xbd\x47\x41\x7a\x81"
+                         "\xa5\x38\x32\x7a\xf9\x27\xda\x3e",
+       }, {
                .plaintext = "abc",
                .psize  = 3,
                .digest = "\xdd\xaf\x35\xa1\x93\x61\x7a\xba"
@@ -687,7 +1282,145 @@ static struct hash_testvec sha512_tv_template[] = {
                          "\xed\xb4\x19\x87\x23\x28\x50\xc9",
                .np     = 4,
                .tap    = { 26, 26, 26, 26 }
-       },
+       }, {
+               .plaintext = "\x08\x9f\x13\xaa\x41\xd8\x4c\xe3"
+                            "\x7a\x11\x85\x1c\xb3\x27\xbe\x55"
+                            "\xec\x60\xf7\x8e\x02\x99\x30\xc7"
+                            "\x3b\xd2\x69\x00\x74\x0b\xa2\x16"
+                            "\xad\x44\xdb\x4f\xe6\x7d\x14\x88"
+                            "\x1f\xb6\x2a\xc1\x58\xef\x63\xfa"
+                            "\x91\x05\x9c\x33\xca\x3e\xd5\x6c"
+                            "\x03\x77\x0e\xa5\x19\xb0\x47\xde"
+                            "\x52\xe9\x80\x17\x8b\x22\xb9\x2d"
+                            "\xc4\x5b\xf2\x66\xfd\x94\x08\x9f"
+                            "\x36\xcd\x41\xd8\x6f\x06\x7a\x11"
+                            "\xa8\x1c\xb3\x4a\xe1\x55\xec\x83"
+                            "\x1a\x8e\x25\xbc\x30\xc7\x5e\xf5"
+                            "\x69\x00\x97\x0b\xa2\x39\xd0\x44"
+                            "\xdb\x72\x09\x7d\x14\xab\x1f\xb6"
+                            "\x4d\xe4\x58\xef\x86\x1d\x91\x28"
+                            "\xbf\x33\xca\x61\xf8\x6c\x03\x9a"
+                            "\x0e\xa5\x3c\xd3\x47\xde\x75\x0c"
+                            "\x80\x17\xae\x22\xb9\x50\xe7\x5b"
+                            "\xf2\x89\x20\x94\x2b\xc2\x36\xcd"
+                            "\x64\xfb\x6f\x06\x9d\x11\xa8\x3f"
+                            "\xd6\x4a\xe1\x78\x0f\x83\x1a\xb1"
+                            "\x25\xbc\x53\xea\x5e\xf5\x8c\x00"
+                            "\x97\x2e\xc5\x39\xd0\x67\xfe\x72"
+                            "\x09\xa0\x14\xab\x42\xd9\x4d\xe4"
+                            "\x7b\x12\x86\x1d\xb4\x28\xbf\x56"
+                            "\xed\x61\xf8\x8f\x03\x9a\x31\xc8"
+                            "\x3c\xd3\x6a\x01\x75\x0c\xa3\x17"
+                            "\xae\x45\xdc\x50\xe7\x7e\x15\x89"
+                            "\x20\xb7\x2b\xc2\x59\xf0\x64\xfb"
+                            "\x92\x06\x9d\x34\xcb\x3f\xd6\x6d"
+                            "\x04\x78\x0f\xa6\x1a\xb1\x48\xdf"
+                            "\x53\xea\x81\x18\x8c\x23\xba\x2e"
+                            "\xc5\x5c\xf3\x67\xfe\x95\x09\xa0"
+                            "\x37\xce\x42\xd9\x70\x07\x7b\x12"
+                            "\xa9\x1d\xb4\x4b\xe2\x56\xed\x84"
+                            "\x1b\x8f\x26\xbd\x31\xc8\x5f\xf6"
+                            "\x6a\x01\x98\x0c\xa3\x3a\xd1\x45"
+                            "\xdc\x73\x0a\x7e\x15\xac\x20\xb7"
+                            "\x4e\xe5\x59\xf0\x87\x1e\x92\x29"
+                            "\xc0\x34\xcb\x62\xf9\x6d\x04\x9b"
+                            "\x0f\xa6\x3d\xd4\x48\xdf\x76\x0d"
+                            "\x81\x18\xaf\x23\xba\x51\xe8\x5c"
+                            "\xf3\x8a\x21\x95\x2c\xc3\x37\xce"
+                            "\x65\xfc\x70\x07\x9e\x12\xa9\x40"
+                            "\xd7\x4b\xe2\x79\x10\x84\x1b\xb2"
+                            "\x26\xbd\x54\xeb\x5f\xf6\x8d\x01"
+                            "\x98\x2f\xc6\x3a\xd1\x68\xff\x73"
+                            "\x0a\xa1\x15\xac\x43\xda\x4e\xe5"
+                            "\x7c\x13\x87\x1e\xb5\x29\xc0\x57"
+                            "\xee\x62\xf9\x90\x04\x9b\x32\xc9"
+                            "\x3d\xd4\x6b\x02\x76\x0d\xa4\x18"
+                            "\xaf\x46\xdd\x51\xe8\x7f\x16\x8a"
+                            "\x21\xb8\x2c\xc3\x5a\xf1\x65\xfc"
+                            "\x93\x07\x9e\x35\xcc\x40\xd7\x6e"
+                            "\x05\x79\x10\xa7\x1b\xb2\x49\xe0"
+                            "\x54\xeb\x82\x19\x8d\x24\xbb\x2f"
+                            "\xc6\x5d\xf4\x68\xff\x96\x0a\xa1"
+                            "\x38\xcf\x43\xda\x71\x08\x7c\x13"
+                            "\xaa\x1e\xb5\x4c\xe3\x57\xee\x85"
+                            "\x1c\x90\x27\xbe\x32\xc9\x60\xf7"
+                            "\x6b\x02\x99\x0d\xa4\x3b\xd2\x46"
+                            "\xdd\x74\x0b\x7f\x16\xad\x21\xb8"
+                            "\x4f\xe6\x5a\xf1\x88\x1f\x93\x2a"
+                            "\xc1\x35\xcc\x63\xfa\x6e\x05\x9c"
+                            "\x10\xa7\x3e\xd5\x49\xe0\x77\x0e"
+                            "\x82\x19\xb0\x24\xbb\x52\xe9\x5d"
+                            "\xf4\x8b\x22\x96\x2d\xc4\x38\xcf"
+                            "\x66\xfd\x71\x08\x9f\x13\xaa\x41"
+                            "\xd8\x4c\xe3\x7a\x11\x85\x1c\xb3"
+                            "\x27\xbe\x55\xec\x60\xf7\x8e\x02"
+                            "\x99\x30\xc7\x3b\xd2\x69\x00\x74"
+                            "\x0b\xa2\x16\xad\x44\xdb\x4f\xe6"
+                            "\x7d\x14\x88\x1f\xb6\x2a\xc1\x58"
+                            "\xef\x63\xfa\x91\x05\x9c\x33\xca"
+                            "\x3e\xd5\x6c\x03\x77\x0e\xa5\x19"
+                            "\xb0\x47\xde\x52\xe9\x80\x17\x8b"
+                            "\x22\xb9\x2d\xc4\x5b\xf2\x66\xfd"
+                            "\x94\x08\x9f\x36\xcd\x41\xd8\x6f"
+                            "\x06\x7a\x11\xa8\x1c\xb3\x4a\xe1"
+                            "\x55\xec\x83\x1a\x8e\x25\xbc\x30"
+                            "\xc7\x5e\xf5\x69\x00\x97\x0b\xa2"
+                            "\x39\xd0\x44\xdb\x72\x09\x7d\x14"
+                            "\xab\x1f\xb6\x4d\xe4\x58\xef\x86"
+                            "\x1d\x91\x28\xbf\x33\xca\x61\xf8"
+                            "\x6c\x03\x9a\x0e\xa5\x3c\xd3\x47"
+                            "\xde\x75\x0c\x80\x17\xae\x22\xb9"
+                            "\x50\xe7\x5b\xf2\x89\x20\x94\x2b"
+                            "\xc2\x36\xcd\x64\xfb\x6f\x06\x9d"
+                            "\x11\xa8\x3f\xd6\x4a\xe1\x78\x0f"
+                            "\x83\x1a\xb1\x25\xbc\x53\xea\x5e"
+                            "\xf5\x8c\x00\x97\x2e\xc5\x39\xd0"
+                            "\x67\xfe\x72\x09\xa0\x14\xab\x42"
+                            "\xd9\x4d\xe4\x7b\x12\x86\x1d\xb4"
+                            "\x28\xbf\x56\xed\x61\xf8\x8f\x03"
+                            "\x9a\x31\xc8\x3c\xd3\x6a\x01\x75"
+                            "\x0c\xa3\x17\xae\x45\xdc\x50\xe7"
+                            "\x7e\x15\x89\x20\xb7\x2b\xc2\x59"
+                            "\xf0\x64\xfb\x92\x06\x9d\x34\xcb"
+                            "\x3f\xd6\x6d\x04\x78\x0f\xa6\x1a"
+                            "\xb1\x48\xdf\x53\xea\x81\x18\x8c"
+                            "\x23\xba\x2e\xc5\x5c\xf3\x67\xfe"
+                            "\x95\x09\xa0\x37\xce\x42\xd9\x70"
+                            "\x07\x7b\x12\xa9\x1d\xb4\x4b\xe2"
+                            "\x56\xed\x84\x1b\x8f\x26\xbd\x31"
+                            "\xc8\x5f\xf6\x6a\x01\x98\x0c\xa3"
+                            "\x3a\xd1\x45\xdc\x73\x0a\x7e\x15"
+                            "\xac\x20\xb7\x4e\xe5\x59\xf0\x87"
+                            "\x1e\x92\x29\xc0\x34\xcb\x62\xf9"
+                            "\x6d\x04\x9b\x0f\xa6\x3d\xd4\x48"
+                            "\xdf\x76\x0d\x81\x18\xaf\x23\xba"
+                            "\x51\xe8\x5c\xf3\x8a\x21\x95\x2c"
+                            "\xc3\x37\xce\x65\xfc\x70\x07\x9e"
+                            "\x12\xa9\x40\xd7\x4b\xe2\x79\x10"
+                            "\x84\x1b\xb2\x26\xbd\x54\xeb\x5f"
+                            "\xf6\x8d\x01\x98\x2f\xc6\x3a\xd1"
+                            "\x68\xff\x73\x0a\xa1\x15\xac\x43"
+                            "\xda\x4e\xe5\x7c\x13\x87\x1e\xb5"
+                            "\x29\xc0\x57\xee\x62\xf9\x90\x04"
+                            "\x9b\x32\xc9\x3d\xd4\x6b\x02\x76"
+                            "\x0d\xa4\x18\xaf\x46\xdd\x51\xe8"
+                            "\x7f\x16\x8a\x21\xb8\x2c\xc3\x5a"
+                            "\xf1\x65\xfc\x93\x07\x9e\x35\xcc"
+                            "\x40\xd7\x6e\x05\x79\x10\xa7\x1b"
+                            "\xb2\x49\xe0\x54\xeb\x82\x19\x8d"
+                            "\x24\xbb\x2f\xc6\x5d\xf4\x68\xff"
+                            "\x96\x0a\xa1\x38\xcf\x43\xda\x71"
+                            "\x08\x7c\x13\xaa\x1e\xb5\x4c",
+               .psize     = 1023,
+               .digest    = "\x76\xc9\xd4\x91\x7a\x5f\x0f\xaa"
+                            "\x13\x39\xf3\x01\x7a\xfa\xe5\x41"
+                            "\x5f\x0b\xf8\xeb\x32\xfc\xbf\xb0"
+                            "\xfa\x8c\xcd\x17\x83\xe2\xfa\xeb"
+                            "\x1c\x19\xde\xe2\x75\xdc\x34\x64"
+                            "\x5f\x35\x9c\x61\x2f\x10\xf9\xec"
+                            "\x59\xca\x9d\xcc\x25\x0c\x43\xba"
+                            "\x85\xa8\xf8\xfe\xb5\x24\xb2\xee",
+       }
 };
 
 
@@ -12823,11 +13556,11 @@ static struct cipher_testvec cast6_xts_dec_tv_template[] = {
 #define AES_CBC_DEC_TEST_VECTORS 5
 #define HMAC_MD5_ECB_CIPHER_NULL_ENC_TEST_VECTORS 2
 #define HMAC_MD5_ECB_CIPHER_NULL_DEC_TEST_VECTORS 2
-#define HMAC_SHA1_ECB_CIPHER_NULL_ENC_TEST_VECTORS 2
-#define HMAC_SHA1_ECB_CIPHER_NULL_DEC_TEST_VECTORS 2
-#define HMAC_SHA1_AES_CBC_ENC_TEST_VECTORS 7
-#define HMAC_SHA256_AES_CBC_ENC_TEST_VECTORS 7
-#define HMAC_SHA512_AES_CBC_ENC_TEST_VECTORS 7
+#define HMAC_SHA1_ECB_CIPHER_NULL_ENC_TEST_VEC 2
+#define HMAC_SHA1_ECB_CIPHER_NULL_DEC_TEST_VEC 2
+#define HMAC_SHA1_AES_CBC_ENC_TEST_VEC 7
+#define HMAC_SHA256_AES_CBC_ENC_TEST_VEC 7
+#define HMAC_SHA512_AES_CBC_ENC_TEST_VEC 7
 #define AES_LRW_ENC_TEST_VECTORS 8
 #define AES_LRW_DEC_TEST_VECTORS 8
 #define AES_XTS_ENC_TEST_VECTORS 5
@@ -12844,7 +13577,7 @@ static struct cipher_testvec cast6_xts_dec_tv_template[] = {
 #define AES_GCM_4106_DEC_TEST_VECTORS 7
 #define AES_GCM_4543_ENC_TEST_VECTORS 1
 #define AES_GCM_4543_DEC_TEST_VECTORS 2
-#define AES_CCM_ENC_TEST_VECTORS 7
+#define AES_CCM_ENC_TEST_VECTORS 8
 #define AES_CCM_DEC_TEST_VECTORS 7
 #define AES_CCM_4309_ENC_TEST_VECTORS 7
 #define AES_CCM_4309_DEC_TEST_VECTORS 10
@@ -13715,7 +14448,7 @@ static struct aead_testvec hmac_md5_ecb_cipher_null_dec_tv_template[] = {
        },
 };
 
-static struct aead_testvec hmac_sha1_aes_cbc_enc_tv_template[] = {
+static struct aead_testvec hmac_sha1_aes_cbc_enc_tv_temp[] = {
        { /* RFC 3602 Case 1 */
 #ifdef __LITTLE_ENDIAN
                .key    = "\x08\x00"            /* rta length */
@@ -13964,7 +14697,7 @@ static struct aead_testvec hmac_sha1_aes_cbc_enc_tv_template[] = {
        },
 };
 
-static struct aead_testvec hmac_sha1_ecb_cipher_null_enc_tv_template[] = {
+static struct aead_testvec hmac_sha1_ecb_cipher_null_enc_tv_temp[] = {
        { /* Input data from RFC 2410 Case 1 */
 #ifdef __LITTLE_ENDIAN
                .key    = "\x08\x00"            /* rta length */
@@ -14010,7 +14743,7 @@ static struct aead_testvec hmac_sha1_ecb_cipher_null_enc_tv_template[] = {
        },
 };
 
-static struct aead_testvec hmac_sha1_ecb_cipher_null_dec_tv_template[] = {
+static struct aead_testvec hmac_sha1_ecb_cipher_null_dec_tv_temp[] = {
        {
 #ifdef __LITTLE_ENDIAN
                .key    = "\x08\x00"            /* rta length */
@@ -14056,7 +14789,7 @@ static struct aead_testvec hmac_sha1_ecb_cipher_null_dec_tv_template[] = {
        },
 };
 
-static struct aead_testvec hmac_sha256_aes_cbc_enc_tv_template[] = {
+static struct aead_testvec hmac_sha256_aes_cbc_enc_tv_temp[] = {
        { /* RFC 3602 Case 1 */
 #ifdef __LITTLE_ENDIAN
                .key    = "\x08\x00"            /* rta length */
@@ -14319,7 +15052,7 @@ static struct aead_testvec hmac_sha256_aes_cbc_enc_tv_template[] = {
        },
 };
 
-static struct aead_testvec hmac_sha512_aes_cbc_enc_tv_template[] = {
+static struct aead_testvec hmac_sha512_aes_cbc_enc_tv_temp[] = {
        { /* RFC 3602 Case 1 */
 #ifdef __LITTLE_ENDIAN
                .key    = "\x08\x00"            /* rta length */
@@ -14638,6 +15371,652 @@ static struct aead_testvec hmac_sha512_aes_cbc_enc_tv_template[] = {
        },
 };
 
+#define HMAC_SHA1_DES_CBC_ENC_TEST_VEC 1
+
+static struct aead_testvec hmac_sha1_des_cbc_enc_tv_temp[] = {
+       { /*Generated with cryptopp*/
+#ifdef __LITTLE_ENDIAN
+               .key    = "\x08\x00"            /* rta length */
+                         "\x01\x00"            /* rta type */
+#else
+       .key    = "\x00\x08"            /* rta length */
+                         "\x00\x01"            /* rta type */
+#endif
+                         "\x00\x00\x00\x08"    /* enc key length */
+                         "\x11\x22\x33\x44\x55\x66\x77\x88"
+                 "\x99\xaa\xbb\xcc\xdd\xee\xff\x11"
+                         "\x22\x33\x44\x55"
+                         "\xE9\xC0\xFF\x2E\x76\x0B\x64\x24",
+               .klen   = 8 + 20 + 8,
+               .iv     = "\x7D\x33\x88\x93\x0F\x93\xB2\x42",
+               .assoc  = "\x00\x00\x43\x21\x00\x00\x00\x01",
+               .alen   = 8,
+               .input  = "\x6f\x54\x20\x6f\x61\x4d\x79\x6e"
+                         "\x53\x20\x63\x65\x65\x72\x73\x74"
+                         "\x54\x20\x6f\x6f\x4d\x20\x6e\x61"
+                         "\x20\x79\x65\x53\x72\x63\x74\x65"
+                         "\x20\x73\x6f\x54\x20\x6f\x61\x4d"
+                         "\x79\x6e\x53\x20\x63\x65\x65\x72"
+                         "\x73\x74\x54\x20\x6f\x6f\x4d\x20"
+                         "\x6e\x61\x20\x79\x65\x53\x72\x63"
+                         "\x74\x65\x20\x73\x6f\x54\x20\x6f"
+                         "\x61\x4d\x79\x6e\x53\x20\x63\x65"
+                         "\x65\x72\x73\x74\x54\x20\x6f\x6f"
+                         "\x4d\x20\x6e\x61\x20\x79\x65\x53"
+                         "\x72\x63\x74\x65\x20\x73\x6f\x54"
+                         "\x20\x6f\x61\x4d\x79\x6e\x53\x20"
+                         "\x63\x65\x65\x72\x73\x74\x54\x20"
+                         "\x6f\x6f\x4d\x20\x6e\x61\x0a\x79",
+               .ilen   = 128,
+               .result = "\x70\xd6\xde\x64\x87\x17\xf1\xe8"
+                         "\x54\x31\x85\x37\xed\x6b\x01\x8d"
+                         "\xe3\xcc\xe0\x1d\x5e\xf3\xfe\xf1"
+                         "\x41\xaa\x33\x91\xa7\x7d\x99\x88"
+                         "\x4d\x85\x6e\x2f\xa3\x69\xf5\x82"
+                         "\x3a\x6f\x25\xcb\x7d\x58\x1f\x9b"
+                         "\xaa\x9c\x11\xd5\x76\x67\xce\xde"
+                         "\x56\xd7\x5a\x80\x69\xea\x3a\x02"
+                         "\xf0\xc7\x7c\xe3\xcb\x40\xe5\x52"
+                         "\xd1\x10\x92\x78\x0b\x8e\x5b\xf1"
+                         "\xe3\x26\x1f\xe1\x15\x41\xc7\xba"
+                         "\x99\xdb\x08\x51\x1c\xd3\x01\xf4"
+                         "\x87\x47\x39\xb8\xd2\xdd\xbd\xfb"
+                         "\x66\x13\xdf\x1c\x01\x44\xf0\x7a"
+                         "\x1a\x6b\x13\xf5\xd5\x0b\xb8\xba"
+                         "\x53\xba\xe1\x76\xe3\x82\x07\x86"
+                         "\x95\x16\x20\x09\xf5\x95\x19\xfd"
+                         "\x3c\xc7\xe0\x42\xc0\x14\x69\xfa"
+                         "\x5c\x44\xa9\x37",
+                         .rlen = 128 + 20,
+       },
+};
+
+#define HMAC_SHA224_DES_CBC_ENC_TEST_VEC       1
+
+static struct aead_testvec hmac_sha224_des_cbc_enc_tv_temp[] = {
+       { /*Generated with cryptopp*/
+#ifdef __LITTLE_ENDIAN
+               .key    = "\x08\x00"            /* rta length */
+                         "\x01\x00"            /* rta type */
+#else
+               .key    = "\x00\x08"            /* rta length */
+                         "\x00\x01"            /* rta type */
+#endif
+                         "\x00\x00\x00\x08"    /* enc key length */
+                         "\x11\x22\x33\x44\x55\x66\x77\x88"
+                         "\x99\xaa\xbb\xcc\xdd\xee\xff\x11"
+                 "\x22\x33\x44\x55\x66\x77\x88\x99"
+                         "\xE9\xC0\xFF\x2E\x76\x0B\x64\x24",
+               .klen   = 8 + 24 + 8,
+               .iv     = "\x7D\x33\x88\x93\x0F\x93\xB2\x42",
+               .assoc  = "\x00\x00\x43\x21\x00\x00\x00\x01",
+               .alen   = 8,
+               .input  = "\x6f\x54\x20\x6f\x61\x4d\x79\x6e"
+                         "\x53\x20\x63\x65\x65\x72\x73\x74"
+                         "\x54\x20\x6f\x6f\x4d\x20\x6e\x61"
+                         "\x20\x79\x65\x53\x72\x63\x74\x65"
+                         "\x20\x73\x6f\x54\x20\x6f\x61\x4d"
+                         "\x79\x6e\x53\x20\x63\x65\x65\x72"
+                         "\x73\x74\x54\x20\x6f\x6f\x4d\x20"
+                         "\x6e\x61\x20\x79\x65\x53\x72\x63"
+                         "\x74\x65\x20\x73\x6f\x54\x20\x6f"
+                         "\x61\x4d\x79\x6e\x53\x20\x63\x65"
+                         "\x65\x72\x73\x74\x54\x20\x6f\x6f"
+                         "\x4d\x20\x6e\x61\x20\x79\x65\x53"
+                         "\x72\x63\x74\x65\x20\x73\x6f\x54"
+                         "\x20\x6f\x61\x4d\x79\x6e\x53\x20"
+                         "\x63\x65\x65\x72\x73\x74\x54\x20"
+                         "\x6f\x6f\x4d\x20\x6e\x61\x0a\x79",
+               .ilen   = 128,
+               .result = "\x70\xd6\xde\x64\x87\x17\xf1\xe8"
+                         "\x54\x31\x85\x37\xed\x6b\x01\x8d"
+                         "\xe3\xcc\xe0\x1d\x5e\xf3\xfe\xf1"
+                         "\x41\xaa\x33\x91\xa7\x7d\x99\x88"
+                         "\x4d\x85\x6e\x2f\xa3\x69\xf5\x82"
+                         "\x3a\x6f\x25\xcb\x7d\x58\x1f\x9b"
+                         "\xaa\x9c\x11\xd5\x76\x67\xce\xde"
+                         "\x56\xd7\x5a\x80\x69\xea\x3a\x02"
+                         "\xf0\xc7\x7c\xe3\xcb\x40\xe5\x52"
+                         "\xd1\x10\x92\x78\x0b\x8e\x5b\xf1"
+                         "\xe3\x26\x1f\xe1\x15\x41\xc7\xba"
+                         "\x99\xdb\x08\x51\x1c\xd3\x01\xf4"
+                 "\x87\x47\x39\xb8\xd2\xdd\xbd\xfb"
+                         "\x66\x13\xdf\x1c\x01\x44\xf0\x7a"
+                         "\x1a\x6b\x13\xf5\xd5\x0b\xb8\xba"
+                         "\x53\xba\xe1\x76\xe3\x82\x07\x86"
+                         "\x9c\x2d\x7e\xee\x20\x34\x55\x0a"
+                         "\xce\xb5\x4e\x64\x53\xe7\xbf\x91"
+                         "\xab\xd4\xd9\xda\xc9\x12\xae\xf7",
+               .rlen   = 128 + 24,
+       },
+};
+
+#define HMAC_SHA256_DES_CBC_ENC_TEST_VEC       1
+
+static struct aead_testvec hmac_sha256_des_cbc_enc_tv_temp[] = {
+       { /*Generated with cryptopp*/
+#ifdef __LITTLE_ENDIAN
+               .key    = "\x08\x00"            /* rta length */
+                         "\x01\x00"            /* rta type */
+#else
+               .key    = "\x00\x08"            /* rta length */
+                         "\x00\x01"            /* rta type */
+#endif
+                         "\x00\x00\x00\x08"    /* enc key length */
+                         "\x11\x22\x33\x44\x55\x66\x77\x88"
+                         "\x99\xaa\xbb\xcc\xdd\xee\xff\x11"
+                         "\x22\x33\x44\x55\x66\x77\x88\x99"
+                         "\xaa\xbb\xcc\xdd\xee\xff\x11\x22"
+                         "\xE9\xC0\xFF\x2E\x76\x0B\x64\x24",
+               .klen   = 8 + 32 + 8,
+               .iv     = "\x7D\x33\x88\x93\x0F\x93\xB2\x42",
+               .assoc  = "\x00\x00\x43\x21\x00\x00\x00\x01",
+               .alen   = 8,
+               .input  = "\x6f\x54\x20\x6f\x61\x4d\x79\x6e"
+                         "\x53\x20\x63\x65\x65\x72\x73\x74"
+                         "\x54\x20\x6f\x6f\x4d\x20\x6e\x61"
+                         "\x20\x79\x65\x53\x72\x63\x74\x65"
+                         "\x20\x73\x6f\x54\x20\x6f\x61\x4d"
+                         "\x79\x6e\x53\x20\x63\x65\x65\x72"
+                         "\x73\x74\x54\x20\x6f\x6f\x4d\x20"
+                         "\x6e\x61\x20\x79\x65\x53\x72\x63"
+                         "\x74\x65\x20\x73\x6f\x54\x20\x6f"
+                         "\x61\x4d\x79\x6e\x53\x20\x63\x65"
+                         "\x65\x72\x73\x74\x54\x20\x6f\x6f"
+                         "\x4d\x20\x6e\x61\x20\x79\x65\x53"
+                         "\x72\x63\x74\x65\x20\x73\x6f\x54"
+                         "\x20\x6f\x61\x4d\x79\x6e\x53\x20"
+                         "\x63\x65\x65\x72\x73\x74\x54\x20"
+                         "\x6f\x6f\x4d\x20\x6e\x61\x0a\x79",
+               .ilen   = 128,
+               .result = "\x70\xd6\xde\x64\x87\x17\xf1\xe8"
+                         "\x54\x31\x85\x37\xed\x6b\x01\x8d"
+                         "\xe3\xcc\xe0\x1d\x5e\xf3\xfe\xf1"
+                         "\x41\xaa\x33\x91\xa7\x7d\x99\x88"
+                         "\x4d\x85\x6e\x2f\xa3\x69\xf5\x82"
+                         "\x3a\x6f\x25\xcb\x7d\x58\x1f\x9b"
+                         "\xaa\x9c\x11\xd5\x76\x67\xce\xde"
+                         "\x56\xd7\x5a\x80\x69\xea\x3a\x02"
+                         "\xf0\xc7\x7c\xe3\xcb\x40\xe5\x52"
+                         "\xd1\x10\x92\x78\x0b\x8e\x5b\xf1"
+                         "\xe3\x26\x1f\xe1\x15\x41\xc7\xba"
+                 "\x99\xdb\x08\x51\x1c\xd3\x01\xf4"
+                         "\x87\x47\x39\xb8\xd2\xdd\xbd\xfb"
+                 "\x66\x13\xdf\x1c\x01\x44\xf0\x7a"
+                 "\x1a\x6b\x13\xf5\xd5\x0b\xb8\xba"
+                         "\x53\xba\xe1\x76\xe3\x82\x07\x86"
+                         "\xc6\x58\xa1\x60\x70\x91\x39\x36"
+                         "\x50\xf6\x5d\xab\x4b\x51\x4e\x5e"
+                         "\xde\x63\xde\x76\x52\xde\x9f\xba"
+                         "\x90\xcf\x15\xf2\xbb\x6e\x84\x00",
+               .rlen   = 128 + 32,
+       },
+};
+
+#define HMAC_SHA384_DES_CBC_ENC_TEST_VEC       1
+
+static struct aead_testvec hmac_sha384_des_cbc_enc_tv_temp[] = {
+       { /*Generated with cryptopp*/
+#ifdef __LITTLE_ENDIAN
+               .key    = "\x08\x00"            /* rta length */
+                         "\x01\x00"            /* rta type */
+#else
+               .key    = "\x00\x08"            /* rta length */
+                         "\x00\x01"            /* rta type */
+#endif
+                         "\x00\x00\x00\x08"    /* enc key length */
+                         "\x11\x22\x33\x44\x55\x66\x77\x88"
+                         "\x99\xaa\xbb\xcc\xdd\xee\xff\x11"
+                         "\x22\x33\x44\x55\x66\x77\x88\x99"
+                         "\xaa\xbb\xcc\xdd\xee\xff\x11\x22"
+                         "\x33\x44\x55\x66\x77\x88\x99\xaa"
+                         "\xbb\xcc\xdd\xee\xff\x11\x22\x33"
+                         "\xE9\xC0\xFF\x2E\x76\x0B\x64\x24",
+               .klen   = 8 + 48 + 8,
+               .iv     = "\x7D\x33\x88\x93\x0F\x93\xB2\x42",
+               .assoc  = "\x00\x00\x43\x21\x00\x00\x00\x01",
+               .alen   = 8,
+               .input  = "\x6f\x54\x20\x6f\x61\x4d\x79\x6e"
+                         "\x53\x20\x63\x65\x65\x72\x73\x74"
+                         "\x54\x20\x6f\x6f\x4d\x20\x6e\x61"
+                         "\x20\x79\x65\x53\x72\x63\x74\x65"
+                         "\x20\x73\x6f\x54\x20\x6f\x61\x4d"
+                         "\x79\x6e\x53\x20\x63\x65\x65\x72"
+                         "\x73\x74\x54\x20\x6f\x6f\x4d\x20"
+                         "\x6e\x61\x20\x79\x65\x53\x72\x63"
+                         "\x74\x65\x20\x73\x6f\x54\x20\x6f"
+                         "\x61\x4d\x79\x6e\x53\x20\x63\x65"
+                         "\x65\x72\x73\x74\x54\x20\x6f\x6f"
+                         "\x4d\x20\x6e\x61\x20\x79\x65\x53"
+                         "\x72\x63\x74\x65\x20\x73\x6f\x54"
+                         "\x20\x6f\x61\x4d\x79\x6e\x53\x20"
+                         "\x63\x65\x65\x72\x73\x74\x54\x20"
+                         "\x6f\x6f\x4d\x20\x6e\x61\x0a\x79",
+               .ilen   = 128,
+               .result = "\x70\xd6\xde\x64\x87\x17\xf1\xe8"
+                         "\x54\x31\x85\x37\xed\x6b\x01\x8d"
+                         "\xe3\xcc\xe0\x1d\x5e\xf3\xfe\xf1"
+                         "\x41\xaa\x33\x91\xa7\x7d\x99\x88"
+                         "\x4d\x85\x6e\x2f\xa3\x69\xf5\x82"
+                         "\x3a\x6f\x25\xcb\x7d\x58\x1f\x9b"
+                         "\xaa\x9c\x11\xd5\x76\x67\xce\xde"
+                         "\x56\xd7\x5a\x80\x69\xea\x3a\x02"
+                         "\xf0\xc7\x7c\xe3\xcb\x40\xe5\x52"
+                         "\xd1\x10\x92\x78\x0b\x8e\x5b\xf1"
+                         "\xe3\x26\x1f\xe1\x15\x41\xc7\xba"
+                         "\x99\xdb\x08\x51\x1c\xd3\x01\xf4"
+                         "\x87\x47\x39\xb8\xd2\xdd\xbd\xfb"
+                         "\x66\x13\xdf\x1c\x01\x44\xf0\x7a"
+                         "\x1a\x6b\x13\xf5\xd5\x0b\xb8\xba"
+                         "\x53\xba\xe1\x76\xe3\x82\x07\x86"
+                         "\xa8\x8e\x9c\x74\x8c\x2b\x99\xa0"
+                         "\xc8\x8c\xef\x25\x07\x83\x11\x3a"
+                         "\x31\x8d\xbe\x3b\x6a\xd7\x96\xfe"
+                         "\x5e\x67\xb5\x74\xe7\xe7\x85\x61"
+                         "\x6a\x95\x26\x75\xcc\x53\x89\xf3"
+                         "\x74\xc9\x2a\x76\x20\xa2\x64\x62",
+               .rlen   = 128 + 48,
+       },
+};
+
+#define HMAC_SHA512_DES_CBC_ENC_TEST_VEC       1
+
+static struct aead_testvec hmac_sha512_des_cbc_enc_tv_temp[] = {
+       { /*Generated with cryptopp*/
+#ifdef __LITTLE_ENDIAN
+               .key    = "\x08\x00"            /* rta length */
+                 "\x01\x00"            /* rta type */
+#else
+               .key    = "\x00\x08"            /* rta length */
+                         "\x00\x01"            /* rta type */
+#endif
+                         "\x00\x00\x00\x08"    /* enc key length */
+                 "\x11\x22\x33\x44\x55\x66\x77\x88"
+                         "\x99\xaa\xbb\xcc\xdd\xee\xff\x11"
+                         "\x22\x33\x44\x55\x66\x77\x88\x99"
+                         "\xaa\xbb\xcc\xdd\xee\xff\x11\x22"
+                         "\x33\x44\x55\x66\x77\x88\x99\xaa"
+                         "\xbb\xcc\xdd\xee\xff\x11\x22\x33"
+                         "\x44\x55\x66\x77\x88\x99\xaa\xbb"
+                         "\xcc\xdd\xee\xff\x11\x22\x33\x44"
+                         "\xE9\xC0\xFF\x2E\x76\x0B\x64\x24",
+               .klen   = 8 + 64 + 8,
+               .iv     = "\x7D\x33\x88\x93\x0F\x93\xB2\x42",
+               .assoc  = "\x00\x00\x43\x21\x00\x00\x00\x01",
+               .alen   = 8,
+               .input  = "\x6f\x54\x20\x6f\x61\x4d\x79\x6e"
+                         "\x53\x20\x63\x65\x65\x72\x73\x74"
+                         "\x54\x20\x6f\x6f\x4d\x20\x6e\x61"
+                         "\x20\x79\x65\x53\x72\x63\x74\x65"
+                         "\x20\x73\x6f\x54\x20\x6f\x61\x4d"
+                         "\x79\x6e\x53\x20\x63\x65\x65\x72"
+                         "\x73\x74\x54\x20\x6f\x6f\x4d\x20"
+                         "\x6e\x61\x20\x79\x65\x53\x72\x63"
+                         "\x74\x65\x20\x73\x6f\x54\x20\x6f"
+                         "\x61\x4d\x79\x6e\x53\x20\x63\x65"
+                         "\x65\x72\x73\x74\x54\x20\x6f\x6f"
+                         "\x4d\x20\x6e\x61\x20\x79\x65\x53"
+                         "\x72\x63\x74\x65\x20\x73\x6f\x54"
+                         "\x20\x6f\x61\x4d\x79\x6e\x53\x20"
+                         "\x63\x65\x65\x72\x73\x74\x54\x20"
+                         "\x6f\x6f\x4d\x20\x6e\x61\x0a\x79",
+               .ilen   = 128,
+               .result = "\x70\xd6\xde\x64\x87\x17\xf1\xe8"
+                         "\x54\x31\x85\x37\xed\x6b\x01\x8d"
+                         "\xe3\xcc\xe0\x1d\x5e\xf3\xfe\xf1"
+                         "\x41\xaa\x33\x91\xa7\x7d\x99\x88"
+                         "\x4d\x85\x6e\x2f\xa3\x69\xf5\x82"
+                         "\x3a\x6f\x25\xcb\x7d\x58\x1f\x9b"
+                         "\xaa\x9c\x11\xd5\x76\x67\xce\xde"
+                 "\x56\xd7\x5a\x80\x69\xea\x3a\x02"
+                         "\xf0\xc7\x7c\xe3\xcb\x40\xe5\x52"
+                 "\xd1\x10\x92\x78\x0b\x8e\x5b\xf1"
+                         "\xe3\x26\x1f\xe1\x15\x41\xc7\xba"
+                         "\x99\xdb\x08\x51\x1c\xd3\x01\xf4"
+                         "\x87\x47\x39\xb8\xd2\xdd\xbd\xfb"
+                         "\x66\x13\xdf\x1c\x01\x44\xf0\x7a"
+                 "\x1a\x6b\x13\xf5\xd5\x0b\xb8\xba"
+                         "\x53\xba\xe1\x76\xe3\x82\x07\x86"
+                         "\xc6\x2c\x73\x88\xb0\x9d\x5f\x3e"
+                         "\x5b\x78\xca\x0e\xab\x8a\xa3\xbb"
+                         "\xd9\x1d\xc3\xe3\x05\xac\x76\xfb"
+                         "\x58\x83\xda\x67\xfb\x21\x24\xa2"
+                         "\xb1\xa7\xd7\x66\xa6\x8d\xa6\x93"
+                         "\x97\xe2\xe3\xb8\xaa\x48\x85\xee"
+                         "\x8c\xf6\x07\x95\x1f\xa6\x6c\x96"
+                         "\x99\xc7\x5c\x8d\xd8\xb5\x68\x7b",
+               .rlen   = 128 + 64,
+       },
+};
+
+#define HMAC_SHA1_DES3_EDE_CBC_ENC_TEST_VEC    1
+
+static struct aead_testvec hmac_sha1_des3_ede_cbc_enc_tv_temp[] = {
+       { /*Generated with cryptopp*/
+#ifdef __LITTLE_ENDIAN
+               .key    = "\x08\x00"            /* rta length */
+                         "\x01\x00"            /* rta type */
+#else
+               .key    = "\x00\x08"            /* rta length */
+                         "\x00\x01"            /* rta type */
+#endif
+                         "\x00\x00\x00\x18"    /* enc key length */
+                         "\x11\x22\x33\x44\x55\x66\x77\x88"
+                         "\x99\xaa\xbb\xcc\xdd\xee\xff\x11"
+                         "\x22\x33\x44\x55"
+                 "\xE9\xC0\xFF\x2E\x76\x0B\x64\x24"
+                         "\x44\x4D\x99\x5A\x12\xD6\x40\xC0"
+                         "\xEA\xC2\x84\xE8\x14\x95\xDB\xE8",
+               .klen   = 8 + 20 + 24,
+               .iv     = "\x7D\x33\x88\x93\x0F\x93\xB2\x42",
+               .assoc  = "\x00\x00\x43\x21\x00\x00\x00\x01",
+               .alen   = 8,
+               .input  = "\x6f\x54\x20\x6f\x61\x4d\x79\x6e"
+                         "\x53\x20\x63\x65\x65\x72\x73\x74"
+                 "\x54\x20\x6f\x6f\x4d\x20\x6e\x61"
+                         "\x20\x79\x65\x53\x72\x63\x74\x65"
+                         "\x20\x73\x6f\x54\x20\x6f\x61\x4d"
+                         "\x79\x6e\x53\x20\x63\x65\x65\x72"
+                         "\x73\x74\x54\x20\x6f\x6f\x4d\x20"
+                         "\x6e\x61\x20\x79\x65\x53\x72\x63"
+                         "\x74\x65\x20\x73\x6f\x54\x20\x6f"
+                         "\x61\x4d\x79\x6e\x53\x20\x63\x65"
+                         "\x65\x72\x73\x74\x54\x20\x6f\x6f"
+                         "\x4d\x20\x6e\x61\x20\x79\x65\x53"
+                         "\x72\x63\x74\x65\x20\x73\x6f\x54"
+                         "\x20\x6f\x61\x4d\x79\x6e\x53\x20"
+                         "\x63\x65\x65\x72\x73\x74\x54\x20"
+                         "\x6f\x6f\x4d\x20\x6e\x61\x0a\x79",
+               .ilen   = 128,
+               .result = "\x0e\x2d\xb6\x97\x3c\x56\x33\xf4"
+                         "\x67\x17\x21\xc7\x6e\x8a\xd5\x49"
+                 "\x74\xb3\x49\x05\xc5\x1c\xd0\xed"
+                 "\x12\x56\x5c\x53\x96\xb6\x00\x7d"
+                 "\x90\x48\xfc\xf5\x8d\x29\x39\xcc"
+                         "\x8a\xd5\x35\x18\x36\x23\x4e\xd7"
+                         "\x76\xd1\xda\x0c\x94\x67\xbb\x04"
+                         "\x8b\xf2\x03\x6c\xa8\xcf\xb6\xea"
+                 "\x22\x64\x47\xaa\x8f\x75\x13\xbf"
+                         "\x9f\xc2\xc3\xf0\xc9\x56\xc5\x7a"
+                         "\x71\x63\x2e\x89\x7b\x1e\x12\xca"
+                         "\xe2\x5f\xaf\xd8\xa4\xf8\xc9\x7a"
+                         "\xd6\xf9\x21\x31\x62\x44\x45\xa6"
+                         "\xd6\xbc\x5a\xd3\x2d\x54\x43\xcc"
+                         "\x9d\xde\xa5\x70\xe9\x42\x45\x8a"
+                         "\x6b\xfa\xb1\x91\x13\xb0\xd9\x19"
+                         "\x67\x6d\xb1\xf5\xb8\x10\xdc\xc6"
+                         "\x75\x86\x96\x6b\xb1\xc5\xe4\xcf"
+                         "\xd1\x60\x91\xb3",
+                         .rlen = 128 + 20,
+       },
+};
+
+#define HMAC_SHA224_DES3_EDE_CBC_ENC_TEST_VEC  1
+
+static struct aead_testvec hmac_sha224_des3_ede_cbc_enc_tv_temp[] = {
+       { /*Generated with cryptopp*/
+#ifdef __LITTLE_ENDIAN
+               .key    = "\x08\x00"            /* rta length */
+                         "\x01\x00"            /* rta type */
+#else
+               .key    = "\x00\x08"            /* rta length */
+                         "\x00\x01"            /* rta type */
+#endif
+                         "\x00\x00\x00\x18"    /* enc key length */
+                         "\x11\x22\x33\x44\x55\x66\x77\x88"
+                         "\x99\xaa\xbb\xcc\xdd\xee\xff\x11"
+                         "\x22\x33\x44\x55\x66\x77\x88\x99"
+                         "\xE9\xC0\xFF\x2E\x76\x0B\x64\x24"
+                         "\x44\x4D\x99\x5A\x12\xD6\x40\xC0"
+                         "\xEA\xC2\x84\xE8\x14\x95\xDB\xE8",
+               .klen   = 8 + 24 + 24,
+               .iv     = "\x7D\x33\x88\x93\x0F\x93\xB2\x42",
+               .assoc  = "\x00\x00\x43\x21\x00\x00\x00\x01",
+               .alen   = 8,
+               .input  = "\x6f\x54\x20\x6f\x61\x4d\x79\x6e"
+                         "\x53\x20\x63\x65\x65\x72\x73\x74"
+                         "\x54\x20\x6f\x6f\x4d\x20\x6e\x61"
+                         "\x20\x79\x65\x53\x72\x63\x74\x65"
+                         "\x20\x73\x6f\x54\x20\x6f\x61\x4d"
+                         "\x79\x6e\x53\x20\x63\x65\x65\x72"
+                         "\x73\x74\x54\x20\x6f\x6f\x4d\x20"
+                         "\x6e\x61\x20\x79\x65\x53\x72\x63"
+                         "\x74\x65\x20\x73\x6f\x54\x20\x6f"
+                         "\x61\x4d\x79\x6e\x53\x20\x63\x65"
+                         "\x65\x72\x73\x74\x54\x20\x6f\x6f"
+                         "\x4d\x20\x6e\x61\x20\x79\x65\x53"
+                 "\x72\x63\x74\x65\x20\x73\x6f\x54"
+                         "\x20\x6f\x61\x4d\x79\x6e\x53\x20"
+                         "\x63\x65\x65\x72\x73\x74\x54\x20"
+                         "\x6f\x6f\x4d\x20\x6e\x61\x0a\x79",
+               .ilen   = 128,
+               .result = "\x0e\x2d\xb6\x97\x3c\x56\x33\xf4"
+                 "\x67\x17\x21\xc7\x6e\x8a\xd5\x49"
+                         "\x74\xb3\x49\x05\xc5\x1c\xd0\xed"
+                         "\x12\x56\x5c\x53\x96\xb6\x00\x7d"
+                         "\x90\x48\xfc\xf5\x8d\x29\x39\xcc"
+                         "\x8a\xd5\x35\x18\x36\x23\x4e\xd7"
+                         "\x76\xd1\xda\x0c\x94\x67\xbb\x04"
+                 "\x8b\xf2\x03\x6c\xa8\xcf\xb6\xea"
+                         "\x22\x64\x47\xaa\x8f\x75\x13\xbf"
+                         "\x9f\xc2\xc3\xf0\xc9\x56\xc5\x7a"
+                         "\x71\x63\x2e\x89\x7b\x1e\x12\xca"
+                         "\xe2\x5f\xaf\xd8\xa4\xf8\xc9\x7a"
+                         "\xd6\xf9\x21\x31\x62\x44\x45\xa6"
+                 "\xd6\xbc\x5a\xd3\x2d\x54\x43\xcc"
+                         "\x9d\xde\xa5\x70\xe9\x42\x45\x8a"
+                 "\x6b\xfa\xb1\x91\x13\xb0\xd9\x19"
+                         "\x15\x24\x7f\x5a\x45\x4a\x66\xce"
+                         "\x2b\x0b\x93\x99\x2f\x9d\x0c\x6c"
+                         "\x56\x1f\xe1\xa6\x41\xb2\x4c\xd0",
+                         .rlen = 128 + 24,
+       },
+};
+
+#define HMAC_SHA256_DES3_EDE_CBC_ENC_TEST_VEC  1
+
+static struct aead_testvec hmac_sha256_des3_ede_cbc_enc_tv_temp[] = {
+       { /*Generated with cryptopp*/
+#ifdef __LITTLE_ENDIAN
+               .key    = "\x08\x00"            /* rta length */
+                         "\x01\x00"            /* rta type */
+#else
+               .key    = "\x00\x08"            /* rta length */
+                         "\x00\x01"            /* rta type */
+#endif
+                         "\x00\x00\x00\x18"    /* enc key length */
+                         "\x11\x22\x33\x44\x55\x66\x77\x88"
+                         "\x99\xaa\xbb\xcc\xdd\xee\xff\x11"
+                         "\x22\x33\x44\x55\x66\x77\x88\x99"
+                         "\xaa\xbb\xcc\xdd\xee\xff\x11\x22"
+                         "\xE9\xC0\xFF\x2E\x76\x0B\x64\x24"
+                         "\x44\x4D\x99\x5A\x12\xD6\x40\xC0"
+                         "\xEA\xC2\x84\xE8\x14\x95\xDB\xE8",
+               .klen   = 8 + 32 + 24,
+               .iv     = "\x7D\x33\x88\x93\x0F\x93\xB2\x42",
+               .assoc  = "\x00\x00\x43\x21\x00\x00\x00\x01",
+               .alen   = 8,
+               .input  = "\x6f\x54\x20\x6f\x61\x4d\x79\x6e"
+                         "\x53\x20\x63\x65\x65\x72\x73\x74"
+                         "\x54\x20\x6f\x6f\x4d\x20\x6e\x61"
+                         "\x20\x79\x65\x53\x72\x63\x74\x65"
+                         "\x20\x73\x6f\x54\x20\x6f\x61\x4d"
+                         "\x79\x6e\x53\x20\x63\x65\x65\x72"
+                         "\x73\x74\x54\x20\x6f\x6f\x4d\x20"
+                         "\x6e\x61\x20\x79\x65\x53\x72\x63"
+                         "\x74\x65\x20\x73\x6f\x54\x20\x6f"
+                         "\x61\x4d\x79\x6e\x53\x20\x63\x65"
+                         "\x65\x72\x73\x74\x54\x20\x6f\x6f"
+                         "\x4d\x20\x6e\x61\x20\x79\x65\x53"
+                         "\x72\x63\x74\x65\x20\x73\x6f\x54"
+                         "\x20\x6f\x61\x4d\x79\x6e\x53\x20"
+                         "\x63\x65\x65\x72\x73\x74\x54\x20"
+                         "\x6f\x6f\x4d\x20\x6e\x61\x0a\x79",
+               .ilen   = 128,
+               .result = "\x0e\x2d\xb6\x97\x3c\x56\x33\xf4"
+                         "\x67\x17\x21\xc7\x6e\x8a\xd5\x49"
+                         "\x74\xb3\x49\x05\xc5\x1c\xd0\xed"
+                         "\x12\x56\x5c\x53\x96\xb6\x00\x7d"
+                         "\x90\x48\xfc\xf5\x8d\x29\x39\xcc"
+                         "\x8a\xd5\x35\x18\x36\x23\x4e\xd7"
+                         "\x76\xd1\xda\x0c\x94\x67\xbb\x04"
+                         "\x8b\xf2\x03\x6c\xa8\xcf\xb6\xea"
+                         "\x22\x64\x47\xaa\x8f\x75\x13\xbf"
+                         "\x9f\xc2\xc3\xf0\xc9\x56\xc5\x7a"
+                         "\x71\x63\x2e\x89\x7b\x1e\x12\xca"
+                         "\xe2\x5f\xaf\xd8\xa4\xf8\xc9\x7a"
+                         "\xd6\xf9\x21\x31\x62\x44\x45\xa6"
+                         "\xd6\xbc\x5a\xd3\x2d\x54\x43\xcc"
+                         "\x9d\xde\xa5\x70\xe9\x42\x45\x8a"
+                         "\x6b\xfa\xb1\x91\x13\xb0\xd9\x19"
+                         "\x73\xb0\xea\x9f\xe8\x18\x80\xd6"
+                         "\x56\x38\x44\xc0\xdb\xe3\x4f\x71"
+                         "\xf7\xce\xd1\xd3\xf8\xbd\x3e\x4f"
+                         "\xca\x43\x95\xdf\x80\x61\x81\xa9",
+               .rlen   = 128 + 32,
+       },
+};
+
+#define HMAC_SHA384_DES3_EDE_CBC_ENC_TEST_VEC  1
+
+static struct aead_testvec hmac_sha384_des3_ede_cbc_enc_tv_temp[] = {
+       { /*Generated with cryptopp*/
+#ifdef __LITTLE_ENDIAN
+               .key    = "\x08\x00"            /* rta length */
+                         "\x01\x00"            /* rta type */
+#else
+               .key    = "\x00\x08"            /* rta length */
+                         "\x00\x01"            /* rta type */
+#endif
+                         "\x00\x00\x00\x18"    /* enc key length */
+                         "\x11\x22\x33\x44\x55\x66\x77\x88"
+                         "\x99\xaa\xbb\xcc\xdd\xee\xff\x11"
+                         "\x22\x33\x44\x55\x66\x77\x88\x99"
+                         "\xaa\xbb\xcc\xdd\xee\xff\x11\x22"
+                         "\x33\x44\x55\x66\x77\x88\x99\xaa"
+                         "\xbb\xcc\xdd\xee\xff\x11\x22\x33"
+                         "\xE9\xC0\xFF\x2E\x76\x0B\x64\x24"
+                         "\x44\x4D\x99\x5A\x12\xD6\x40\xC0"
+                         "\xEA\xC2\x84\xE8\x14\x95\xDB\xE8",
+               .klen   = 8 + 48 + 24,
+               .iv     = "\x7D\x33\x88\x93\x0F\x93\xB2\x42",
+       .assoc  = "\x00\x00\x43\x21\x00\x00\x00\x01",
+               .alen   = 8,
+               .input  = "\x6f\x54\x20\x6f\x61\x4d\x79\x6e"
+                         "\x53\x20\x63\x65\x65\x72\x73\x74"
+                         "\x54\x20\x6f\x6f\x4d\x20\x6e\x61"
+                         "\x20\x79\x65\x53\x72\x63\x74\x65"
+                         "\x20\x73\x6f\x54\x20\x6f\x61\x4d"
+                         "\x79\x6e\x53\x20\x63\x65\x65\x72"
+                         "\x73\x74\x54\x20\x6f\x6f\x4d\x20"
+                         "\x6e\x61\x20\x79\x65\x53\x72\x63"
+                         "\x74\x65\x20\x73\x6f\x54\x20\x6f"
+                         "\x61\x4d\x79\x6e\x53\x20\x63\x65"
+                         "\x65\x72\x73\x74\x54\x20\x6f\x6f"
+                         "\x4d\x20\x6e\x61\x20\x79\x65\x53"
+                         "\x72\x63\x74\x65\x20\x73\x6f\x54"
+                         "\x20\x6f\x61\x4d\x79\x6e\x53\x20"
+                         "\x63\x65\x65\x72\x73\x74\x54\x20"
+                         "\x6f\x6f\x4d\x20\x6e\x61\x0a\x79",
+               .ilen   = 128,
+               .result = "\x0e\x2d\xb6\x97\x3c\x56\x33\xf4"
+                         "\x67\x17\x21\xc7\x6e\x8a\xd5\x49"
+                         "\x74\xb3\x49\x05\xc5\x1c\xd0\xed"
+                         "\x12\x56\x5c\x53\x96\xb6\x00\x7d"
+                         "\x90\x48\xfc\xf5\x8d\x29\x39\xcc"
+                         "\x8a\xd5\x35\x18\x36\x23\x4e\xd7"
+                         "\x76\xd1\xda\x0c\x94\x67\xbb\x04"
+                         "\x8b\xf2\x03\x6c\xa8\xcf\xb6\xea"
+                         "\x22\x64\x47\xaa\x8f\x75\x13\xbf"
+                         "\x9f\xc2\xc3\xf0\xc9\x56\xc5\x7a"
+                         "\x71\x63\x2e\x89\x7b\x1e\x12\xca"
+                         "\xe2\x5f\xaf\xd8\xa4\xf8\xc9\x7a"
+                         "\xd6\xf9\x21\x31\x62\x44\x45\xa6"
+                         "\xd6\xbc\x5a\xd3\x2d\x54\x43\xcc"
+                         "\x9d\xde\xa5\x70\xe9\x42\x45\x8a"
+                         "\x6b\xfa\xb1\x91\x13\xb0\xd9\x19"
+                         "\x6d\x77\xfc\x80\x9d\x8a\x9c\xb7"
+                 "\x70\xe7\x93\xbf\x73\xe6\x9f\x83"
+                         "\x99\x62\x23\xe6\x5b\xd0\xda\x18"
+                         "\xa4\x32\x8a\x0b\x46\xd7\xf0\x39"
+                         "\x36\x5d\x13\x2f\x86\x10\x78\xd6"
+                         "\xd6\xbe\x5c\xb9\x15\x89\xf9\x1b",
+               .rlen   = 128 + 48,
+       },
+};
+
+#define HMAC_SHA512_DES3_EDE_CBC_ENC_TEST_VEC  1
+
+static struct aead_testvec hmac_sha512_des3_ede_cbc_enc_tv_temp[] = {
+       { /*Generated with cryptopp*/
+#ifdef __LITTLE_ENDIAN
+               .key    = "\x08\x00"            /* rta length */
+                         "\x01\x00"            /* rta type */
+#else
+               .key    = "\x00\x08"            /* rta length */
+                         "\x00\x01"            /* rta type */
+#endif
+                         "\x00\x00\x00\x18"    /* enc key length */
+                         "\x11\x22\x33\x44\x55\x66\x77\x88"
+                         "\x99\xaa\xbb\xcc\xdd\xee\xff\x11"
+                         "\x22\x33\x44\x55\x66\x77\x88\x99"
+                         "\xaa\xbb\xcc\xdd\xee\xff\x11\x22"
+                         "\x33\x44\x55\x66\x77\x88\x99\xaa"
+                         "\xbb\xcc\xdd\xee\xff\x11\x22\x33"
+                         "\x44\x55\x66\x77\x88\x99\xaa\xbb"
+                         "\xcc\xdd\xee\xff\x11\x22\x33\x44"
+                         "\xE9\xC0\xFF\x2E\x76\x0B\x64\x24"
+                 "\x44\x4D\x99\x5A\x12\xD6\x40\xC0"
+                         "\xEA\xC2\x84\xE8\x14\x95\xDB\xE8",
+               .klen   = 8 + 64 + 24,
+               .iv     = "\x7D\x33\x88\x93\x0F\x93\xB2\x42",
+               .assoc  = "\x00\x00\x43\x21\x00\x00\x00\x01",
+               .alen   = 8,
+               .input  = "\x6f\x54\x20\x6f\x61\x4d\x79\x6e"
+                         "\x53\x20\x63\x65\x65\x72\x73\x74"
+                         "\x54\x20\x6f\x6f\x4d\x20\x6e\x61"
+                         "\x20\x79\x65\x53\x72\x63\x74\x65"
+                         "\x20\x73\x6f\x54\x20\x6f\x61\x4d"
+                         "\x79\x6e\x53\x20\x63\x65\x65\x72"
+                         "\x73\x74\x54\x20\x6f\x6f\x4d\x20"
+                         "\x6e\x61\x20\x79\x65\x53\x72\x63"
+                 "\x74\x65\x20\x73\x6f\x54\x20\x6f"
+                         "\x61\x4d\x79\x6e\x53\x20\x63\x65"
+                         "\x65\x72\x73\x74\x54\x20\x6f\x6f"
+                         "\x4d\x20\x6e\x61\x20\x79\x65\x53"
+                         "\x72\x63\x74\x65\x20\x73\x6f\x54"
+                         "\x20\x6f\x61\x4d\x79\x6e\x53\x20"
+                         "\x63\x65\x65\x72\x73\x74\x54\x20"
+                         "\x6f\x6f\x4d\x20\x6e\x61\x0a\x79",
+               .ilen   = 128,
+               .result = "\x0e\x2d\xb6\x97\x3c\x56\x33\xf4"
+                         "\x67\x17\x21\xc7\x6e\x8a\xd5\x49"
+                         "\x74\xb3\x49\x05\xc5\x1c\xd0\xed"
+                         "\x12\x56\x5c\x53\x96\xb6\x00\x7d"
+                         "\x90\x48\xfc\xf5\x8d\x29\x39\xcc"
+                         "\x8a\xd5\x35\x18\x36\x23\x4e\xd7"
+                         "\x76\xd1\xda\x0c\x94\x67\xbb\x04"
+                         "\x8b\xf2\x03\x6c\xa8\xcf\xb6\xea"
+                         "\x22\x64\x47\xaa\x8f\x75\x13\xbf"
+                         "\x9f\xc2\xc3\xf0\xc9\x56\xc5\x7a"
+                         "\x71\x63\x2e\x89\x7b\x1e\x12\xca"
+                         "\xe2\x5f\xaf\xd8\xa4\xf8\xc9\x7a"
+                         "\xd6\xf9\x21\x31\x62\x44\x45\xa6"
+                         "\xd6\xbc\x5a\xd3\x2d\x54\x43\xcc"
+                         "\x9d\xde\xa5\x70\xe9\x42\x45\x8a"
+                         "\x6b\xfa\xb1\x91\x13\xb0\xd9\x19"
+                         "\x41\xb5\x1f\xbb\xbd\x4e\xb8\x32"
+                         "\x22\x86\x4e\x57\x1b\x2a\xd8\x6e"
+                         "\xa9\xfb\xc8\xf3\xbf\x2d\xae\x2b"
+                         "\x3b\xbc\x41\xe8\x38\xbb\xf1\x60"
+                         "\x4c\x68\xa9\x4e\x8c\x73\xa7\xc0"
+                         "\x2a\x74\xd4\x65\x12\xcb\x55\xf2"
+                         "\xd5\x02\x6d\xe6\xaf\xc9\x2f\xf2"
+                         "\x57\xaa\x85\xf7\xf3\x6a\xcb\xdb",
+               .rlen   = 128 + 64,
+       },
+};
+
 static struct cipher_testvec aes_lrw_enc_tv_template[] = {
        /* from http://grouper.ieee.org/groups/1619/email/pdf00017.pdf */
        { /* LRW-32-AES 1 */
@@ -18746,7 +20125,29 @@ static struct aead_testvec aes_ccm_enc_tv_template[] = {
                          "\x7c\xf9\xbe\xc2\x40\x88\x97\xc6"
                          "\xba",
                .rlen   = 33,
-       },
+       }, {
+               /*
+                * This is the same vector as aes_ccm_rfc4309_enc_tv_template[0]
+                * below but rewritten to use the ccm algorithm directly.
+                */
+               .key    = "\x83\xac\x54\x66\xc2\xeb\xe5\x05"
+                         "\x2e\x01\xd1\xfc\x5d\x82\x66\x2e",
+               .klen   = 16,
+               .iv     = "\x03\x96\xac\x59\x30\x07\xa1\xe2\xa2\xc7\x55\x24\0\0\0\0",
+               .alen   = 0,
+               .input  = "\x19\xc8\x81\xf6\xe9\x86\xff\x93"
+                         "\x0b\x78\x67\xe5\xbb\xb7\xfc\x6e"
+                         "\x83\x77\xb3\xa6\x0c\x8c\x9f\x9c"
+                         "\x35\x2e\xad\xe0\x62\xf9\x91\xa1",
+               .ilen   = 32,
+               .result = "\xab\x6f\xe1\x69\x1d\x19\x99\xa8"
+                         "\x92\xa0\xc4\x6f\x7e\xe2\x8b\xb1"
+                         "\x70\xbb\x8c\xa6\x4c\x6e\x97\x8a"
+                         "\x57\x2b\xbe\x5d\x98\xa6\xb1\x32"
+                         "\xda\x24\xea\xd9\xa1\x39\x98\xfd"
+                         "\xa4\xbe\xd9\xf2\x1a\x6d\x22\xa8",
+               .rlen   = 48,
+       }
 };
 
 static struct aead_testvec aes_ccm_dec_tv_template[] = {
index 244759bbd7b73d0aa3015c915654abd35ac7a193..836b061ced356fc099625973cb1a77003b9a0b90 100644 (file)
@@ -2,7 +2,7 @@
 # Hardware Random Number Generator (RNG) configuration
 #
 
-config HW_RANDOM
+menuconfig HW_RANDOM
        tristate "Hardware Random Number Generator Core support"
        default m
        ---help---
@@ -20,9 +20,11 @@ config HW_RANDOM
 
          If unsure, say Y.
 
+if HW_RANDOM
+
 config HW_RANDOM_TIMERIOMEM
        tristate "Timer IOMEM HW Random Number Generator support"
-       depends on HW_RANDOM && HAS_IOMEM
+       depends on HAS_IOMEM
        ---help---
          This driver provides kernel-side support for a generic Random
          Number Generator used by reading a 'dumb' iomem address that
@@ -36,7 +38,7 @@ config HW_RANDOM_TIMERIOMEM
 
 config HW_RANDOM_INTEL
        tristate "Intel HW Random Number Generator support"
-       depends on HW_RANDOM && (X86 || IA64) && PCI
+       depends on (X86 || IA64) && PCI
        default HW_RANDOM
        ---help---
          This driver provides kernel-side support for the Random Number
@@ -49,7 +51,7 @@ config HW_RANDOM_INTEL
 
 config HW_RANDOM_AMD
        tristate "AMD HW Random Number Generator support"
-       depends on HW_RANDOM && (X86 || PPC_MAPLE) && PCI
+       depends on (X86 || PPC_MAPLE) && PCI
        default HW_RANDOM
        ---help---
          This driver provides kernel-side support for the Random Number
@@ -62,8 +64,8 @@ config HW_RANDOM_AMD
 
 config HW_RANDOM_ATMEL
        tristate "Atmel Random Number Generator support"
-       depends on HW_RANDOM && HAVE_CLK
-       default (HW_RANDOM && ARCH_AT91)
+       depends on ARCH_AT91 && HAVE_CLK
+       default HW_RANDOM
        ---help---
          This driver provides kernel-side support for the Random Number
          Generator hardware found on Atmel AT91 devices.
@@ -75,7 +77,7 @@ config HW_RANDOM_ATMEL
 
 config HW_RANDOM_BCM63XX
        tristate "Broadcom BCM63xx Random Number Generator support"
-       depends on HW_RANDOM && BCM63XX
+       depends on BCM63XX
        default HW_RANDOM
        ---help---
          This driver provides kernel-side support for the Random Number
@@ -88,7 +90,7 @@ config HW_RANDOM_BCM63XX
 
 config HW_RANDOM_BCM2835
        tristate "Broadcom BCM2835 Random Number Generator support"
-       depends on HW_RANDOM && ARCH_BCM2835
+       depends on ARCH_BCM2835
        default HW_RANDOM
        ---help---
          This driver provides kernel-side support for the Random Number
@@ -101,7 +103,7 @@ config HW_RANDOM_BCM2835
 
 config HW_RANDOM_GEODE
        tristate "AMD Geode HW Random Number Generator support"
-       depends on HW_RANDOM && X86_32 && PCI
+       depends on X86_32 && PCI
        default HW_RANDOM
        ---help---
          This driver provides kernel-side support for the Random Number
@@ -114,7 +116,7 @@ config HW_RANDOM_GEODE
 
 config HW_RANDOM_N2RNG
        tristate "Niagara2 Random Number Generator support"
-       depends on HW_RANDOM && SPARC64
+       depends on SPARC64
        default HW_RANDOM
        ---help---
          This driver provides kernel-side support for the Random Number
@@ -127,7 +129,7 @@ config HW_RANDOM_N2RNG
 
 config HW_RANDOM_VIA
        tristate "VIA HW Random Number Generator support"
-       depends on HW_RANDOM && X86
+       depends on X86
        default HW_RANDOM
        ---help---
          This driver provides kernel-side support for the Random Number
@@ -140,7 +142,7 @@ config HW_RANDOM_VIA
 
 config HW_RANDOM_IXP4XX
        tristate "Intel IXP4xx NPU HW Pseudo-Random Number Generator support"
-       depends on HW_RANDOM && ARCH_IXP4XX
+       depends on ARCH_IXP4XX
        default HW_RANDOM
        ---help---
          This driver provides kernel-side support for the Pseudo-Random
@@ -153,7 +155,7 @@ config HW_RANDOM_IXP4XX
 
 config HW_RANDOM_OMAP
        tristate "OMAP Random Number Generator support"
-       depends on HW_RANDOM && (ARCH_OMAP16XX || ARCH_OMAP2PLUS)
+       depends on ARCH_OMAP16XX || ARCH_OMAP2PLUS
        default HW_RANDOM
        ---help---
          This driver provides kernel-side support for the Random Number
@@ -167,7 +169,7 @@ config HW_RANDOM_OMAP
 
 config HW_RANDOM_OMAP3_ROM
        tristate "OMAP3 ROM Random Number Generator support"
-       depends on HW_RANDOM && ARCH_OMAP3
+       depends on ARCH_OMAP3
        default HW_RANDOM
        ---help---
          This driver provides kernel-side support for the Random Number
@@ -180,7 +182,7 @@ config HW_RANDOM_OMAP3_ROM
 
 config HW_RANDOM_OCTEON
        tristate "Octeon Random Number Generator support"
-       depends on HW_RANDOM && CAVIUM_OCTEON_SOC
+       depends on CAVIUM_OCTEON_SOC
        default HW_RANDOM
        ---help---
          This driver provides kernel-side support for the Random Number
@@ -193,7 +195,7 @@ config HW_RANDOM_OCTEON
 
 config HW_RANDOM_PASEMI
        tristate "PA Semi HW Random Number Generator support"
-       depends on HW_RANDOM && PPC_PASEMI
+       depends on PPC_PASEMI
        default HW_RANDOM
        ---help---
          This driver provides kernel-side support for the Random Number
@@ -206,7 +208,7 @@ config HW_RANDOM_PASEMI
 
 config HW_RANDOM_VIRTIO
        tristate "VirtIO Random Number Generator support"
-       depends on HW_RANDOM && VIRTIO
+       depends on VIRTIO
        ---help---
          This driver provides kernel-side support for the virtual Random Number
          Generator hardware.
@@ -216,7 +218,7 @@ config HW_RANDOM_VIRTIO
 
 config HW_RANDOM_TX4939
        tristate "TX4939 Random Number Generator support"
-       depends on HW_RANDOM && SOC_TX4939
+       depends on SOC_TX4939
        default HW_RANDOM
        ---help---
          This driver provides kernel-side support for the Random Number
@@ -229,7 +231,8 @@ config HW_RANDOM_TX4939
 
 config HW_RANDOM_MXC_RNGA
        tristate "Freescale i.MX RNGA Random Number Generator"
-       depends on HW_RANDOM && ARCH_HAS_RNGA
+       depends on ARCH_HAS_RNGA
+       default HW_RANDOM
        ---help---
          This driver provides kernel-side support for the Random Number
          Generator hardware found on Freescale i.MX processors.
@@ -241,7 +244,8 @@ config HW_RANDOM_MXC_RNGA
 
 config HW_RANDOM_NOMADIK
        tristate "ST-Ericsson Nomadik Random Number Generator support"
-       depends on HW_RANDOM && ARCH_NOMADIK
+       depends on ARCH_NOMADIK
+       default HW_RANDOM
        ---help---
          This driver provides kernel-side support for the Random Number
          Generator hardware found on ST-Ericsson SoCs (8815 and 8500).
@@ -251,21 +255,10 @@ config HW_RANDOM_NOMADIK
 
          If unsure, say Y.
 
-config HW_RANDOM_PICOXCELL
-       tristate "Picochip picoXcell true random number generator support"
-       depends on HW_RANDOM && ARCH_PICOXCELL && PICOXCELL_PC3X3
-       ---help---
-         This driver provides kernel-side support for the Random Number
-         Generator hardware found on Picochip PC3x3 and later devices.
-
-         To compile this driver as a module, choose M here: the
-         module will be called picoxcell-rng.
-
-         If unsure, say Y.
-
 config HW_RANDOM_PPC4XX
        tristate "PowerPC 4xx generic true random number generator support"
-       depends on HW_RANDOM && PPC && 4xx
+       depends on PPC && 4xx
+       default HW_RANDOM
        ---help---
         This driver provides the kernel-side support for the TRNG hardware
         found in the security function of some PowerPC 4xx SoCs.
@@ -275,24 +268,9 @@ config HW_RANDOM_PPC4XX
 
         If unsure, say N.
 
-config UML_RANDOM
-       depends on UML
-       tristate "Hardware random number generator"
-       help
-         This option enables UML's "hardware" random number generator.  It
-         attaches itself to the host's /dev/random, supplying as much entropy
-         as the host has, rather than the small amount the UML gets from its
-         own drivers.  It registers itself as a standard hardware random number
-         generator, major 10, minor 183, and the canonical device name is
-         /dev/hwrng.
-         The way to make use of this is to install the rng-tools package
-         (check your distro, or download from
-         http://sourceforge.net/projects/gkernel/).  rngd periodically reads
-         /dev/hwrng and injects the entropy into /dev/random.
-
 config HW_RANDOM_PSERIES
        tristate "pSeries HW Random Number Generator support"
-       depends on HW_RANDOM && PPC64 && IBMVIO
+       depends on PPC64 && IBMVIO
        default HW_RANDOM
        ---help---
          This driver provides kernel-side support for the Random Number
@@ -305,7 +283,7 @@ config HW_RANDOM_PSERIES
 
 config HW_RANDOM_POWERNV
        tristate "PowerNV Random Number Generator support"
-       depends on HW_RANDOM && PPC_POWERNV
+       depends on PPC_POWERNV
        default HW_RANDOM
        ---help---
          This is the driver for Random Number Generator hardware found
@@ -318,7 +296,8 @@ config HW_RANDOM_POWERNV
 
 config HW_RANDOM_EXYNOS
        tristate "EXYNOS HW random number generator support"
-       depends on HW_RANDOM && HAS_IOMEM && HAVE_CLK
+       depends on ARCH_EXYNOS
+       default HW_RANDOM
        ---help---
          This driver provides kernel-side support for the Random Number
          Generator hardware found on EXYNOS SOCs.
@@ -330,7 +309,7 @@ config HW_RANDOM_EXYNOS
 
 config HW_RANDOM_TPM
        tristate "TPM HW Random Number Generator support"
-       depends on HW_RANDOM && TCG_TPM
+       depends on TCG_TPM
        default HW_RANDOM
        ---help---
          This driver provides kernel-side support for the Random Number
@@ -344,6 +323,7 @@ config HW_RANDOM_TPM
 config HW_RANDOM_MSM
        tristate "Qualcomm SoCs Random Number Generator support"
        depends on HW_RANDOM && ARCH_QCOM
+       default HW_RANDOM
        ---help---
          This driver provides kernel-side support for the Random Number
          Generator hardware found on Qualcomm SoCs.
@@ -352,3 +332,20 @@ config HW_RANDOM_MSM
          module will be called msm-rng.
 
          If unsure, say Y.
+
+endif # HW_RANDOM
+
+config UML_RANDOM
+       depends on UML
+       tristate "Hardware random number generator"
+       help
+         This option enables UML's "hardware" random number generator.  It
+         attaches itself to the host's /dev/random, supplying as much entropy
+         as the host has, rather than the small amount the UML gets from its
+         own drivers.  It registers itself as a standard hardware random number
+         generator, major 10, minor 183, and the canonical device name is
+         /dev/hwrng.
+         The way to make use of this is to install the rng-tools package
+         (check your distro, or download from
+         http://sourceforge.net/projects/gkernel/).  rngd periodically reads
+         /dev/hwrng and injects the entropy into /dev/random.
index 3ae7755a52e706bd8356e8ae5bc660fe8a693767..199ed283e1497bcaadf99805f92116b49739d874 100644 (file)
@@ -22,7 +22,6 @@ obj-$(CONFIG_HW_RANDOM_TX4939) += tx4939-rng.o
 obj-$(CONFIG_HW_RANDOM_MXC_RNGA) += mxc-rnga.o
 obj-$(CONFIG_HW_RANDOM_OCTEON) += octeon-rng.o
 obj-$(CONFIG_HW_RANDOM_NOMADIK) += nomadik-rng.o
-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
index 432232eefe057da718751d9b6721ca9a0e657aaf..292a5889f675ea62c4ed88c09b5a78118f5de779 100644 (file)
@@ -632,7 +632,7 @@ static int n2rng_probe(struct platform_device *op)
        multi_capable = (match->data != NULL);
 
        n2rng_driver_version();
-       np = kzalloc(sizeof(*np), GFP_KERNEL);
+       np = devm_kzalloc(&op->dev, sizeof(*np), GFP_KERNEL);
        if (!np)
                goto out;
        np->op = op;
@@ -653,7 +653,7 @@ static int n2rng_probe(struct platform_device *op)
                                         &np->hvapi_minor)) {
                        dev_err(&op->dev, "Cannot register suitable "
                                "HVAPI version.\n");
-                       goto out_free;
+                       goto out;
                }
        }
 
@@ -676,15 +676,16 @@ static int n2rng_probe(struct platform_device *op)
        dev_info(&op->dev, "Registered RNG HVAPI major %lu minor %lu\n",
                 np->hvapi_major, np->hvapi_minor);
 
-       np->units = kzalloc(sizeof(struct n2rng_unit) * np->num_units,
-                           GFP_KERNEL);
+       np->units = devm_kzalloc(&op->dev,
+                                sizeof(struct n2rng_unit) * np->num_units,
+                                GFP_KERNEL);
        err = -ENOMEM;
        if (!np->units)
                goto out_hvapi_unregister;
 
        err = n2rng_init_control(np);
        if (err)
-               goto out_free_units;
+               goto out_hvapi_unregister;
 
        dev_info(&op->dev, "Found %s RNG, units: %d\n",
                 ((np->flags & N2RNG_FLAG_MULTI) ?
@@ -697,7 +698,7 @@ static int n2rng_probe(struct platform_device *op)
 
        err = hwrng_register(&np->hwrng);
        if (err)
-               goto out_free_units;
+               goto out_hvapi_unregister;
 
        platform_set_drvdata(op, np);
 
@@ -705,15 +706,9 @@ static int n2rng_probe(struct platform_device *op)
 
        return 0;
 
-out_free_units:
-       kfree(np->units);
-       np->units = NULL;
-
 out_hvapi_unregister:
        sun4v_hvapi_unregister(HV_GRP_RNG);
 
-out_free:
-       kfree(np);
 out:
        return err;
 }
@@ -730,11 +725,6 @@ static int n2rng_remove(struct platform_device *op)
 
        sun4v_hvapi_unregister(HV_GRP_RNG);
 
-       kfree(np->units);
-       np->units = NULL;
-
-       kfree(np);
-
        return 0;
 }
 
index 9b89ff4881de7cdfe49e607e33c5ed0788f0be58..f66ea258382f36f94b0964a79886023f3dc84c97 100644 (file)
@@ -369,10 +369,8 @@ static int omap_rng_probe(struct platform_device *pdev)
        int ret;
 
        priv = devm_kzalloc(dev, sizeof(struct omap_rng_dev), GFP_KERNEL);
-       if (!priv) {
-               dev_err(&pdev->dev, "could not allocate memory\n");
+       if (!priv)
                return -ENOMEM;
-       };
 
        omap_rng_ops.priv = (unsigned long)priv;
        platform_set_drvdata(pdev, priv);
diff --git a/drivers/char/hw_random/picoxcell-rng.c b/drivers/char/hw_random/picoxcell-rng.c
deleted file mode 100644 (file)
index eab5448..0000000
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright (c) 2010-2011 Picochip Ltd., Jamie Iles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * All enquiries to support@picochip.com
- */
-#include <linux/clk.h>
-#include <linux/delay.h>
-#include <linux/err.h>
-#include <linux/hw_random.h>
-#include <linux/io.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-
-#define DATA_REG_OFFSET                0x0200
-#define CSR_REG_OFFSET         0x0278
-#define CSR_OUT_EMPTY_MASK     (1 << 24)
-#define CSR_FAULT_MASK         (1 << 1)
-#define TRNG_BLOCK_RESET_MASK  (1 << 0)
-#define TAI_REG_OFFSET         0x0380
-
-/*
- * The maximum amount of time in microseconds to spend waiting for data if the
- * core wants us to wait.  The TRNG should generate 32 bits every 320ns so a
- * timeout of 20us seems reasonable.  The TRNG does builtin tests of the data
- * for randomness so we can't always assume there is data present.
- */
-#define PICO_TRNG_TIMEOUT              20
-
-static void __iomem *rng_base;
-static struct clk *rng_clk;
-static struct device *rng_dev;
-
-static inline u32 picoxcell_trng_read_csr(void)
-{
-       return __raw_readl(rng_base + CSR_REG_OFFSET);
-}
-
-static inline bool picoxcell_trng_is_empty(void)
-{
-       return picoxcell_trng_read_csr() & CSR_OUT_EMPTY_MASK;
-}
-
-/*
- * Take the random number generator out of reset and make sure the interrupts
- * are masked. We shouldn't need to get large amounts of random bytes so just
- * poll the status register. The hardware generates 32 bits every 320ns so we
- * shouldn't have to wait long enough to warrant waiting for an IRQ.
- */
-static void picoxcell_trng_start(void)
-{
-       __raw_writel(0, rng_base + TAI_REG_OFFSET);
-       __raw_writel(0, rng_base + CSR_REG_OFFSET);
-}
-
-static void picoxcell_trng_reset(void)
-{
-       __raw_writel(TRNG_BLOCK_RESET_MASK, rng_base + CSR_REG_OFFSET);
-       __raw_writel(TRNG_BLOCK_RESET_MASK, rng_base + TAI_REG_OFFSET);
-       picoxcell_trng_start();
-}
-
-/*
- * Get some random data from the random number generator. The hw_random core
- * layer provides us with locking.
- */
-static int picoxcell_trng_read(struct hwrng *rng, void *buf, size_t max,
-                              bool wait)
-{
-       int i;
-
-       /* Wait for some data to become available. */
-       for (i = 0; i < PICO_TRNG_TIMEOUT && picoxcell_trng_is_empty(); ++i) {
-               if (!wait)
-                       return 0;
-
-               udelay(1);
-       }
-
-       if (picoxcell_trng_read_csr() & CSR_FAULT_MASK) {
-               dev_err(rng_dev, "fault detected, resetting TRNG\n");
-               picoxcell_trng_reset();
-               return -EIO;
-       }
-
-       if (i == PICO_TRNG_TIMEOUT)
-               return 0;
-
-       *(u32 *)buf = __raw_readl(rng_base + DATA_REG_OFFSET);
-       return sizeof(u32);
-}
-
-static struct hwrng picoxcell_trng = {
-       .name           = "picoxcell",
-       .read           = picoxcell_trng_read,
-};
-
-static int picoxcell_trng_probe(struct platform_device *pdev)
-{
-       int ret;
-       struct resource *mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-
-       rng_base = devm_ioremap_resource(&pdev->dev, mem);
-       if (IS_ERR(rng_base))
-               return PTR_ERR(rng_base);
-
-       rng_clk = devm_clk_get(&pdev->dev, NULL);
-       if (IS_ERR(rng_clk)) {
-               dev_warn(&pdev->dev, "no clk\n");
-               return PTR_ERR(rng_clk);
-       }
-
-       ret = clk_enable(rng_clk);
-       if (ret) {
-               dev_warn(&pdev->dev, "unable to enable clk\n");
-               return ret;
-       }
-
-       picoxcell_trng_start();
-       ret = hwrng_register(&picoxcell_trng);
-       if (ret)
-               goto err_register;
-
-       rng_dev = &pdev->dev;
-       dev_info(&pdev->dev, "pixoxcell random number generator active\n");
-
-       return 0;
-
-err_register:
-       clk_disable(rng_clk);
-       return ret;
-}
-
-static int picoxcell_trng_remove(struct platform_device *pdev)
-{
-       hwrng_unregister(&picoxcell_trng);
-       clk_disable(rng_clk);
-
-       return 0;
-}
-
-#ifdef CONFIG_PM
-static int picoxcell_trng_suspend(struct device *dev)
-{
-       clk_disable(rng_clk);
-
-       return 0;
-}
-
-static int picoxcell_trng_resume(struct device *dev)
-{
-       return clk_enable(rng_clk);
-}
-
-static const struct dev_pm_ops picoxcell_trng_pm_ops = {
-       .suspend        = picoxcell_trng_suspend,
-       .resume         = picoxcell_trng_resume,
-};
-#endif /* CONFIG_PM */
-
-static struct platform_driver picoxcell_trng_driver = {
-       .probe          = picoxcell_trng_probe,
-       .remove         = picoxcell_trng_remove,
-       .driver         = {
-               .name   = "picoxcell-trng",
-               .owner  = THIS_MODULE,
-#ifdef CONFIG_PM
-               .pm     = &picoxcell_trng_pm_ops,
-#endif /* CONFIG_PM */
-       },
-};
-
-module_platform_driver(picoxcell_trng_driver);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Jamie Iles");
-MODULE_DESCRIPTION("Picochip picoXcell TRNG driver");
index 439ff8b28c439c6da97101b3d096cb9f9bd66691..b6ab9ac3f34d2587157a7eaf8bf17fa7d97f167f 100644 (file)
@@ -120,10 +120,8 @@ static int timeriomem_rng_probe(struct platform_device *pdev)
        /* Allocate memory for the device structure (and zero it) */
        priv = devm_kzalloc(&pdev->dev,
                        sizeof(struct timeriomem_rng_private_data), GFP_KERNEL);
-       if (!priv) {
-               dev_err(&pdev->dev, "failed to allocate device structure.\n");
+       if (!priv)
                return -ENOMEM;
-       }
 
        platform_set_drvdata(pdev, priv);
 
index 03ccdb0ccf9ea3e6422e32ebfd8465633d744276..f066fa23cc050f2fb8ea1ed605d24774f11956dc 100644 (file)
@@ -301,14 +301,14 @@ config CRYPTO_DEV_SAHARA
          found in some Freescale i.MX chips.
 
 config CRYPTO_DEV_S5P
-       tristate "Support for Samsung S5PV210 crypto accelerator"
-       depends on ARCH_S5PV210
+       tristate "Support for Samsung S5PV210/Exynos crypto accelerator"
+       depends on ARCH_S5PV210 || ARCH_EXYNOS
        select CRYPTO_AES
        select CRYPTO_ALGAPI
        select CRYPTO_BLKCIPHER
        help
          This option allows you to have support for S5P crypto acceleration.
-         Select this to offload Samsung S5PV210 or S5PC110 from AES
+         Select this to offload Samsung S5PV210 or S5PC110, Exynos from AES
          algorithms execution.
 
 config CRYPTO_DEV_NX
index d7c9e317423cb2910e808571584ef3c4cd0bd84e..a083474991abbb343aa330160ff988f34635b268 100644 (file)
@@ -716,6 +716,12 @@ static int atmel_aes_crypt(struct ablkcipher_request *req, unsigned long mode)
                        return -EINVAL;
                }
                ctx->block_size = CFB32_BLOCK_SIZE;
+       } else if (mode & AES_FLAGS_CFB64) {
+               if (!IS_ALIGNED(req->nbytes, CFB64_BLOCK_SIZE)) {
+                       pr_err("request size is not exact amount of CFB64 blocks\n");
+                       return -EINVAL;
+               }
+               ctx->block_size = CFB64_BLOCK_SIZE;
        } else {
                if (!IS_ALIGNED(req->nbytes, AES_BLOCK_SIZE)) {
                        pr_err("request size is not exact amount of AES blocks\n");
@@ -1069,7 +1075,7 @@ static struct crypto_alg aes_algs[] = {
        .cra_driver_name        = "atmel-cfb8-aes",
        .cra_priority           = 100,
        .cra_flags              = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC,
-       .cra_blocksize          = CFB64_BLOCK_SIZE,
+       .cra_blocksize          = CFB8_BLOCK_SIZE,
        .cra_ctxsize            = sizeof(struct atmel_aes_ctx),
        .cra_alignmask          = 0x0,
        .cra_type               = &crypto_ablkcipher_type,
index c9ff298e6d26e8670a85affa59ea1104554be6a0..b099e33cb07303dff8e32da36fdfc589426d0bc0 100644 (file)
 #include <crypto/hash.h>
 #include <crypto/internal/hash.h>
 
-#include <asm/blackfin.h>
-#include <asm/bfin_crc.h>
 #include <asm/dma.h>
 #include <asm/portmux.h>
+#include <asm/io.h>
+
+#include "bfin_crc.h"
 
 #define CRC_CCRYPTO_QUEUE_LENGTH       5
 
@@ -54,12 +55,13 @@ struct bfin_crypto_crc {
        int                     irq;
        int                     dma_ch;
        u32                     poly;
-       volatile struct crc_register *regs;
+       struct crc_register     *regs;
 
        struct ahash_request    *req; /* current request in operation */
        struct dma_desc_array   *sg_cpu; /* virt addr of sg dma descriptors */
        dma_addr_t              sg_dma; /* phy addr of sg dma descriptors */
        u8                      *sg_mid_buf;
+       dma_addr_t              sg_mid_dma; /* phy addr of sg mid buffer */
 
        struct tasklet_struct   done_task;
        struct crypto_queue     queue; /* waiting requests */
@@ -132,13 +134,13 @@ static struct scatterlist *sg_get(struct scatterlist *sg_list, unsigned int nent
 
 static int bfin_crypto_crc_init_hw(struct bfin_crypto_crc *crc, u32 key)
 {
-       crc->regs->datacntrld = 0;
-       crc->regs->control = MODE_CALC_CRC << OPMODE_OFFSET;
-       crc->regs->curresult = key;
+       writel(0, &crc->regs->datacntrld);
+       writel(MODE_CALC_CRC << OPMODE_OFFSET, &crc->regs->control);
+       writel(key, &crc->regs->curresult);
 
        /* setup CRC interrupts */
-       crc->regs->status = CMPERRI | DCNTEXPI;
-       crc->regs->intrenset = CMPERRI | DCNTEXPI;
+       writel(CMPERRI | DCNTEXPI, &crc->regs->status);
+       writel(CMPERRI | DCNTEXPI, &crc->regs->intrenset);
 
        return 0;
 }
@@ -194,7 +196,6 @@ static void bfin_crypto_crc_config_dma(struct bfin_crypto_crc *crc)
        dma_map_sg(crc->dev, ctx->sg, ctx->sg_nents, DMA_TO_DEVICE);
 
        for_each_sg(ctx->sg, sg, ctx->sg_nents, j) {
-               dma_config = DMAFLOW_ARRAY | RESTART | NDSIZE_3 | DMAEN | PSIZE_32;
                dma_addr = sg_dma_address(sg);
                /* deduce extra bytes in last sg */
                if (sg_is_last(sg))
@@ -207,12 +208,29 @@ static void bfin_crypto_crc_config_dma(struct bfin_crypto_crc *crc)
                           bytes in current sg buffer. Move addr of current
                           sg and deduce the length of current sg.
                         */
-                       memcpy(crc->sg_mid_buf +((i-1) << 2) + mid_dma_count,
-                               (void *)dma_addr,
+                       memcpy(crc->sg_mid_buf +(i << 2) + mid_dma_count,
+                               sg_virt(sg),
                                CHKSUM_DIGEST_SIZE - mid_dma_count);
                        dma_addr += CHKSUM_DIGEST_SIZE - mid_dma_count;
                        dma_count -= CHKSUM_DIGEST_SIZE - mid_dma_count;
+
+                       dma_config = DMAFLOW_ARRAY | RESTART | NDSIZE_3 |
+                               DMAEN | PSIZE_32 | WDSIZE_32;
+
+                       /* setup new dma descriptor for next middle dma */
+                       crc->sg_cpu[i].start_addr = crc->sg_mid_dma + (i << 2);
+                       crc->sg_cpu[i].cfg = dma_config;
+                       crc->sg_cpu[i].x_count = 1;
+                       crc->sg_cpu[i].x_modify = CHKSUM_DIGEST_SIZE;
+                       dev_dbg(crc->dev, "%d: crc_dma: start_addr:0x%lx, "
+                               "cfg:0x%lx, x_count:0x%lx, x_modify:0x%lx\n",
+                               i, crc->sg_cpu[i].start_addr,
+                               crc->sg_cpu[i].cfg, crc->sg_cpu[i].x_count,
+                               crc->sg_cpu[i].x_modify);
+                       i++;
                }
+
+               dma_config = DMAFLOW_ARRAY | RESTART | NDSIZE_3 | DMAEN | PSIZE_32;
                /* chop current sg dma len to multiple of 32 bits */
                mid_dma_count = dma_count % 4;
                dma_count &= ~0x3;
@@ -243,24 +261,9 @@ static void bfin_crypto_crc_config_dma(struct bfin_crypto_crc *crc)
 
                if (mid_dma_count) {
                        /* copy extra bytes to next middle dma buffer */
-                       dma_config = DMAFLOW_ARRAY | RESTART | NDSIZE_3 |
-                               DMAEN | PSIZE_32 | WDSIZE_32;
                        memcpy(crc->sg_mid_buf + (i << 2),
-                               (void *)(dma_addr + (dma_count << 2)),
+                               (u8*)sg_virt(sg) + (dma_count << 2),
                                mid_dma_count);
-                       /* setup new dma descriptor for next middle dma */
-                       crc->sg_cpu[i].start_addr = dma_map_single(crc->dev,
-                                       crc->sg_mid_buf + (i << 2),
-                                       CHKSUM_DIGEST_SIZE, DMA_TO_DEVICE);
-                       crc->sg_cpu[i].cfg = dma_config;
-                       crc->sg_cpu[i].x_count = 1;
-                       crc->sg_cpu[i].x_modify = CHKSUM_DIGEST_SIZE;
-                       dev_dbg(crc->dev, "%d: crc_dma: start_addr:0x%lx, "
-                               "cfg:0x%lx, x_count:0x%lx, x_modify:0x%lx\n",
-                               i, crc->sg_cpu[i].start_addr,
-                               crc->sg_cpu[i].cfg, crc->sg_cpu[i].x_count,
-                               crc->sg_cpu[i].x_modify);
-                       i++;
                }
        }
 
@@ -303,6 +306,7 @@ static int bfin_crypto_crc_handle_queue(struct bfin_crypto_crc *crc,
        int nsg, i, j;
        unsigned int nextlen;
        unsigned long flags;
+       u32 reg;
 
        spin_lock_irqsave(&crc->lock, flags);
        if (req)
@@ -402,13 +406,14 @@ finish_update:
                ctx->sg_buflen += CHKSUM_DIGEST_SIZE;
 
        /* set CRC data count before start DMA */
-       crc->regs->datacnt = ctx->sg_buflen >> 2;
+       writel(ctx->sg_buflen >> 2, &crc->regs->datacnt);
 
        /* setup and enable CRC DMA */
        bfin_crypto_crc_config_dma(crc);
 
        /* finally kick off CRC operation */
-       crc->regs->control |= BLKEN;
+       reg = readl(&crc->regs->control);
+       writel(reg | BLKEN, &crc->regs->control);
 
        return -EINPROGRESS;
 }
@@ -529,14 +534,17 @@ static void bfin_crypto_crc_done_task(unsigned long data)
 static irqreturn_t bfin_crypto_crc_handler(int irq, void *dev_id)
 {
        struct bfin_crypto_crc *crc = dev_id;
+       u32 reg;
 
-       if (crc->regs->status & DCNTEXP) {
-               crc->regs->status = DCNTEXP;
+       if (readl(&crc->regs->status) & DCNTEXP) {
+               writel(DCNTEXP, &crc->regs->status);
 
                /* prepare results */
-               put_unaligned_le32(crc->regs->result, crc->req->result);
+               put_unaligned_le32(readl(&crc->regs->result),
+                       crc->req->result);
 
-               crc->regs->control &= ~BLKEN;
+               reg = readl(&crc->regs->control);
+               writel(reg & ~BLKEN, &crc->regs->control);
                crc->busy = 0;
 
                if (crc->req->base.complete)
@@ -560,7 +568,7 @@ static int bfin_crypto_crc_suspend(struct platform_device *pdev, pm_message_t st
        struct bfin_crypto_crc *crc = platform_get_drvdata(pdev);
        int i = 100000;
 
-       while ((crc->regs->control & BLKEN) && --i)
+       while ((readl(&crc->regs->control) & BLKEN) && --i)
                cpu_relax();
 
        if (i == 0)
@@ -647,29 +655,32 @@ static int bfin_crypto_crc_probe(struct platform_device *pdev)
         * 1 last + 1 next dma descriptors
         */
        crc->sg_mid_buf = (u8 *)(crc->sg_cpu + ((CRC_MAX_DMA_DESC + 1) << 1));
+       crc->sg_mid_dma = crc->sg_dma + sizeof(struct dma_desc_array)
+                       * ((CRC_MAX_DMA_DESC + 1) << 1);
 
-       crc->regs->control = 0;
-       crc->regs->poly = crc->poly = (u32)pdev->dev.platform_data;
+       writel(0, &crc->regs->control);
+       crc->poly = (u32)pdev->dev.platform_data;
+       writel(crc->poly, &crc->regs->poly);
 
-       while (!(crc->regs->status & LUTDONE) && (--timeout) > 0)
+       while (!(readl(&crc->regs->status) & LUTDONE) && (--timeout) > 0)
                cpu_relax();
 
        if (timeout == 0)
                dev_info(&pdev->dev, "init crc poly timeout\n");
 
+       platform_set_drvdata(pdev, crc);
+
        spin_lock(&crc_list.lock);
        list_add(&crc->list, &crc_list.dev_list);
        spin_unlock(&crc_list.lock);
 
-       platform_set_drvdata(pdev, crc);
-
-       ret = crypto_register_ahash(&algs);
-       if (ret) {
-               spin_lock(&crc_list.lock);
-               list_del(&crc->list);
-               spin_unlock(&crc_list.lock);
-               dev_err(&pdev->dev, "Cann't register crypto ahash device\n");
-               goto out_error_dma;
+       if (list_is_singular(&crc_list.dev_list)) {
+               ret = crypto_register_ahash(&algs);
+               if (ret) {
+                       dev_err(&pdev->dev,
+                               "Can't register crypto ahash device\n");
+                       goto out_error_dma;
+               }
        }
 
        dev_info(&pdev->dev, "initialized\n");
diff --git a/drivers/crypto/bfin_crc.h b/drivers/crypto/bfin_crc.h
new file mode 100644 (file)
index 0000000..75cef4d
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+ * bfin_crc.h - interface to Blackfin CRC controllers
+ *
+ * Copyright 2012 Analog Devices Inc.
+ *
+ * Licensed under the GPL-2 or later.
+ */
+
+#ifndef __BFIN_CRC_H__
+#define __BFIN_CRC_H__
+
+/* Function driver which use hardware crc must initialize the structure */
+struct crc_info {
+       /* Input data address */
+       unsigned char *in_addr;
+       /* Output data address */
+       unsigned char *out_addr;
+       /* Input or output bytes */
+       unsigned long datasize;
+       union {
+       /* CRC to compare with that of input buffer */
+       unsigned long crc_compare;
+       /* Value to compare with input data */
+       unsigned long val_verify;
+       /* Value to fill */
+       unsigned long val_fill;
+       };
+       /* Value to program the 32b CRC Polynomial */
+       unsigned long crc_poly;
+       union {
+       /* CRC calculated from the input data */
+       unsigned long crc_result;
+       /* First failed position to verify input data */
+       unsigned long pos_verify;
+       };
+       /* CRC mirror flags */
+       unsigned int bitmirr:1;
+       unsigned int bytmirr:1;
+       unsigned int w16swp:1;
+       unsigned int fdsel:1;
+       unsigned int rsltmirr:1;
+       unsigned int polymirr:1;
+       unsigned int cmpmirr:1;
+};
+
+/* Userspace interface */
+#define CRC_IOC_MAGIC          'C'
+#define CRC_IOC_CALC_CRC       _IOWR('C', 0x01, unsigned int)
+#define CRC_IOC_MEMCPY_CRC     _IOWR('C', 0x02, unsigned int)
+#define CRC_IOC_VERIFY_VAL     _IOWR('C', 0x03, unsigned int)
+#define CRC_IOC_FILL_VAL       _IOWR('C', 0x04, unsigned int)
+
+
+#ifdef __KERNEL__
+
+#include <linux/types.h>
+#include <linux/spinlock.h>
+#include <linux/miscdevice.h>
+
+struct crc_register {
+       u32 control;
+       u32 datacnt;
+       u32 datacntrld;
+       u32 __pad_1[2];
+       u32 compare;
+       u32 fillval;
+       u32 datafifo;
+       u32 intren;
+       u32 intrenset;
+       u32 intrenclr;
+       u32 poly;
+       u32 __pad_2[4];
+       u32 status;
+       u32 datacntcap;
+       u32 __pad_3;
+       u32 result;
+       u32 curresult;
+       u32 __pad_4[3];
+       u32 revid;
+};
+
+/* CRC_STATUS Masks */
+#define CMPERR                 0x00000002      /* Compare error */
+#define DCNTEXP                        0x00000010      /* datacnt register expired */
+#define IBR                    0x00010000      /* Input buffer ready */
+#define OBR                    0x00020000      /* Output buffer ready */
+#define IRR                    0x00040000      /* Immediate result readt */
+#define LUTDONE                        0x00080000      /* Look-up table generation done */
+#define FSTAT                  0x00700000      /* FIFO status */
+#define MAX_FIFO               4               /* Max fifo size */
+
+/* CRC_CONTROL Masks */
+#define BLKEN                  0x00000001      /* Block enable */
+#define OPMODE                 0x000000F0      /* Operation mode */
+#define OPMODE_OFFSET          4               /* Operation mode mask offset*/
+#define MODE_DMACPY_CRC                1               /* MTM CRC compute and compare */
+#define MODE_DATA_FILL         2               /* MTM data fill */
+#define MODE_CALC_CRC          3               /* MSM CRC compute and compare */
+#define MODE_DATA_VERIFY       4               /* MSM data verify */
+#define AUTOCLRZ               0x00000100      /* Auto clear to zero */
+#define AUTOCLRF               0x00000200      /* Auto clear to one */
+#define OBRSTALL               0x00001000      /* Stall on output buffer ready */
+#define IRRSTALL               0x00002000      /* Stall on immediate result ready */
+#define BITMIRR                        0x00010000      /* Mirror bits within each byte of 32-bit input data */
+#define BITMIRR_OFFSET         16              /* Mirror bits offset */
+#define BYTMIRR                        0x00020000      /* Mirror bytes of 32-bit input data */
+#define BYTMIRR_OFFSET         17              /* Mirror bytes offset */
+#define W16SWP                 0x00040000      /* Mirror uppper and lower 16-bit word of 32-bit input data */
+#define W16SWP_OFFSET          18              /* Mirror 16-bit word offset */
+#define FDSEL                  0x00080000      /* FIFO is written after input data is mirrored */
+#define FDSEL_OFFSET           19              /* Mirror FIFO offset */
+#define RSLTMIRR               0x00100000      /* CRC result registers are mirrored. */
+#define RSLTMIRR_OFFSET                20              /* Mirror CRC result offset. */
+#define POLYMIRR               0x00200000      /* CRC poly register is mirrored. */
+#define POLYMIRR_OFFSET                21              /* Mirror CRC poly offset. */
+#define CMPMIRR                        0x00400000      /* CRC compare register is mirrored. */
+#define CMPMIRR_OFFSET         22              /* Mirror CRC compare offset. */
+
+/* CRC_INTREN Masks */
+#define CMPERRI                0x02            /* CRC_ERROR_INTR */
+#define DCNTEXPI               0x10            /* CRC_STATUS_INTR */
+
+#endif
+
+#endif
index 5f891254db73f92a80035adaab1213b110c11ce3..c09ce1f040d370bd45d44a843283ac0308c4465e 100644 (file)
@@ -303,6 +303,7 @@ static int aead_null_set_sh_desc(struct crypto_aead *aead)
         * Job Descriptor and Shared Descriptors
         * must all fit into the 64-word Descriptor h/w Buffer
         */
+       keys_fit_inline = false;
        if (DESC_AEAD_NULL_DEC_LEN + DESC_JOB_IO_LEN +
            ctx->split_key_pad_len <= CAAM_DESC_BYTES_MAX)
                keys_fit_inline = true;
@@ -472,6 +473,7 @@ static int aead_set_sh_desc(struct crypto_aead *aead)
         * Job Descriptor and Shared Descriptors
         * must all fit into the 64-word Descriptor h/w Buffer
         */
+       keys_fit_inline = false;
        if (DESC_AEAD_DEC_LEN + DESC_JOB_IO_LEN +
            ctx->split_key_pad_len + ctx->enckeylen <=
            CAAM_DESC_BYTES_MAX)
@@ -527,6 +529,7 @@ static int aead_set_sh_desc(struct crypto_aead *aead)
         * Job Descriptor and Shared Descriptors
         * must all fit into the 64-word Descriptor h/w Buffer
         */
+       keys_fit_inline = false;
        if (DESC_AEAD_GIVENC_LEN + DESC_JOB_IO_LEN +
            ctx->split_key_pad_len + ctx->enckeylen <=
            CAAM_DESC_BYTES_MAX)
@@ -918,11 +921,8 @@ static void aead_encrypt_done(struct device *jrdev, u32 *desc, u32 err,
        edesc = (struct aead_edesc *)((char *)desc -
                 offsetof(struct aead_edesc, hw_desc));
 
-       if (err) {
-               char tmp[CAAM_ERROR_STR_MAX];
-
-               dev_err(jrdev, "%08x: %s\n", err, caam_jr_strstatus(tmp, err));
-       }
+       if (err)
+               caam_jr_strstatus(jrdev, err);
 
        aead_unmap(jrdev, edesc, req);
 
@@ -969,11 +969,8 @@ static void aead_decrypt_done(struct device *jrdev, u32 *desc, u32 err,
                       req->cryptlen - ctx->authsize, 1);
 #endif
 
-       if (err) {
-               char tmp[CAAM_ERROR_STR_MAX];
-
-               dev_err(jrdev, "%08x: %s\n", err, caam_jr_strstatus(tmp, err));
-       }
+       if (err)
+               caam_jr_strstatus(jrdev, err);
 
        aead_unmap(jrdev, edesc, req);
 
@@ -1018,11 +1015,8 @@ static void ablkcipher_encrypt_done(struct device *jrdev, u32 *desc, u32 err,
        edesc = (struct ablkcipher_edesc *)((char *)desc -
                 offsetof(struct ablkcipher_edesc, hw_desc));
 
-       if (err) {
-               char tmp[CAAM_ERROR_STR_MAX];
-
-               dev_err(jrdev, "%08x: %s\n", err, caam_jr_strstatus(tmp, err));
-       }
+       if (err)
+               caam_jr_strstatus(jrdev, err);
 
 #ifdef DEBUG
        print_hex_dump(KERN_ERR, "dstiv  @"__stringify(__LINE__)": ",
@@ -1053,11 +1047,8 @@ static void ablkcipher_decrypt_done(struct device *jrdev, u32 *desc, u32 err,
 
        edesc = (struct ablkcipher_edesc *)((char *)desc -
                 offsetof(struct ablkcipher_edesc, hw_desc));
-       if (err) {
-               char tmp[CAAM_ERROR_STR_MAX];
-
-               dev_err(jrdev, "%08x: %s\n", err, caam_jr_strstatus(tmp, err));
-       }
+       if (err)
+               caam_jr_strstatus(jrdev, err);
 
 #ifdef DEBUG
        print_hex_dump(KERN_ERR, "dstiv  @"__stringify(__LINE__)": ",
index 0378328f47a775b368b795cd3d7adc9b678fd31b..0d9284ef96a856e64755c1820dd29aefda54bcc8 100644 (file)
@@ -545,7 +545,8 @@ static int ahash_setkey(struct crypto_ahash *ahash,
                                      DMA_TO_DEVICE);
        if (dma_mapping_error(jrdev, ctx->key_dma)) {
                dev_err(jrdev, "unable to map key i/o memory\n");
-               return -ENOMEM;
+               ret = -ENOMEM;
+               goto map_err;
        }
 #ifdef DEBUG
        print_hex_dump(KERN_ERR, "ctx.key@"__stringify(__LINE__)": ",
@@ -559,6 +560,7 @@ static int ahash_setkey(struct crypto_ahash *ahash,
                                 DMA_TO_DEVICE);
        }
 
+map_err:
        kfree(hashed_key);
        return ret;
 badkey:
@@ -631,11 +633,8 @@ static void ahash_done(struct device *jrdev, u32 *desc, u32 err,
 
        edesc = (struct ahash_edesc *)((char *)desc -
                 offsetof(struct ahash_edesc, hw_desc));
-       if (err) {
-               char tmp[CAAM_ERROR_STR_MAX];
-
-               dev_err(jrdev, "%08x: %s\n", err, caam_jr_strstatus(tmp, err));
-       }
+       if (err)
+               caam_jr_strstatus(jrdev, err);
 
        ahash_unmap(jrdev, edesc, req, digestsize);
        kfree(edesc);
@@ -669,11 +668,8 @@ static void ahash_done_bi(struct device *jrdev, u32 *desc, u32 err,
 
        edesc = (struct ahash_edesc *)((char *)desc -
                 offsetof(struct ahash_edesc, hw_desc));
-       if (err) {
-               char tmp[CAAM_ERROR_STR_MAX];
-
-               dev_err(jrdev, "%08x: %s\n", err, caam_jr_strstatus(tmp, err));
-       }
+       if (err)
+               caam_jr_strstatus(jrdev, err);
 
        ahash_unmap_ctx(jrdev, edesc, req, ctx->ctx_len, DMA_BIDIRECTIONAL);
        kfree(edesc);
@@ -707,11 +703,8 @@ static void ahash_done_ctx_src(struct device *jrdev, u32 *desc, u32 err,
 
        edesc = (struct ahash_edesc *)((char *)desc -
                 offsetof(struct ahash_edesc, hw_desc));
-       if (err) {
-               char tmp[CAAM_ERROR_STR_MAX];
-
-               dev_err(jrdev, "%08x: %s\n", err, caam_jr_strstatus(tmp, err));
-       }
+       if (err)
+               caam_jr_strstatus(jrdev, err);
 
        ahash_unmap_ctx(jrdev, edesc, req, digestsize, DMA_FROM_DEVICE);
        kfree(edesc);
@@ -745,11 +738,8 @@ static void ahash_done_ctx_dst(struct device *jrdev, u32 *desc, u32 err,
 
        edesc = (struct ahash_edesc *)((char *)desc -
                 offsetof(struct ahash_edesc, hw_desc));
-       if (err) {
-               char tmp[CAAM_ERROR_STR_MAX];
-
-               dev_err(jrdev, "%08x: %s\n", err, caam_jr_strstatus(tmp, err));
-       }
+       if (err)
+               caam_jr_strstatus(jrdev, err);
 
        ahash_unmap_ctx(jrdev, edesc, req, ctx->ctx_len, DMA_TO_DEVICE);
        kfree(edesc);
index 3529b54048c9bfefb181198a44d06b1174f1331a..8c07d3153f125df158301f0e13226c597b2babc8 100644 (file)
@@ -103,11 +103,8 @@ static void rng_done(struct device *jrdev, u32 *desc, u32 err, void *context)
        bd = (struct buf_data *)((char *)desc -
              offsetof(struct buf_data, hw_desc));
 
-       if (err) {
-               char tmp[CAAM_ERROR_STR_MAX];
-
-               dev_err(jrdev, "%08x: %s\n", err, caam_jr_strstatus(tmp, err));
-       }
+       if (err)
+               caam_jr_strstatus(jrdev, err);
 
        atomic_set(&bd->empty, BUF_NOT_EMPTY);
        complete(&bd->filled);
index 0eabd81e1a902711bb838eb93dfed8e3289be610..6531054a44c8b8feb3ec00ff9ad1f139a5a8ebc1 100644 (file)
 #include "jr.h"
 #include "error.h"
 
-#define SPRINTFCAT(str, format, param, max_alloc)              \
-{                                                              \
-       char *tmp;                                              \
-                                                               \
-       tmp = kmalloc(sizeof(format) + max_alloc, GFP_ATOMIC);  \
-       if (likely(tmp)) {                                      \
-               sprintf(tmp, format, param);                    \
-               strcat(str, tmp);                               \
-               kfree(tmp);                                     \
-       } else {                                                \
-               strcat(str, "kmalloc failure in SPRINTFCAT");   \
-       }                                                       \
-}
-
-static void report_jump_idx(u32 status, char *outstr)
+static const struct {
+       u8 value;
+       const char *error_text;
+} desc_error_list[] = {
+       { 0x00, "No error." },
+       { 0x01, "SGT Length Error. The descriptor is trying to read more data than is contained in the SGT table." },
+       { 0x02, "SGT Null Entry Error." },
+       { 0x03, "Job Ring Control Error. There is a bad value in the Job Ring Control register." },
+       { 0x04, "Invalid Descriptor Command. The Descriptor Command field is invalid." },
+       { 0x05, "Reserved." },
+       { 0x06, "Invalid KEY Command" },
+       { 0x07, "Invalid LOAD Command" },
+       { 0x08, "Invalid STORE Command" },
+       { 0x09, "Invalid OPERATION Command" },
+       { 0x0A, "Invalid FIFO LOAD Command" },
+       { 0x0B, "Invalid FIFO STORE Command" },
+       { 0x0C, "Invalid MOVE/MOVE_LEN Command" },
+       { 0x0D, "Invalid JUMP Command. A nonlocal JUMP Command is invalid because the target is not a Job Header Command, or the jump is from a Trusted Descriptor to a Job Descriptor, or because the target Descriptor contains a Shared Descriptor." },
+       { 0x0E, "Invalid MATH Command" },
+       { 0x0F, "Invalid SIGNATURE Command" },
+       { 0x10, "Invalid Sequence Command. A SEQ IN PTR OR SEQ OUT PTR Command is invalid or a SEQ KEY, SEQ LOAD, SEQ FIFO LOAD, or SEQ FIFO STORE decremented the input or output sequence length below 0. This error may result if a built-in PROTOCOL Command has encountered a malformed PDU." },
+       { 0x11, "Skip data type invalid. The type must be 0xE or 0xF."},
+       { 0x12, "Shared Descriptor Header Error" },
+       { 0x13, "Header Error. Invalid length or parity, or certain other problems." },
+       { 0x14, "Burster Error. Burster has gotten to an illegal state" },
+       { 0x15, "Context Register Length Error. The descriptor is trying to read or write past the end of the Context Register. A SEQ LOAD or SEQ STORE with the VLF bit set was executed with too large a length in the variable length register (VSOL for SEQ STORE or VSIL for SEQ LOAD)." },
+       { 0x16, "DMA Error" },
+       { 0x17, "Reserved." },
+       { 0x1A, "Job failed due to JR reset" },
+       { 0x1B, "Job failed due to Fail Mode" },
+       { 0x1C, "DECO Watchdog timer timeout error" },
+       { 0x1D, "DECO tried to copy a key from another DECO but the other DECO's Key Registers were locked" },
+       { 0x1E, "DECO attempted to copy data from a DECO that had an unmasked Descriptor error" },
+       { 0x1F, "LIODN error. DECO was trying to share from itself or from another DECO but the two Non-SEQ LIODN values didn't match or the 'shared from' DECO's Descriptor required that the SEQ LIODNs be the same and they aren't." },
+       { 0x20, "DECO has completed a reset initiated via the DRR register" },
+       { 0x21, "Nonce error. When using EKT (CCM) key encryption option in the FIFO STORE Command, the Nonce counter reached its maximum value and this encryption mode can no longer be used." },
+       { 0x22, "Meta data is too large (> 511 bytes) for TLS decap (input frame; block ciphers) and IPsec decap (output frame, when doing the next header byte update) and DCRC (output frame)." },
+       { 0x23, "Read Input Frame error" },
+       { 0x24, "JDKEK, TDKEK or TDSK not loaded error" },
+       { 0x80, "DNR (do not run) error" },
+       { 0x81, "undefined protocol command" },
+       { 0x82, "invalid setting in PDB" },
+       { 0x83, "Anti-replay LATE error" },
+       { 0x84, "Anti-replay REPLAY error" },
+       { 0x85, "Sequence number overflow" },
+       { 0x86, "Sigver invalid signature" },
+       { 0x87, "DSA Sign Illegal test descriptor" },
+       { 0x88, "Protocol Format Error - A protocol has seen an error in the format of data received. When running RSA, this means that formatting with random padding was used, and did not follow the form: 0x00, 0x02, 8-to-N bytes of non-zero pad, 0x00, F data." },
+       { 0x89, "Protocol Size Error - A protocol has seen an error in size. When running RSA, pdb size N < (size of F) when no formatting is used; or pdb size N < (F + 11) when formatting is used." },
+       { 0xC1, "Blob Command error: Undefined mode" },
+       { 0xC2, "Blob Command error: Secure Memory Blob mode error" },
+       { 0xC4, "Blob Command error: Black Blob key or input size error" },
+       { 0xC5, "Blob Command error: Invalid key destination" },
+       { 0xC8, "Blob Command error: Trusted/Secure mode error" },
+       { 0xF0, "IPsec TTL or hop limit field either came in as 0, or was decremented to 0" },
+       { 0xF1, "3GPP HFN matches or exceeds the Threshold" },
+};
+
+static const char * const cha_id_list[] = {
+       "",
+       "AES",
+       "DES",
+       "ARC4",
+       "MDHA",
+       "RNG",
+       "SNOW f8",
+       "Kasumi f8/9",
+       "PKHA",
+       "CRCA",
+       "SNOW f9",
+       "ZUCE",
+       "ZUCA",
+};
+
+static const char * const err_id_list[] = {
+       "No error.",
+       "Mode error.",
+       "Data size error.",
+       "Key size error.",
+       "PKHA A memory size error.",
+       "PKHA B memory size error.",
+       "Data arrived out of sequence error.",
+       "PKHA divide-by-zero error.",
+       "PKHA modulus even error.",
+       "DES key parity error.",
+       "ICV check failed.",
+       "Hardware error.",
+       "Unsupported CCM AAD size.",
+       "Class 1 CHA is not reset",
+       "Invalid CHA combination was selected",
+       "Invalid CHA selected.",
+};
+
+static const char * const rng_err_id_list[] = {
+       "",
+       "",
+       "",
+       "Instantiate",
+       "Not instantiated",
+       "Test instantiate",
+       "Prediction resistance",
+       "Prediction resistance and test request",
+       "Uninstantiate",
+       "Secure key generation",
+};
+
+static void report_ccb_status(struct device *jrdev, const u32 status,
+                             const char *error)
 {
+       u8 cha_id = (status & JRSTA_CCBERR_CHAID_MASK) >>
+                   JRSTA_CCBERR_CHAID_SHIFT;
+       u8 err_id = status & JRSTA_CCBERR_ERRID_MASK;
        u8 idx = (status & JRSTA_DECOERR_INDEX_MASK) >>
                  JRSTA_DECOERR_INDEX_SHIFT;
+       char *idx_str;
+       const char *cha_str = "unidentified cha_id value 0x";
+       char cha_err_code[3] = { 0 };
+       const char *err_str = "unidentified err_id value 0x";
+       char err_err_code[3] = { 0 };
 
        if (status & JRSTA_DECOERR_JUMP)
-               strcat(outstr, "jump tgt desc idx ");
+               idx_str = "jump tgt desc idx";
        else
-               strcat(outstr, "desc idx ");
-
-       SPRINTFCAT(outstr, "%d: ", idx, sizeof("255"));
-}
-
-static void report_ccb_status(u32 status, char *outstr)
-{
-       static const char * const cha_id_list[] = {
-               "",
-               "AES",
-               "DES",
-               "ARC4",
-               "MDHA",
-               "RNG",
-               "SNOW f8",
-               "Kasumi f8/9",
-               "PKHA",
-               "CRCA",
-               "SNOW f9",
-               "ZUCE",
-               "ZUCA",
-       };
-       static const char * const err_id_list[] = {
-               "No error.",
-               "Mode error.",
-               "Data size error.",
-               "Key size error.",
-               "PKHA A memory size error.",
-               "PKHA B memory size error.",
-               "Data arrived out of sequence error.",
-               "PKHA divide-by-zero error.",
-               "PKHA modulus even error.",
-               "DES key parity error.",
-               "ICV check failed.",
-               "Hardware error.",
-               "Unsupported CCM AAD size.",
-               "Class 1 CHA is not reset",
-               "Invalid CHA combination was selected",
-               "Invalid CHA selected.",
-       };
-       static const char * const rng_err_id_list[] = {
-               "",
-               "",
-               "",
-               "Instantiate",
-               "Not instantiated",
-               "Test instantiate",
-               "Prediction resistance",
-               "Prediction resistance and test request",
-               "Uninstantiate",
-               "Secure key generation",
-       };
-       u8 cha_id = (status & JRSTA_CCBERR_CHAID_MASK) >>
-                   JRSTA_CCBERR_CHAID_SHIFT;
-       u8 err_id = status & JRSTA_CCBERR_ERRID_MASK;
+               idx_str = "desc idx";
 
-       report_jump_idx(status, outstr);
-
-       if (cha_id < ARRAY_SIZE(cha_id_list)) {
-               SPRINTFCAT(outstr, "%s: ", cha_id_list[cha_id],
-                          strlen(cha_id_list[cha_id]));
-       } else {
-               SPRINTFCAT(outstr, "unidentified cha_id value 0x%02x: ",
-                          cha_id, sizeof("ff"));
-       }
+       if (cha_id < ARRAY_SIZE(cha_id_list))
+               cha_str = cha_id_list[cha_id];
+       else
+               snprintf(cha_err_code, sizeof(cha_err_code), "%02x", cha_id);
 
        if ((cha_id << JRSTA_CCBERR_CHAID_SHIFT) == JRSTA_CCBERR_CHAID_RNG &&
            err_id < ARRAY_SIZE(rng_err_id_list) &&
            strlen(rng_err_id_list[err_id])) {
                /* RNG-only error */
-               SPRINTFCAT(outstr, "%s", rng_err_id_list[err_id],
-                          strlen(rng_err_id_list[err_id]));
-       } else if (err_id < ARRAY_SIZE(err_id_list)) {
-               SPRINTFCAT(outstr, "%s", err_id_list[err_id],
-                          strlen(err_id_list[err_id]));
-       } else {
-               SPRINTFCAT(outstr, "unidentified err_id value 0x%02x",
-                          err_id, sizeof("ff"));
-       }
+               err_str = rng_err_id_list[err_id];
+       } else if (err_id < ARRAY_SIZE(err_id_list))
+               err_str = err_id_list[err_id];
+       else
+               snprintf(err_err_code, sizeof(err_err_code), "%02x", err_id);
+
+       dev_err(jrdev, "%08x: %s: %s %d: %s%s: %s%s\n",
+               status, error, idx_str, idx,
+               cha_str, cha_err_code,
+               err_str, err_err_code);
 }
 
-static void report_jump_status(u32 status, char *outstr)
+static void report_jump_status(struct device *jrdev, const u32 status,
+                              const char *error)
 {
-       SPRINTFCAT(outstr, "%s() not implemented", __func__, sizeof(__func__));
+       dev_err(jrdev, "%08x: %s: %s() not implemented\n",
+               status, error, __func__);
 }
 
-static void report_deco_status(u32 status, char *outstr)
+static void report_deco_status(struct device *jrdev, const u32 status,
+                              const char *error)
 {
-       static const struct {
-               u8 value;
-               char *error_text;
-       } desc_error_list[] = {
-               { 0x00, "No error." },
-               { 0x01, "SGT Length Error. The descriptor is trying to read "
-                       "more data than is contained in the SGT table." },
-               { 0x02, "SGT Null Entry Error." },
-               { 0x03, "Job Ring Control Error. There is a bad value in the "
-                       "Job Ring Control register." },
-               { 0x04, "Invalid Descriptor Command. The Descriptor Command "
-                       "field is invalid." },
-               { 0x05, "Reserved." },
-               { 0x06, "Invalid KEY Command" },
-               { 0x07, "Invalid LOAD Command" },
-               { 0x08, "Invalid STORE Command" },
-               { 0x09, "Invalid OPERATION Command" },
-               { 0x0A, "Invalid FIFO LOAD Command" },
-               { 0x0B, "Invalid FIFO STORE Command" },
-               { 0x0C, "Invalid MOVE/MOVE_LEN Command" },
-               { 0x0D, "Invalid JUMP Command. A nonlocal JUMP Command is "
-                       "invalid because the target is not a Job Header "
-                       "Command, or the jump is from a Trusted Descriptor to "
-                       "a Job Descriptor, or because the target Descriptor "
-                       "contains a Shared Descriptor." },
-               { 0x0E, "Invalid MATH Command" },
-               { 0x0F, "Invalid SIGNATURE Command" },
-               { 0x10, "Invalid Sequence Command. A SEQ IN PTR OR SEQ OUT PTR "
-                       "Command is invalid or a SEQ KEY, SEQ LOAD, SEQ FIFO "
-                       "LOAD, or SEQ FIFO STORE decremented the input or "
-                       "output sequence length below 0. This error may result "
-                       "if a built-in PROTOCOL Command has encountered a "
-                       "malformed PDU." },
-               { 0x11, "Skip data type invalid. The type must be 0xE or 0xF."},
-               { 0x12, "Shared Descriptor Header Error" },
-               { 0x13, "Header Error. Invalid length or parity, or certain "
-                       "other problems." },
-               { 0x14, "Burster Error. Burster has gotten to an illegal "
-                       "state" },
-               { 0x15, "Context Register Length Error. The descriptor is "
-                       "trying to read or write past the end of the Context "
-                       "Register. A SEQ LOAD or SEQ STORE with the VLF bit "
-                       "set was executed with too large a length in the "
-                       "variable length register (VSOL for SEQ STORE or VSIL "
-                       "for SEQ LOAD)." },
-               { 0x16, "DMA Error" },
-               { 0x17, "Reserved." },
-               { 0x1A, "Job failed due to JR reset" },
-               { 0x1B, "Job failed due to Fail Mode" },
-               { 0x1C, "DECO Watchdog timer timeout error" },
-               { 0x1D, "DECO tried to copy a key from another DECO but the "
-                       "other DECO's Key Registers were locked" },
-               { 0x1E, "DECO attempted to copy data from a DECO that had an "
-                       "unmasked Descriptor error" },
-               { 0x1F, "LIODN error. DECO was trying to share from itself or "
-                       "from another DECO but the two Non-SEQ LIODN values "
-                       "didn't match or the 'shared from' DECO's Descriptor "
-                       "required that the SEQ LIODNs be the same and they "
-                       "aren't." },
-               { 0x20, "DECO has completed a reset initiated via the DRR "
-                       "register" },
-               { 0x21, "Nonce error. When using EKT (CCM) key encryption "
-                       "option in the FIFO STORE Command, the Nonce counter "
-                       "reached its maximum value and this encryption mode "
-                       "can no longer be used." },
-               { 0x22, "Meta data is too large (> 511 bytes) for TLS decap "
-                       "(input frame; block ciphers) and IPsec decap (output "
-                       "frame, when doing the next header byte update) and "
-                       "DCRC (output frame)." },
-               { 0x23, "Read Input Frame error" },
-               { 0x24, "JDKEK, TDKEK or TDSK not loaded error" },
-               { 0x80, "DNR (do not run) error" },
-               { 0x81, "undefined protocol command" },
-               { 0x82, "invalid setting in PDB" },
-               { 0x83, "Anti-replay LATE error" },
-               { 0x84, "Anti-replay REPLAY error" },
-               { 0x85, "Sequence number overflow" },
-               { 0x86, "Sigver invalid signature" },
-               { 0x87, "DSA Sign Illegal test descriptor" },
-               { 0x88, "Protocol Format Error - A protocol has seen an error "
-                       "in the format of data received. When running RSA, "
-                       "this means that formatting with random padding was "
-                       "used, and did not follow the form: 0x00, 0x02, 8-to-N "
-                       "bytes of non-zero pad, 0x00, F data." },
-               { 0x89, "Protocol Size Error - A protocol has seen an error in "
-                       "size. When running RSA, pdb size N < (size of F) when "
-                       "no formatting is used; or pdb size N < (F + 11) when "
-                       "formatting is used." },
-               { 0xC1, "Blob Command error: Undefined mode" },
-               { 0xC2, "Blob Command error: Secure Memory Blob mode error" },
-               { 0xC4, "Blob Command error: Black Blob key or input size "
-                       "error" },
-               { 0xC5, "Blob Command error: Invalid key destination" },
-               { 0xC8, "Blob Command error: Trusted/Secure mode error" },
-               { 0xF0, "IPsec TTL or hop limit field either came in as 0, "
-                       "or was decremented to 0" },
-               { 0xF1, "3GPP HFN matches or exceeds the Threshold" },
-       };
-       u8 desc_error = status & JRSTA_DECOERR_ERROR_MASK;
+       u8 err_id = status & JRSTA_DECOERR_ERROR_MASK;
+       u8 idx = (status & JRSTA_DECOERR_INDEX_MASK) >>
+                 JRSTA_DECOERR_INDEX_SHIFT;
+       char *idx_str;
+       const char *err_str = "unidentified error value 0x";
+       char err_err_code[3] = { 0 };
        int i;
 
-       report_jump_idx(status, outstr);
+       if (status & JRSTA_DECOERR_JUMP)
+               idx_str = "jump tgt desc idx";
+       else
+               idx_str = "desc idx";
 
        for (i = 0; i < ARRAY_SIZE(desc_error_list); i++)
-               if (desc_error_list[i].value == desc_error)
+               if (desc_error_list[i].value == err_id)
                        break;
 
-       if (i != ARRAY_SIZE(desc_error_list) && desc_error_list[i].error_text) {
-               SPRINTFCAT(outstr, "%s", desc_error_list[i].error_text,
-                          strlen(desc_error_list[i].error_text));
-       } else {
-               SPRINTFCAT(outstr, "unidentified error value 0x%02x",
-                          desc_error, sizeof("ff"));
-       }
+       if (i != ARRAY_SIZE(desc_error_list) && desc_error_list[i].error_text)
+               err_str = desc_error_list[i].error_text;
+       else
+               snprintf(err_err_code, sizeof(err_err_code), "%02x", err_id);
+
+       dev_err(jrdev, "%08x: %s: %s %d: %s%s\n",
+               status, error, idx_str, idx, err_str, err_err_code);
 }
 
-static void report_jr_status(u32 status, char *outstr)
+static void report_jr_status(struct device *jrdev, const u32 status,
+                            const char *error)
 {
-       SPRINTFCAT(outstr, "%s() not implemented", __func__, sizeof(__func__));
+       dev_err(jrdev, "%08x: %s: %s() not implemented\n",
+               status, error, __func__);
 }
 
-static void report_cond_code_status(u32 status, char *outstr)
+static void report_cond_code_status(struct device *jrdev, const u32 status,
+                                   const char *error)
 {
-       SPRINTFCAT(outstr, "%s() not implemented", __func__, sizeof(__func__));
+       dev_err(jrdev, "%08x: %s: %s() not implemented\n",
+               status, error, __func__);
 }
 
-char *caam_jr_strstatus(char *outstr, u32 status)
+void caam_jr_strstatus(struct device *jrdev, u32 status)
 {
        static const struct stat_src {
-               void (*report_ssed)(u32 status, char *outstr);
-               char *error;
+               void (*report_ssed)(struct device *jrdev, const u32 status,
+                                   const char *error);
+               const char *error;
        } status_src[] = {
                { NULL, "No error" },
                { NULL, NULL },
@@ -263,12 +224,16 @@ char *caam_jr_strstatus(char *outstr, u32 status)
                { report_cond_code_status, "Condition Code" },
        };
        u32 ssrc = status >> JRSTA_SSRC_SHIFT;
-
-       sprintf(outstr, "%s: ", status_src[ssrc].error);
-
-       if (status_src[ssrc].report_ssed)
-               status_src[ssrc].report_ssed(status, outstr);
-
-       return outstr;
+       const char *error = status_src[ssrc].error;
+
+       /*
+        * If there is no further error handling function, just
+        * print the error code, error string and exit. Otherwise
+        * call the handler function.
+        */
+       if (!status_src[ssrc].report_ssed)
+               dev_err(jrdev, "%08x: %s: \n", status, status_src[ssrc].error);
+       else
+               status_src[ssrc].report_ssed(jrdev, status, error);
 }
 EXPORT_SYMBOL(caam_jr_strstatus);
index 02c7baa1748e44ed7da80074ba34bcb86d8e60c8..b6350b0d91539023d98064015ff1ff2dc3a2a5bf 100644 (file)
@@ -7,5 +7,5 @@
 #ifndef CAAM_ERROR_H
 #define CAAM_ERROR_H
 #define CAAM_ERROR_STR_MAX 302
-extern char *caam_jr_strstatus(char *outstr, u32 status);
+void caam_jr_strstatus(struct device *jrdev, u32 status);
 #endif /* CAAM_ERROR_H */
index ea2e406610ebf9450008f2e2baf9ee65be0839a0..871703c49d2c09923d162af7651518d46a5ff3a4 100644 (file)
@@ -19,11 +19,8 @@ void split_key_done(struct device *dev, u32 *desc, u32 err,
        dev_err(dev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
 #endif
 
-       if (err) {
-               char tmp[CAAM_ERROR_STR_MAX];
-
-               dev_err(dev, "%08x: %s\n", err, caam_jr_strstatus(tmp, err));
-       }
+       if (err)
+               caam_jr_strstatus(dev, err);
 
        res->err = err;
 
index 0237ab58f2427e75b3fb4b61eb505d6d26170bf3..0cc5594b7de3c95710eaebc8535f82d240941ce7 100644 (file)
@@ -191,12 +191,12 @@ static int ccp_aes_xts_cra_init(struct crypto_tfm *tfm)
        ctx->complete = ccp_aes_xts_complete;
        ctx->u.aes.key_len = 0;
 
-       fallback_tfm = crypto_alloc_ablkcipher(tfm->__crt_alg->cra_name, 0,
+       fallback_tfm = crypto_alloc_ablkcipher(crypto_tfm_alg_name(tfm), 0,
                                               CRYPTO_ALG_ASYNC |
                                               CRYPTO_ALG_NEED_FALLBACK);
        if (IS_ERR(fallback_tfm)) {
                pr_warn("could not load fallback driver %s\n",
-                       tfm->__crt_alg->cra_name);
+                       crypto_tfm_alg_name(tfm));
                return PTR_ERR(fallback_tfm);
        }
        ctx->u.aes.tfm_ablkcipher = fallback_tfm;
index 93319f9db7531b5667542fe6b3c371046711fd5e..0d746236df5ef6ae886cfacc93b462efa8f96741 100644 (file)
@@ -48,12 +48,11 @@ static int ccp_get_msix_irqs(struct ccp_device *ccp)
        for (v = 0; v < ARRAY_SIZE(msix_entry); v++)
                msix_entry[v].entry = v;
 
-       while ((ret = pci_enable_msix(pdev, msix_entry, v)) > 0)
-               v = ret;
-       if (ret)
+       ret = pci_enable_msix_range(pdev, msix_entry, 1, v);
+       if (ret < 0)
                return ret;
 
-       ccp_pci->msix_count = v;
+       ccp_pci->msix_count = ret;
        for (v = 0; v < ccp_pci->msix_count; v++) {
                /* Set the interrupt names and request the irqs */
                snprintf(ccp_pci->msix[v].name, name_len, "ccp-%u", v);
index 0c9ff497172425f617bd753c912b7b62567c7e74..fe538e5287a55b8ba2b231629956e32826ed34a1 100644 (file)
@@ -226,7 +226,7 @@ geode_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
        op->dst = (void *) out;
        op->mode = AES_MODE_ECB;
        op->flags = 0;
-       op->len = AES_MIN_BLOCK_SIZE;
+       op->len = AES_BLOCK_SIZE;
        op->dir = AES_DIR_ENCRYPT;
 
        geode_aes_crypt(op);
@@ -247,7 +247,7 @@ geode_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
        op->dst = (void *) out;
        op->mode = AES_MODE_ECB;
        op->flags = 0;
-       op->len = AES_MIN_BLOCK_SIZE;
+       op->len = AES_BLOCK_SIZE;
        op->dir = AES_DIR_DECRYPT;
 
        geode_aes_crypt(op);
@@ -255,7 +255,7 @@ geode_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
 
 static int fallback_init_cip(struct crypto_tfm *tfm)
 {
-       const char *name = tfm->__crt_alg->cra_name;
+       const char *name = crypto_tfm_alg_name(tfm);
        struct geode_aes_op *op = crypto_tfm_ctx(tfm);
 
        op->fallback.cip = crypto_alloc_cipher(name, 0,
@@ -286,7 +286,7 @@ static struct crypto_alg geode_alg = {
                                                        CRYPTO_ALG_NEED_FALLBACK,
        .cra_init                       =       fallback_init_cip,
        .cra_exit                       =       fallback_exit_cip,
-       .cra_blocksize          =       AES_MIN_BLOCK_SIZE,
+       .cra_blocksize          =       AES_BLOCK_SIZE,
        .cra_ctxsize            =       sizeof(struct geode_aes_op),
        .cra_module                     =       THIS_MODULE,
        .cra_u                          =       {
@@ -320,7 +320,7 @@ geode_cbc_decrypt(struct blkcipher_desc *desc,
                op->src = walk.src.virt.addr,
                op->dst = walk.dst.virt.addr;
                op->mode = AES_MODE_CBC;
-               op->len = nbytes - (nbytes % AES_MIN_BLOCK_SIZE);
+               op->len = nbytes - (nbytes % AES_BLOCK_SIZE);
                op->dir = AES_DIR_DECRYPT;
 
                ret = geode_aes_crypt(op);
@@ -352,7 +352,7 @@ geode_cbc_encrypt(struct blkcipher_desc *desc,
                op->src = walk.src.virt.addr,
                op->dst = walk.dst.virt.addr;
                op->mode = AES_MODE_CBC;
-               op->len = nbytes - (nbytes % AES_MIN_BLOCK_SIZE);
+               op->len = nbytes - (nbytes % AES_BLOCK_SIZE);
                op->dir = AES_DIR_ENCRYPT;
 
                ret = geode_aes_crypt(op);
@@ -365,7 +365,7 @@ geode_cbc_encrypt(struct blkcipher_desc *desc,
 
 static int fallback_init_blk(struct crypto_tfm *tfm)
 {
-       const char *name = tfm->__crt_alg->cra_name;
+       const char *name = crypto_tfm_alg_name(tfm);
        struct geode_aes_op *op = crypto_tfm_ctx(tfm);
 
        op->fallback.blk = crypto_alloc_blkcipher(name, 0,
@@ -396,7 +396,7 @@ static struct crypto_alg geode_cbc_alg = {
                                                CRYPTO_ALG_NEED_FALLBACK,
        .cra_init                       =       fallback_init_blk,
        .cra_exit                       =       fallback_exit_blk,
-       .cra_blocksize          =       AES_MIN_BLOCK_SIZE,
+       .cra_blocksize          =       AES_BLOCK_SIZE,
        .cra_ctxsize            =       sizeof(struct geode_aes_op),
        .cra_alignmask          =       15,
        .cra_type                       =       &crypto_blkcipher_type,
@@ -408,7 +408,7 @@ static struct crypto_alg geode_cbc_alg = {
                        .setkey                 =       geode_setkey_blk,
                        .encrypt                =       geode_cbc_encrypt,
                        .decrypt                =       geode_cbc_decrypt,
-                       .ivsize                 =       AES_IV_LENGTH,
+                       .ivsize                 =       AES_BLOCK_SIZE,
                }
        }
 };
@@ -432,7 +432,7 @@ geode_ecb_decrypt(struct blkcipher_desc *desc,
                op->src = walk.src.virt.addr,
                op->dst = walk.dst.virt.addr;
                op->mode = AES_MODE_ECB;
-               op->len = nbytes - (nbytes % AES_MIN_BLOCK_SIZE);
+               op->len = nbytes - (nbytes % AES_BLOCK_SIZE);
                op->dir = AES_DIR_DECRYPT;
 
                ret = geode_aes_crypt(op);
@@ -462,7 +462,7 @@ geode_ecb_encrypt(struct blkcipher_desc *desc,
                op->src = walk.src.virt.addr,
                op->dst = walk.dst.virt.addr;
                op->mode = AES_MODE_ECB;
-               op->len = nbytes - (nbytes % AES_MIN_BLOCK_SIZE);
+               op->len = nbytes - (nbytes % AES_BLOCK_SIZE);
                op->dir = AES_DIR_ENCRYPT;
 
                ret = geode_aes_crypt(op);
@@ -482,7 +482,7 @@ static struct crypto_alg geode_ecb_alg = {
                                                CRYPTO_ALG_NEED_FALLBACK,
        .cra_init                       =       fallback_init_blk,
        .cra_exit                       =       fallback_exit_blk,
-       .cra_blocksize          =       AES_MIN_BLOCK_SIZE,
+       .cra_blocksize          =       AES_BLOCK_SIZE,
        .cra_ctxsize            =       sizeof(struct geode_aes_op),
        .cra_alignmask          =       15,
        .cra_type                       =       &crypto_blkcipher_type,
@@ -547,7 +547,7 @@ static int geode_aes_probe(struct pci_dev *dev, const struct pci_device_id *id)
        if (ret)
                goto eecb;
 
-       printk(KERN_NOTICE "geode-aes: GEODE AES engine enabled.\n");
+       dev_notice(&dev->dev, "GEODE AES engine enabled.\n");
        return 0;
 
  eecb:
@@ -565,7 +565,7 @@ static int geode_aes_probe(struct pci_dev *dev, const struct pci_device_id *id)
  eenable:
        pci_disable_device(dev);
 
-       printk(KERN_ERR "geode-aes:  GEODE AES initialization failed.\n");
+       dev_err(&dev->dev, "GEODE AES initialization failed.\n");
        return ret;
 }
 
index f1855b50da48d53cbc3e1f2d6d953529e56252d5..f442ca972e3c0c88aa87e7790e5ada0b510b0155 100644 (file)
 #define _GEODE_AES_H_
 
 /* driver logic flags */
-#define AES_IV_LENGTH  16
-#define AES_KEY_LENGTH 16
-#define AES_MIN_BLOCK_SIZE 16
-
 #define AES_MODE_ECB 0
 #define AES_MODE_CBC 1
 
@@ -64,7 +60,7 @@ struct geode_aes_op {
        u32 flags;
        int len;
 
-       u8 key[AES_KEY_LENGTH];
+       u8 key[AES_KEYSIZE_128];
        u8 *iv;
 
        union {
index 8d1e6f8e9e9cf613519b14fa5e5126135d37e986..29d0ee5049070c114696820c95d1b2daa3aef732 100644 (file)
@@ -622,8 +622,8 @@ static int queue_manag(void *data)
                }
 
                if (async_req) {
-                       if (async_req->tfm->__crt_alg->cra_type !=
-                           &crypto_ahash_type) {
+                       if (crypto_tfm_alg_type(async_req->tfm) !=
+                           CRYPTO_ALG_TYPE_AHASH) {
                                struct ablkcipher_request *req =
                                    ablkcipher_request_cast(async_req);
                                mv_start_new_crypt_req(req);
@@ -843,7 +843,7 @@ static int mv_hash_setkey(struct crypto_ahash *tfm, const u8 * key,
 static int mv_cra_hash_init(struct crypto_tfm *tfm, const char *base_hash_name,
                            enum hash_op op, int count_add)
 {
-       const char *fallback_driver_name = tfm->__crt_alg->cra_name;
+       const char *fallback_driver_name = crypto_tfm_alg_name(tfm);
        struct mv_tfm_hash_ctx *ctx = crypto_tfm_ctx(tfm);
        struct crypto_shash *fallback_tfm = NULL;
        struct crypto_shash *base_hash = NULL;
index 7bbe0ab21eca70eb573cb645baf277ca141ba7b3..b5f7e6db24d42fa3bcc84662fb206bab7dcc7e19 100644 (file)
@@ -104,7 +104,6 @@ struct dcp_sha_req_ctx {
  * design of Linux Crypto API.
  */
 static struct dcp *global_sdcp;
-static DEFINE_MUTEX(global_mutex);
 
 /* DCP register layout. */
 #define MXS_DCP_CTRL                           0x00
@@ -482,7 +481,7 @@ static int mxs_dcp_aes_setkey(struct crypto_ablkcipher *tfm, const u8 *key,
 
 static int mxs_dcp_aes_fallback_init(struct crypto_tfm *tfm)
 {
-       const char *name = tfm->__crt_alg->cra_name;
+       const char *name = crypto_tfm_alg_name(tfm);
        const uint32_t flags = CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK;
        struct dcp_async_ctx *actx = crypto_tfm_ctx(tfm);
        struct crypto_ablkcipher *blk;
@@ -907,60 +906,49 @@ static int mxs_dcp_probe(struct platform_device *pdev)
        struct resource *iores;
        int dcp_vmi_irq, dcp_irq;
 
-       mutex_lock(&global_mutex);
        if (global_sdcp) {
                dev_err(dev, "Only one DCP instance allowed!\n");
-               ret = -ENODEV;
-               goto err_mutex;
+               return -ENODEV;
        }
 
        iores = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        dcp_vmi_irq = platform_get_irq(pdev, 0);
-       if (dcp_vmi_irq < 0) {
-               ret = dcp_vmi_irq;
-               goto err_mutex;
-       }
+       if (dcp_vmi_irq < 0)
+               return dcp_vmi_irq;
 
        dcp_irq = platform_get_irq(pdev, 1);
-       if (dcp_irq < 0) {
-               ret = dcp_irq;
-               goto err_mutex;
-       }
+       if (dcp_irq < 0)
+               return dcp_irq;
 
        sdcp = devm_kzalloc(dev, sizeof(*sdcp), GFP_KERNEL);
-       if (!sdcp) {
-               ret = -ENOMEM;
-               goto err_mutex;
-       }
+       if (!sdcp)
+               return -ENOMEM;
 
        sdcp->dev = dev;
        sdcp->base = devm_ioremap_resource(dev, iores);
-       if (IS_ERR(sdcp->base)) {
-               ret = PTR_ERR(sdcp->base);
-               goto err_mutex;
-       }
+       if (IS_ERR(sdcp->base))
+               return PTR_ERR(sdcp->base);
+
 
        ret = devm_request_irq(dev, dcp_vmi_irq, mxs_dcp_irq, 0,
                               "dcp-vmi-irq", sdcp);
        if (ret) {
                dev_err(dev, "Failed to claim DCP VMI IRQ!\n");
-               goto err_mutex;
+               return ret;
        }
 
        ret = devm_request_irq(dev, dcp_irq, mxs_dcp_irq, 0,
                               "dcp-irq", sdcp);
        if (ret) {
                dev_err(dev, "Failed to claim DCP IRQ!\n");
-               goto err_mutex;
+               return ret;
        }
 
        /* Allocate coherent helper block. */
        sdcp->coh = devm_kzalloc(dev, sizeof(*sdcp->coh) + DCP_ALIGNMENT,
                                   GFP_KERNEL);
-       if (!sdcp->coh) {
-               ret = -ENOMEM;
-               goto err_mutex;
-       }
+       if (!sdcp->coh)
+               return -ENOMEM;
 
        /* Re-align the structure so it fits the DCP constraints. */
        sdcp->coh = PTR_ALIGN(sdcp->coh, DCP_ALIGNMENT);
@@ -968,7 +956,7 @@ static int mxs_dcp_probe(struct platform_device *pdev)
        /* Restart the DCP block. */
        ret = stmp_reset_block(sdcp->base);
        if (ret)
-               goto err_mutex;
+               return ret;
 
        /* Initialize control register. */
        writel(MXS_DCP_CTRL_GATHER_RESIDUAL_WRITES |
@@ -1006,8 +994,7 @@ static int mxs_dcp_probe(struct platform_device *pdev)
                                                      NULL, "mxs_dcp_chan/sha");
        if (IS_ERR(sdcp->thread[DCP_CHAN_HASH_SHA])) {
                dev_err(dev, "Error starting SHA thread!\n");
-               ret = PTR_ERR(sdcp->thread[DCP_CHAN_HASH_SHA]);
-               goto err_mutex;
+               return PTR_ERR(sdcp->thread[DCP_CHAN_HASH_SHA]);
        }
 
        sdcp->thread[DCP_CHAN_CRYPTO] = kthread_run(dcp_chan_thread_aes,
@@ -1064,9 +1051,6 @@ err_destroy_aes_thread:
 
 err_destroy_sha_thread:
        kthread_stop(sdcp->thread[DCP_CHAN_HASH_SHA]);
-
-err_mutex:
-       mutex_unlock(&global_mutex);
        return ret;
 }
 
@@ -1088,9 +1072,7 @@ static int mxs_dcp_remove(struct platform_device *pdev)
 
        platform_set_drvdata(pdev, NULL);
 
-       mutex_lock(&global_mutex);
        global_sdcp = NULL;
-       mutex_unlock(&global_mutex);
 
        return 0;
 }
index e1f0ab413c3b80a59b55bb4f079524067c09d22f..7263c10a56ee30914c1916418559901fa5090d7f 100644 (file)
@@ -356,7 +356,7 @@ static int n2_hash_async_finup(struct ahash_request *req)
 
 static int n2_hash_cra_init(struct crypto_tfm *tfm)
 {
-       const char *fallback_driver_name = tfm->__crt_alg->cra_name;
+       const char *fallback_driver_name = crypto_tfm_alg_name(tfm);
        struct crypto_ahash *ahash = __crypto_ahash_cast(tfm);
        struct n2_hash_ctx *ctx = crypto_ahash_ctx(ahash);
        struct crypto_ahash *fallback_tfm;
@@ -391,7 +391,7 @@ static void n2_hash_cra_exit(struct crypto_tfm *tfm)
 
 static int n2_hmac_cra_init(struct crypto_tfm *tfm)
 {
-       const char *fallback_driver_name = tfm->__crt_alg->cra_name;
+       const char *fallback_driver_name = crypto_tfm_alg_name(tfm);
        struct crypto_ahash *ahash = __crypto_ahash_cast(tfm);
        struct n2_hmac_ctx *ctx = crypto_ahash_ctx(ahash);
        struct n2_hmac_alg *n2alg = n2_hmac_alg(tfm);
index 5ce8b576512106656fc9d38571a36107d9f3f2bc..502edf0a29332a5e9af8bbe362c6b5deccc62568 100644 (file)
@@ -1229,7 +1229,7 @@ static int __exit nx842_remove(struct vio_dev *viodev)
        old_devdata = rcu_dereference_check(devdata,
                        lockdep_is_held(&devdata_mutex));
        of_reconfig_notifier_unregister(&nx842_of_nb);
-       rcu_assign_pointer(devdata, NULL);
+       RCU_INIT_POINTER(devdata, NULL);
        spin_unlock_irqrestore(&devdata_mutex, flags);
        synchronize_rcu();
        dev_set_drvdata(&viodev->dev, NULL);
@@ -1280,7 +1280,7 @@ static void __exit nx842_exit(void)
        spin_lock_irqsave(&devdata_mutex, flags);
        old_devdata = rcu_dereference_check(devdata,
                        lockdep_is_held(&devdata_mutex));
-       rcu_assign_pointer(devdata, NULL);
+       RCU_INIT_POINTER(devdata, NULL);
        spin_unlock_irqrestore(&devdata_mutex, flags);
        synchronize_rcu();
        if (old_devdata)
index ec5f13162b733c027d1b2c8d2df2ac2def08c4d8..b8bc84be874178397e7c3ccf51e1bbca2e926634 100644 (file)
@@ -223,12 +223,19 @@ static void omap_des_write_n(struct omap_des_dev *dd, u32 offset,
 
 static int omap_des_hw_init(struct omap_des_dev *dd)
 {
+       int err;
+
        /*
         * clocks are enabled when request starts and disabled when finished.
         * It may be long delays between requests.
         * Device might go to off mode to save power.
         */
-       pm_runtime_get_sync(dd->dev);
+       err = pm_runtime_get_sync(dd->dev);
+       if (err < 0) {
+               pm_runtime_put_noidle(dd->dev);
+               dev_err(dd->dev, "%s: failed to get_sync(%d)\n", __func__, err);
+               return err;
+       }
 
        if (!(dd->flags & FLAGS_INIT)) {
                dd->flags |= FLAGS_INIT;
@@ -1074,16 +1081,20 @@ static int omap_des_probe(struct platform_device *pdev)
        if (err)
                goto err_res;
 
-       dd->io_base = devm_request_and_ioremap(dev, res);
-       if (!dd->io_base) {
-               dev_err(dev, "can't ioremap\n");
-               err = -ENOMEM;
+       dd->io_base = devm_ioremap_resource(dev, res);
+       if (IS_ERR(dd->io_base)) {
+               err = PTR_ERR(dd->io_base);
                goto err_res;
        }
        dd->phys_base = res->start;
 
        pm_runtime_enable(dev);
-       pm_runtime_get_sync(dev);
+       err = pm_runtime_get_sync(dev);
+       if (err < 0) {
+               pm_runtime_put_noidle(dev);
+               dev_err(dd->dev, "%s: failed to get_sync(%d)\n", __func__, err);
+               goto err_get;
+       }
 
        omap_des_dma_stop(dd);
 
@@ -1148,6 +1159,7 @@ err_algs:
 err_irq:
        tasklet_kill(&dd->done_task);
        tasklet_kill(&dd->queue_task);
+err_get:
        pm_runtime_disable(dev);
 err_res:
        dd = NULL;
@@ -1191,7 +1203,14 @@ static int omap_des_suspend(struct device *dev)
 
 static int omap_des_resume(struct device *dev)
 {
-       pm_runtime_get_sync(dev);
+       int err;
+
+       err = pm_runtime_get_sync(dev);
+       if (err < 0) {
+               pm_runtime_put_noidle(dev);
+               dev_err(dev, "%s: failed to get_sync(%d)\n", __func__, err);
+               return err;
+       }
        return 0;
 }
 #endif
index 9266c0e2549297cfd403b85556ac86ae728f6f77..bace885634f244b405113477010f2719351e997d 100644 (file)
@@ -211,7 +211,7 @@ static int padlock_sha256_final(struct shash_desc *desc, u8 *out)
 static int padlock_cra_init(struct crypto_tfm *tfm)
 {
        struct crypto_shash *hash = __crypto_shash_cast(tfm);
-       const char *fallback_driver_name = tfm->__crt_alg->cra_name;
+       const char *fallback_driver_name = crypto_tfm_alg_name(tfm);
        struct padlock_sha_ctx *ctx = crypto_tfm_ctx(tfm);
        struct crypto_shash *fallback_tfm;
        int err = -ENOMEM;
index be45762f390a274f2b916effd52b46fe12fd1619..4197ad9a711bd6c04e8a993f3fafe1a6e553dea2 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/scatterlist.h>
 #include <linux/dma-mapping.h>
 #include <linux/io.h>
+#include <linux/of.h>
 #include <linux/crypto.h>
 #include <linux/interrupt.h>
 
@@ -29,9 +30,6 @@
 #include <crypto/aes.h>
 #include <crypto/ctr.h>
 
-#include <plat/cpu.h>
-#include <mach/dma.h>
-
 #define _SBF(s, v)                      ((v) << (s))
 #define _BIT(b)                         _SBF(b, 1)
 
 #define SSS_REG_FCPKDMAO                0x005C
 
 /* AES registers */
-#define SSS_REG_AES_CONTROL             0x4000
+#define SSS_REG_AES_CONTROL            0x00
 #define SSS_AES_BYTESWAP_DI             _BIT(11)
 #define SSS_AES_BYTESWAP_DO             _BIT(10)
 #define SSS_AES_BYTESWAP_IV             _BIT(9)
 #define SSS_AES_CHAIN_MODE_CTR          _SBF(1, 0x02)
 #define SSS_AES_MODE_DECRYPT            _BIT(0)
 
-#define SSS_REG_AES_STATUS              0x4004
+#define SSS_REG_AES_STATUS             0x04
 #define SSS_AES_BUSY                    _BIT(2)
 #define SSS_AES_INPUT_READY             _BIT(1)
 #define SSS_AES_OUTPUT_READY            _BIT(0)
 
-#define SSS_REG_AES_IN_DATA(s)          (0x4010 + (s << 2))
-#define SSS_REG_AES_OUT_DATA(s)         (0x4020 + (s << 2))
-#define SSS_REG_AES_IV_DATA(s)          (0x4030 + (s << 2))
-#define SSS_REG_AES_CNT_DATA(s)         (0x4040 + (s << 2))
-#define SSS_REG_AES_KEY_DATA(s)         (0x4080 + (s << 2))
+#define SSS_REG_AES_IN_DATA(s)         (0x10 + (s << 2))
+#define SSS_REG_AES_OUT_DATA(s)                (0x20 + (s << 2))
+#define SSS_REG_AES_IV_DATA(s)         (0x30 + (s << 2))
+#define SSS_REG_AES_CNT_DATA(s)                (0x40 + (s << 2))
+#define SSS_REG_AES_KEY_DATA(s)                (0x80 + (s << 2))
 
 #define SSS_REG(dev, reg)               ((dev)->ioaddr + (SSS_REG_##reg))
 #define SSS_READ(dev, reg)              __raw_readl(SSS_REG(dev, reg))
 #define SSS_WRITE(dev, reg, val)        __raw_writel((val), SSS_REG(dev, reg))
 
+#define SSS_AES_REG(dev, reg)           ((dev)->aes_ioaddr + SSS_REG_##reg)
+#define SSS_AES_WRITE(dev, reg, val)    __raw_writel((val), \
+                                               SSS_AES_REG(dev, reg))
+
 /* HW engine modes */
 #define FLAGS_AES_DECRYPT               _BIT(0)
 #define FLAGS_AES_MODE_MASK             _SBF(1, 0x03)
 #define AES_KEY_LEN         16
 #define CRYPTO_QUEUE_LEN    1
 
+/**
+ * struct samsung_aes_variant - platform specific SSS driver data
+ * @has_hash_irq: true if SSS module uses hash interrupt, false otherwise
+ * @aes_offset: AES register offset from SSS module's base.
+ *
+ * Specifies platform specific configuration of SSS module.
+ * Note: A structure for driver specific platform data is used for future
+ * expansion of its usage.
+ */
+struct samsung_aes_variant {
+       bool                        has_hash_irq;
+       unsigned int                aes_offset;
+};
+
 struct s5p_aes_reqctx {
        unsigned long mode;
 };
@@ -161,6 +177,7 @@ struct s5p_aes_dev {
        struct device              *dev;
        struct clk                 *clk;
        void __iomem               *ioaddr;
+       void __iomem               *aes_ioaddr;
        int                         irq_hash;
        int                         irq_fc;
 
@@ -173,10 +190,48 @@ struct s5p_aes_dev {
        struct crypto_queue         queue;
        bool                        busy;
        spinlock_t                  lock;
+
+       struct samsung_aes_variant *variant;
 };
 
 static struct s5p_aes_dev *s5p_dev;
 
+static const struct samsung_aes_variant s5p_aes_data = {
+       .has_hash_irq   = true,
+       .aes_offset     = 0x4000,
+};
+
+static const struct samsung_aes_variant exynos_aes_data = {
+       .has_hash_irq   = false,
+       .aes_offset     = 0x200,
+};
+
+static const struct of_device_id s5p_sss_dt_match[] = {
+       {
+               .compatible = "samsung,s5pv210-secss",
+               .data = &s5p_aes_data,
+       },
+       {
+               .compatible = "samsung,exynos4210-secss",
+               .data = &exynos_aes_data,
+       },
+       { },
+};
+MODULE_DEVICE_TABLE(of, s5p_sss_dt_match);
+
+static inline struct samsung_aes_variant *find_s5p_sss_version
+                                  (struct platform_device *pdev)
+{
+       if (IS_ENABLED(CONFIG_OF) && (pdev->dev.of_node)) {
+               const struct of_device_id *match;
+               match = of_match_node(s5p_sss_dt_match,
+                                       pdev->dev.of_node);
+               return (struct samsung_aes_variant *)match->data;
+       }
+       return (struct samsung_aes_variant *)
+                       platform_get_device_id(pdev)->driver_data;
+}
+
 static void s5p_set_dma_indata(struct s5p_aes_dev *dev, struct scatterlist *sg)
 {
        SSS_WRITE(dev, FCBRDMAS, sg_dma_address(sg));
@@ -272,8 +327,12 @@ static void s5p_aes_tx(struct s5p_aes_dev *dev)
                }
 
                s5p_set_dma_outdata(dev, dev->sg_dst);
-       } else
+       } else {
                s5p_aes_complete(dev, err);
+
+               dev->busy = true;
+               tasklet_schedule(&dev->tasklet);
+       }
 }
 
 static void s5p_aes_rx(struct s5p_aes_dev *dev)
@@ -322,14 +381,15 @@ static void s5p_set_aes(struct s5p_aes_dev *dev,
 {
        void __iomem *keystart;
 
-       memcpy(dev->ioaddr + SSS_REG_AES_IV_DATA(0), iv, 0x10);
+       if (iv)
+               memcpy(dev->aes_ioaddr + SSS_REG_AES_IV_DATA(0), iv, 0x10);
 
        if (keylen == AES_KEYSIZE_256)
-               keystart = dev->ioaddr + SSS_REG_AES_KEY_DATA(0);
+               keystart = dev->aes_ioaddr + SSS_REG_AES_KEY_DATA(0);
        else if (keylen == AES_KEYSIZE_192)
-               keystart = dev->ioaddr + SSS_REG_AES_KEY_DATA(2);
+               keystart = dev->aes_ioaddr + SSS_REG_AES_KEY_DATA(2);
        else
-               keystart = dev->ioaddr + SSS_REG_AES_KEY_DATA(4);
+               keystart = dev->aes_ioaddr + SSS_REG_AES_KEY_DATA(4);
 
        memcpy(keystart, key, keylen);
 }
@@ -379,7 +439,7 @@ static void s5p_aes_crypt_start(struct s5p_aes_dev *dev, unsigned long mode)
        if (err)
                goto outdata_error;
 
-       SSS_WRITE(dev, AES_CONTROL, aes_control);
+       SSS_AES_WRITE(dev, AES_CONTROL, aes_control);
        s5p_set_aes(dev, dev->ctx->aes_key, req->info, dev->ctx->keylen);
 
        s5p_set_dma_indata(dev,  req->src);
@@ -410,10 +470,13 @@ static void s5p_tasklet_cb(unsigned long data)
        spin_lock_irqsave(&dev->lock, flags);
        backlog   = crypto_get_backlog(&dev->queue);
        async_req = crypto_dequeue_request(&dev->queue);
-       spin_unlock_irqrestore(&dev->lock, flags);
 
-       if (!async_req)
+       if (!async_req) {
+               dev->busy = false;
+               spin_unlock_irqrestore(&dev->lock, flags);
                return;
+       }
+       spin_unlock_irqrestore(&dev->lock, flags);
 
        if (backlog)
                backlog->complete(backlog, -EINPROGRESS);
@@ -432,14 +495,13 @@ static int s5p_aes_handle_req(struct s5p_aes_dev *dev,
        int err;
 
        spin_lock_irqsave(&dev->lock, flags);
+       err = ablkcipher_enqueue_request(&dev->queue, req);
        if (dev->busy) {
-               err = -EAGAIN;
                spin_unlock_irqrestore(&dev->lock, flags);
                goto exit;
        }
        dev->busy = true;
 
-       err = ablkcipher_enqueue_request(&dev->queue, req);
        spin_unlock_irqrestore(&dev->lock, flags);
 
        tasklet_schedule(&dev->tasklet);
@@ -564,6 +626,7 @@ static int s5p_aes_probe(struct platform_device *pdev)
        struct s5p_aes_dev *pdata;
        struct device      *dev = &pdev->dev;
        struct resource    *res;
+       struct samsung_aes_variant *variant;
 
        if (s5p_dev)
                return -EEXIST;
@@ -577,30 +640,25 @@ static int s5p_aes_probe(struct platform_device *pdev)
        if (IS_ERR(pdata->ioaddr))
                return PTR_ERR(pdata->ioaddr);
 
+       variant = find_s5p_sss_version(pdev);
+
        pdata->clk = devm_clk_get(dev, "secss");
        if (IS_ERR(pdata->clk)) {
                dev_err(dev, "failed to find secss clock source\n");
                return -ENOENT;
        }
 
-       clk_enable(pdata->clk);
+       err = clk_prepare_enable(pdata->clk);
+       if (err < 0) {
+               dev_err(dev, "Enabling SSS clk failed, err %d\n", err);
+               return err;
+       }
 
        spin_lock_init(&pdata->lock);
 
-       pdata->irq_hash = platform_get_irq_byname(pdev, "hash");
-       if (pdata->irq_hash < 0) {
-               err = pdata->irq_hash;
-               dev_warn(dev, "hash interrupt is not available.\n");
-               goto err_irq;
-       }
-       err = devm_request_irq(dev, pdata->irq_hash, s5p_aes_interrupt,
-                              IRQF_SHARED, pdev->name, pdev);
-       if (err < 0) {
-               dev_warn(dev, "hash interrupt is not available.\n");
-               goto err_irq;
-       }
+       pdata->aes_ioaddr = pdata->ioaddr + variant->aes_offset;
 
-       pdata->irq_fc = platform_get_irq_byname(pdev, "feed control");
+       pdata->irq_fc = platform_get_irq(pdev, 0);
        if (pdata->irq_fc < 0) {
                err = pdata->irq_fc;
                dev_warn(dev, "feed control interrupt is not available.\n");
@@ -613,6 +671,23 @@ static int s5p_aes_probe(struct platform_device *pdev)
                goto err_irq;
        }
 
+       if (variant->has_hash_irq) {
+               pdata->irq_hash = platform_get_irq(pdev, 1);
+               if (pdata->irq_hash < 0) {
+                       err = pdata->irq_hash;
+                       dev_warn(dev, "hash interrupt is not available.\n");
+                       goto err_irq;
+               }
+               err = devm_request_irq(dev, pdata->irq_hash, s5p_aes_interrupt,
+                                      IRQF_SHARED, pdev->name, pdev);
+               if (err < 0) {
+                       dev_warn(dev, "hash interrupt is not available.\n");
+                       goto err_irq;
+               }
+       }
+
+       pdata->busy = false;
+       pdata->variant = variant;
        pdata->dev = dev;
        platform_set_drvdata(pdev, pdata);
        s5p_dev = pdata;
@@ -639,7 +714,7 @@ static int s5p_aes_probe(struct platform_device *pdev)
        tasklet_kill(&pdata->tasklet);
 
  err_irq:
-       clk_disable(pdata->clk);
+       clk_disable_unprepare(pdata->clk);
 
        s5p_dev = NULL;
 
@@ -659,7 +734,7 @@ static int s5p_aes_remove(struct platform_device *pdev)
 
        tasklet_kill(&pdata->tasklet);
 
-       clk_disable(pdata->clk);
+       clk_disable_unprepare(pdata->clk);
 
        s5p_dev = NULL;
 
@@ -672,6 +747,7 @@ static struct platform_driver s5p_aes_crypto = {
        .driver = {
                .owner  = THIS_MODULE,
                .name   = "s5p-secss",
+               .of_match_table = s5p_sss_dt_match,
        },
 };
 
index 07a5987ce67d4783a1ffd3dbecc6151efb791d4a..164e1ec624e3c7e2a9ca6234a8100f98cec8894d 100644 (file)
@@ -728,7 +728,7 @@ static int sahara_aes_cbc_decrypt(struct ablkcipher_request *req)
 
 static int sahara_aes_cra_init(struct crypto_tfm *tfm)
 {
-       const char *name = tfm->__crt_alg->cra_name;
+       const char *name = crypto_tfm_alg_name(tfm);
        struct sahara_ctx *ctx = crypto_tfm_ctx(tfm);
 
        ctx->fallback = crypto_alloc_ablkcipher(name, 0,
index 821eae8cbd8cf131bdbcc41dd46de828e700269a..9b6f32a6cad1a0ca2479fef6204656b94417798e 100644 (file)
@@ -55,15 +55,28 @@ extern const struct crypto_type crypto_ahash_type;
 int crypto_hash_walk_done(struct crypto_hash_walk *walk, int err);
 int crypto_hash_walk_first(struct ahash_request *req,
                           struct crypto_hash_walk *walk);
+int crypto_ahash_walk_first(struct ahash_request *req,
+                          struct crypto_hash_walk *walk);
 int crypto_hash_walk_first_compat(struct hash_desc *hdesc,
                                  struct crypto_hash_walk *walk,
                                  struct scatterlist *sg, unsigned int len);
 
+static inline int crypto_ahash_walk_done(struct crypto_hash_walk *walk,
+                                        int err)
+{
+       return crypto_hash_walk_done(walk, err);
+}
+
 static inline int crypto_hash_walk_last(struct crypto_hash_walk *walk)
 {
        return !(walk->entrylen | walk->total);
 }
 
+static inline int crypto_ahash_walk_last(struct crypto_hash_walk *walk)
+{
+       return crypto_hash_walk_last(walk);
+}
+
 int crypto_register_ahash(struct ahash_alg *alg);
 int crypto_unregister_ahash(struct ahash_alg *alg);
 int ahash_register_instance(struct crypto_template *tmpl,