aboutsummaryrefslogtreecommitdiffstats
path: root/crypto/crc32c.c
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/crc32c.c')
-rw-r--r--crypto/crc32c.c25
1 files changed, 15 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,