]>
cvs.zerfleddert.de Git - proxmark3-svn/blob - common/crc16.c
1 //-----------------------------------------------------------------------------
2 // This code is licensed to you under the terms of the GNU GPL, version 2 or,
3 // at your option, any later version. See the LICENSE.txt file for the text of
5 //-----------------------------------------------------------------------------
7 //-----------------------------------------------------------------------------
10 #define CRC16_MASK_CCITT 0x1021
12 unsigned short update_crc16( unsigned short crc
, unsigned char c
)
14 unsigned short i
, v
, tcrc
= 0;
17 for (i
= 0; i
< 8; i
++) {
18 tcrc
= ( (tcrc
^ v
) & 1 ) ? ( tcrc
>> 1 ) ^ 0x8408 : tcrc
>> 1;
22 return ((crc
>> 8) ^ tcrc
)&0xffff;
25 uint16_t crc16(uint8_t const *message
, int length
, uint16_t remainder
, uint16_t polynomial
) {
30 for (int byte
= 0; byte
< length
; ++byte
) {
31 remainder
^= (message
[byte
] << 8);
32 for (uint8_t bit
= 8; bit
> 0; --bit
) {
33 if (remainder
& 0x8000) {
34 remainder
= (remainder
<< 1) ^ polynomial
;
36 remainder
= (remainder
<< 1);
43 uint16_t crc16_ccitt(uint8_t const *message
, int length
) {
44 return crc16(message
, length
, 0xffff, CRC16_MASK_CCITT
);
47 uint16_t crc16_ccitt_kermit(uint8_t const *message
, int length
) {
48 return bit_reverse_uint16(crc16(message
, length
, 0x0000, CRC16_MASK_CCITT
));
50 uint16_t bit_reverse_uint16 (uint16_t value
) {
51 const uint16_t mask0
= 0x5555;
52 const uint16_t mask1
= 0x3333;
53 const uint16_t mask2
= 0x0F0F;
54 const uint16_t mask3
= 0x00FF;
56 value
= (((~mask0
) & value
) >> 1) | ((mask0
& value
) << 1);
57 value
= (((~mask1
) & value
) >> 2) | ((mask1
& value
) << 2);
58 value
= (((~mask2
) & value
) >> 4) | ((mask2
& value
) << 4);
59 value
= (((~mask3
) & value
) >> 8) | ((mask3
& value
) << 8);