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: *crc, p: data, len: 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(val: *crc, p: 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, p: data, len); |
38 | put_unaligned_le64(val: crc, p: 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: *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(crc: 0, data, len: 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: &alg); |
76 | } |
77 | |
78 | static void __exit crc64_rocksoft_exit(void) |
79 | { |
80 | crypto_unregister_shash(alg: &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" ); |
90 | |