mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2026-05-12 11:18:11 -07:00
style
This commit is contained in:
@@ -46,8 +46,7 @@ static inline void bs_add8(const uint64_t *a, const uint64_t *b, uint64_t *out)
|
||||
// where array index is bit position (LSB first) and each slot is a uint64_t
|
||||
// holding that bit for 64 lanes. kb[64] is the bitsliced key schedule.
|
||||
// y_bs is the input bit broadcast to all 64 lanes (0 or all-ones).
|
||||
static inline void bs_tick(uint64_t *t, uint64_t *b, uint64_t *l, uint64_t *r,
|
||||
const uint64_t *kb, uint64_t y_bs) {
|
||||
static inline void bs_tick(uint64_t *t, uint64_t *b, uint64_t *l, uint64_t *r, const uint64_t *kb, uint64_t y_bs) {
|
||||
|
||||
const uint64_t Tt = t[15] ^ t[14] ^ t[10] ^ t[8] ^ t[5] ^ t[4] ^ t[1] ^ t[0];
|
||||
const uint64_t Bt = b[6] ^ b[5] ^ b[4] ^ b[0];
|
||||
@@ -89,7 +88,9 @@ static inline void bs_tick(uint64_t *t, uint64_t *b, uint64_t *l, uint64_t *r,
|
||||
val[4] ^= b[4]; val[5] ^= b[5]; val[6] ^= b[6]; val[7] ^= b[7];
|
||||
|
||||
uint64_t old_r[8];
|
||||
for (int i = 0; i < 8; i++) old_r[i] = r[i];
|
||||
for (int i = 0; i < 8; i++) {
|
||||
old_r[i] = r[i];
|
||||
}
|
||||
|
||||
// r = val + l ; l = r + old_r
|
||||
bs_add8(val, l, r);
|
||||
@@ -111,7 +112,9 @@ void prepare_ccnr_bits_bs(const uint8_t *cc_nr, uint64_t y_bits_bs[96]) {
|
||||
}
|
||||
|
||||
void prepare_target_mac_bs(const uint8_t target_mac[4], uint64_t target_mac_bs[32]) {
|
||||
|
||||
for (int i = 0; i < 4; i++) {
|
||||
|
||||
const uint8_t byte = target_mac[i];
|
||||
for (int bit = 0; bit < 8; bit++) {
|
||||
target_mac_bs[i * 8 + bit] = ((byte >> bit) & 1) ? BS_ALL_ONES : 0;
|
||||
@@ -145,8 +148,10 @@ void build_bitslice_key_64(const uint8_t partial_key[8], uint64_t index_start, u
|
||||
// (index_start + L) equal the lane index L, so they pick up LANE_BITS;
|
||||
// bits 6..39 are broadcast from index_start.
|
||||
for (int j = 0; j < 8; j++) {
|
||||
|
||||
const int base_bit = 5 * (7 - j);
|
||||
for (int k = 0; k < 5; k++) {
|
||||
|
||||
const int idx_bit = base_bit + k;
|
||||
uint64_t pattern;
|
||||
if (idx_bit < 6) {
|
||||
@@ -165,9 +170,7 @@ void build_bitslice_key_64(const uint8_t partial_key[8], uint64_t index_start, u
|
||||
// b = 0x4C, t = 0xE012
|
||||
// Bitsliced: flip kb[0..7] bits that differ under XOR with 0x4C, then bs_add8
|
||||
// against the broadcast 0xEC / 0x21 bit patterns.
|
||||
static inline void bs_init_state(const uint64_t kb[64],
|
||||
uint64_t l[8], uint64_t r[8],
|
||||
uint64_t b[8], uint64_t t[16]) {
|
||||
static inline void bs_init_state(const uint64_t kb[64], uint64_t l[8], uint64_t r[8], uint64_t b[8], uint64_t t[16]) {
|
||||
|
||||
// 0x4C = 0b01001100 → bits set at positions 2, 3, 6.
|
||||
uint64_t k0xor[8];
|
||||
|
||||
@@ -54,8 +54,7 @@ static inline void bs_tick(__m256i *t, __m256i *b, __m256i *l, __m256i *r,
|
||||
const __m256i *kb, __m256i y_bs) {
|
||||
|
||||
const __m256i Tt = _mm256_xor_si256(_mm256_xor_si256(_mm256_xor_si256(_mm256_xor_si256(
|
||||
_mm256_xor_si256(_mm256_xor_si256(_mm256_xor_si256(t[15], t[14]), t[10]), t[8]),
|
||||
t[5]), t[4]), t[1]), t[0]);
|
||||
_mm256_xor_si256(_mm256_xor_si256(_mm256_xor_si256(t[15], t[14]), t[10]), t[8]), t[5]), t[4]), t[1]), t[0]);
|
||||
const __m256i Bt = _mm256_xor_si256(_mm256_xor_si256(_mm256_xor_si256(b[6], b[5]), b[4]), b[0]);
|
||||
|
||||
const __m256i cr0 = r[7], cr1 = r[6], cr2 = r[5], cr3 = r[4];
|
||||
@@ -64,20 +63,22 @@ static inline void bs_tick(__m256i *t, __m256i *b, __m256i *l, __m256i *r,
|
||||
const __m256i new_t = _mm256_xor_si256(_mm256_xor_si256(Tt, cr0), cr4);
|
||||
const __m256i new_b = _mm256_xor_si256(Bt, cr7);
|
||||
|
||||
for (int i = 0; i < 15; i++) t[i] = t[i + 1];
|
||||
for (int i = 0; i < 15; i++) {
|
||||
t[i] = t[i + 1];
|
||||
}
|
||||
t[15] = new_t;
|
||||
for (int i = 0; i < 7; i++) b[i] = b[i + 1];
|
||||
|
||||
for (int i = 0; i < 7; i++) {
|
||||
b[i] = b[i + 1];
|
||||
}
|
||||
b[7] = new_b;
|
||||
|
||||
const __m256i ncr3 = bs_not(cr3);
|
||||
const __m256i ncr5 = bs_not(cr5);
|
||||
|
||||
const __m256i z0 = _mm256_xor_si256(_mm256_xor_si256(_mm256_and_si256(cr0, cr2), _mm256_and_si256(cr1, ncr3)),
|
||||
_mm256_or_si256(cr2, cr4));
|
||||
const __m256i z1 = _mm256_xor_si256(_mm256_xor_si256(_mm256_xor_si256(_mm256_xor_si256(_mm256_xor_si256(
|
||||
_mm256_or_si256(cr0, cr2), _mm256_or_si256(cr5, cr7)), cr1), cr6), Tt), y_bs);
|
||||
const __m256i z2 = _mm256_xor_si256(_mm256_xor_si256(_mm256_xor_si256(
|
||||
_mm256_and_si256(cr3, ncr5), _mm256_and_si256(cr4, cr6)), cr7), Tt);
|
||||
const __m256i z0 = _mm256_xor_si256(_mm256_xor_si256(_mm256_and_si256(cr0, cr2), _mm256_and_si256(cr1, ncr3)), _mm256_or_si256(cr2, cr4));
|
||||
const __m256i z1 = _mm256_xor_si256(_mm256_xor_si256(_mm256_xor_si256(_mm256_xor_si256(_mm256_xor_si256( _mm256_or_si256(cr0, cr2), _mm256_or_si256(cr5, cr7)), cr1), cr6), Tt), y_bs);
|
||||
const __m256i z2 = _mm256_xor_si256(_mm256_xor_si256(_mm256_xor_si256(_mm256_and_si256(cr3, ncr5), _mm256_and_si256(cr4, cr6)), cr7), Tt);
|
||||
|
||||
const __m256i nz0 = bs_not(z0);
|
||||
const __m256i nz1 = bs_not(z1);
|
||||
@@ -92,10 +93,15 @@ static inline void bs_tick(__m256i *t, __m256i *b, __m256i *l, __m256i *r,
|
||||
kb[6 * 8 + bit], kb[7 * 8 + bit]);
|
||||
}
|
||||
|
||||
for (int i = 0; i < 8; i++) val[i] = _mm256_xor_si256(val[i], b[i]);
|
||||
for (int i = 0; i < 8; i++) {
|
||||
val[i] = _mm256_xor_si256(val[i], b[i]);
|
||||
}
|
||||
|
||||
__m256i old_r[8];
|
||||
for (int i = 0; i < 8; i++) old_r[i] = r[i];
|
||||
for (int i = 0; i < 8; i++) {
|
||||
old_r[i] = r[i];
|
||||
}
|
||||
|
||||
bs_add8(val, l, r);
|
||||
bs_add8(r, old_r, l);
|
||||
}
|
||||
@@ -118,9 +124,7 @@ static inline __m256i lane_bits_256(int k) {
|
||||
return _mm256_loadu_si256((const __m256i *)LANE_BITS_256_RAW[k]);
|
||||
}
|
||||
|
||||
static inline void bs_init_state(const __m256i kb[64],
|
||||
__m256i l[8], __m256i r[8],
|
||||
__m256i b[8], __m256i t[16]) {
|
||||
static inline void bs_init_state(const __m256i kb[64], __m256i l[8], __m256i r[8], __m256i b[8], __m256i t[16]) {
|
||||
|
||||
__m256i k0xor[8];
|
||||
k0xor[0] = kb[0];
|
||||
@@ -181,8 +185,10 @@ void build_bitslice_key_256(const uint8_t partial_key[8], uint64_t index_start,
|
||||
}
|
||||
|
||||
for (int j = 0; j < 8; j++) {
|
||||
|
||||
const int base_bit = 5 * (7 - j);
|
||||
for (int kk = 0; kk < 5; kk++) {
|
||||
|
||||
const int idx_bit = base_bit + kk;
|
||||
__m256i pattern;
|
||||
if (idx_bit < 8) {
|
||||
@@ -203,7 +209,9 @@ void doMAC_brute_match256(const uint64_t y_bits_bs[96 * BS256_WORDS],
|
||||
// Load key into local __m256i array for fast access.
|
||||
__m256i k[64];
|
||||
const __m256i *kb_m = (const __m256i *)kb;
|
||||
for (int i = 0; i < 64; i++) k[i] = _mm256_loadu_si256(&kb_m[i]);
|
||||
for (int i = 0; i < 64; i++) {
|
||||
k[i] = _mm256_loadu_si256(&kb_m[i]);
|
||||
}
|
||||
|
||||
__m256i l[8], r[8], b[8], t[16];
|
||||
bs_init_state(k, l, r, b, t);
|
||||
@@ -217,12 +225,15 @@ void doMAC_brute_match256(const uint64_t y_bits_bs[96 * BS256_WORDS],
|
||||
|
||||
__m256i mac_match = BS_ONES;
|
||||
for (int tick = 0; tick < 32; tick++) {
|
||||
|
||||
const __m256i diff = _mm256_xor_si256(r[2], _mm256_loadu_si256(&tm[tick]));
|
||||
// mac_match &= ~diff → andnot(diff, mac_match) = ~diff & mac_match
|
||||
mac_match = _mm256_andnot_si256(diff, mac_match);
|
||||
|
||||
if ((tick == 7 || tick == 15 || tick == 23) && _mm256_testz_si256(mac_match, mac_match)) {
|
||||
for (int i = 0; i < BS256_WORDS; i++) match_out[i] = 0;
|
||||
for (int i = 0; i < BS256_WORDS; i++) {
|
||||
match_out[i] = 0;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -256,20 +267,28 @@ bool bs_avx2_supported(void) {
|
||||
bool bs_avx2_supported(void) { return false; }
|
||||
|
||||
void prepare_ccnr_bits_bs256(const uint8_t *cc_nr, uint64_t y_bits_bs[96 * BS256_WORDS]) {
|
||||
(void)cc_nr; (void)y_bits_bs;
|
||||
(void)cc_nr;
|
||||
(void)y_bits_bs;
|
||||
}
|
||||
void prepare_target_mac_bs256(const uint8_t target_mac[4], uint64_t target_mac_bs[32 * BS256_WORDS]) {
|
||||
(void)target_mac; (void)target_mac_bs;
|
||||
(void)target_mac;
|
||||
(void)target_mac_bs;
|
||||
}
|
||||
void build_bitslice_key_256(const uint8_t partial_key[8], uint64_t index_start, uint64_t kb[64 * BS256_WORDS]) {
|
||||
(void)partial_key; (void)index_start; (void)kb;
|
||||
(void)partial_key;
|
||||
(void)index_start;
|
||||
(void)kb;
|
||||
}
|
||||
void doMAC_brute_match256(const uint64_t y_bits_bs[96 * BS256_WORDS],
|
||||
const uint64_t kb[64 * BS256_WORDS],
|
||||
const uint64_t target_mac_bs[32 * BS256_WORDS],
|
||||
uint64_t match_out[BS256_WORDS]) {
|
||||
(void)y_bits_bs; (void)kb; (void)target_mac_bs;
|
||||
for (int i = 0; i < BS256_WORDS; i++) match_out[i] = 0;
|
||||
(void)y_bits_bs;
|
||||
(void)kb;
|
||||
(void)target_mac_bs;
|
||||
for (int i = 0; i < BS256_WORDS; i++) {
|
||||
match_out[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -27,7 +27,9 @@
|
||||
#define BS_ZERO _mm512_setzero_si512()
|
||||
#define BS_ONES _mm512_set1_epi64(-1)
|
||||
|
||||
static inline __m512i bs_not(__m512i v) { return _mm512_xor_si512(v, BS_ONES); }
|
||||
static inline __m512i bs_not(__m512i v) {
|
||||
return _mm512_xor_si512(v, BS_ONES);
|
||||
}
|
||||
|
||||
static inline __m512i bs_mux8(__m512i z0, __m512i z1, __m512i z2,
|
||||
__m512i nz0, __m512i nz1, __m512i nz2,
|
||||
@@ -55,8 +57,7 @@ static inline void bs_tick(__m512i *t, __m512i *b, __m512i *l, __m512i *r,
|
||||
const __m512i *kb, __m512i y_bs) {
|
||||
|
||||
const __m512i Tt = _mm512_xor_si512(_mm512_xor_si512(_mm512_xor_si512(_mm512_xor_si512(
|
||||
_mm512_xor_si512(_mm512_xor_si512(_mm512_xor_si512(t[15], t[14]), t[10]), t[8]),
|
||||
t[5]), t[4]), t[1]), t[0]);
|
||||
_mm512_xor_si512(_mm512_xor_si512(_mm512_xor_si512(t[15], t[14]), t[10]), t[8]), t[5]), t[4]), t[1]), t[0]);
|
||||
const __m512i Bt = _mm512_xor_si512(_mm512_xor_si512(_mm512_xor_si512(b[6], b[5]), b[4]), b[0]);
|
||||
|
||||
const __m512i cr0 = r[7], cr1 = r[6], cr2 = r[5], cr3 = r[4];
|
||||
@@ -65,20 +66,24 @@ static inline void bs_tick(__m512i *t, __m512i *b, __m512i *l, __m512i *r,
|
||||
const __m512i new_t = _mm512_xor_si512(_mm512_xor_si512(Tt, cr0), cr4);
|
||||
const __m512i new_b = _mm512_xor_si512(Bt, cr7);
|
||||
|
||||
for (int i = 0; i < 15; i++) t[i] = t[i + 1];
|
||||
for (int i = 0; i < 15; i++) {
|
||||
t[i] = t[i + 1];
|
||||
}
|
||||
|
||||
t[15] = new_t;
|
||||
for (int i = 0; i < 7; i++) b[i] = b[i + 1];
|
||||
|
||||
for (int i = 0; i < 7; i++) {
|
||||
b[i] = b[i + 1];
|
||||
}
|
||||
|
||||
b[7] = new_b;
|
||||
|
||||
const __m512i ncr3 = bs_not(cr3);
|
||||
const __m512i ncr5 = bs_not(cr5);
|
||||
|
||||
const __m512i z0 = _mm512_xor_si512(_mm512_xor_si512(_mm512_and_si512(cr0, cr2), _mm512_and_si512(cr1, ncr3)),
|
||||
_mm512_or_si512(cr2, cr4));
|
||||
const __m512i z1 = _mm512_xor_si512(_mm512_xor_si512(_mm512_xor_si512(_mm512_xor_si512(_mm512_xor_si512(
|
||||
_mm512_or_si512(cr0, cr2), _mm512_or_si512(cr5, cr7)), cr1), cr6), Tt), y_bs);
|
||||
const __m512i z2 = _mm512_xor_si512(_mm512_xor_si512(_mm512_xor_si512(
|
||||
_mm512_and_si512(cr3, ncr5), _mm512_and_si512(cr4, cr6)), cr7), Tt);
|
||||
const __m512i z0 = _mm512_xor_si512(_mm512_xor_si512(_mm512_and_si512(cr0, cr2), _mm512_and_si512(cr1, ncr3)), _mm512_or_si512(cr2, cr4));
|
||||
const __m512i z1 = _mm512_xor_si512(_mm512_xor_si512(_mm512_xor_si512(_mm512_xor_si512(_mm512_xor_si512( _mm512_or_si512(cr0, cr2), _mm512_or_si512(cr5, cr7)), cr1), cr6), Tt), y_bs);
|
||||
const __m512i z2 = _mm512_xor_si512(_mm512_xor_si512(_mm512_xor_si512(_mm512_and_si512(cr3, ncr5), _mm512_and_si512(cr4, cr6)), cr7), Tt);
|
||||
|
||||
const __m512i nz0 = bs_not(z0);
|
||||
const __m512i nz1 = bs_not(z1);
|
||||
@@ -93,10 +98,15 @@ static inline void bs_tick(__m512i *t, __m512i *b, __m512i *l, __m512i *r,
|
||||
kb[6 * 8 + bit], kb[7 * 8 + bit]);
|
||||
}
|
||||
|
||||
for (int i = 0; i < 8; i++) val[i] = _mm512_xor_si512(val[i], b[i]);
|
||||
for (int i = 0; i < 8; i++) {
|
||||
val[i] = _mm512_xor_si512(val[i], b[i]);
|
||||
}
|
||||
|
||||
__m512i old_r[8];
|
||||
for (int i = 0; i < 8; i++) old_r[i] = r[i];
|
||||
for (int i = 0; i < 8; i++) {
|
||||
old_r[i] = r[i];
|
||||
}
|
||||
|
||||
bs_add8(val, l, r);
|
||||
bs_add8(r, old_r, l);
|
||||
}
|
||||
@@ -165,8 +175,7 @@ void prepare_ccnr_bits_bs512(const uint8_t *cc_nr, uint64_t y_bits_bs[96 * BS512
|
||||
for (int i = 0; i < 12; i++) {
|
||||
const uint8_t byte = cc_nr[i];
|
||||
for (int bit = 0; bit < 8; bit++) {
|
||||
_mm512_storeu_si512((void *)&y_bits_bs[(i * 8 + bit) * BS512_WORDS],
|
||||
((byte >> bit) & 1) ? BS_ONES : BS_ZERO);
|
||||
_mm512_storeu_si512((void *)&y_bits_bs[(i * 8 + bit) * BS512_WORDS], ((byte >> bit) & 1) ? BS_ONES : BS_ZERO);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -175,8 +184,7 @@ void prepare_target_mac_bs512(const uint8_t target_mac[4], uint64_t target_mac_b
|
||||
for (int i = 0; i < 4; i++) {
|
||||
const uint8_t byte = target_mac[i];
|
||||
for (int bit = 0; bit < 8; bit++) {
|
||||
_mm512_storeu_si512((void *)&target_mac_bs[(i * 8 + bit) * BS512_WORDS],
|
||||
((byte >> bit) & 1) ? BS_ONES : BS_ZERO);
|
||||
_mm512_storeu_si512((void *)&target_mac_bs[(i * 8 + bit) * BS512_WORDS], ((byte >> bit) & 1) ? BS_ONES : BS_ZERO);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -190,9 +198,13 @@ void build_bitslice_key_512(const uint8_t partial_key[8], uint64_t index_start,
|
||||
}
|
||||
|
||||
for (int j = 0; j < 8; j++) {
|
||||
|
||||
const int base_bit = 5 * (7 - j);
|
||||
|
||||
for (int kk = 0; kk < 5; kk++) {
|
||||
|
||||
const int idx_bit = base_bit + kk;
|
||||
|
||||
__m512i pattern;
|
||||
if (idx_bit < 9) {
|
||||
pattern = lane_bits_512(idx_bit);
|
||||
@@ -210,8 +222,9 @@ void doMAC_brute_match512(const uint64_t y_bits_bs[96 * BS512_WORDS],
|
||||
uint64_t match_out[BS512_WORDS]) {
|
||||
|
||||
__m512i k[64];
|
||||
for (int i = 0; i < 64; i++) k[i] = _mm512_loadu_si512((const void *)&kb[i * BS512_WORDS]);
|
||||
|
||||
for (int i = 0; i < 64; i++) {
|
||||
k[i] = _mm512_loadu_si512((const void *)&kb[i * BS512_WORDS]);
|
||||
}
|
||||
__m512i l[8], r[8], b[8], t[16];
|
||||
bs_init_state(k, l, r, b, t);
|
||||
|
||||
@@ -221,12 +234,15 @@ void doMAC_brute_match512(const uint64_t y_bits_bs[96 * BS512_WORDS],
|
||||
|
||||
__m512i mac_match = BS_ONES;
|
||||
for (int tick = 0; tick < 32; tick++) {
|
||||
|
||||
const __m512i diff = _mm512_xor_si512(r[2], _mm512_loadu_si512((const void *)&target_mac_bs[tick * BS512_WORDS]));
|
||||
|
||||
mac_match = _mm512_andnot_si512(diff, mac_match);
|
||||
|
||||
if ((tick == 7 || tick == 15 || tick == 23) &&
|
||||
_mm512_test_epi64_mask(mac_match, mac_match) == 0) {
|
||||
for (int i = 0; i < BS512_WORDS; i++) match_out[i] = 0;
|
||||
if ((tick == 7 || tick == 15 || tick == 23) && _mm512_test_epi64_mask(mac_match, mac_match) == 0) {
|
||||
for (int i = 0; i < BS512_WORDS; i++) {
|
||||
match_out[i] = 0;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -260,20 +276,30 @@ bool bs_avx512_supported(void) {
|
||||
bool bs_avx512_supported(void) { return false; }
|
||||
|
||||
void prepare_ccnr_bits_bs512(const uint8_t *cc_nr, uint64_t y_bits_bs[96 * BS512_WORDS]) {
|
||||
(void)cc_nr; (void)y_bits_bs;
|
||||
(void)cc_nr;
|
||||
(void)y_bits_bs;
|
||||
}
|
||||
void prepare_target_mac_bs512(const uint8_t target_mac[4], uint64_t target_mac_bs[32 * BS512_WORDS]) {
|
||||
(void)target_mac; (void)target_mac_bs;
|
||||
(void)target_mac;
|
||||
(void)target_mac_bs;
|
||||
}
|
||||
void build_bitslice_key_512(const uint8_t partial_key[8], uint64_t index_start, uint64_t kb[64 * BS512_WORDS]) {
|
||||
(void)partial_key; (void)index_start; (void)kb;
|
||||
(void)partial_key;
|
||||
(void)index_start;
|
||||
(void)kb;
|
||||
}
|
||||
void doMAC_brute_match512(const uint64_t y_bits_bs[96 * BS512_WORDS],
|
||||
const uint64_t kb[64 * BS512_WORDS],
|
||||
const uint64_t target_mac_bs[32 * BS512_WORDS],
|
||||
uint64_t match_out[BS512_WORDS]) {
|
||||
(void)y_bits_bs; (void)kb; (void)target_mac_bs;
|
||||
for (int i = 0; i < BS512_WORDS; i++) match_out[i] = 0;
|
||||
|
||||
(void)y_bits_bs;
|
||||
(void)kb;
|
||||
(void)target_mac_bs;
|
||||
|
||||
for (int i = 0; i < BS512_WORDS; i++) {
|
||||
match_out[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -48,9 +48,7 @@ static inline void bs_add8(const uint64x2_t *a, const uint64x2_t *b, uint64x2_t
|
||||
static inline void bs_tick(uint64x2_t *t, uint64x2_t *b, uint64x2_t *l, uint64x2_t *r,
|
||||
const uint64x2_t *kb, uint64x2_t y_bs) {
|
||||
|
||||
const uint64x2_t Tt = veorq_u64(veorq_u64(veorq_u64(veorq_u64(
|
||||
veorq_u64(veorq_u64(veorq_u64(t[15], t[14]), t[10]), t[8]),
|
||||
t[5]), t[4]), t[1]), t[0]);
|
||||
const uint64x2_t Tt = veorq_u64(veorq_u64(veorq_u64(veorq_u64(veorq_u64(veorq_u64(veorq_u64(t[15], t[14]), t[10]), t[8]), t[5]), t[4]), t[1]), t[0]);
|
||||
const uint64x2_t Bt = veorq_u64(veorq_u64(veorq_u64(b[6], b[5]), b[4]), b[0]);
|
||||
|
||||
const uint64x2_t cr0 = r[7], cr1 = r[6], cr2 = r[5], cr3 = r[4];
|
||||
@@ -59,20 +57,22 @@ static inline void bs_tick(uint64x2_t *t, uint64x2_t *b, uint64x2_t *l, uint64x2
|
||||
const uint64x2_t new_t = veorq_u64(veorq_u64(Tt, cr0), cr4);
|
||||
const uint64x2_t new_b = veorq_u64(Bt, cr7);
|
||||
|
||||
for (int i = 0; i < 15; i++) t[i] = t[i + 1];
|
||||
for (int i = 0; i < 15; i++) {
|
||||
t[i] = t[i + 1];
|
||||
}
|
||||
t[15] = new_t;
|
||||
for (int i = 0; i < 7; i++) b[i] = b[i + 1];
|
||||
|
||||
for (int i = 0; i < 7; i++) {
|
||||
b[i] = b[i + 1];
|
||||
}
|
||||
b[7] = new_b;
|
||||
|
||||
const uint64x2_t ncr3 = bs_not(cr3);
|
||||
const uint64x2_t ncr5 = bs_not(cr5);
|
||||
|
||||
const uint64x2_t z0 = veorq_u64(veorq_u64(vandq_u64(cr0, cr2), vandq_u64(cr1, ncr3)),
|
||||
vorrq_u64(cr2, cr4));
|
||||
const uint64x2_t z1 = veorq_u64(veorq_u64(veorq_u64(veorq_u64(veorq_u64(
|
||||
vorrq_u64(cr0, cr2), vorrq_u64(cr5, cr7)), cr1), cr6), Tt), y_bs);
|
||||
const uint64x2_t z2 = veorq_u64(veorq_u64(veorq_u64(
|
||||
vandq_u64(cr3, ncr5), vandq_u64(cr4, cr6)), cr7), Tt);
|
||||
const uint64x2_t z0 = veorq_u64(veorq_u64(vandq_u64(cr0, cr2), vandq_u64(cr1, ncr3)), vorrq_u64(cr2, cr4));
|
||||
const uint64x2_t z1 = veorq_u64(veorq_u64(veorq_u64(veorq_u64(veorq_u64(vorrq_u64(cr0, cr2), vorrq_u64(cr5, cr7)), cr1), cr6), Tt), y_bs);
|
||||
const uint64x2_t z2 = veorq_u64(veorq_u64(veorq_u64(vandq_u64(cr3, ncr5), vandq_u64(cr4, cr6)), cr7), Tt);
|
||||
|
||||
const uint64x2_t nz0 = bs_not(z0);
|
||||
const uint64x2_t nz1 = bs_not(z1);
|
||||
@@ -87,10 +87,15 @@ static inline void bs_tick(uint64x2_t *t, uint64x2_t *b, uint64x2_t *l, uint64x2
|
||||
kb[6 * 8 + bit], kb[7 * 8 + bit]);
|
||||
}
|
||||
|
||||
for (int i = 0; i < 8; i++) val[i] = veorq_u64(val[i], b[i]);
|
||||
for (int i = 0; i < 8; i++) {
|
||||
val[i] = veorq_u64(val[i], b[i]);
|
||||
}
|
||||
|
||||
uint64x2_t old_r[8];
|
||||
for (int i = 0; i < 8; i++) old_r[i] = r[i];
|
||||
for (int i = 0; i < 8; i++) {
|
||||
old_r[i] = r[i];
|
||||
}
|
||||
|
||||
bs_add8(val, l, r);
|
||||
bs_add8(r, old_r, l);
|
||||
}
|
||||
@@ -111,9 +116,7 @@ static inline uint64x2_t lane_bits_128(int k) {
|
||||
return vld1q_u64(LANE_BITS_128_RAW[k]);
|
||||
}
|
||||
|
||||
static inline void bs_init_state(const uint64x2_t kb[64],
|
||||
uint64x2_t l[8], uint64x2_t r[8],
|
||||
uint64x2_t b[8], uint64x2_t t[16]) {
|
||||
static inline void bs_init_state(const uint64x2_t kb[64], uint64x2_t l[8], uint64x2_t r[8], uint64x2_t b[8], uint64x2_t t[16]) {
|
||||
|
||||
uint64x2_t k0xor[8];
|
||||
k0xor[0] = kb[0];
|
||||
@@ -141,21 +144,22 @@ static inline void bs_init_state(const uint64x2_t kb[64],
|
||||
}
|
||||
|
||||
void prepare_ccnr_bits_bs128(const uint8_t *cc_nr, uint64_t y_bits_bs[96 * BS128_WORDS]) {
|
||||
|
||||
for (int i = 0; i < 12; i++) {
|
||||
|
||||
const uint8_t byte = cc_nr[i];
|
||||
for (int bit = 0; bit < 8; bit++) {
|
||||
vst1q_u64(&y_bits_bs[(i * 8 + bit) * BS128_WORDS],
|
||||
((byte >> bit) & 1) ? BS_ONES : BS_ZERO);
|
||||
vst1q_u64(&y_bits_bs[(i * 8 + bit) * BS128_WORDS], ((byte >> bit) & 1) ? BS_ONES : BS_ZERO);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void prepare_target_mac_bs128(const uint8_t target_mac[4], uint64_t target_mac_bs[32 * BS128_WORDS]) {
|
||||
for (int i = 0; i < 4; i++) {
|
||||
|
||||
const uint8_t byte = target_mac[i];
|
||||
for (int bit = 0; bit < 8; bit++) {
|
||||
vst1q_u64(&target_mac_bs[(i * 8 + bit) * BS128_WORDS],
|
||||
((byte >> bit) & 1) ? BS_ONES : BS_ZERO);
|
||||
vst1q_u64(&target_mac_bs[(i * 8 + bit) * BS128_WORDS], ((byte >> bit) & 1) ? BS_ONES : BS_ZERO);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -169,8 +173,10 @@ void build_bitslice_key_128(const uint8_t partial_key[8], uint64_t index_start,
|
||||
}
|
||||
|
||||
for (int j = 0; j < 8; j++) {
|
||||
|
||||
const int base_bit = 5 * (7 - j);
|
||||
for (int kk = 0; kk < 5; kk++) {
|
||||
|
||||
const int idx_bit = base_bit + kk;
|
||||
uint64x2_t pattern;
|
||||
if (idx_bit < 7) {
|
||||
@@ -194,7 +200,9 @@ void doMAC_brute_match128(const uint64_t y_bits_bs[96 * BS128_WORDS],
|
||||
uint64_t match_out[BS128_WORDS]) {
|
||||
|
||||
uint64x2_t k[64];
|
||||
for (int i = 0; i < 64; i++) k[i] = vld1q_u64(&kb[i * BS128_WORDS]);
|
||||
for (int i = 0; i < 64; i++) {
|
||||
k[i] = vld1q_u64(&kb[i * BS128_WORDS]);
|
||||
}
|
||||
|
||||
uint64x2_t l[8], r[8], b[8], t[16];
|
||||
bs_init_state(k, l, r, b, t);
|
||||
@@ -205,12 +213,14 @@ void doMAC_brute_match128(const uint64_t y_bits_bs[96 * BS128_WORDS],
|
||||
|
||||
uint64x2_t mac_match = BS_ONES;
|
||||
for (int tick = 0; tick < 32; tick++) {
|
||||
|
||||
const uint64x2_t diff = veorq_u64(r[2], vld1q_u64(&target_mac_bs[tick * BS128_WORDS]));
|
||||
// mac_match &= ~diff → vbicq_u64(mac_match, diff) = mac_match AND NOT diff
|
||||
mac_match = vbicq_u64(mac_match, diff);
|
||||
|
||||
if ((tick == 7 || tick == 15 || tick == 23) && bs128_all_zero(mac_match)) {
|
||||
match_out[0] = 0; match_out[1] = 0;
|
||||
match_out[0] = 0;
|
||||
match_out[1] = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -229,20 +239,28 @@ bool bs_neon_supported(void) { return true; }
|
||||
bool bs_neon_supported(void) { return false; }
|
||||
|
||||
void prepare_ccnr_bits_bs128(const uint8_t *cc_nr, uint64_t y_bits_bs[96 * BS128_WORDS]) {
|
||||
(void)cc_nr; (void)y_bits_bs;
|
||||
(void)cc_nr;
|
||||
(void)y_bits_bs;
|
||||
}
|
||||
void prepare_target_mac_bs128(const uint8_t target_mac[4], uint64_t target_mac_bs[32 * BS128_WORDS]) {
|
||||
(void)target_mac; (void)target_mac_bs;
|
||||
(void)target_mac;
|
||||
(void)target_mac_bs;
|
||||
}
|
||||
void build_bitslice_key_128(const uint8_t partial_key[8], uint64_t index_start, uint64_t kb[64 * BS128_WORDS]) {
|
||||
(void)partial_key; (void)index_start; (void)kb;
|
||||
(void)partial_key;
|
||||
(void)index_start;
|
||||
(void)kb;
|
||||
}
|
||||
void doMAC_brute_match128(const uint64_t y_bits_bs[96 * BS128_WORDS],
|
||||
const uint64_t kb[64 * BS128_WORDS],
|
||||
const uint64_t target_mac_bs[32 * BS128_WORDS],
|
||||
uint64_t match_out[BS128_WORDS]) {
|
||||
(void)y_bits_bs; (void)kb; (void)target_mac_bs;
|
||||
for (int i = 0; i < BS128_WORDS; i++) match_out[i] = 0;
|
||||
(void)y_bits_bs;
|
||||
(void)kb;
|
||||
(void)target_mac_bs;
|
||||
for (int i = 0; i < BS128_WORDS; i++) {
|
||||
match_out[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user