rizin/librz/hash/p/algo_crca.c
billow 7a77b8f7bd
linter: update clang-format installation to version 20 (#5451)
* fix: format with clang-format-20
* fix: fix clang-format linter with rewrite '^#define.*/\*.*\\$'
* fix: update clang-format to version 20 in workflows and documentation
* fix: add SPDX license information to .git-blame-ignore-revs
2025-10-12 08:02:03 +08:00

179 lines
8.7 KiB
C

// SPDX-FileCopyrightText: 2021 deroad <wargio@libero.it>
// SPDX-License-Identifier: LGPL-3.0-only
#include <rz_hash.h>
#include <rz_util/rz_assert.h>
#include "../algorithms/crc/crca.h"
#define plugin_crca_preset_context_new(crcalgo, preset) \
static void *plugin_crca_##crcalgo##_context_new() { \
RzCrc *crc = RZ_NEW0(RzCrc); \
if (!crc) { \
return NULL; \
} \
crc_init_preset(crc, preset); \
return crc; \
}
#define plugin_crca_preset_init(crcalgo, preset) \
static bool plugin_crca_##crcalgo##_init(void *context) { \
rz_return_val_if_fail(context, false); \
crc_init_preset((RzCrc *)context, preset); \
return true; \
}
#define plugin_crca_preset_small_block(crcalgo, preset) \
static bool plugin_crca_##crcalgo##_small_block(const ut8 *data, ut64 size, ut8 **digest, RzHashSize *digest_size) { \
rz_return_val_if_fail(data && digest, false); \
RzCrc ctx; \
crc_init_preset(&ctx, preset); \
ut8 *dgst = malloc(plugin_crca_digest_size(&ctx)); \
if (!dgst) { \
return false; \
} \
crc_update(&ctx, data, size); \
plugin_crca_final((void *)&ctx, dgst); \
*digest = dgst; \
if (digest_size) { \
*digest_size = plugin_crca_digest_size(&ctx); \
} \
return true; \
}
static void plugin_crca_context_free(void *context) {
free(context);
}
static RzHashSize plugin_crca_digest_size(void *context) {
rz_return_val_if_fail(context, 0);
RzCrc *ctx = (RzCrc *)context;
if (ctx->size <= 8) {
return 1;
} else if (ctx->size > 8 && ctx->size <= 16) {
return 2;
} else if (ctx->size > 16 && ctx->size <= 32) {
return 4;
} else if (ctx->size > 32 && ctx->size <= 64) {
return 8;
}
RZ_LOG_ERROR("msg digest: unknown size %d.\n", ctx->size);
return 0;
}
static RzHashSize plugin_crca_block_size(void *context) {
return 0;
}
static bool plugin_crca_update(void *context, const ut8 *data, ut64 size) {
rz_return_val_if_fail(context && data, false);
crc_update((RzCrc *)context, data, size);
return true;
}
static bool plugin_crca_final(void *context, ut8 *digest) {
rz_return_val_if_fail(context && digest, false);
RzCrc *ctx = (RzCrc *)context;
utcrc r;
crc_final(ctx, &r);
if (ctx->size <= 8) {
rz_write_be8(digest, (ut8)r);
} else if (ctx->size > 8 && ctx->size <= 16) {
rz_write_be16(digest, (ut16)r);
} else if (ctx->size > 16 && ctx->size <= 32) {
rz_write_be32(digest, (ut32)r);
} else if (ctx->size > 32 && ctx->size <= 64) {
rz_write_be64(digest, r);
} else {
RZ_LOG_ERROR("msg digest: unknown size %d.\n", ctx->size);
}
return true;
}
#define rz_hash_plugin_crca_preset(crcalgo, preset, crcdesc) \
plugin_crca_preset_context_new(crcalgo, preset); \
plugin_crca_preset_init(crcalgo, preset); \
plugin_crca_preset_small_block(crcalgo, preset); \
RzHashPlugin rz_hash_plugin_crca_##crcalgo = { \
.name = #crcalgo, \
.license = "LGPL3", \
.author = "deroad", \
.description = crcdesc, \
.support_hmac = false, \
.context_new = plugin_crca_##crcalgo##_context_new, \
.context_free = plugin_crca_context_free, \
.digest_size = plugin_crca_digest_size, \
.block_size = plugin_crca_block_size, \
.init = plugin_crca_##crcalgo##_init, \
.update = plugin_crca_update, \
.final = plugin_crca_final, \
.small_block = plugin_crca_##crcalgo##_small_block, \
}
#ifndef RZ_PLUGIN_INCORE
#define rz_lib_plugin_crca_preset(crcalgo) \
RZ_API RzLibStruct rizin_plugin = { \
.type = RZ_LIB_TYPE_HASH, \
.data = &rz_hash_plugin_crca_##crcalgo, \
.version = RZ_VERSION \
}
#else
#define rz_lib_plugin_crca_preset(crcalgo)
#endif
#define rz_plugin_crca_preset_definition(crcalgo, preset, crcdesc) \
rz_hash_plugin_crca_preset(crcalgo, preset, crcdesc); \
rz_lib_plugin_crca_preset(crcalgo)
rz_plugin_crca_preset_definition(crc8smbus, /* */ CRC_PRESET_8_SMBUS, "CRC-8 SMBUS checksum");
rz_plugin_crca_preset_definition(crc8cdma2000, /* */ CRC_PRESET_CRC8_CDMA2000, "CRC-8 CDMA-2000 checksum");
rz_plugin_crca_preset_definition(crc8darc, /* */ CRC_PRESET_CRC8_DARC, "CRC-8 DARC checksum");
rz_plugin_crca_preset_definition(crc8dvbs2, /* */ CRC_PRESET_CRC8_DVB_S2, "CRC-8 DVB-S2 checksum");
rz_plugin_crca_preset_definition(crc8ebu, /* */ CRC_PRESET_CRC8_EBU, "CRC-8 EBU checksum");
rz_plugin_crca_preset_definition(crc8icode, /* */ CRC_PRESET_CRC8_ICODE, "CRC-8 I-CODE checksum");
rz_plugin_crca_preset_definition(crc8itu, /* */ CRC_PRESET_CRC8_ITU, "CRC-8 ITU checksum");
rz_plugin_crca_preset_definition(crc8maxim, /* */ CRC_PRESET_CRC8_MAXIM, "CRC-8 MAXIM checksum");
rz_plugin_crca_preset_definition(crc8rohc, /* */ CRC_PRESET_CRC8_ROHC, "CRC-8 ROHC checksum");
rz_plugin_crca_preset_definition(crc8wcdma, /* */ CRC_PRESET_CRC8_WCDMA, "CRC-8 WCDMA checksum");
rz_plugin_crca_preset_definition(crc15can, /* */ CRC_PRESET_15_CAN, "CRC-15 CAN checksum");
rz_plugin_crca_preset_definition(crc16, /* */ CRC_PRESET_16, "CRC-16 IBM/ARC checksum");
rz_plugin_crca_preset_definition(crc16citt, /* */ CRC_PRESET_16_CITT, "CRC-16 CITT checksum");
rz_plugin_crca_preset_definition(crc16usb, /* */ CRC_PRESET_16_USB, "CRC-16 USB checksum");
rz_plugin_crca_preset_definition(crc16hdlc, /* */ CRC_PRESET_16_HDLC, "CRC-16 HDLC checksum");
rz_plugin_crca_preset_definition(crc16augccitt, /**/ CRC_PRESET_CRC16_AUG_CCITT, "CRC-16 AUG-CCITT checksum");
rz_plugin_crca_preset_definition(crc16buypass, /* */ CRC_PRESET_CRC16_BUYPASS, "CRC-16 BUYPASS checksum");
rz_plugin_crca_preset_definition(crc16cdma2000, /**/ CRC_PRESET_CRC16_CDMA2000, "CRC-16 CDMA-2000 checksum");
rz_plugin_crca_preset_definition(crc16dds110, /* */ CRC_PRESET_CRC16_DDS110, "CRC-16 DDS110 checksum");
rz_plugin_crca_preset_definition(crc16dectr, /* */ CRC_PRESET_CRC16_DECT_R, "CRC-16 DECT-R checksum");
rz_plugin_crca_preset_definition(crc16dectx, /* */ CRC_PRESET_CRC16_DECT_X, "CRC-16 DECT-X checksum");
rz_plugin_crca_preset_definition(crc16dnp, /* */ CRC_PRESET_CRC16_DNP, "CRC-16 DNP checksum");
rz_plugin_crca_preset_definition(crc16en13757, /* */ CRC_PRESET_CRC16_EN13757, "CRC-16 EN-13757 checksum");
rz_plugin_crca_preset_definition(crc16genibus, /* */ CRC_PRESET_CRC16_GENIBUS, "CRC-16 GENIBUS checksum");
rz_plugin_crca_preset_definition(crc16maxim, /* */ CRC_PRESET_CRC16_MAXIM, "CRC-16 MAXIM checksum");
rz_plugin_crca_preset_definition(crc16mcrf4xx, /* */ CRC_PRESET_CRC16_MCRF4XX, "CRC-16 MCRF4XX checksum");
rz_plugin_crca_preset_definition(crc16riello, /* */ CRC_PRESET_CRC16_RIELLO, "CRC-16 RIELLO checksum");
rz_plugin_crca_preset_definition(crc16t10dif, /* */ CRC_PRESET_CRC16_T10_DIF, "CRC-16 T10-DIF checksum");
rz_plugin_crca_preset_definition(crc16teledisk, /**/ CRC_PRESET_CRC16_TELEDISK, "CRC-16 TELEDISK checksum");
rz_plugin_crca_preset_definition(crc16tms37157, /**/ CRC_PRESET_CRC16_TMS37157, "CRC-16 TMS37157 checksum");
rz_plugin_crca_preset_definition(crca, /* */ CRC_PRESET_CRCA, "CRC-16/CRCA checksum");
rz_plugin_crca_preset_definition(crc16kermit, /* */ CRC_PRESET_CRC16_KERMIT, "CRC-16 KERMIT checksum");
rz_plugin_crca_preset_definition(crc16modbus, /* */ CRC_PRESET_CRC16_MODBUS, "CRC-16 MODBUS checksum");
rz_plugin_crca_preset_definition(crc16x25, /* */ CRC_PRESET_CRC16_X25, "CRC-16 X25 checksum");
rz_plugin_crca_preset_definition(crc16xmodem, /* */ CRC_PRESET_CRC16_XMODEM, "CRC-16 XMODEM checksum");
rz_plugin_crca_preset_definition(crc24, /* */ CRC_PRESET_24, "CRC-24 checksum");
rz_plugin_crca_preset_definition(crc32, /* */ CRC_PRESET_32, "CRC-32 checksum");
rz_plugin_crca_preset_definition(crc32ecma267, /* */ CRC_PRESET_32_ECMA_267, "CRC-32 ECMA-267 checksum (EDC for DVD sectors)");
rz_plugin_crca_preset_definition(crc32c, /* */ CRC_PRESET_32C, "CRC-32C checksum");
rz_plugin_crca_preset_definition(crc32bzip2, /* */ CRC_PRESET_CRC32_BZIP2, "CRC-32 BZIP2 checksum");
rz_plugin_crca_preset_definition(crc32d, /* */ CRC_PRESET_CRC32D, "CRC-32D checksum");
rz_plugin_crca_preset_definition(crc32mpeg2, /* */ CRC_PRESET_CRC32_MPEG2, "CRC-32 MPEG2 checksum");
rz_plugin_crca_preset_definition(crc32posix, /* */ CRC_PRESET_CRC32_POSIX, "CRC-32 POSIX checksum");
rz_plugin_crca_preset_definition(crc32q, /* */ CRC_PRESET_CRC32Q, "CRC-32Q checksum");
rz_plugin_crca_preset_definition(crc32jamcrc, /* */ CRC_PRESET_CRC32_JAMCRC, "CRC-32 JAMCRC checksum");
rz_plugin_crca_preset_definition(crc32xfer, /* */ CRC_PRESET_CRC32_XFER, "CRC-32 XFER checksum");
rz_plugin_crca_preset_definition(crc64, /* */ CRC_PRESET_CRC64, "CRC-64 checksum");
rz_plugin_crca_preset_definition(crc64ecma182, /* */ CRC_PRESET_CRC64_ECMA182, "CRC-64 ECMA-182 checksum");
rz_plugin_crca_preset_definition(crc64we, /* */ CRC_PRESET_CRC64_WE, "CRC-64 WE checksum");
rz_plugin_crca_preset_definition(crc64xz, /* */ CRC_PRESET_CRC64_XZ, "CRC-64 XZ checksum");
rz_plugin_crca_preset_definition(crc64iso, /* */ CRC_PRESET_CRC64_ISO, "CRC-64 ISO checksum");