projects
/
proxmark3-svn
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
chg: lets not have it static, since I get the same nonce in the same session over...
[proxmark3-svn]
/
tools
/
nonce2key
/
crapto1.c
diff --git
a/tools/nonce2key/crapto1.c
b/tools/nonce2key/crapto1.c
index 61922481256e940e2ef3d7df0c4959d7aeb66237..1d854d96b1ab39fa81b8c1d2dc447ae726de02d3 100644
(file)
--- a/
tools/nonce2key/crapto1.c
+++ b/
tools/nonce2key/crapto1.c
@@
-95,26
+95,10
@@
static void bucket_sort_intersect(uint32_t* const estart, uint32_t* const estop,
}
\r
}
\r
\r
}
\r
}
\r
\r
-/** binsearch
\r
- * Binary search for the first occurence of *stop's MSB in sorted [start,stop]
\r
- */
\r
-static inline uint32_t* binsearch(uint32_t *start, uint32_t *stop)
\r
-{
\r
- uint32_t mid, val = *stop & 0xff000000;
\r
- while(start != stop)
\r
- if(start[mid = (stop - start) >> 1] > val)
\r
- stop = &start[mid];
\r
- else
\r
- start += mid + 1;
\r
-
\r
- return start;
\r
-}
\r
-
\r
/** update_contribution
\r
* helper, calculates the partial linear feedback contributions and puts in MSB
\r
*/
\r
/** update_contribution
\r
* helper, calculates the partial linear feedback contributions and puts in MSB
\r
*/
\r
-static inline void
\r
-update_contribution(uint32_t *item, const uint32_t mask1, const uint32_t mask2)
\r
+static inline void update_contribution(uint32_t *item, const uint32_t mask1, const uint32_t mask2)
\r
{
\r
uint32_t p = *item >> 25;
\r
\r
{
\r
uint32_t p = *item >> 25;
\r
\r
@@
-126,8
+110,7
@@
update_contribution(uint32_t *item, const uint32_t mask1, const uint32_t mask2)
/** extend_table
\r
* using a bit of the keystream extend the table of possible lfsr states
\r
*/
\r
/** extend_table
\r
* using a bit of the keystream extend the table of possible lfsr states
\r
*/
\r
-static inline void
\r
-extend_table(uint32_t *tbl, uint32_t **end, int bit, int m1, int m2, uint32_t in)
\r
+static inline void extend_table(uint32_t *tbl, uint32_t **end, int bit, int m1, int m2, uint32_t in)
\r
{
\r
in <<= 24;
\r
for(*tbl <<= 1; tbl <= *end; *++tbl <<= 1)
\r
{
\r
in <<= 24;
\r
for(*tbl <<= 1; tbl <= *end; *++tbl <<= 1)
\r
@@
-150,14
+133,16
@@
extend_table(uint32_t *tbl, uint32_t **end, int bit, int m1, int m2, uint32_t in
*/
\r
static inline void extend_table_simple(uint32_t *tbl, uint32_t **end, int bit)
\r
{
\r
*/
\r
static inline void extend_table_simple(uint32_t *tbl, uint32_t **end, int bit)
\r
{
\r
- for(*tbl <<= 1; tbl <= *end; *++tbl <<= 1)
\r
+ for(*tbl <<= 1; tbl <= *end; *++tbl <<= 1)
{
\r
if(filter(*tbl) ^ filter(*tbl | 1)) { // replace
\r
*tbl |= filter(*tbl) ^ bit;
\r
} else if(filter(*tbl) == bit) { // insert
\r
*++*end = *++tbl;
\r
*tbl = tbl[-1] | 1;
\r
if(filter(*tbl) ^ filter(*tbl | 1)) { // replace
\r
*tbl |= filter(*tbl) ^ bit;
\r
} else if(filter(*tbl) == bit) { // insert
\r
*++*end = *++tbl;
\r
*tbl = tbl[-1] | 1;
\r
- } else
// drop
\r
+ } else
{
// drop
\r
*tbl-- = *(*end)--;
\r
*tbl-- = *(*end)--;
\r
+ }
\r
+ }
\r
}
\r
/** recover
\r
* recursively narrow down the search space, 4 bits of keystream at a time
\r
}
\r
/** recover
\r
* recursively narrow down the search space, 4 bits of keystream at a time
\r
@@
-186,13
+171,11
@@
recover(uint32_t *o_head, uint32_t *o_tail, uint32_t oks,
oks >>= 1;
\r
eks >>= 1;
\r
in >>= 2;
\r
oks >>= 1;
\r
eks >>= 1;
\r
in >>= 2;
\r
- extend_table(o_head, &o_tail, oks & 1, LF_POLY_EVEN << 1 | 1,
\r
- LF_POLY_ODD << 1, 0);
\r
+ extend_table(o_head, &o_tail, oks & 1, LF_POLY_EVEN << 1 | 1, LF_POLY_ODD << 1, 0);
\r
if(o_head > o_tail)
\r
return sl;
\r
\r
if(o_head > o_tail)
\r
return sl;
\r
\r
- extend_table(e_head, &e_tail, eks & 1, LF_POLY_ODD,
\r
- LF_POLY_EVEN << 1 | 1, in & 3);
\r
+ extend_table(e_head, &e_tail, eks & 1, LF_POLY_ODD, LF_POLY_EVEN << 1 | 1, in & 3);
\r
if(e_head > e_tail)
\r
return sl;
\r
}
\r
if(e_head > e_tail)
\r
return sl;
\r
}
\r
@@
-238,14
+221,15
@@
struct Crypto1State* lfsr_recovery32(uint32_t ks2, uint32_t in)
\r
// allocate memory for out of place bucket_sort
\r
bucket_array_t bucket;
\r
\r
// allocate memory for out of place bucket_sort
\r
bucket_array_t bucket;
\r
- for (uint32_t i = 0; i < 2; i++)
\r
+
\r
+ for (uint32_t i = 0; i < 2; i++) {
\r
for (uint32_t j = 0; j <= 0xff; j++) {
\r
bucket[i][j].head = malloc(sizeof(uint32_t)<<14);
\r
if (!bucket[i][j].head) {
\r
goto out;
\r
}
\r
}
\r
for (uint32_t j = 0; j <= 0xff; j++) {
\r
bucket[i][j].head = malloc(sizeof(uint32_t)<<14);
\r
if (!bucket[i][j].head) {
\r
goto out;
\r
}
\r
}
\r
-
\r
+ }
\r
\r
// initialize statelists: add all possible states which would result into the rightmost 2 bits of the keystream
\r
for(i = 1 << 20; i >= 0; --i) {
\r
\r
// initialize statelists: add all possible states which would result into the rightmost 2 bits of the keystream
\r
for(i = 1 << 20; i >= 0; --i) {
\r
@@
-265,17
+249,14
@@
struct Crypto1State* lfsr_recovery32(uint32_t ks2, uint32_t in)
// 22 bits to go to recover 32 bits in total. From now on, we need to take the "in"
\r
// parameter into account.
\r
in = (in >> 16 & 0xff) | (in << 16) | (in & 0xff00); // Byte swapping
\r
// 22 bits to go to recover 32 bits in total. From now on, we need to take the "in"
\r
// parameter into account.
\r
in = (in >> 16 & 0xff) | (in << 16) | (in & 0xff00); // Byte swapping
\r
- recover(odd_head, odd_tail, oks,
\r
- even_head, even_tail, eks, 11, statelist, in << 1, bucket);
\r
-
\r
+ recover(odd_head, odd_tail, oks, even_head, even_tail, eks, 11, statelist, in << 1, bucket);
\r
\r
out:
\r
\r
out:
\r
- free(odd_head);
\r
- free(even_head);
\r
for (uint32_t i = 0; i < 2; i++)
\r
for (uint32_t j = 0; j <= 0xff; j++)
\r
free(bucket[i][j].head);
\r
for (uint32_t i = 0; i < 2; i++)
\r
for (uint32_t j = 0; j <= 0xff; j++)
\r
free(bucket[i][j].head);
\r
-
\r
+ free(odd_head);
\r
+ free(even_head);
\r
return statelist;
\r
}
\r
\r
return statelist;
\r
}
\r
\r
@@
-569,12
+550,11
@@
struct Crypto1State* lfsr_common_prefix(uint32_t pfx, uint32_t rr, uint8_t ks[8]
odd = lfsr_prefix_ks(ks, 1);
\r
even = lfsr_prefix_ks(ks, 0);
\r
\r
odd = lfsr_prefix_ks(ks, 1);
\r
even = lfsr_prefix_ks(ks, 0);
\r
\r
- s = statelist = malloc((sizeof *statelist) << 2
1
);
\r
+ s = statelist = malloc((sizeof *statelist) << 2
0
);
\r
if(!s || !odd || !even) {
\r
free(statelist);
\r
if(!s || !odd || !even) {
\r
free(statelist);
\r
- free(odd);
\r
- free(even);
\r
- return 0;
\r
+ statelist = 0;
\r
+ goto out;
\r
}
\r
\r
for(o = odd; *o + 1; ++o)
\r
}
\r
\r
for(o = odd; *o + 1; ++o)
\r
@@
-586,8
+566,8
@@
struct Crypto1State* lfsr_common_prefix(uint32_t pfx, uint32_t rr, uint8_t ks[8]
}
\r
\r
s->odd = s->even = 0;
\r
}
\r
\r
s->odd = s->even = 0;
\r
-
\r
+out:
\r
free(odd);
\r
free(even);
\r
return statelist;
\r
free(odd);
\r
free(even);
\r
return statelist;
\r
-}
\ No newline at end of file
+}
\r
Impressum
,
Datenschutz