/* * Library: libjamcrc * File: src/plugin_jamcrc.c * Original Author: Lammert Bies * Plugin Author: Syping * * This file is licensed under the MIT License as stated below * * Copyright (c) 1999-2016 Lammert Bies * Copyright (c) 2020 Syping * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #include #include "checksum.h" static void init_crc32_tab(void); static bool crc_tab32_init = false; static uint32_t crc_tab32[256]; static void init_crc32_tab(void) { uint32_t i; uint32_t j; uint32_t crc; for (i = 0; i < 256; i++) { crc = i; for (j = 0; j < 8; j++) { if (crc & 0x00000001L) { crc = (crc >> 1) ^ CRC_POLY_32; } else { crc = crc >> 1; } } crc_tab32[i] = crc; } crc_tab32_init = true; } const char* checkbrute_format() { return "JAMCRC"; } const char* checkbrute_version() { return "0.1"; } uint32_t checkbrute_hash32(unsigned char* data, size_t size) { uint32_t crc; uint32_t tmp; uint32_t long_c; const unsigned char *ptr; size_t a; if (!crc_tab32_init) init_crc32_tab(); crc = CRC_START_32; ptr = data; if (ptr != NULL) for (a = 0; a < size; a++) { long_c = 0x000000FFL & (uint32_t)*ptr; tmp = crc ^ long_c; crc = (crc >> 8) ^ crc_tab32[tmp & 0xff]; ptr++; } crc ^= 0x00000000L; return crc & 0xffffffffL; } int checkbrute_hashsz() { return 4; }