1 // SPDX-License-Identifier: GPL-2.0-only
3 #include <linux/crc64.h>
4 #include <linux/module.h>
5 #include <crypto/internal/hash.h>
6 #include <linux/unaligned.h>
8 static int chksum_init(struct shash_desc
*desc
)
10 u64
*crc
= shash_desc_ctx(desc
);
17 static int chksum_update(struct shash_desc
*desc
, const u8
*data
,
20 u64
*crc
= shash_desc_ctx(desc
);
22 *crc
= crc64_rocksoft_generic(*crc
, data
, length
);
27 static int chksum_final(struct shash_desc
*desc
, u8
*out
)
29 u64
*crc
= shash_desc_ctx(desc
);
31 put_unaligned_le64(*crc
, out
);
35 static int __chksum_finup(u64 crc
, const u8
*data
, unsigned int len
, u8
*out
)
37 crc
= crc64_rocksoft_generic(crc
, data
, len
);
38 put_unaligned_le64(crc
, out
);
42 static int chksum_finup(struct shash_desc
*desc
, const u8
*data
,
43 unsigned int len
, u8
*out
)
45 u64
*crc
= shash_desc_ctx(desc
);
47 return __chksum_finup(*crc
, data
, len
, out
);
50 static int chksum_digest(struct shash_desc
*desc
, const u8
*data
,
51 unsigned int length
, u8
*out
)
53 return __chksum_finup(0, data
, length
, out
);
56 static struct shash_alg alg
= {
57 .digestsize
= sizeof(u64
),
59 .update
= chksum_update
,
60 .final
= chksum_final
,
61 .finup
= chksum_finup
,
62 .digest
= chksum_digest
,
63 .descsize
= sizeof(u64
),
65 .cra_name
= CRC64_ROCKSOFT_STRING
,
66 .cra_driver_name
= "crc64-rocksoft-generic",
69 .cra_module
= THIS_MODULE
,
73 static int __init
crc64_rocksoft_init(void)
75 return crypto_register_shash(&alg
);
78 static void __exit
crc64_rocksoft_exit(void)
80 crypto_unregister_shash(&alg
);
83 module_init(crc64_rocksoft_init
);
84 module_exit(crc64_rocksoft_exit
);
86 MODULE_LICENSE("GPL");
87 MODULE_DESCRIPTION("Rocksoft model CRC64 calculation.");
88 MODULE_ALIAS_CRYPTO("crc64-rocksoft");
89 MODULE_ALIAS_CRYPTO("crc64-rocksoft-generic");