]> cvs.zerfleddert.de Git - proxmark3-svn/commitdiff
Add generic CRC calculation code
authorhenryk@ploetzli.ch <henryk@ploetzli.ch@ef4ab9da-24cd-11de-8aaa-f3a34680c41f>
Wed, 25 Nov 2009 20:41:41 +0000 (20:41 +0000)
committerhenryk@ploetzli.ch <henryk@ploetzli.ch@ef4ab9da-24cd-11de-8aaa-f3a34680c41f>
Wed, 25 Nov 2009 20:41:41 +0000 (20:41 +0000)
armsrc/Makefile
common/crc.c [new file with mode: 0644]
include/crc.h [new file with mode: 0644]

index 8010fcf07d9a20c9bf900101f22be4282c4d248a..2cfac4acb51cf2fef73acf91a2d3c075cf211f57 100644 (file)
@@ -25,7 +25,8 @@ THUMBSRC = start.c \
 ARMSRC = fpgaloader.c \\r
        legicrf.c \\r
        $(SRC_ISO14443a) \\r
 ARMSRC = fpgaloader.c \\r
        legicrf.c \\r
        $(SRC_ISO14443a) \\r
-       $(SRC_ISO14443b)\r
+       $(SRC_ISO14443b) \\r
+       crc.c\r
 \r
 # Do not move this inclusion before the definition of {THUMB,ASM,ARM}SRC\r
 include ../common/Makefile.common\r
 \r
 # Do not move this inclusion before the definition of {THUMB,ASM,ARM}SRC\r
 include ../common/Makefile.common\r
diff --git a/common/crc.c b/common/crc.c
new file mode 100644 (file)
index 0000000..817272e
--- /dev/null
@@ -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<<order)-1;
+       crc_clear(crc);
+}
+
+void crc_update(crc_t *crc, uint32_t data, int data_width)
+{
+       int i;
+       for(i=0; i<data_width; i++) {
+               int oldstate = crc->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 (file)
index 0000000..2ee9a4d
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * crc.h
+ *
+ * Generic CRC calculation code.
+ * 
+ */
+
+#ifndef CRC_H_
+#define CRC_H_
+
+#include <stdint.h>
+
+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_ */
Impressum, Datenschutz