Commit | Line | Data |
---|---|---|
f3813f4b KB |
1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | ||
3 | #include <linux/crc64.h> | |
4 | #include <linux/module.h> | |
5 | #include <crypto/internal/hash.h> | |
6 | #include <asm/unaligned.h> | |
7 | ||
8 | static int chksum_init(struct shash_desc *desc) | |
9 | { | |
10 | u64 *crc = shash_desc_ctx(desc); | |
11 | ||
12 | *crc = 0; | |
13 | ||
14 | return 0; | |
15 | } | |
16 | ||
17 | static int chksum_update(struct shash_desc *desc, const u8 *data, | |
18 | unsigned int length) | |
19 | { | |
20 | u64 *crc = shash_desc_ctx(desc); | |
21 | ||
22 | *crc = crc64_rocksoft_generic(*crc, data, length); | |
23 | ||
24 | return 0; | |
25 | } | |
26 | ||
27 | static int chksum_final(struct shash_desc *desc, u8 *out) | |
28 | { | |
29 | u64 *crc = shash_desc_ctx(desc); | |
30 | ||
31 | put_unaligned_le64(*crc, out); | |
32 | return 0; | |
33 | } | |
34 | ||
35 | static int __chksum_finup(u64 crc, const u8 *data, unsigned int len, u8 *out) | |
36 | { | |
37 | crc = crc64_rocksoft_generic(crc, data, len); | |
38 | put_unaligned_le64(crc, out); | |
39 | return 0; | |
40 | } | |
41 | ||
42 | static int chksum_finup(struct shash_desc *desc, const u8 *data, | |
43 | unsigned int len, u8 *out) | |
44 | { | |
45 | u64 *crc = shash_desc_ctx(desc); | |
46 | ||
47 | return __chksum_finup(*crc, data, len, out); | |
48 | } | |
49 | ||
50 | static int chksum_digest(struct shash_desc *desc, const u8 *data, | |
51 | unsigned int length, u8 *out) | |
52 | { | |
53 | return __chksum_finup(0, data, length, out); | |
54 | } | |
55 | ||
56 | static struct shash_alg alg = { | |
57 | .digestsize = sizeof(u64), | |
58 | .init = chksum_init, | |
59 | .update = chksum_update, | |
60 | .final = chksum_final, | |
61 | .finup = chksum_finup, | |
62 | .digest = chksum_digest, | |
63 | .descsize = sizeof(u64), | |
64 | .base = { | |
65 | .cra_name = CRC64_ROCKSOFT_STRING, | |
66 | .cra_driver_name = "crc64-rocksoft-generic", | |
67 | .cra_priority = 200, | |
68 | .cra_blocksize = 1, | |
69 | .cra_module = THIS_MODULE, | |
70 | } | |
71 | }; | |
72 | ||
73 | static int __init crc64_rocksoft_init(void) | |
74 | { | |
75 | return crypto_register_shash(&alg); | |
76 | } | |
77 | ||
78 | static void __exit crc64_rocksoft_exit(void) | |
79 | { | |
80 | crypto_unregister_shash(&alg); | |
81 | } | |
82 | ||
83 | module_init(crc64_rocksoft_init); | |
84 | module_exit(crc64_rocksoft_exit); | |
85 | ||
86 | MODULE_LICENSE("GPL"); | |
87 | MODULE_DESCRIPTION("Rocksoft model CRC64 calculation."); | |
88 | MODULE_ALIAS_CRYPTO("crc64-rocksoft"); | |
89 | MODULE_ALIAS_CRYPTO("crc64-rocksoft-generic"); |