crc64_rocksoft_generic.c (1904B)
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 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");