90 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2 3#include <linux/crc64.h>4#include <linux/module.h>5#include <crypto/internal/hash.h>6#include <linux/unaligned.h>7 8static 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 17static 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 27static 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 35static 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 42static 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 50static 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 56static 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 73static int __init crc64_rocksoft_init(void)74{75 return crypto_register_shash(&alg);76}77 78static void __exit crc64_rocksoft_exit(void)79{80 crypto_unregister_shash(&alg);81}82 83module_init(crc64_rocksoft_init);84module_exit(crc64_rocksoft_exit);85 86MODULE_LICENSE("GPL");87MODULE_DESCRIPTION("Rocksoft model CRC64 calculation.");88MODULE_ALIAS_CRYPTO("crc64-rocksoft");89MODULE_ALIAS_CRYPTO("crc64-rocksoft-generic");90