From d9b53ed189b99cea08c4bd7e0088de1e07c36f7e Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Tue, 21 Sep 2021 23:54:09 +0100 Subject: [PATCH] Add CRC64 (ECMA). --- CMakeLists.txt | 2 +- crc64.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++ crc64.h | 31 +++++++++++++++++++++++ 3 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 crc64.c create mode 100644 crc64.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 93e31c6..ea0c560 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 crc32.c crc32.h 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 crc64.c crc64.h library.h) diff --git a/crc64.c b/crc64.c new file mode 100644 index 0000000..cdeb6c0 --- /dev/null +++ b/crc64.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 "crc64.h" + +#include "library.h" + +crc64_ctx* crc64_init(void) +{ + crc64_ctx* ctx = (crc64_ctx*)malloc(sizeof(crc64_ctx)); + + if(!ctx) return NULL; + + ctx->crc = CRC64_ECMA_SEED; + + for(int i = 0; i < 256; i++) + { + uint64_t entry = (uint64_t)i; + + for(int j = 0; j < 8; j++) + if(entry & 1) ctx->table[i] = (entry >> 1) ^ CRC64_ECMA_POLY; + else + ctx->table[i] >>= 1; + } + + return ctx; +} + +int crc64_update(crc64_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 crc64_final(crc64_ctx* ctx, uint64_t* crc) +{ + if(!ctx) return -1; + + *crc = ctx->crc ^ CRC64_ECMA_SEED; + + return 0; +} + +void crc64_free(crc64_ctx* ctx) +{ + if(ctx) free(ctx); +} \ No newline at end of file diff --git a/crc64.h b/crc64.h new file mode 100644 index 0000000..18e4920 --- /dev/null +++ b/crc64.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 +{ + uint64_t crc; + uint64_t table[256]; +} crc64_ctx; + +#define CRC64_ECMA_POLY 0xC96C5795D7870F42 +#define CRC64_ECMA_SEED 0xFFFFFFFFFFFFFFFF + +crc64_ctx* crc64_init(); +int crc64_update(crc64_ctx* ctx, const uint8_t* data, uint32_t len); +int crc64_final(crc64_ctx* ctx, uint64_t* crc); +void crc64_free(crc64_ctx* ctx); \ No newline at end of file