]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - common/crc32.c
FIX: The input handling for "hf 14b write" is now correct. Thanks Asper for spotting...
[proxmark3-svn] / common / crc32.c
diff --git a/common/crc32.c b/common/crc32.c
new file mode 100644 (file)
index 0000000..69d770f
--- /dev/null
@@ -0,0 +1,35 @@
+#include <stdint.h>
+#include <stddef.h>
+#include "crc32.h"
+
+#define htole32(x) (x)
+#define CRC32_PRESET 0xFFFFFFFF
+
+
+static void crc32_byte (uint32_t *crc, const uint8_t value);
+
+static void crc32_byte (uint32_t *crc, const uint8_t value) {
+    /* x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1 */
+    const uint32_t poly = 0xEDB88320;
+
+    *crc ^= value;
+    for (int current_bit = 7; current_bit >= 0; current_bit--) {
+        int bit_out = (*crc) & 0x00000001;
+        *crc >>= 1;
+        if (bit_out)
+            *crc ^= poly;
+    }
+}
+
+void crc32 (const uint8_t *data, const size_t len, uint8_t *crc) {
+    uint32_t desfire_crc = CRC32_PRESET;
+    for (size_t i = 0; i < len; i++) {
+        crc32_byte (&desfire_crc, data[i]);
+    }
+
+    *((uint32_t *)(crc)) = htole32 (desfire_crc);
+}
+
+void crc32_append (uint8_t *data, const size_t len) {
+    crc32 (data, len, data + len);
+}
Impressum, Datenschutz