]>
cvs.zerfleddert.de Git - proxmark3-svn/blob - common/crc.c
153ff11c235d50ecaf8f60de04654986e25c887a
   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 //----------------------------------------------------------------------------- 
   6 // Generic CRC calculation code. 
   7 //----------------------------------------------------------------------------- 
  12 void crc_init(crc_t 
*crc
, int order
, uint32_t polynom
, uint32_t initial_value
, uint32_t final_xor
) 
  15         crc
->polynom 
= polynom
; 
  16         crc
->initial_value 
= initial_value
; 
  17         crc
->final_xor 
= final_xor
; 
  18         crc
->mask 
= (1L<<order
)-1; 
  22 void crc_update(crc_t 
*crc
, uint32_t data
, int data_width
) 
  25         for(i
=0; i
<data_width
; i
++) { 
  26                 int oldstate 
= crc
->state
; 
  27                 crc
->state 
= crc
->state 
>> 1; 
  28                 if( (oldstate
^data
) & 1 ) { 
  29                         crc
->state 
^= crc
->polynom
; 
  35 void crc_clear(crc_t 
*crc
) 
  37         crc
->state 
= crc
->initial_value 
& crc
->mask
; 
  40 uint32_t crc_finish(crc_t 
*crc
) 
  42         return ( crc
->state 
^ crc
->final_xor 
) & crc
->mask
; 
  45 int CRC8Maxim(uint8_t *buff
, size_t size  
) { 
  48         crc_init(&crc
, 8, 0x31, 0x00, 0x00); 
  51         for ( int i
=0; i 
< size
; ++i
){ 
  52                 crc_update(&crc
, buff
[i
], 8); 
  54         return crc_finish(&crc
);