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