]>
cvs.zerfleddert.de Git - proxmark3-svn/blob - armsrc/crypto1.c
9d103c7f553ab285fd2410f8ad3a53e8d1e4fb39
   3     This program is free software; you can redistribute it and/or 
   4     modify it under the terms of the GNU General Public License 
   5     as published by the Free Software Foundation; either version 2 
   6     of the License, or (at your option) any later version. 
   8     This program is distributed in the hope that it will be useful, 
   9     but WITHOUT ANY WARRANTY; without even the implied warranty of 
  10     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
  11     GNU General Public License for more details. 
  13     You should have received a copy of the GNU General Public License 
  14     along with this program; if not, write to the Free Software 
  15     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
  18     Copyright (C) 2008-2008 bla <blapost@gmail.com> 
  23 #define SWAPENDIAN(x)\ 
  24         (x = (x >> 8 & 0xff00ff) | (x & 0xff00ff) << 8, x = x >> 16 | x << 16) 
  26 void crypto1_create(struct Crypto1State 
*s
, uint64_t key
) 
  28 //      struct Crypto1State *s = malloc(sizeof(*s)); 
  31         for(i 
= 47;s 
&& i 
> 0; i 
-= 2) { 
  32                 s
->odd  
= s
->odd  
<< 1 | BIT(key
, (i 
- 1) ^ 7); 
  33                 s
->even 
= s
->even 
<< 1 | BIT(key
, i 
^ 7); 
  37 void crypto1_destroy(struct Crypto1State 
*state
) 
  43 void crypto1_get_lfsr(struct Crypto1State 
*state
, uint64_t *lfsr
) 
  46         for(*lfsr 
= 0, i 
= 23; i 
>= 0; --i
) { 
  47                 *lfsr 
= *lfsr 
<< 1 | BIT(state
->odd
, i 
^ 3); 
  48                 *lfsr 
= *lfsr 
<< 1 | BIT(state
->even
, i 
^ 3); 
  51 uint8_t crypto1_bit(struct Crypto1State 
*s
, uint8_t in
, int is_encrypted
) 
  54         uint8_t ret 
= filter(s
->odd
); 
  56         feedin  
= ret 
& !!is_encrypted
; 
  58         feedin 
^= LF_POLY_ODD 
& s
->odd
; 
  59         feedin 
^= LF_POLY_EVEN 
& s
->even
; 
  60         s
->even 
= s
->even 
<< 1 | parity(feedin
); 
  62         s
->odd 
^= (s
->odd 
^= s
->even
, s
->even 
^= s
->odd
); 
  66 uint8_t crypto1_byte(struct Crypto1State 
*s
, uint8_t in
, int is_encrypted
) 
  70         for (i 
= 0; i 
< 8; ++i
) 
  71                 ret 
|= crypto1_bit(s
, BIT(in
, i
), is_encrypted
) << i
; 
  75 uint32_t crypto1_word(struct Crypto1State 
*s
, uint32_t in
, int is_encrypted
) 
  79         for (i 
= 0; i 
< 32; ++i
) 
  80                 ret 
|= crypto1_bit(s
, BEBIT(in
, i
), is_encrypted
) << (i 
^ 24); 
  86  * helper used to obscure the keystream during authentication 
  88 uint32_t prng_successor(uint32_t x
, uint32_t n
) 
  92                 x 
= x 
>> 1 | (x 
>> 16 ^ x 
>> 18 ^ x 
>> 19 ^ x 
>> 21) << 31;