xref: /linux/crypto/crc64_rocksoft_generic.c (revision f3813f4b)
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