162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci#include <linux/crc64.h> 462306a36Sopenharmony_ci#include <linux/module.h> 562306a36Sopenharmony_ci#include <crypto/internal/hash.h> 662306a36Sopenharmony_ci#include <asm/unaligned.h> 762306a36Sopenharmony_ci 862306a36Sopenharmony_cistatic int chksum_init(struct shash_desc *desc) 962306a36Sopenharmony_ci{ 1062306a36Sopenharmony_ci u64 *crc = shash_desc_ctx(desc); 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci *crc = 0; 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci return 0; 1562306a36Sopenharmony_ci} 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cistatic int chksum_update(struct shash_desc *desc, const u8 *data, 1862306a36Sopenharmony_ci unsigned int length) 1962306a36Sopenharmony_ci{ 2062306a36Sopenharmony_ci u64 *crc = shash_desc_ctx(desc); 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci *crc = crc64_rocksoft_generic(*crc, data, length); 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci return 0; 2562306a36Sopenharmony_ci} 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_cistatic int chksum_final(struct shash_desc *desc, u8 *out) 2862306a36Sopenharmony_ci{ 2962306a36Sopenharmony_ci u64 *crc = shash_desc_ctx(desc); 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci put_unaligned_le64(*crc, out); 3262306a36Sopenharmony_ci return 0; 3362306a36Sopenharmony_ci} 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_cistatic int __chksum_finup(u64 crc, const u8 *data, unsigned int len, u8 *out) 3662306a36Sopenharmony_ci{ 3762306a36Sopenharmony_ci crc = crc64_rocksoft_generic(crc, data, len); 3862306a36Sopenharmony_ci put_unaligned_le64(crc, out); 3962306a36Sopenharmony_ci return 0; 4062306a36Sopenharmony_ci} 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_cistatic int chksum_finup(struct shash_desc *desc, const u8 *data, 4362306a36Sopenharmony_ci unsigned int len, u8 *out) 4462306a36Sopenharmony_ci{ 4562306a36Sopenharmony_ci u64 *crc = shash_desc_ctx(desc); 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci return __chksum_finup(*crc, data, len, out); 4862306a36Sopenharmony_ci} 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_cistatic int chksum_digest(struct shash_desc *desc, const u8 *data, 5162306a36Sopenharmony_ci unsigned int length, u8 *out) 5262306a36Sopenharmony_ci{ 5362306a36Sopenharmony_ci return __chksum_finup(0, data, length, out); 5462306a36Sopenharmony_ci} 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_cistatic struct shash_alg alg = { 5762306a36Sopenharmony_ci .digestsize = sizeof(u64), 5862306a36Sopenharmony_ci .init = chksum_init, 5962306a36Sopenharmony_ci .update = chksum_update, 6062306a36Sopenharmony_ci .final = chksum_final, 6162306a36Sopenharmony_ci .finup = chksum_finup, 6262306a36Sopenharmony_ci .digest = chksum_digest, 6362306a36Sopenharmony_ci .descsize = sizeof(u64), 6462306a36Sopenharmony_ci .base = { 6562306a36Sopenharmony_ci .cra_name = CRC64_ROCKSOFT_STRING, 6662306a36Sopenharmony_ci .cra_driver_name = "crc64-rocksoft-generic", 6762306a36Sopenharmony_ci .cra_priority = 200, 6862306a36Sopenharmony_ci .cra_blocksize = 1, 6962306a36Sopenharmony_ci .cra_module = THIS_MODULE, 7062306a36Sopenharmony_ci } 7162306a36Sopenharmony_ci}; 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_cistatic int __init crc64_rocksoft_init(void) 7462306a36Sopenharmony_ci{ 7562306a36Sopenharmony_ci return crypto_register_shash(&alg); 7662306a36Sopenharmony_ci} 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_cistatic void __exit crc64_rocksoft_exit(void) 7962306a36Sopenharmony_ci{ 8062306a36Sopenharmony_ci crypto_unregister_shash(&alg); 8162306a36Sopenharmony_ci} 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_cimodule_init(crc64_rocksoft_init); 8462306a36Sopenharmony_cimodule_exit(crc64_rocksoft_exit); 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 8762306a36Sopenharmony_ciMODULE_DESCRIPTION("Rocksoft model CRC64 calculation."); 8862306a36Sopenharmony_ciMODULE_ALIAS_CRYPTO("crc64-rocksoft"); 8962306a36Sopenharmony_ciMODULE_ALIAS_CRYPTO("crc64-rocksoft-generic"); 90