X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/33443e7caa26da1563402d548e0a871d53ccc23a..544f3fae9127158ad25307ba35f6a760bf453d20:/common/crapto1/crypto1.c diff --git a/common/crapto1/crypto1.c b/common/crapto1/crypto1.c index f3bb0d73..19b71cbb 100644 --- a/common/crapto1/crypto1.c +++ b/common/crapto1/crypto1.c @@ -18,38 +18,41 @@ Copyright (C) 2008-2008 bla */ #include "crapto1.h" + #include +#include "parity.h" #define SWAPENDIAN(x)\ (x = (x >> 8 & 0xff00ff) | (x & 0xff00ff) << 8, x = x >> 16 | x << 16) -#if defined(__arm__) +#if defined(__arm__) && !defined(__linux__) && !defined(_WIN32) && !defined(__APPLE__) // bare metal ARM Proxmark lacks malloc()/free() void crypto1_create(struct Crypto1State *s, uint64_t key) { -#else -struct Crypto1State * crypto1_create(uint64_t key) -{ - struct Crypto1State *s = malloc(sizeof(*s)); -#endif int i; for(i = 47;s && i > 0; i -= 2) { s->odd = s->odd << 1 | BIT(key, (i - 1) ^ 7); s->even = s->even << 1 | BIT(key, i ^ 7); } -#if defined(__arm__) return; -#else - return s; -#endif } -#if defined(__arm__) void crypto1_destroy(struct Crypto1State *state) { state->odd = 0; state->even = 0; } #else +struct Crypto1State * crypto1_create(uint64_t key) +{ + struct Crypto1State *s = malloc(sizeof(*s)); + int i; + + for(i = 47;s && i > 0; i -= 2) { + s->odd = s->odd << 1 | BIT(key, (i - 1) ^ 7); + s->even = s->even << 1 | BIT(key, i ^ 7); + } + return s; +} void crypto1_destroy(struct Crypto1State *state) { free(state); @@ -65,19 +68,16 @@ void crypto1_get_lfsr(struct Crypto1State *state, uint64_t *lfsr) } uint8_t crypto1_bit(struct Crypto1State *s, uint8_t in, int is_encrypted) { - uint32_t feedin; - uint32_t tmp; + uint32_t feedin, t; uint8_t ret = filter(s->odd); feedin = ret & !!is_encrypted; feedin ^= !!in; feedin ^= LF_POLY_ODD & s->odd; feedin ^= LF_POLY_EVEN & s->even; - s->even = s->even << 1 | parity(feedin); + s->even = s->even << 1 | evenparity32(feedin); - tmp = s->odd; - s->odd = s->even; - s->even = tmp; + t = s->odd, s->odd = s->even, s->even = t; return ret; } @@ -94,8 +94,8 @@ uint32_t crypto1_word(struct Crypto1State *s, uint32_t in, int is_encrypted) { uint32_t i, ret = 0; - for (i = 0; i < 4; ++i, in <<= 8) - ret = ret << 8 | crypto1_byte(s, in >> 24, is_encrypted); + for (i = 0; i < 32; ++i) + ret |= crypto1_bit(s, BEBIT(in, i), is_encrypted) << (i ^ 24); return ret; }