Blame view
crypto/crc32c_generic.c
4.17 KB
2874c5fd2 treewide: Replace... |
1 |
// SPDX-License-Identifier: GPL-2.0-or-later |
db83aabfe crypto: crc32 - F... |
2 |
/* |
1da177e4c Linux-2.6.12-rc2 |
3 4 5 6 |
* Cryptographic API. * * CRC32C chksum * |
69c35efcf libcrc32c: Move i... |
7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
*@Article{castagnoli-crc, * author = { Guy Castagnoli and Stefan Braeuer and Martin Herrman}, * title = {{Optimization of Cyclic Redundancy-Check Codes with 24 * and 32 Parity Bits}}, * journal = IEEE Transactions on Communication, * year = {1993}, * volume = {41}, * number = {6}, * pages = {}, * month = {June}, *} * Used by the iSCSI driver, possibly others, and derived from the * the iscsi-crc.c module of the linux-iscsi driver at * http://linux-iscsi.sourceforge.net. |
1da177e4c Linux-2.6.12-rc2 |
21 |
* |
69c35efcf libcrc32c: Move i... |
22 23 24 25 26 27 28 29 |
* Following the example of lib/crc32, this function is intended to be * flexible and useful for all users. Modules that currently have their * own crc32c, but hopefully may be able to use this one are: * net/sctp (please add all your doco to here if you change to * use this one!) * <endoflist> * * Copyright (c) 2004 Cisco Systems, Inc. |
5773a3e6e crypto: crc32c - ... |
30 |
* Copyright (c) 2008 Herbert Xu <herbert@gondor.apana.org.au> |
1da177e4c Linux-2.6.12-rc2 |
31 |
*/ |
5773a3e6e crypto: crc32c - ... |
32 |
|
7bcfb1363 crypto: crc32c-ge... |
33 |
#include <asm/unaligned.h> |
5773a3e6e crypto: crc32c - ... |
34 |
#include <crypto/internal/hash.h> |
1da177e4c Linux-2.6.12-rc2 |
35 36 37 |
#include <linux/init.h> #include <linux/module.h> #include <linux/string.h> |
25cdbcd9e [CRYPTO] crc32c: ... |
38 |
#include <linux/kernel.h> |
6a0962b22 crypto: crc32c sh... |
39 |
#include <linux/crc32.h> |
1da177e4c Linux-2.6.12-rc2 |
40 |
|
5773a3e6e crypto: crc32c - ... |
41 |
#define CHKSUM_BLOCK_SIZE 1 |
1da177e4c Linux-2.6.12-rc2 |
42 43 44 |
#define CHKSUM_DIGEST_SIZE 4 struct chksum_ctx { |
25cdbcd9e [CRYPTO] crc32c: ... |
45 |
u32 key; |
1da177e4c Linux-2.6.12-rc2 |
46 |
}; |
faccc4bba crypto: crc32c - ... |
47 48 49 |
struct chksum_desc_ctx { u32 crc; }; |
1da177e4c Linux-2.6.12-rc2 |
50 |
/* |
db83aabfe crypto: crc32 - F... |
51 |
* Steps through buffer one byte at at time, calculates reflected |
1da177e4c Linux-2.6.12-rc2 |
52 53 |
* crc using table. */ |
faccc4bba crypto: crc32c - ... |
54 |
static int chksum_init(struct shash_desc *desc) |
1da177e4c Linux-2.6.12-rc2 |
55 |
{ |
faccc4bba crypto: crc32c - ... |
56 57 58 59 |
struct chksum_ctx *mctx = crypto_shash_ctx(desc->tfm); struct chksum_desc_ctx *ctx = shash_desc_ctx(desc); ctx->crc = mctx->key; |
1da177e4c Linux-2.6.12-rc2 |
60 |
|
faccc4bba crypto: crc32c - ... |
61 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
62 63 64 65 66 67 68 |
} /* * Setting the seed allows arbitrary accumulators and flexible XOR policy * If your algorithm starts with ~0, then XOR with ~0 before you set * the seed. */ |
faccc4bba crypto: crc32c - ... |
69 |
static int chksum_setkey(struct crypto_shash *tfm, const u8 *key, |
560c06ae1 [CRYPTO] api: Get... |
70 |
unsigned int keylen) |
1da177e4c Linux-2.6.12-rc2 |
71 |
{ |
faccc4bba crypto: crc32c - ... |
72 |
struct chksum_ctx *mctx = crypto_shash_ctx(tfm); |
1da177e4c Linux-2.6.12-rc2 |
73 |
|
faccc4bba crypto: crc32c - ... |
74 75 |
if (keylen != sizeof(mctx->key)) { crypto_shash_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN); |
1da177e4c Linux-2.6.12-rc2 |
76 77 |
return -EINVAL; } |
7bcfb1363 crypto: crc32c-ge... |
78 |
mctx->key = get_unaligned_le32(key); |
1da177e4c Linux-2.6.12-rc2 |
79 80 |
return 0; } |
faccc4bba crypto: crc32c - ... |
81 82 |
static int chksum_update(struct shash_desc *desc, const u8 *data, unsigned int length) |
1da177e4c Linux-2.6.12-rc2 |
83 |
{ |
faccc4bba crypto: crc32c - ... |
84 |
struct chksum_desc_ctx *ctx = shash_desc_ctx(desc); |
1da177e4c Linux-2.6.12-rc2 |
85 |
|
6a0962b22 crypto: crc32c sh... |
86 |
ctx->crc = __crc32c_le(ctx->crc, data, length); |
25cdbcd9e [CRYPTO] crc32c: ... |
87 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
88 |
} |
faccc4bba crypto: crc32c - ... |
89 |
static int chksum_final(struct shash_desc *desc, u8 *out) |
5773a3e6e crypto: crc32c - ... |
90 |
{ |
faccc4bba crypto: crc32c - ... |
91 |
struct chksum_desc_ctx *ctx = shash_desc_ctx(desc); |
5773a3e6e crypto: crc32c - ... |
92 |
|
7bcfb1363 crypto: crc32c-ge... |
93 |
put_unaligned_le32(~ctx->crc, out); |
5773a3e6e crypto: crc32c - ... |
94 95 |
return 0; } |
faccc4bba crypto: crc32c - ... |
96 |
static int __chksum_finup(u32 *crcp, const u8 *data, unsigned int len, u8 *out) |
5773a3e6e crypto: crc32c - ... |
97 |
{ |
7bcfb1363 crypto: crc32c-ge... |
98 |
put_unaligned_le32(~__crc32c_le(*crcp, data, len), out); |
5773a3e6e crypto: crc32c - ... |
99 100 |
return 0; } |
faccc4bba crypto: crc32c - ... |
101 102 |
static int chksum_finup(struct shash_desc *desc, const u8 *data, unsigned int len, u8 *out) |
5773a3e6e crypto: crc32c - ... |
103 |
{ |
faccc4bba crypto: crc32c - ... |
104 |
struct chksum_desc_ctx *ctx = shash_desc_ctx(desc); |
5773a3e6e crypto: crc32c - ... |
105 |
|
faccc4bba crypto: crc32c - ... |
106 |
return __chksum_finup(&ctx->crc, data, len, out); |
5773a3e6e crypto: crc32c - ... |
107 |
} |
faccc4bba crypto: crc32c - ... |
108 109 |
static int chksum_digest(struct shash_desc *desc, const u8 *data, unsigned int length, u8 *out) |
5773a3e6e crypto: crc32c - ... |
110 |
{ |
faccc4bba crypto: crc32c - ... |
111 |
struct chksum_ctx *mctx = crypto_shash_ctx(desc->tfm); |
5773a3e6e crypto: crc32c - ... |
112 |
|
faccc4bba crypto: crc32c - ... |
113 |
return __chksum_finup(&mctx->key, data, length, out); |
5773a3e6e crypto: crc32c - ... |
114 115 116 117 |
} static int crc32c_cra_init(struct crypto_tfm *tfm) { |
faccc4bba crypto: crc32c - ... |
118 |
struct chksum_ctx *mctx = crypto_tfm_ctx(tfm); |
5773a3e6e crypto: crc32c - ... |
119 |
|
faccc4bba crypto: crc32c - ... |
120 |
mctx->key = ~0; |
5773a3e6e crypto: crc32c - ... |
121 122 |
return 0; } |
faccc4bba crypto: crc32c - ... |
123 124 125 |
static struct shash_alg alg = { .digestsize = CHKSUM_DIGEST_SIZE, .setkey = chksum_setkey, |
fae366401 crypto: crc32c - ... |
126 127 128 129 130 |
.init = chksum_init, .update = chksum_update, .final = chksum_final, .finup = chksum_finup, .digest = chksum_digest, |
faccc4bba crypto: crc32c - ... |
131 132 133 134 135 |
.descsize = sizeof(struct chksum_desc_ctx), .base = { .cra_name = "crc32c", .cra_driver_name = "crc32c-generic", .cra_priority = 100, |
a208fa8f3 crypto: hash - an... |
136 |
.cra_flags = CRYPTO_ALG_OPTIONAL_KEY, |
faccc4bba crypto: crc32c - ... |
137 |
.cra_blocksize = CHKSUM_BLOCK_SIZE, |
faccc4bba crypto: crc32c - ... |
138 139 140 |
.cra_ctxsize = sizeof(struct chksum_ctx), .cra_module = THIS_MODULE, .cra_init = crc32c_cra_init, |
5773a3e6e crypto: crc32c - ... |
141 142 |
} }; |
3af5b90bd [CRYPTO] all: Cle... |
143 |
static int __init crc32c_mod_init(void) |
1da177e4c Linux-2.6.12-rc2 |
144 |
{ |
faccc4bba crypto: crc32c - ... |
145 |
return crypto_register_shash(&alg); |
1da177e4c Linux-2.6.12-rc2 |
146 |
} |
3af5b90bd [CRYPTO] all: Cle... |
147 |
static void __exit crc32c_mod_fini(void) |
1da177e4c Linux-2.6.12-rc2 |
148 |
{ |
faccc4bba crypto: crc32c - ... |
149 |
crypto_unregister_shash(&alg); |
1da177e4c Linux-2.6.12-rc2 |
150 |
} |
c4741b230 crypto: run initc... |
151 |
subsys_initcall(crc32c_mod_init); |
3af5b90bd [CRYPTO] all: Cle... |
152 |
module_exit(crc32c_mod_fini); |
1da177e4c Linux-2.6.12-rc2 |
153 154 155 156 |
MODULE_AUTHOR("Clay Haapala <chaapala@cisco.com>"); MODULE_DESCRIPTION("CRC32c (Castagnoli) calculations wrapper for lib/crc32c"); MODULE_LICENSE("GPL"); |
5d26a105b crypto: prefix mo... |
157 |
MODULE_ALIAS_CRYPTO("crc32c"); |
3e14dcf7c crypto: add missi... |
158 |
MODULE_ALIAS_CRYPTO("crc32c-generic"); |