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 <linux/unaligned.h> 7 8 static 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 17 static 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 27 static 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 35 static 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 42 static 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 50 static 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 56 static 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 73 static int __init crc64_rocksoft_init(void) 74 { 75 return crypto_register_shash(&alg); 76 } 77 78 static void __exit crc64_rocksoft_exit(void) 79 { 80 crypto_unregister_shash(&alg); 81 } 82 83 module_init(crc64_rocksoft_init); 84 module_exit(crc64_rocksoft_exit); 85 86 MODULE_LICENSE("GPL"); 87 MODULE_DESCRIPTION("Rocksoft model CRC64 calculation."); 88 MODULE_ALIAS_CRYPTO("crc64-rocksoft"); 89 MODULE_ALIAS_CRYPTO("crc64-rocksoft-generic"); 90