From ee4e2816753bbc28ca10c20cbfbbc7eff404cab9 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Fri, 12 Feb 2016 12:34:05 +0100 Subject: [PATCH 1/1] FIX: legic_prng.c according to user on forum ref: http://www.proxmark.org/forum/viewtopic.php?pid=5437#p5437 needs to be "& 0x7F" ADD: method for calculating the storage crc8. --- common/crc.c | 29 +++++++++++++++++++++++++---- common/crc.h | 9 +++++++-- common/legic_prng.c | 4 +++- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/common/crc.c b/common/crc.c index 0c73474f..21019da9 100644 --- a/common/crc.c +++ b/common/crc.c @@ -6,6 +6,8 @@ // Generic CRC calculation code. //----------------------------------------------------------------------------- #include "crc.h" +#include "util.h" +#include #include #include @@ -21,8 +23,7 @@ void crc_init(crc_t *crc, int order, uint32_t polynom, uint32_t initial_value, u void crc_update(crc_t *crc, uint32_t data, int data_width) { - int i; - for(i=0; istate; crc->state = crc->state >> 1; if( (oldstate^data) & 1 ) { @@ -49,8 +50,28 @@ uint32_t CRC8Maxim(uint8_t *buff, size_t size) crc_init(&crc, 9, 0x8c, 0x00, 0x00); crc_clear(&crc); - for (size_t i=0; i < size; ++i){ + for (size_t i=0; i < size; ++i) crc_update(&crc, buff[i], 8); - } + return crc_finish(&crc); } + +uint32_t CRC8Legic(uint8_t *buff, size_t size) { + + // Poly 0x63, reversed poly 0xC6, Init 0x55, Final 0x00 + crc_t crc; + crc_init(&crc, 8, 0xC6, 0x55, 0); + crc_clear(&crc); + + for ( int i = 0; i < size; ++i) + crc_update(&crc, buff[i], 8); + return SwapBits(crc_finish(&crc), 8); +} + +uint32_t SwapBits(uint32_t value, int nrbits) { + uint32_t newvalue = 0; + for(int i = 0; i < nrbits; i++) { + newvalue ^= ((value >> i) & 1) << (nrbits - 1 - i); + } + return newvalue; +} diff --git a/common/crc.h b/common/crc.h index adbfb237..0c0770a4 100644 --- a/common/crc.h +++ b/common/crc.h @@ -26,7 +26,7 @@ typedef struct crc { * 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 +/* Update the crc state. data is the data of length data_width bits (only the * data_width lower-most bits are used). */ extern void crc_update(crc_t *crc, uint32_t data, int data_width); @@ -38,7 +38,12 @@ extern void crc_clear(crc_t *crc); extern uint32_t crc_finish(crc_t *crc); // Calculate CRC-8/Maxim checksum -uint32_t CRC8Maxim(uint8_t *buff, size_t size ); +uint32_t CRC8Maxim(uint8_t *buff, size_t size); + +// Calculate CRC-8/Legic checksum +uint32_t CRC8Legic(uint8_t *buff, size_t size); +uint32_t SwapBits(uint32_t value, int nrbits); + /* Static initialization of a crc structure */ #define CRC_INITIALIZER(_order, _polynom, _initial_value, _final_xor) { \ .state = ((_initial_value) & ((1L<<(_order))-1)), \ diff --git a/common/legic_prng.c b/common/legic_prng.c index 4f3b1ffe..1f12873c 100644 --- a/common/legic_prng.c +++ b/common/legic_prng.c @@ -26,7 +26,9 @@ void legic_prng_init(uint8_t init) { void legic_prng_forward(int count) { lfsr.c += count; while(count--) { - lfsr.a = lfsr.a >> 1 | (lfsr.a ^ lfsr.a >> 6) << 6; + //lfsr.a = lfsr.a >> 1 | (lfsr.a ^ lfsr.a >> 6) << 6; + // According: http://www.proxmark.org/forum/viewtopic.php?pid=5437#p5437 + lfsr.a = (lfsr.a >> 1 | (lfsr.a ^ lfsr.a >> 6) << 6) & 0x7F; lfsr.b = lfsr.b >> 1 | (lfsr.b ^ lfsr.b >> 2 ^ lfsr.b >> 3 ^ lfsr.b >> 7) << 7; } } -- 2.39.5