proxmark3/common/crc.h
Philippe Teuwen 85def31a8d hitag1/S trace: add crc check
Example:

[usb] pm3 --> trace load -f traces/lf_HitagS256_dump.trace
[+] loaded 272 bytes from binary file traces/lf_HitagS256_dump.trace
[+] Recorded Activity (TraceLen = 272 bytes)
[?] try `trace list -1 -t ...` to view trace.  Remember the `-1` param
[usb] pm3 --> trace list -t hitags -c
[=] downloading tracelog data from device
[+] Recorded activity (trace len = 272 bytes)
[=] start = start of start frame end = end of frame. src = source of transfer
[=] Hitag1 / Hitag2 / HitagS - Timings in ETU (8us)

      Start |        End | Src | Data (! denotes parity error)                                           | CRC | Annotation
------------+------------+-----+-------------------------------------------------------------------------+-----+--------------------
          0 |          0 | Rdr |18(5)                                                                    |     |
        117 |        117 | Tag |21  a5  b4 [73]                                                          | !crc|
          0 |          0 | Rdr |00(5) 21  a5  b4  73 [8c]                                                |  ok |
        117 |        117 | Tag |c9  00  00  aa [75]                                                      |  ok |
          0 |          0 | Rdr |0c(4) 00 [ab]                                                            |  ok |
        117 |        117 | Tag |21  a5  b4  73 [53]                                                      |  ok |
          0 |          0 | Rdr |0c(4) 01 [b6]                                                            |  ok |
        117 |        117 | Tag |c9  00  00  aa [75]                                                      |  ok |
          0 |          0 | Rdr |0c(4) 02 [91]                                                            |  ok |
        117 |        117 | Tag |48  54  4f  4e [2c]                                                      |  ok |
          0 |          0 | Rdr |0c(4) 03 [8c]                                                            |  ok |
        117 |        117 | Tag |4d  49  4b  52 [1e]                                                      |  ok |
          0 |          0 | Rdr |0c(4) 04 [df]                                                            |  ok |
        117 |        117 | Tag |00  00  00  00 [a6]                                                      |  ok |
          0 |          0 | Rdr |0c(4) 05 [c2]                                                            |  ok |
        117 |        117 | Tag |00  00  00  00 [a6]                                                      |  ok |
          0 |          0 | Rdr |0c(4) 06 [e5]                                                            |  ok |
        118 |        118 | Tag |00  00  00  00 [a6]                                                      |  ok |
          0 |          0 | Rdr |0c(4) 07 [f8]                                                            |  ok |
        118 |        118 | Tag |57  5f  4f  4b [88]                                                      |  ok |
          0 |          0 | Rdr |0c(4) 08 [43]                                                            |  ok |
2021-12-30 01:46:41 +01:00

83 lines
3 KiB
C

//-----------------------------------------------------------------------------
// This code is licensed to you under the terms of the GNU GPL, version 2 or,
// at your option, any later version. See the LICENSE.txt file for the text of
// the license.
//-----------------------------------------------------------------------------
// Generic CRC calculation code.
//-----------------------------------------------------------------------------
#ifndef __CRC_H
#define __CRC_H
#include "common.h"
typedef struct crc_ctx {
uint32_t state;
int order;
uint32_t polynom;
uint32_t initial_value;
uint32_t final_xor;
uint32_t mask;
int topbit;
bool refin; /* Parameter: Reflect input bytes? */
bool refout; /* Parameter: Reflect output CRC? */
} crc_t;
/* 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) \
.refin = false, \
.refout = false \
}
/* 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().
* refin is the setting for reversing (bitwise) the bytes during crc
* refot is the setting for reversing (bitwise) the crc byte before returning it.
*/
void crc_init_ref(crc_t *crc, int order, uint32_t polynom, uint32_t initial_value, uint32_t final_xor, bool refin, bool refout);
/* 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(). */
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
* data_width lower-most bits are used).
*/
void crc_update(crc_t *crc, uint32_t data, int data_width);
void crc_update2(crc_t *crc, uint32_t data, int data_width);
/* Clean the crc state, e.g. reset it to initial_value */
void crc_clear(crc_t *crc);
/* Get the result of the crc calculation */
uint32_t crc_finish(crc_t *crc);
// Calculate CRC-8/Maxim checksum
uint32_t CRC8Maxim(uint8_t *buff, size_t size);
// Calculate CRC-8 Mifare MAD checksum
uint32_t CRC8Mad(uint8_t *buff, size_t size);
// Calculate CRC-4/Legic checksum
uint32_t CRC4Legic(uint8_t *buff, size_t size);
// Calculate CRC-8/Legic checksum
uint32_t CRC8Legic(uint8_t *buff, size_t size);
// Calculate CRC-8/Cardx checksum
uint32_t CRC8Cardx(uint8_t *buff, size_t size);
// Calculate CRC-8/Hitag1, ZX8211 checksum
uint32_t CRC8Hitag1(uint8_t *buff, size_t size);
uint32_t CRC8Hitag1Bits(uint8_t *buff, size_t bitsize);
#endif /* __CRC_H */