]>
cvs.zerfleddert.de Git - proxmark3-svn/blob - armsrc/crypto1.c
db864113dbdf5758652c36d4cea1c28190f8b78e
   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
) 
  55         uint8_t ret 
= filter(s
->odd
); 
  57         feedin  
= ret 
& !!is_encrypted
; 
  59         feedin 
^= LF_POLY_ODD 
& s
->odd
; 
  60         feedin 
^= LF_POLY_EVEN 
& s
->even
; 
  61         s
->even 
= s
->even 
<< 1 | parity(feedin
); 
  69 uint8_t crypto1_byte(struct Crypto1State 
*s
, uint8_t in
, int is_encrypted
) 
  74         for (i = 0; i < 8; ++i) 
  75                 ret |= crypto1_bit(s, BIT(in, i), is_encrypted) << i; 
  77 // unfold loop 20161012 
  79         ret 
|= crypto1_bit(s
, BIT(in
, 0), is_encrypted
) << 0; 
  80         ret 
|= crypto1_bit(s
, BIT(in
, 1), is_encrypted
) << 1; 
  81         ret 
|= crypto1_bit(s
, BIT(in
, 2), is_encrypted
) << 2; 
  82         ret 
|= crypto1_bit(s
, BIT(in
, 3), is_encrypted
) << 3; 
  83         ret 
|= crypto1_bit(s
, BIT(in
, 4), is_encrypted
) << 4; 
  84         ret 
|= crypto1_bit(s
, BIT(in
, 5), is_encrypted
) << 5; 
  85         ret 
|= crypto1_bit(s
, BIT(in
, 6), is_encrypted
) << 6; 
  86         ret 
|= crypto1_bit(s
, BIT(in
, 7), is_encrypted
) << 7; 
  89 uint32_t crypto1_word(struct Crypto1State 
*s
, uint32_t in
, int is_encrypted
) 
  94         for (i = 0; i < 32; ++i) 
  95                 ret |= crypto1_bit(s, BEBIT(in, i), is_encrypted) << (i ^ 24); 
  99         ret 
|= crypto1_bit(s
, BEBIT(in
, 0), is_encrypted
) << (0 ^ 24); 
 100         ret 
|= crypto1_bit(s
, BEBIT(in
, 1), is_encrypted
) << (1 ^ 24); 
 101         ret 
|= crypto1_bit(s
, BEBIT(in
, 2), is_encrypted
) << (2 ^ 24); 
 102         ret 
|= crypto1_bit(s
, BEBIT(in
, 3), is_encrypted
) << (3 ^ 24); 
 103         ret 
|= crypto1_bit(s
, BEBIT(in
, 4), is_encrypted
) << (4 ^ 24); 
 104         ret 
|= crypto1_bit(s
, BEBIT(in
, 5), is_encrypted
) << (5 ^ 24); 
 105         ret 
|= crypto1_bit(s
, BEBIT(in
, 6), is_encrypted
) << (6 ^ 24); 
 106         ret 
|= crypto1_bit(s
, BEBIT(in
, 7), is_encrypted
) << (7 ^ 24); 
 108         ret 
|= crypto1_bit(s
, BEBIT(in
, 8), is_encrypted
) << (8 ^ 24); 
 109         ret 
|= crypto1_bit(s
, BEBIT(in
, 9), is_encrypted
) << (9 ^ 24); 
 110         ret 
|= crypto1_bit(s
, BEBIT(in
, 10), is_encrypted
) << (10 ^ 24); 
 111         ret 
|= crypto1_bit(s
, BEBIT(in
, 11), is_encrypted
) << (11 ^ 24); 
 112         ret 
|= crypto1_bit(s
, BEBIT(in
, 12), is_encrypted
) << (12 ^ 24); 
 113         ret 
|= crypto1_bit(s
, BEBIT(in
, 13), is_encrypted
) << (13 ^ 24); 
 114         ret 
|= crypto1_bit(s
, BEBIT(in
, 14), is_encrypted
) << (14 ^ 24); 
 115         ret 
|= crypto1_bit(s
, BEBIT(in
, 15), is_encrypted
) << (15 ^ 24); 
 117         ret 
|= crypto1_bit(s
, BEBIT(in
, 16), is_encrypted
) << (16 ^ 24); 
 118         ret 
|= crypto1_bit(s
, BEBIT(in
, 17), is_encrypted
) << (17 ^ 24); 
 119         ret 
|= crypto1_bit(s
, BEBIT(in
, 18), is_encrypted
) << (18 ^ 24); 
 120         ret 
|= crypto1_bit(s
, BEBIT(in
, 19), is_encrypted
) << (19 ^ 24); 
 121         ret 
|= crypto1_bit(s
, BEBIT(in
, 20), is_encrypted
) << (20 ^ 24); 
 122         ret 
|= crypto1_bit(s
, BEBIT(in
, 21), is_encrypted
) << (21 ^ 24); 
 123         ret 
|= crypto1_bit(s
, BEBIT(in
, 22), is_encrypted
) << (22 ^ 24); 
 124         ret 
|= crypto1_bit(s
, BEBIT(in
, 23), is_encrypted
) << (23 ^ 24); 
 126         ret 
|= crypto1_bit(s
, BEBIT(in
, 24), is_encrypted
) << (24 ^ 24);  
 127         ret 
|= crypto1_bit(s
, BEBIT(in
, 25), is_encrypted
) << (25 ^ 24); 
 128         ret 
|= crypto1_bit(s
, BEBIT(in
, 26), is_encrypted
) << (26 ^ 24); 
 129         ret 
|= crypto1_bit(s
, BEBIT(in
, 27), is_encrypted
) << (27 ^ 24); 
 130         ret 
|= crypto1_bit(s
, BEBIT(in
, 28), is_encrypted
) << (28 ^ 24); 
 131         ret 
|= crypto1_bit(s
, BEBIT(in
, 29), is_encrypted
) << (29 ^ 24); 
 132         ret 
|= crypto1_bit(s
, BEBIT(in
, 30), is_encrypted
) << (30 ^ 24); 
 133         ret 
|= crypto1_bit(s
, BEBIT(in
, 31), is_encrypted
) << (31 ^ 24); 
 138  * helper used to obscure the keystream during authentication 
 140 uint32_t prng_successor(uint32_t x
, uint32_t n
) 
 144                 x 
= x 
>> 1 | (x 
>> 16 ^ x 
>> 18 ^ x 
>> 19 ^ x 
>> 21) << 31; 
 146         return SWAPENDIAN(x
);