diff options
Diffstat (limited to 'crypto/crc32c.c')
-rw-r--r-- | crypto/crc32c.c | 30 |
1 files changed, 17 insertions, 13 deletions
diff --git a/crypto/crc32c.c b/crypto/crc32c.c index f2660123aeb4..0fa744392a4c 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 | ||
25 | struct chksum_ctx { | 24 | struct 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 | /* |
@@ -44,16 +44,15 @@ static void chksum_init(struct crypto_tfm *tfm) | |||
44 | * the seed. | 44 | * the seed. |
45 | */ | 45 | */ |
46 | static int chksum_setkey(struct crypto_tfm *tfm, const u8 *key, | 46 | static int chksum_setkey(struct crypto_tfm *tfm, const u8 *key, |
47 | unsigned int keylen, u32 *flags) | 47 | unsigned int keylen) |
48 | { | 48 | { |
49 | struct chksum_ctx *mctx = crypto_tfm_ctx(tfm); | 49 | struct chksum_ctx *mctx = crypto_tfm_ctx(tfm); |
50 | 50 | ||
51 | if (keylen != sizeof(mctx->crc)) { | 51 | if (keylen != sizeof(mctx->crc)) { |
52 | if (flags) | 52 | tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN; |
53 | *flags = CRYPTO_TFM_RES_BAD_KEY_LEN; | ||
54 | return -EINVAL; | 53 | return -EINVAL; |
55 | } | 54 | } |
56 | mctx->crc = __cpu_to_le32(*(u32 *)key); | 55 | mctx->key = le32_to_cpu(*(__le32 *)key); |
57 | return 0; | 56 | return 0; |
58 | } | 57 | } |
59 | 58 | ||
@@ -61,19 +60,23 @@ static void chksum_update(struct crypto_tfm *tfm, const u8 *data, | |||
61 | unsigned int length) | 60 | unsigned int length) |
62 | { | 61 | { |
63 | struct chksum_ctx *mctx = crypto_tfm_ctx(tfm); | 62 | struct chksum_ctx *mctx = crypto_tfm_ctx(tfm); |
64 | u32 mcrc; | ||
65 | 63 | ||
66 | mcrc = crc32c(mctx->crc, data, (size_t)length); | 64 | mctx->crc = crc32c(mctx->crc, data, length); |
67 | |||
68 | mctx->crc = mcrc; | ||
69 | } | 65 | } |
70 | 66 | ||
71 | static void chksum_final(struct crypto_tfm *tfm, u8 *out) | 67 | static void chksum_final(struct crypto_tfm *tfm, u8 *out) |
72 | { | 68 | { |
73 | struct chksum_ctx *mctx = crypto_tfm_ctx(tfm); | 69 | struct chksum_ctx *mctx = crypto_tfm_ctx(tfm); |
74 | u32 mcrc = (mctx->crc ^ ~(u32)0); | ||
75 | 70 | ||
76 | *(u32 *)out = __le32_to_cpu(mcrc); | 71 | *(__le32 *)out = ~cpu_to_le32(mctx->crc); |
72 | } | ||
73 | |||
74 | static int crc32c_cra_init(struct crypto_tfm *tfm) | ||
75 | { | ||
76 | struct chksum_ctx *mctx = crypto_tfm_ctx(tfm); | ||
77 | |||
78 | mctx->key = ~0; | ||
79 | return 0; | ||
77 | } | 80 | } |
78 | 81 | ||
79 | static struct crypto_alg alg = { | 82 | static struct crypto_alg alg = { |
@@ -83,6 +86,7 @@ static struct crypto_alg alg = { | |||
83 | .cra_ctxsize = sizeof(struct chksum_ctx), | 86 | .cra_ctxsize = sizeof(struct chksum_ctx), |
84 | .cra_module = THIS_MODULE, | 87 | .cra_module = THIS_MODULE, |
85 | .cra_list = LIST_HEAD_INIT(alg.cra_list), | 88 | .cra_list = LIST_HEAD_INIT(alg.cra_list), |
89 | .cra_init = crc32c_cra_init, | ||
86 | .cra_u = { | 90 | .cra_u = { |
87 | .digest = { | 91 | .digest = { |
88 | .dia_digestsize= CHKSUM_DIGEST_SIZE, | 92 | .dia_digestsize= CHKSUM_DIGEST_SIZE, |