aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2006-08-06 09:03:08 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2006-09-20 21:41:01 -0400
commit25cdbcd9e5d20e431f829cafce48a418830011f4 (patch)
tree0dff8422d2b0b1da1d3505b0ad0e840f6f0fd66d
parent58ec4152895b96f047dcf5e490ee49b4c574dec3 (diff)
[CRYPTO] crc32c: Fix unconventional setkey usage
The convention for setkey is that once it is set it should not change, in particular, init must not wipe out the key set by it. In fact, init should always be used after setkey before any digestion is performed. The only user of crc32c that sets the key is tcrypt. This patch adds the necessary init calls there. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--crypto/crc32c.c25
-rw-r--r--crypto/tcrypt.c4
2 files changed, 19 insertions, 10 deletions
diff --git a/crypto/crc32c.c b/crypto/crc32c.c
index f2660123aeb4..91ecd895e957 100644
--- a/crypto/crc32c.c
+++ b/crypto/crc32c.c
@@ -16,14 +16,14 @@
16#include <linux/string.h> 16#include <linux/string.h>
17#include <linux/crypto.h> 17#include <linux/crypto.h>
18#include <linux/crc32c.h> 18#include <linux/crc32c.h>
19#include <linux/types.h> 19#include <linux/kernel.h>
20#include <asm/byteorder.h>
21 20
22#define CHKSUM_BLOCK_SIZE 32 21#define CHKSUM_BLOCK_SIZE 32
23#define CHKSUM_DIGEST_SIZE 4 22#define CHKSUM_DIGEST_SIZE 4
24 23
25struct chksum_ctx { 24struct chksum_ctx {
26 u32 crc; 25 u32 crc;
26 u32 key;
27}; 27};
28 28
29/* 29/*
@@ -35,7 +35,7 @@ static void chksum_init(struct crypto_tfm *tfm)
35{ 35{
36 struct chksum_ctx *mctx = crypto_tfm_ctx(tfm); 36 struct chksum_ctx *mctx = crypto_tfm_ctx(tfm);
37 37
38 mctx->crc = ~(u32)0; /* common usage */ 38 mctx->crc = mctx->key;
39} 39}
40 40
41/* 41/*
@@ -53,7 +53,7 @@ static int chksum_setkey(struct crypto_tfm *tfm, const u8 *key,
53 *flags = CRYPTO_TFM_RES_BAD_KEY_LEN; 53 *flags = CRYPTO_TFM_RES_BAD_KEY_LEN;
54 return -EINVAL; 54 return -EINVAL;
55 } 55 }
56 mctx->crc = __cpu_to_le32(*(u32 *)key); 56 mctx->key = le32_to_cpu(*(__le32 *)key);
57 return 0; 57 return 0;
58} 58}
59 59
@@ -61,19 +61,23 @@ static void chksum_update(struct crypto_tfm *tfm, const u8 *data,
61 unsigned int length) 61 unsigned int length)
62{ 62{
63 struct chksum_ctx *mctx = crypto_tfm_ctx(tfm); 63 struct chksum_ctx *mctx = crypto_tfm_ctx(tfm);
64 u32 mcrc;
65 64
66 mcrc = crc32c(mctx->crc, data, (size_t)length); 65 mctx->crc = crc32c(mctx->crc, data, length);
67
68 mctx->crc = mcrc;
69} 66}
70 67
71static void chksum_final(struct crypto_tfm *tfm, u8 *out) 68static void chksum_final(struct crypto_tfm *tfm, u8 *out)
72{ 69{
73 struct chksum_ctx *mctx = crypto_tfm_ctx(tfm); 70 struct chksum_ctx *mctx = crypto_tfm_ctx(tfm);
74 u32 mcrc = (mctx->crc ^ ~(u32)0);
75 71
76 *(u32 *)out = __le32_to_cpu(mcrc); 72 *(__le32 *)out = ~cpu_to_le32(mctx->crc);
73}
74
75static int crc32c_cra_init(struct crypto_tfm *tfm)
76{
77 struct chksum_ctx *mctx = crypto_tfm_ctx(tfm);
78
79 mctx->key = ~0;
80 return 0;
77} 81}
78 82
79static struct crypto_alg alg = { 83static struct crypto_alg alg = {
@@ -83,6 +87,7 @@ static struct crypto_alg alg = {
83 .cra_ctxsize = sizeof(struct chksum_ctx), 87 .cra_ctxsize = sizeof(struct chksum_ctx),
84 .cra_module = THIS_MODULE, 88 .cra_module = THIS_MODULE,
85 .cra_list = LIST_HEAD_INIT(alg.cra_list), 89 .cra_list = LIST_HEAD_INIT(alg.cra_list),
90 .cra_init = crc32c_cra_init,
86 .cra_u = { 91 .cra_u = {
87 .digest = { 92 .digest = {
88 .dia_digestsize= CHKSUM_DIGEST_SIZE, 93 .dia_digestsize= CHKSUM_DIGEST_SIZE,
diff --git a/crypto/tcrypt.c b/crypto/tcrypt.c
index e52f56c5bd5e..bed225e83231 100644
--- a/crypto/tcrypt.c
+++ b/crypto/tcrypt.c
@@ -810,6 +810,7 @@ static void test_crc32c(void)
810 810
811 seed = SEEDTESTVAL; 811 seed = SEEDTESTVAL;
812 (void)crypto_digest_setkey(tfm, (const u8*)&seed, sizeof(u32)); 812 (void)crypto_digest_setkey(tfm, (const u8*)&seed, sizeof(u32));
813 crypto_digest_init(tfm);
813 crypto_digest_final(tfm, (u8*)&crc); 814 crypto_digest_final(tfm, (u8*)&crc);
814 printk("testing crc32c setkey returns %08x : %s\n", crc, (crc == (SEEDTESTVAL ^ ~(u32)0)) ? 815 printk("testing crc32c setkey returns %08x : %s\n", crc, (crc == (SEEDTESTVAL ^ ~(u32)0)) ?
815 "pass" : "ERROR"); 816 "pass" : "ERROR");
@@ -821,6 +822,7 @@ static void test_crc32c(void)
821 for (i = 0; i < NUMVEC; i++) { 822 for (i = 0; i < NUMVEC; i++) {
822 seed = ~(u32)0; 823 seed = ~(u32)0;
823 (void)crypto_digest_setkey(tfm, (const u8*)&seed, sizeof(u32)); 824 (void)crypto_digest_setkey(tfm, (const u8*)&seed, sizeof(u32));
825 crypto_digest_init(tfm);
824 crypto_digest_update(tfm, &sg[i], 1); 826 crypto_digest_update(tfm, &sg[i], 1);
825 crypto_digest_final(tfm, (u8*)&crc); 827 crypto_digest_final(tfm, (u8*)&crc);
826 if (crc == vec_results[i]) { 828 if (crc == vec_results[i]) {
@@ -836,6 +838,7 @@ static void test_crc32c(void)
836 for (i = 0; i < NUMVEC; i++) { 838 for (i = 0; i < NUMVEC; i++) {
837 seed = (crc ^ ~(u32)0); 839 seed = (crc ^ ~(u32)0);
838 (void)crypto_digest_setkey(tfm, (const u8*)&seed, sizeof(u32)); 840 (void)crypto_digest_setkey(tfm, (const u8*)&seed, sizeof(u32));
841 crypto_digest_init(tfm);
839 crypto_digest_update(tfm, &sg[i], 1); 842 crypto_digest_update(tfm, &sg[i], 1);
840 crypto_digest_final(tfm, (u8*)&crc); 843 crypto_digest_final(tfm, (u8*)&crc);
841 } 844 }
@@ -849,6 +852,7 @@ static void test_crc32c(void)
849 printk("\ntesting crc32c using digest:\n"); 852 printk("\ntesting crc32c using digest:\n");
850 seed = ~(u32)0; 853 seed = ~(u32)0;
851 (void)crypto_digest_setkey(tfm, (const u8*)&seed, sizeof(u32)); 854 (void)crypto_digest_setkey(tfm, (const u8*)&seed, sizeof(u32));
855 crypto_digest_init(tfm);
852 crypto_digest_digest(tfm, sg, NUMVEC, (u8*)&crc); 856 crypto_digest_digest(tfm, sg, NUMVEC, (u8*)&crc);
853 if (crc == tot_vec_results) { 857 if (crc == tot_vec_results) {
854 printk(" %08x:OK", crc); 858 printk(" %08x:OK", crc);