From a0b77b23e5ed284e62cac1fd0f815b365b526e76 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Mon, 20 Apr 2026 09:14:51 +0700 Subject: [PATCH] style --- client/src/loclass/cipher_bs.c | 15 +++-- client/src/loclass/cipher_bs_avx2.c | 63 +++++++++++++-------- client/src/loclass/cipher_bs_avx512.c | 80 ++++++++++++++++++--------- client/src/loclass/cipher_bs_neon.c | 72 +++++++++++++++--------- 4 files changed, 148 insertions(+), 82 deletions(-) diff --git a/client/src/loclass/cipher_bs.c b/client/src/loclass/cipher_bs.c index dc13e7ad7..f012743c1 100644 --- a/client/src/loclass/cipher_bs.c +++ b/client/src/loclass/cipher_bs.c @@ -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]; diff --git a/client/src/loclass/cipher_bs_avx2.c b/client/src/loclass/cipher_bs_avx2.c index e7d564851..1155660d7 100644 --- a/client/src/loclass/cipher_bs_avx2.c +++ b/client/src/loclass/cipher_bs_avx2.c @@ -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 diff --git a/client/src/loclass/cipher_bs_avx512.c b/client/src/loclass/cipher_bs_avx512.c index 6656fb7b8..5e454baa3 100644 --- a/client/src/loclass/cipher_bs_avx512.c +++ b/client/src/loclass/cipher_bs_avx512.c @@ -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 diff --git a/client/src/loclass/cipher_bs_neon.c b/client/src/loclass/cipher_bs_neon.c index d3d6bf1a5..79c45472a 100644 --- a/client/src/loclass/cipher_bs_neon.c +++ b/client/src/loclass/cipher_bs_neon.c @@ -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