]>
git.zerfleddert.de Git - proxmark3-svn/blob - common/legic_prng.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 //-----------------------------------------------------------------------------
6 // LEFIC's obfuscation function
7 //-----------------------------------------------------------------------------
9 #include "legic_prng.h"
19 // Normal init is set following variables with a random value IV
22 // * someone mentioned iv must be ODD.
24 // Now we have a special case with iv == 0
25 // it sets b to 0 aswell to make sure we get a all zero keystream out
26 // which is used in the initialisation phase sending the IV
28 void legic_prng_init(uint8_t iv
) {
30 lfsr
.b
= 0; // hack to get a always 0 keystream
33 lfsr
.b
= (iv
<< 1) | 1;
36 void legic_prng_forward(int count
) {
37 if (count
== 0) return;
41 // According: http://www.proxmark.org/forum/viewtopic.php?pid=5437#p5437
42 lfsr
.a
= (lfsr
.a
>> 1 | (lfsr
.a
^ lfsr
.a
>> 6) << 6) & 0x7F;
43 lfsr
.b
= lfsr
.b
>> 1 | (lfsr
.b
^ lfsr
.b
>> 2 ^ lfsr
.b
>> 3 ^ lfsr
.b
>> 7) << 7;
47 uint32_t legic_prng_count() {
51 uint8_t legic_prng_get_bit() {
52 uint8_t idx
= 7 - ( (lfsr
.a
& 4) | (lfsr
.a
>> 2 & 2) | (lfsr
.a
>> 4 & 1) );
53 return lfsr
.b
>> idx
& 1;
56 uint32_t legic_prng_get_bits(uint8_t len
){
58 for(uint8_t i
= 0; i
< len
; ++i
) {
59 a
|= legic_prng_get_bit() << i
;
60 legic_prng_forward(1);