diff --git a/CMakeLists.txt b/CMakeLists.txt index ae02715..93e31c6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,4 +3,4 @@ project("Aaru.Checksums.Native" C) set(CMAKE_C_STANDARD 90) -add_library("Aaru.Checksums.Native" SHARED adler32.h adler32.c crc16.h crc16.c crc16_ccitt.h crc16_ccitt.c library.h) +add_library("Aaru.Checksums.Native" SHARED adler32.h adler32.c crc16.h crc16.c crc16_ccitt.h crc16_ccitt.c crc32.c crc32.h library.h) diff --git a/crc32.c b/crc32.c new file mode 100644 index 0000000..8aab08a --- /dev/null +++ b/crc32.c @@ -0,0 +1,68 @@ +/* + * This file is part of the Aaru Data Preservation Suite. + * Copyright (c) 2019-2021 Natalia Portillo. + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +#include +#include + +#include "crc32.h" + +#include "library.h" + +crc32_ctx* crc32_init(void) +{ + crc32_ctx* ctx = (crc32_ctx*)malloc(sizeof(crc32_ctx)); + + if(!ctx) return NULL; + + ctx->crc = CRC32_ISO_SEED; + + for(int i = 0; i < 256; i++) + { + uint32_t entry = (uint32_t)i; + + for(int j = 0; j < 8; j++) + if(entry & 1) ctx->table[i] = (entry >> 1) ^ CRC32_ISO_POLY; + else + ctx->table[i] >>= 1; + } + + return ctx; +} + +int crc32_update(crc32_ctx* ctx, const uint8_t* data, uint32_t len) +{ + if(!ctx || !data) return -1; + + for(uint32_t i = 0; i < len; i++) ctx->crc = (ctx->crc >> 8) ^ ctx->table[data[i] ^ (ctx->crc & 0xff)]; + + return 0; +} + +int crc32_final(crc32_ctx* ctx, uint32_t* crc) +{ + if(!ctx) return -1; + + *crc = ctx->crc ^ CRC32_ISO_SEED; + + return 0; +} + +void crc32_free(crc32_ctx* ctx) +{ + if(ctx) free(ctx); +} \ No newline at end of file diff --git a/crc32.h b/crc32.h new file mode 100644 index 0000000..0c6e271 --- /dev/null +++ b/crc32.h @@ -0,0 +1,31 @@ +/* + * This file is part of the Aaru Data Preservation Suite. + * Copyright (c) 2019-2021 Natalia Portillo. + * + * This library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of the + * License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see . + */ + +typedef struct +{ + uint32_t crc; + uint32_t table[256]; +} crc32_ctx; + +#define CRC32_ISO_POLY 0xEDB88320 +#define CRC32_ISO_SEED 0xFFFFFFFF + +crc32_ctx* crc32_init(); +int crc32_update(crc32_ctx* ctx, const uint8_t* data, uint32_t len); +int crc32_final(crc32_ctx* ctx, uint32_t* crc); +void crc32_free(crc32_ctx* ctx); \ No newline at end of file