From: henryk@ploetzli.ch Date: Wed, 25 Nov 2009 20:41:41 +0000 (+0000) Subject: Add generic CRC calculation code X-Git-Tag: v1.0.0~449 X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/commitdiff_plain/68d9d60a4d5a4696faf3e36a9a8a7f10ed5bdd22 Add generic CRC calculation code --- diff --git a/armsrc/Makefile b/armsrc/Makefile index 8010fcf0..2cfac4ac 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -25,7 +25,8 @@ THUMBSRC = start.c \ ARMSRC = fpgaloader.c \ legicrf.c \ $(SRC_ISO14443a) \ - $(SRC_ISO14443b) + $(SRC_ISO14443b) \ + crc.c # Do not move this inclusion before the definition of {THUMB,ASM,ARM}SRC include ../common/Makefile.common diff --git a/common/crc.c b/common/crc.c new file mode 100644 index 00000000..817272eb --- /dev/null +++ b/common/crc.c @@ -0,0 +1,41 @@ +/* + * crc.c + * + * Generic CRC calculation code. + * + */ + +#include "crc.h" + +void crc_init(crc_t *crc, int order, uint32_t polynom, uint32_t initial_value, uint32_t final_xor) +{ + crc->order = order; + crc->polynom = polynom; + crc->initial_value = initial_value; + crc->final_xor = final_xor; + crc->mask = (1L<state; + crc->state = crc->state >> 1; + if( (oldstate^data) & 1 ) { + crc->state ^= crc->polynom; + } + data >>= 1; + } +} + +void crc_clear(crc_t *crc) +{ + crc->state = crc->initial_value & crc->mask; +} + +uint32_t crc_finish(crc_t *crc) +{ + return ( crc->state ^ crc->final_xor ) & crc->mask; +} diff --git a/include/crc.h b/include/crc.h new file mode 100644 index 00000000..2ee9a4dd --- /dev/null +++ b/include/crc.h @@ -0,0 +1,47 @@ +/* + * crc.h + * + * Generic CRC calculation code. + * + */ + +#ifndef CRC_H_ +#define CRC_H_ + +#include + +typedef struct crc { + uint32_t state; + int order; + uint32_t polynom; + uint32_t initial_value; + uint32_t final_xor; + uint32_t mask; +} crc_t; + +/* Initialize a crc structure. order is the order of the polynom, e.g. 32 for a CRC-32 + * polynom is the CRC polynom. initial_value is the initial value of a clean state. + * final_xor is XORed onto the state before returning it from crc_result(). */ +extern void crc_init(crc_t *crc, int order, uint32_t polynom, uint32_t initial_value, uint32_t final_xor); + +/* Update the crc state. data is the data of length data_width bits (only the the + * data_width lower-most bits are used). + */ +extern void crc_update(crc_t *crc, uint32_t data, int data_width); + +/* Clean the crc state, e.g. reset it to initial_value */ +extern void crc_clear(crc_t *crc); + +/* Get the result of the crc calculation */ +extern uint32_t crc_finish(crc_t *crc); + +/* Static initialization of a crc structure */ +#define CRC_INITIALIZER(_order, _polynom, _initial_value, _final_xor) { \ + .state = ((_initial_value) & ((1L<<(_order))-1)), \ + .order = (_order), \ + .polynom = (_polynom), \ + .initial_value = (_initial_value), \ + .final_xor = (_final_xor), \ + .mask = ((1L<<(_order))-1) } + +#endif /* CRC_H_ */