]>
cvs.zerfleddert.de Git - proxmark3-svn/blob - client/nonce2key/crypto1.c
fbf888987c8539eee9d8f411daa786938ec243aa
   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 struct Crypto1State 
* crypto1_create(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
) 
  41 void crypto1_get_lfsr(struct Crypto1State 
*state
, uint64_t *lfsr
) 
  44         for(*lfsr 
= 0, i 
= 23; i 
>= 0; --i
) { 
  45                 *lfsr 
= *lfsr 
<< 1 | BIT(state
->odd
, i 
^ 3); 
  46                 *lfsr 
= *lfsr 
<< 1 | BIT(state
->even
, i 
^ 3); 
  49 uint8_t crypto1_bit(struct Crypto1State 
*s
, uint8_t in
, int is_encrypted
) 
  52         uint8_t ret 
= filter(s
->odd
); 
  54         feedin  
= ret 
& !!is_encrypted
; 
  56         feedin 
^= LF_POLY_ODD 
& s
->odd
; 
  57         feedin 
^= LF_POLY_EVEN 
& s
->even
; 
  58         s
->even 
= s
->even 
<< 1 | parity(feedin
); 
  60         s
->odd 
^= (s
->odd 
^= s
->even
, s
->even 
^= s
->odd
); 
  64 uint8_t crypto1_byte(struct Crypto1State 
*s
, uint8_t in
, int is_encrypted
) 
  68         for (i 
= 0; i 
< 8; ++i
) 
  69                 ret 
|= crypto1_bit(s
, BIT(in
, i
), is_encrypted
) << i
; 
  73 uint32_t crypto1_word(struct Crypto1State 
*s
, uint32_t in
, int is_encrypted
) 
  77         for (i 
= 0; i 
< 4; ++i
, in 
<<= 8) 
  78                 ret 
= ret 
<< 8 | crypto1_byte(s
, in 
>> 24, is_encrypted
); 
  84  * helper used to obscure the keystream during authentication 
  86 uint32_t prng_successor(uint32_t x
, uint32_t n
) 
  90                 x 
= x 
>> 1 | (x 
>> 16 ^ x 
>> 18 ^ x 
>> 19 ^ x 
>> 21) << 31;