diff --git a/.gitconfig b/.gitconfig new file mode 100644 index 00000000..83575d66 --- /dev/null +++ b/.gitconfig @@ -0,0 +1,3 @@ +[user] + email = iceman@iuse.se + name = iceman1001 diff --git a/client/hardnested/bf_bench_data.bin b/client/hardnested/bf_bench_data.bin new file mode 100644 index 00000000..30734da9 Binary files /dev/null and b/client/hardnested/bf_bench_data.bin differ diff --git a/client/hardnested/hardnested_bf_core.c b/client/hardnested/hardnested_bf_core.c new file mode 100644 index 00000000..2388f6f5 --- /dev/null +++ b/client/hardnested/hardnested_bf_core.c @@ -0,0 +1,603 @@ +//----------------------------------------------------------------------------- +// Copyright (C) 2016, 2017 by piwi +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// Implements a card only attack based on crypto text (encrypted nonces +// received during a nested authentication) only. Unlike other card only +// attacks this doesn't rely on implementation errors but only on the +// inherent weaknesses of the crypto1 cypher. Described in +// Carlo Meijer, Roel Verdult, "Ciphertext-only Cryptanalysis on Hardened +// Mifare Classic Cards" in Proceedings of the 22nd ACM SIGSAC Conference on +// Computer and Communications Security, 2015 +//----------------------------------------------------------------------------- +// +// brute forcing is based on @aczids bitsliced brute forcer +// https://github.com/aczid/crypto1_bs with some modifications. Mainly: +// - don't rollback. Start with 2nd byte of nonce instead +// - reuse results of filter subfunctions +// - reuse results of previous nonces if some first bits are identical +// +//----------------------------------------------------------------------------- +// aczid's Copyright notice: +// +// Bit-sliced Crypto-1 brute-forcing implementation +// Builds on the data structures returned by CraptEV1 craptev1_get_space(nonces, threshold, uid) +/* +Copyright (c) 2015-2016 Aram Verstegen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +#include "hardnested_bf_core.h" + +#include +#include +#include +#ifndef __APPLE__ +#include +#endif +#include +#include +#include "crapto1/crapto1.h" +#include "parity.h" + +// bitslice type +// while AVX supports 256 bit vector floating point operations, we need integer operations for boolean logic +// same for AVX2 and 512 bit vectors +// using larger vectors works but seems to generate more register pressure +#if defined(__AVX512F__) +#define MAX_BITSLICES 512 +#elif defined(__AVX2__) +#define MAX_BITSLICES 256 +#elif defined(__AVX__) +#define MAX_BITSLICES 128 +#elif defined(__SSE2__) +#define MAX_BITSLICES 128 +#else // MMX or SSE or NOSIMD +#define MAX_BITSLICES 64 +#endif + +#define VECTOR_SIZE (MAX_BITSLICES/8) +typedef unsigned int __attribute__((aligned(VECTOR_SIZE))) __attribute__((vector_size(VECTOR_SIZE))) bitslice_value_t; +typedef union { + bitslice_value_t value; + uint64_t bytes64[MAX_BITSLICES/64]; + uint8_t bytes[MAX_BITSLICES/8]; +} bitslice_t; + +// filter function (f20) +// sourced from ``Wirelessly Pickpocketing a Mifare Classic Card'' by Flavio Garcia, Peter van Rossum, Roel Verdult and Ronny Wichers Schreur +#define f20a(a,b,c,d) (((a|b)^(a&d))^(c&((a^b)|d))) +#define f20b(a,b,c,d) (((a&b)|c)^((a^b)&(c|d))) +#define f20c(a,b,c,d,e) ((a|((b|e)&(d^e)))^((a^(b&d))&((c^d)|(b&e)))) + +// bit indexing +#define get_bit(n, word) (((word) >> (n)) & 1) +#define get_vector_bit(slice, value) get_bit((slice)&0x3f, value.bytes64[(slice)>>6]) + +// size of crypto-1 state +#define STATE_SIZE 48 +// size of nonce to be decrypted +#define KEYSTREAM_SIZE 24 + +// endianness conversion +#define rev32(word) ((((word) & 0xff) << 24) | ((((word) >> 8) & 0xff) << 16) | ((((word) >> 16) & 0xff) << 8) | ((((word) >> 24) & 0xff))) + +// this needs to be compiled several times for each instruction set. +// For each instruction set, define a dedicated function name: +#if defined (__AVX512F__) +#define BITSLICE_TEST_NONCES bitslice_test_nonces_AVX512 +#define CRACK_STATES_BITSLICED crack_states_bitsliced_AVX512 +#elif defined (__AVX2__) +#define BITSLICE_TEST_NONCES bitslice_test_nonces_AVX2 +#define CRACK_STATES_BITSLICED crack_states_bitsliced_AVX2 +#elif defined (__AVX__) +#define BITSLICE_TEST_NONCES bitslice_test_nonces_AVX +#define CRACK_STATES_BITSLICED crack_states_bitsliced_AVX +#elif defined (__SSE2__) +#define BITSLICE_TEST_NONCES bitslice_test_nonces_SSE2 +#define CRACK_STATES_BITSLICED crack_states_bitsliced_SSE2 +#elif defined (__MMX__) +#define BITSLICE_TEST_NONCES bitslice_test_nonces_MMX +#define CRACK_STATES_BITSLICED crack_states_bitsliced_MMX +#else +#define BITSLICE_TEST_NONCES bitslice_test_nonces_NOSIMD +#define CRACK_STATES_BITSLICED crack_states_bitsliced_NOSIMD +#endif + +// typedefs and declaration of functions: +typedef const uint64_t crack_states_bitsliced_t(uint32_t, uint8_t*, statelist_t*, uint32_t*, uint64_t*, uint32_t, uint8_t*, noncelist_t*); +crack_states_bitsliced_t crack_states_bitsliced_AVX512; +crack_states_bitsliced_t crack_states_bitsliced_AVX2; +crack_states_bitsliced_t crack_states_bitsliced_AVX; +crack_states_bitsliced_t crack_states_bitsliced_SSE2; +crack_states_bitsliced_t crack_states_bitsliced_MMX; +crack_states_bitsliced_t crack_states_bitsliced_NOSIMD; +crack_states_bitsliced_t crack_states_bitsliced_dispatch; + +typedef void bitslice_test_nonces_t(uint32_t, uint32_t*, uint8_t*); +bitslice_test_nonces_t bitslice_test_nonces_AVX512; +bitslice_test_nonces_t bitslice_test_nonces_AVX2; +bitslice_test_nonces_t bitslice_test_nonces_AVX; +bitslice_test_nonces_t bitslice_test_nonces_SSE2; +bitslice_test_nonces_t bitslice_test_nonces_MMX; +bitslice_test_nonces_t bitslice_test_nonces_NOSIMD; +bitslice_test_nonces_t bitslice_test_nonces_dispatch; + +#if defined (_WIN32) +#define malloc_bitslice(x) __builtin_assume_aligned(_aligned_malloc((x), MAX_BITSLICES/8), MAX_BITSLICES/8) +#define free_bitslice(x) _aligned_free(x) +#elif defined (__APPLE__) +static void *malloc_bitslice(size_t x) { + char *allocated_memory; + if (posix_memalign((void**)&allocated_memory, MAX_BITSLICES/8, x)) { + return NULL; + } else { + return __builtin_assume_aligned(allocated_memory, MAX_BITSLICES/8); + } +} +#define free_bitslice(x) free(x) +#else +#define malloc_bitslice(x) memalign(MAX_BITSLICES/8, (x)) +#define free_bitslice(x) free(x) +#endif + +typedef enum { + EVEN_STATE = 0, + ODD_STATE = 1 +} odd_even_t; + + +// arrays of bitsliced states with identical values in all slices +static bitslice_t bitsliced_encrypted_nonces[256][KEYSTREAM_SIZE]; +static bitslice_t bitsliced_encrypted_parity_bits[256][4]; +// 1 and 0 vectors +static bitslice_t bs_ones; +static bitslice_t bs_zeroes; + + +void BITSLICE_TEST_NONCES(uint32_t nonces_to_bruteforce, uint32_t *bf_test_nonce, uint8_t *bf_test_nonce_par) { + + // initialize 1 and 0 vectors + memset(bs_ones.bytes, 0xff, VECTOR_SIZE); + memset(bs_zeroes.bytes, 0x00, VECTOR_SIZE); + + // bitslice nonces' 2nd to 4th byte + for (uint32_t i = 0; i < nonces_to_bruteforce; i++) { + for(uint32_t bit_idx = 0; bit_idx < KEYSTREAM_SIZE; bit_idx++){ + bool bit = get_bit(KEYSTREAM_SIZE-1-bit_idx, rev32(bf_test_nonce[i] << 8)); + if(bit){ + bitsliced_encrypted_nonces[i][bit_idx].value = bs_ones.value; + } else { + bitsliced_encrypted_nonces[i][bit_idx].value = bs_zeroes.value; + } + } + } + // bitslice nonces' parity (4 bits) + for (uint32_t i = 0; i < nonces_to_bruteforce; i++) { + for(uint32_t bit_idx = 0; bit_idx < 4; bit_idx++){ + bool bit = get_bit(4-1-bit_idx, bf_test_nonce_par[i]); + if(bit){ + bitsliced_encrypted_parity_bits[i][bit_idx].value = bs_ones.value; + } else { + bitsliced_encrypted_parity_bits[i][bit_idx].value = bs_zeroes.value; + } + } + } + +} + + +const uint64_t CRACK_STATES_BITSLICED(uint32_t cuid, uint8_t *best_first_bytes, statelist_t *p, uint32_t *keys_found, uint64_t *num_keys_tested, uint32_t nonces_to_bruteforce, uint8_t *bf_test_nonce_2nd_byte, noncelist_t *nonces){ + + // Unlike aczid's implementation this doesn't roll back at all when performing bitsliced bruteforce. + // We know that the best first byte is already shifted in. Testing with the remaining three bytes of + // the nonces is sufficient to eliminate most of them. The small rest is tested with a simple unsliced + // brute forcing (including roll back). + + bitslice_t states[KEYSTREAM_SIZE+STATE_SIZE]; + bitslice_t * restrict state_p; + uint64_t key = -1; + uint64_t bucket_states_tested = 0; + uint32_t bucket_size[(p->len[EVEN_STATE] - 1)/MAX_BITSLICES + 1]; + uint32_t bitsliced_blocks = 0; + uint32_t const *restrict p_even_end = p->states[EVEN_STATE] + p->len[EVEN_STATE]; +#if defined (DEBUG_BRUTE_FORCE) + uint32_t elimination_step = 0; + #define MAX_ELIMINATION_STEP 32 + uint64_t keys_eliminated[MAX_ELIMINATION_STEP] = {0}; +#endif +#ifdef DEBUG_KEY_ELIMINATION + bool bucket_contains_test_key[(p->len[EVEN_STATE] - 1)/MAX_BITSLICES + 1]; +#endif + + // constant ones/zeroes + bitslice_t bs_ones; + memset(bs_ones.bytes, 0xff, VECTOR_SIZE); + bitslice_t bs_zeroes; + memset(bs_zeroes.bytes, 0x00, VECTOR_SIZE); + + // bitslice all the even states + bitslice_t **restrict bitsliced_even_states = (bitslice_t **)malloc(((p->len[EVEN_STATE] - 1)/MAX_BITSLICES + 1) * sizeof(bitslice_t *)); + if (bitsliced_even_states == NULL) { + printf("Out of memory error in brute_force. Aborting..."); + exit(4); + } + bitslice_value_t *restrict bitsliced_even_feedback = malloc_bitslice(((p->len[EVEN_STATE] - 1)/MAX_BITSLICES + 1) * sizeof(bitslice_value_t)); + if (bitsliced_even_feedback == NULL) { + printf("Out of memory error in brute_force. Aborting..."); + exit(4); + } + for(uint32_t *restrict p_even = p->states[EVEN_STATE]; p_even < p_even_end; p_even += MAX_BITSLICES){ + bitslice_t *restrict lstate_p = malloc_bitslice(STATE_SIZE/2*sizeof(bitslice_t)); + if (lstate_p == NULL) { + printf("Out of memory error in brute_force. Aborting... \n"); + exit(4); + } + memset(lstate_p, 0x00, STATE_SIZE/2*sizeof(bitslice_t)); // zero even bits + // bitslice even half-states + const uint32_t max_slices = (p_even_end-p_even) < MAX_BITSLICES ? p_even_end-p_even : MAX_BITSLICES; + bucket_size[bitsliced_blocks] = max_slices; +#ifdef DEBUG_KEY_ELIMINATION + bucket_contains_test_key[bitsliced_blocks] = false; +#endif + uint32_t slice_idx; + for(slice_idx = 0; slice_idx < max_slices; ++slice_idx){ + uint32_t e = *(p_even+slice_idx); +#ifdef DEBUG_KEY_ELIMINATION + if (known_target_key != -1 && e == test_state[EVEN_STATE]) { + bucket_contains_test_key[bitsliced_blocks] = true; + // printf("bucket %d contains test key even state\n", bitsliced_blocks); + // printf("in slice %d\n", slice_idx); + } +#endif + for(uint32_t bit_idx = 0; bit_idx < STATE_SIZE/2; bit_idx++, e >>= 1){ + // set even bits + if(e&1){ + lstate_p[bit_idx].bytes64[slice_idx>>6] |= 1ull << (slice_idx & 0x3f); + } + } + } + // padding with last even state + for ( ; slice_idx < MAX_BITSLICES; ++slice_idx) { + uint32_t e = *(p_even_end-1); + for(uint32_t bit_idx = 0; bit_idx < STATE_SIZE/2; bit_idx++, e >>= 1){ + // set even bits + if(e&1){ + lstate_p[bit_idx].bytes64[slice_idx>>6] |= 1ull << (slice_idx & 0x3f); + } + } + } + bitsliced_even_states[bitsliced_blocks] = lstate_p; + // bitsliced_even_feedback[bitsliced_blocks] = bs_ones; + bitsliced_even_feedback[bitsliced_blocks] = lstate_p[(47- 0)/2].value ^ + lstate_p[(47-10)/2].value ^ lstate_p[(47-12)/2].value ^ lstate_p[(47-14)/2].value ^ + lstate_p[(47-24)/2].value ^ lstate_p[(47-42)/2].value; + bitsliced_blocks++; + } + // bitslice every odd state to every block of even states + for(uint32_t const *restrict p_odd = p->states[ODD_STATE]; p_odd < p->states[ODD_STATE] + p->len[ODD_STATE]; ++p_odd){ + // early abort + if(*keys_found){ + goto out; + } + + // set odd state bits and pre-compute first keystream bit vector. This is the same for all blocks of even states + + state_p = &states[KEYSTREAM_SIZE]; + uint32_t o = *p_odd; + + // pre-compute the odd feedback bit + bool odd_feedback_bit = evenparity32(o&0x29ce5c); + const bitslice_value_t odd_feedback = odd_feedback_bit ? bs_ones.value : bs_zeroes.value; + + // set odd state bits + for (uint32_t state_idx = 0; state_idx < STATE_SIZE; o >>= 1, state_idx += 2) { + if (o & 1){ + state_p[state_idx] = bs_ones; + } else { + state_p[state_idx] = bs_zeroes; + } + } + + bitslice_value_t crypto1_bs_f20b_2[16]; + bitslice_value_t crypto1_bs_f20b_3[8]; + + crypto1_bs_f20b_2[0] = f20b(state_p[47-25].value, state_p[47-27].value, state_p[47-29].value, state_p[47-31].value); + crypto1_bs_f20b_3[0] = f20b(state_p[47-41].value, state_p[47-43].value, state_p[47-45].value, state_p[47-47].value); + + bitslice_value_t ksb[8]; + ksb[0] = f20c(f20a(state_p[47- 9].value, state_p[47-11].value, state_p[47-13].value, state_p[47-15].value), + f20b(state_p[47-17].value, state_p[47-19].value, state_p[47-21].value, state_p[47-23].value), + crypto1_bs_f20b_2[0], + f20a(state_p[47-33].value, state_p[47-35].value, state_p[47-37].value, state_p[47-39].value), + crypto1_bs_f20b_3[0]); + + uint32_t *restrict p_even = p->states[EVEN_STATE]; + for (uint32_t block_idx = 0; block_idx < bitsliced_blocks; ++block_idx, p_even += MAX_BITSLICES) { + +#ifdef DEBUG_KEY_ELIMINATION + // if (known_target_key != -1 && bucket_contains_test_key[block_idx] && *p_odd == test_state[ODD_STATE]) { + // printf("Now testing known target key.\n"); + // printf("block_idx = %d/%d\n", block_idx, bitsliced_blocks); + // } +#endif + // add the even state bits + const bitslice_t const *restrict bitsliced_even_state = bitsliced_even_states[block_idx]; + for(uint32_t state_idx = 1; state_idx < STATE_SIZE; state_idx += 2) { + state_p[state_idx] = bitsliced_even_state[state_idx/2]; + } + + // pre-compute first feedback bit vector. This is the same for all nonces + bitslice_value_t fbb[8]; + fbb[0] = odd_feedback ^ bitsliced_even_feedback[block_idx]; + + // vector to contain test results (1 = passed, 0 = failed) + bitslice_t results = bs_ones; + + // parity_bits + bitslice_value_t par[8]; + par[0] = bs_zeroes.value; + uint32_t next_common_bits = 0; + + for(uint32_t tests = 0; tests < nonces_to_bruteforce; ++tests){ + // common bits with preceding test nonce + uint32_t common_bits = next_common_bits; //tests ? trailing_zeros(bf_test_nonce_2nd_byte[tests] ^ bf_test_nonce_2nd_byte[tests-1]) : 0; + next_common_bits = tests < nonces_to_bruteforce - 1 ? trailing_zeros(bf_test_nonce_2nd_byte[tests] ^ bf_test_nonce_2nd_byte[tests+1]) : 0; + uint32_t parity_bit_idx = 1; // start checking with the parity of second nonce byte + bitslice_value_t fb_bits = fbb[common_bits]; // start with precomputed feedback bits from previous nonce + bitslice_value_t ks_bits = ksb[common_bits]; // dito for first keystream bits + bitslice_value_t parity_bit_vector = par[common_bits]; // dito for first parity vector + // bitslice_value_t fb_bits = fbb[0]; // start with precomputed feedback bits from previous nonce + // bitslice_value_t ks_bits = ksb[0]; // dito for first keystream bits + // bitslice_value_t parity_bit_vector = par[0]; // dito for first parity vector + state_p -= common_bits; // and reuse the already calculated state bits + // highest bit is transmitted/received first. We start with Bit 23 (highest bit of second nonce byte), + // or the highest bit which differs from the previous nonce + for (int32_t ks_idx = KEYSTREAM_SIZE-1-common_bits; ks_idx >= 0; --ks_idx) { + + // decrypt nonce bits + const bitslice_value_t encrypted_nonce_bit_vector = bitsliced_encrypted_nonces[tests][ks_idx].value; + const bitslice_value_t decrypted_nonce_bit_vector = encrypted_nonce_bit_vector ^ ks_bits; + + // compute real parity bits on the fly + parity_bit_vector ^= decrypted_nonce_bit_vector; + + // update state + state_p--; + state_p[0].value = fb_bits ^ decrypted_nonce_bit_vector; + + // update crypto1 subfunctions + bitslice_value_t f20a_1, f20b_1, f20b_2, f20a_2, f20b_3; + f20a_2 = f20a(state_p[47-33].value, state_p[47-35].value, state_p[47-37].value, state_p[47-39].value); + f20b_3 = f20b(state_p[47-41].value, state_p[47-43].value, state_p[47-45].value, state_p[47-47].value); + if (ks_idx > KEYSTREAM_SIZE - 8) { + f20a_1 = f20a(state_p[47- 9].value, state_p[47-11].value, state_p[47-13].value, state_p[47-15].value); + f20b_1 = f20b(state_p[47-17].value, state_p[47-19].value, state_p[47-21].value, state_p[47-23].value); + f20b_2 = f20b(state_p[47-25].value, state_p[47-27].value, state_p[47-29].value, state_p[47-31].value); + crypto1_bs_f20b_2[KEYSTREAM_SIZE - ks_idx] = f20b_2; + crypto1_bs_f20b_3[KEYSTREAM_SIZE - ks_idx] = f20b_3; + } else if (ks_idx > KEYSTREAM_SIZE - 16) { + f20a_1 = f20a(state_p[47- 9].value, state_p[47-11].value, state_p[47-13].value, state_p[47-15].value); + f20b_1 = crypto1_bs_f20b_2[KEYSTREAM_SIZE - ks_idx - 8]; + f20b_2 = f20b(state_p[47-25].value, state_p[47-27].value, state_p[47-29].value, state_p[47-31].value); + crypto1_bs_f20b_2[KEYSTREAM_SIZE - ks_idx] = f20b_2; + } else if (ks_idx > KEYSTREAM_SIZE - 24){ + f20a_1 = f20a(state_p[47- 9].value, state_p[47-11].value, state_p[47-13].value, state_p[47-15].value); + f20b_1 = crypto1_bs_f20b_2[KEYSTREAM_SIZE - ks_idx - 8]; + f20b_2 = crypto1_bs_f20b_3[KEYSTREAM_SIZE - ks_idx - 16]; + } else { + f20a_1 = f20a(state_p[47- 9].value, state_p[47-11].value, state_p[47-13].value, state_p[47-15].value); + f20b_1 = f20b(state_p[47-17].value, state_p[47-19].value, state_p[47-21].value, state_p[47-23].value); + f20b_2 = f20b(state_p[47-25].value, state_p[47-27].value, state_p[47-29].value, state_p[47-31].value); + } + // update keystream bit + ks_bits = f20c(f20a_1, f20b_1, f20b_2, f20a_2, f20b_3); + + // for each completed byte: + if ((ks_idx & 0x07) == 0) { + // get encrypted parity bits + const bitslice_value_t encrypted_parity_bit_vector = bitsliced_encrypted_parity_bits[tests][parity_bit_idx++].value; + + // decrypt parity bits + const bitslice_value_t decrypted_parity_bit_vector = encrypted_parity_bit_vector ^ ks_bits; + + // compare actual parity bits with decrypted parity bits and take count in results vector + results.value &= ~parity_bit_vector ^ decrypted_parity_bit_vector; + + // make sure we still have a match in our set + // if(memcmp(&results, &bs_zeroes, sizeof(bitslice_t)) == 0){ + + // this is much faster on my gcc, because somehow a memcmp needlessly spills/fills all the xmm registers to/from the stack - ??? + // the short-circuiting also helps + if(results.bytes64[0] == 0 +#if MAX_BITSLICES > 64 + && results.bytes64[1] == 0 +#endif +#if MAX_BITSLICES > 128 + && results.bytes64[2] == 0 + && results.bytes64[3] == 0 +#endif + ) { +#if defined (DEBUG_BRUTE_FORCE) + if (elimination_step < MAX_ELIMINATION_STEP) { + keys_eliminated[elimination_step] += MAX_BITSLICES; + } +#endif +#ifdef DEBUG_KEY_ELIMINATION + if (known_target_key != -1 && bucket_contains_test_key[block_idx] && *p_odd == test_state[ODD_STATE]) { + printf("Known target key eliminated in brute_force.\n"); + printf("block_idx = %d/%d, nonce = %d/%d\n", block_idx, bitsliced_blocks, tests, nonces_to_bruteforce); + } +#endif + goto stop_tests; + } + // prepare for next nonce byte +#if defined (DEBUG_BRUTE_FORCE) + elimination_step++; +#endif + parity_bit_vector = bs_zeroes.value; + } + // update feedback bit vector + if (ks_idx != 0) { + fb_bits = + (state_p[47- 0].value ^ state_p[47- 5].value ^ state_p[47- 9].value ^ + state_p[47-10].value ^ state_p[47-12].value ^ state_p[47-14].value ^ + state_p[47-15].value ^ state_p[47-17].value ^ state_p[47-19].value ^ + state_p[47-24].value ^ state_p[47-25].value ^ state_p[47-27].value ^ + state_p[47-29].value ^ state_p[47-35].value ^ state_p[47-39].value ^ + state_p[47-41].value ^ state_p[47-42].value ^ state_p[47-43].value); + } + // remember feedback and keystream vectors for later use + uint8_t bit = KEYSTREAM_SIZE - ks_idx; + if (bit <= next_common_bits) { // if needed and not yet stored + fbb[bit] = fb_bits; + ksb[bit] = ks_bits; + par[bit] = parity_bit_vector; + } + } + // prepare for next nonce. Revert to initial state + state_p = &states[KEYSTREAM_SIZE]; + } + + // all nonce tests were successful: we've found a possible key in this block! + uint32_t *p_even_test = p_even; + for (uint32_t results_word = 0; results_word < MAX_BITSLICES / 64; ++results_word) { + uint64_t results64 = results.bytes64[results_word]; + for (uint32_t results_bit = 0; results_bit < 64; results_bit++) { + if (results64 & 0x01) { + if (verify_key(cuid, nonces, best_first_bytes, *p_odd, *p_even_test)) { + struct Crypto1State pcs; + pcs.odd = *p_odd; + pcs.even = *p_even_test; + lfsr_rollback_byte(&pcs, (cuid >> 24) ^ best_first_bytes[0], true); + crypto1_get_lfsr(&pcs, &key); + bucket_states_tested += 64 * results_word + results_bit; + goto out; + } +#ifdef DEBUG_KEY_ELIMINATION + if (known_target_key != -1 && *p_even_test == test_state[EVEN_STATE] && *p_odd == test_state[ODD_STATE]) { + printf("Known target key eliminated in brute_force verification.\n"); + printf("block_idx = %d/%d\n", block_idx, bitsliced_blocks); + } +#endif + } +#ifdef DEBUG_KEY_ELIMINATION + if (known_target_key != -1 && *p_even_test == test_state[EVEN_STATE] && *p_odd == test_state[ODD_STATE]) { + printf("Known target key eliminated in brute_force (results_bit == 0).\n"); + printf("block_idx = %d/%d\n", block_idx, bitsliced_blocks); + } +#endif + results64 >>= 1; + p_even_test++; + if (p_even_test == p_even_end) { + goto stop_tests; + } + } + } +stop_tests: +#if defined (DEBUG_BRUTE_FORCE) + elimination_step = 0; +#endif + bucket_states_tested += bucket_size[block_idx]; + // prepare to set new states + state_p = &states[KEYSTREAM_SIZE]; + continue; + } + } +out: + for(uint32_t block_idx = 0; block_idx < bitsliced_blocks; ++block_idx){ + free_bitslice(bitsliced_even_states[block_idx]); + } + free(bitsliced_even_states); + free_bitslice(bitsliced_even_feedback); + __sync_fetch_and_add(num_keys_tested, bucket_states_tested); + +#if defined (DEBUG_BRUTE_FORCE) + for (uint32_t i = 0; i < MAX_ELIMINATION_STEP; i++) { + printf("Eliminated after %2u test_bytes: %5.2f%%\n", i+1, (float)keys_eliminated[i] / bucket_states_tested * 100); + } +#endif + return key; +} + + + +#ifndef __MMX__ + +// pointers to functions: +crack_states_bitsliced_t *crack_states_bitsliced_function_p = &crack_states_bitsliced_dispatch; +bitslice_test_nonces_t *bitslice_test_nonces_function_p = &bitslice_test_nonces_dispatch; + +// determine the available instruction set at runtime and call the correct function +const uint64_t crack_states_bitsliced_dispatch(uint32_t cuid, uint8_t *best_first_bytes, statelist_t *p, uint32_t *keys_found, uint64_t *num_keys_tested, uint32_t nonces_to_bruteforce, uint8_t *bf_test_nonce_2nd_byte, noncelist_t *nonces) { +#if defined (__i386__) || defined (__x86_64__) + #if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8)) + #if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) + if (__builtin_cpu_supports("avx512f")) crack_states_bitsliced_function_p = &crack_states_bitsliced_AVX512; + else if (__builtin_cpu_supports("avx2")) crack_states_bitsliced_function_p = &crack_states_bitsliced_AVX2; + #else + if (__builtin_cpu_supports("avx2")) crack_states_bitsliced_function_p = &crack_states_bitsliced_AVX2; + #endif + else if (__builtin_cpu_supports("avx")) crack_states_bitsliced_function_p = &crack_states_bitsliced_AVX; + else if (__builtin_cpu_supports("sse2")) crack_states_bitsliced_function_p = &crack_states_bitsliced_SSE2; + else if (__builtin_cpu_supports("mmx")) crack_states_bitsliced_function_p = &crack_states_bitsliced_MMX; + else + #endif +#endif + crack_states_bitsliced_function_p = &crack_states_bitsliced_NOSIMD; + + // call the most optimized function for this CPU + return (*crack_states_bitsliced_function_p)(cuid, best_first_bytes, p, keys_found, num_keys_tested, nonces_to_bruteforce, bf_test_nonce_2nd_byte, nonces); +} + +void bitslice_test_nonces_dispatch(uint32_t nonces_to_bruteforce, uint32_t *bf_test_nonce, uint8_t *bf_test_nonce_par) { +#if defined (__i386__) || defined (__x86_64__) + #if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8)) + #if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) + if (__builtin_cpu_supports("avx512f")) bitslice_test_nonces_function_p = &bitslice_test_nonces_AVX512; + else if (__builtin_cpu_supports("avx2")) bitslice_test_nonces_function_p = &bitslice_test_nonces_AVX2; + #else + if (__builtin_cpu_supports("avx2")) bitslice_test_nonces_function_p = &bitslice_test_nonces_AVX2; + #endif + else if (__builtin_cpu_supports("avx")) bitslice_test_nonces_function_p = &bitslice_test_nonces_AVX; + else if (__builtin_cpu_supports("sse2")) bitslice_test_nonces_function_p = &bitslice_test_nonces_SSE2; + else if (__builtin_cpu_supports("mmx")) bitslice_test_nonces_function_p = &bitslice_test_nonces_MMX; + else + #endif +#endif + bitslice_test_nonces_function_p = &bitslice_test_nonces_NOSIMD; + + // call the most optimized function for this CPU + (*bitslice_test_nonces_function_p)(nonces_to_bruteforce, bf_test_nonce, bf_test_nonce_par); +} + +// Entries to dispatched function calls +const uint64_t crack_states_bitsliced(uint32_t cuid, uint8_t *best_first_bytes, statelist_t *p, uint32_t *keys_found, uint64_t *num_keys_tested, uint32_t nonces_to_bruteforce, uint8_t *bf_test_nonce_2nd_byte, noncelist_t *nonces) { + return (*crack_states_bitsliced_function_p)(cuid, best_first_bytes, p, keys_found, num_keys_tested, nonces_to_bruteforce, bf_test_nonce_2nd_byte, nonces); +} + +void bitslice_test_nonces(uint32_t nonces_to_bruteforce, uint32_t *bf_test_nonce, uint8_t *bf_test_nonce_par) { + (*bitslice_test_nonces_function_p)(nonces_to_bruteforce, bf_test_nonce, bf_test_nonce_par); +} + +#endif diff --git a/client/hardnested/hardnested_bf_core.h b/client/hardnested/hardnested_bf_core.h new file mode 100644 index 00000000..7a445993 --- /dev/null +++ b/client/hardnested/hardnested_bf_core.h @@ -0,0 +1,58 @@ +//----------------------------------------------------------------------------- +// Copyright (C) 2016, 2017 by piwi +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// Implements a card only attack based on crypto text (encrypted nonces +// received during a nested authentication) only. Unlike other card only +// attacks this doesn't rely on implementation errors but only on the +// inherent weaknesses of the crypto1 cypher. Described in +// Carlo Meijer, Roel Verdult, "Ciphertext-only Cryptanalysis on Hardened +// Mifare Classic Cards" in Proceedings of the 22nd ACM SIGSAC Conference on +// Computer and Communications Security, 2015 +//----------------------------------------------------------------------------- +// +// brute forcing is based on @aczids bitsliced brute forcer +// https://github.com/aczid/crypto1_bs with some modifications. Mainly: +// - don't rollback. Start with 2nd byte of nonce instead +// - reuse results of filter subfunctions +// - reuse results of previous nonces if some first bits are identical +// +//----------------------------------------------------------------------------- +// aczid's Copyright notice: +// +// Bit-sliced Crypto-1 brute-forcing implementation +// Builds on the data structures returned by CraptEV1 craptev1_get_space(nonces, threshold, uid) +/* +Copyright (c) 2015-2016 Aram Verstegen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +#ifndef HARDNESTED_BF_CORE_H__ +#define HARDNESTED_BF_CORE_H__ + +#include "hardnested_bruteforce.h" // statelist_t + +extern const uint64_t crack_states_bitsliced(uint32_t cuid, uint8_t *best_first_bytes, statelist_t *p, uint32_t *keys_found, uint64_t *num_keys_tested, uint32_t nonces_to_bruteforce, uint8_t *bf_test_nonces_2nd_byte, noncelist_t *nonces); +extern void bitslice_test_nonces(uint32_t nonces_to_bruteforce, uint32_t *bf_test_nonces, uint8_t *bf_test_nonce_par); + +#endif diff --git a/client/hardnested/hardnested_bitarray_core.c b/client/hardnested/hardnested_bitarray_core.c new file mode 100644 index 00000000..5615d006 --- /dev/null +++ b/client/hardnested/hardnested_bitarray_core.c @@ -0,0 +1,650 @@ +//----------------------------------------------------------------------------- +// Copyright (C) 2016, 2017 by piwi +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license.ch b +//----------------------------------------------------------------------------- +// Implements a card only attack based on crypto text (encrypted nonces +// received during a nested authentication) only. Unlike other card only +// attacks this doesn't rely on implementation errors but only on the +// inherent weaknesses of the crypto1 cypher. Described in +// Carlo Meijer, Roel Verdult, "Ciphertext-only Cryptanalysis on Hardened +// Mifare Classic Cards" in Proceedings of the 22nd ACM SIGSAC Conference on +// Computer and Communications Security, 2015 +//----------------------------------------------------------------------------- +// some helper functions which can benefit from SIMD instructions or other special instructions +// + +#include "hardnested_bitarray_core.h" + +#include +#include +#include +#ifndef __APPLE__ +#include +#endif + +// this needs to be compiled several times for each instruction set. +// For each instruction set, define a dedicated function name: +#if defined (__AVX512F__) +#define MALLOC_BITARRAY malloc_bitarray_AVX512 +#define FREE_BITARRAY free_bitarray_AVX512 +#define BITCOUNT bitcount_AVX512 +#define COUNT_STATES count_states_AVX512 +#define BITARRAY_AND bitarray_AND_AVX512 +#define BITARRAY_LOW20_AND bitarray_low20_AND_AVX512 +#define COUNT_BITARRAY_AND count_bitarray_AND_AVX512 +#define COUNT_BITARRAY_LOW20_AND count_bitarray_low20_AND_AVX512 +#define BITARRAY_AND4 bitarray_AND4_AVX512 +#define BITARRAY_OR bitarray_OR_AVX512 +#define COUNT_BITARRAY_AND2 count_bitarray_AND2_AVX512 +#define COUNT_BITARRAY_AND3 count_bitarray_AND3_AVX512 +#define COUNT_BITARRAY_AND4 count_bitarray_AND4_AVX512 +#elif defined (__AVX2__) +#define MALLOC_BITARRAY malloc_bitarray_AVX2 +#define FREE_BITARRAY free_bitarray_AVX2 +#define BITCOUNT bitcount_AVX2 +#define COUNT_STATES count_states_AVX2 +#define BITARRAY_AND bitarray_AND_AVX2 +#define BITARRAY_LOW20_AND bitarray_low20_AND_AVX2 +#define COUNT_BITARRAY_AND count_bitarray_AND_AVX2 +#define COUNT_BITARRAY_LOW20_AND count_bitarray_low20_AND_AVX2 +#define BITARRAY_AND4 bitarray_AND4_AVX2 +#define BITARRAY_OR bitarray_OR_AVX2 +#define COUNT_BITARRAY_AND2 count_bitarray_AND2_AVX2 +#define COUNT_BITARRAY_AND3 count_bitarray_AND3_AVX2 +#define COUNT_BITARRAY_AND4 count_bitarray_AND4_AVX2 +#elif defined (__AVX__) +#define MALLOC_BITARRAY malloc_bitarray_AVX +#define FREE_BITARRAY free_bitarray_AVX +#define BITCOUNT bitcount_AVX +#define COUNT_STATES count_states_AVX +#define BITARRAY_AND bitarray_AND_AVX +#define BITARRAY_LOW20_AND bitarray_low20_AND_AVX +#define COUNT_BITARRAY_AND count_bitarray_AND_AVX +#define COUNT_BITARRAY_LOW20_AND count_bitarray_low20_AND_AVX +#define BITARRAY_AND4 bitarray_AND4_AVX +#define BITARRAY_OR bitarray_OR_AVX +#define COUNT_BITARRAY_AND2 count_bitarray_AND2_AVX +#define COUNT_BITARRAY_AND3 count_bitarray_AND3_AVX +#define COUNT_BITARRAY_AND4 count_bitarray_AND4_AVX +#elif defined (__SSE2__) +#define MALLOC_BITARRAY malloc_bitarray_SSE2 +#define FREE_BITARRAY free_bitarray_SSE2 +#define BITCOUNT bitcount_SSE2 +#define COUNT_STATES count_states_SSE2 +#define BITARRAY_AND bitarray_AND_SSE2 +#define BITARRAY_LOW20_AND bitarray_low20_AND_SSE2 +#define COUNT_BITARRAY_AND count_bitarray_AND_SSE2 +#define COUNT_BITARRAY_LOW20_AND count_bitarray_low20_AND_SSE2 +#define BITARRAY_AND4 bitarray_AND4_SSE2 +#define BITARRAY_OR bitarray_OR_SSE2 +#define COUNT_BITARRAY_AND2 count_bitarray_AND2_SSE2 +#define COUNT_BITARRAY_AND3 count_bitarray_AND3_SSE2 +#define COUNT_BITARRAY_AND4 count_bitarray_AND4_SSE2 +#elif defined (__MMX__) +#define MALLOC_BITARRAY malloc_bitarray_MMX +#define FREE_BITARRAY free_bitarray_MMX +#define BITCOUNT bitcount_MMX +#define COUNT_STATES count_states_MMX +#define BITARRAY_AND bitarray_AND_MMX +#define BITARRAY_LOW20_AND bitarray_low20_AND_MMX +#define COUNT_BITARRAY_AND count_bitarray_AND_MMX +#define COUNT_BITARRAY_LOW20_AND count_bitarray_low20_AND_MMX +#define BITARRAY_AND4 bitarray_AND4_MMX +#define BITARRAY_OR bitarray_OR_MMX +#define COUNT_BITARRAY_AND2 count_bitarray_AND2_MMX +#define COUNT_BITARRAY_AND3 count_bitarray_AND3_MMX +#define COUNT_BITARRAY_AND4 count_bitarray_AND4_MMX +#else +#define MALLOC_BITARRAY malloc_bitarray_NOSIMD +#define FREE_BITARRAY free_bitarray_NOSIMD +#define BITCOUNT bitcount_NOSIMD +#define COUNT_STATES count_states_NOSIMD +#define BITARRAY_AND bitarray_AND_NOSIMD +#define BITARRAY_LOW20_AND bitarray_low20_AND_NOSIMD +#define COUNT_BITARRAY_AND count_bitarray_AND_NOSIMD +#define COUNT_BITARRAY_LOW20_AND count_bitarray_low20_AND_NOSIMD +#define BITARRAY_AND4 bitarray_AND4_NOSIMD +#define BITARRAY_OR bitarray_OR_NOSIMD +#define COUNT_BITARRAY_AND2 count_bitarray_AND2_NOSIMD +#define COUNT_BITARRAY_AND3 count_bitarray_AND3_NOSIMD +#define COUNT_BITARRAY_AND4 count_bitarray_AND4_NOSIMD +#endif + + +// typedefs and declaration of functions: +typedef uint32_t* malloc_bitarray_t(uint32_t); +malloc_bitarray_t malloc_bitarray_AVX512, malloc_bitarray_AVX2, malloc_bitarray_AVX, malloc_bitarray_SSE2, malloc_bitarray_MMX, malloc_bitarray_NOSIMD, malloc_bitarray_dispatch; +typedef void free_bitarray_t(uint32_t*); +free_bitarray_t free_bitarray_AVX512, free_bitarray_AVX2, free_bitarray_AVX, free_bitarray_SSE2, free_bitarray_MMX, free_bitarray_NOSIMD, free_bitarray_dispatch; +typedef uint32_t bitcount_t(uint32_t); +bitcount_t bitcount_AVX512, bitcount_AVX2, bitcount_AVX, bitcount_SSE2, bitcount_MMX, bitcount_NOSIMD, bitcount_dispatch; +typedef uint32_t count_states_t(uint32_t*); +count_states_t count_states_AVX512, count_states_AVX2, count_states_AVX, count_states_SSE2, count_states_MMX, count_states_NOSIMD, count_states_dispatch; +typedef void bitarray_AND_t(uint32_t[], uint32_t[]); +bitarray_AND_t bitarray_AND_AVX512, bitarray_AND_AVX2, bitarray_AND_AVX, bitarray_AND_SSE2, bitarray_AND_MMX, bitarray_AND_NOSIMD, bitarray_AND_dispatch; +typedef void bitarray_low20_AND_t(uint32_t*, uint32_t*); +bitarray_low20_AND_t bitarray_low20_AND_AVX512, bitarray_low20_AND_AVX2, bitarray_low20_AND_AVX, bitarray_low20_AND_SSE2, bitarray_low20_AND_MMX, bitarray_low20_AND_NOSIMD, bitarray_low20_AND_dispatch; +typedef uint32_t count_bitarray_AND_t(uint32_t*, uint32_t*); +count_bitarray_AND_t count_bitarray_AND_AVX512, count_bitarray_AND_AVX2, count_bitarray_AND_AVX, count_bitarray_AND_SSE2, count_bitarray_AND_MMX, count_bitarray_AND_NOSIMD, count_bitarray_AND_dispatch; +typedef uint32_t count_bitarray_low20_AND_t(uint32_t*, uint32_t*); +count_bitarray_low20_AND_t count_bitarray_low20_AND_AVX512, count_bitarray_low20_AND_AVX2, count_bitarray_low20_AND_AVX, count_bitarray_low20_AND_SSE2, count_bitarray_low20_AND_MMX, count_bitarray_low20_AND_NOSIMD, count_bitarray_low20_AND_dispatch; +typedef void bitarray_AND4_t(uint32_t*, uint32_t*, uint32_t*, uint32_t*); +bitarray_AND4_t bitarray_AND4_AVX512, bitarray_AND4_AVX2, bitarray_AND4_AVX, bitarray_AND4_SSE2, bitarray_AND4_MMX, bitarray_AND4_NOSIMD, bitarray_AND4_dispatch; +typedef void bitarray_OR_t(uint32_t[], uint32_t[]); +bitarray_OR_t bitarray_OR_AVX512, bitarray_OR_AVX2, bitarray_OR_AVX, bitarray_OR_SSE2, bitarray_OR_MMX, bitarray_OR_NOSIMD, bitarray_OR_dispatch; +typedef uint32_t count_bitarray_AND2_t(uint32_t*, uint32_t*); +count_bitarray_AND2_t count_bitarray_AND2_AVX512, count_bitarray_AND2_AVX2, count_bitarray_AND2_AVX, count_bitarray_AND2_SSE2, count_bitarray_AND2_MMX, count_bitarray_AND2_NOSIMD, count_bitarray_AND2_dispatch; +typedef uint32_t count_bitarray_AND3_t(uint32_t*, uint32_t*, uint32_t*); +count_bitarray_AND3_t count_bitarray_AND3_AVX512, count_bitarray_AND3_AVX2, count_bitarray_AND3_AVX, count_bitarray_AND3_SSE2, count_bitarray_AND3_MMX, count_bitarray_AND3_NOSIMD, count_bitarray_AND3_dispatch; +typedef uint32_t count_bitarray_AND4_t(uint32_t*, uint32_t*, uint32_t*, uint32_t*); +count_bitarray_AND4_t count_bitarray_AND4_AVX512, count_bitarray_AND4_AVX2, count_bitarray_AND4_AVX, count_bitarray_AND4_SSE2, count_bitarray_AND4_MMX, count_bitarray_AND4_NOSIMD, count_bitarray_AND4_dispatch; + + +inline uint32_t *MALLOC_BITARRAY(uint32_t x) +{ +#if defined (_WIN32) + return __builtin_assume_aligned(_aligned_malloc((x), __BIGGEST_ALIGNMENT__), __BIGGEST_ALIGNMENT__); +#elif defined (__APPLE__) + uint32_t *allocated_memory; + if (posix_memalign((void**)&allocated_memory, __BIGGEST_ALIGNMENT__, x)) { + return NULL; + } else { + return __builtin_assume_aligned(allocated_memory, __BIGGEST_ALIGNMENT__); + } +#else + return __builtin_assume_aligned(memalign(__BIGGEST_ALIGNMENT__, (x)), __BIGGEST_ALIGNMENT__); +#endif +} + + +inline void FREE_BITARRAY(uint32_t *x) +{ +#ifdef _WIN32 + _aligned_free(x); +#else + free(x); +#endif +} + + +inline uint32_t BITCOUNT(uint32_t a) +{ + return __builtin_popcountl(a); +} + + +inline uint32_t COUNT_STATES(uint32_t *A) +{ + uint32_t count = 0; + for (uint32_t i = 0; i < (1<<19); i++) { + count += BITCOUNT(A[i]); + } + return count; +} + + +inline void BITARRAY_AND(uint32_t *restrict A, uint32_t *restrict B) +{ + A = __builtin_assume_aligned(A, __BIGGEST_ALIGNMENT__); + B = __builtin_assume_aligned(B, __BIGGEST_ALIGNMENT__); + for (uint32_t i = 0; i < (1<<19); i++) { + A[i] &= B[i]; + } +} + + +inline void BITARRAY_LOW20_AND(uint32_t *restrict A, uint32_t *restrict B) +{ + uint16_t *a = (uint16_t *)__builtin_assume_aligned(A, __BIGGEST_ALIGNMENT__); + uint16_t *b = (uint16_t *)__builtin_assume_aligned(B, __BIGGEST_ALIGNMENT__); + + for (uint32_t i = 0; i < (1<<20); i++) { + if (!b[i]) { + a[i] = 0; + } + } +} + + +inline uint32_t COUNT_BITARRAY_AND(uint32_t *restrict A, uint32_t *restrict B) +{ + A = __builtin_assume_aligned(A, __BIGGEST_ALIGNMENT__); + B = __builtin_assume_aligned(B, __BIGGEST_ALIGNMENT__); + uint32_t count = 0; + for (uint32_t i = 0; i < (1<<19); i++) { + A[i] &= B[i]; + count += BITCOUNT(A[i]); + } + return count; +} + + +inline uint32_t COUNT_BITARRAY_LOW20_AND(uint32_t *restrict A, uint32_t *restrict B) +{ + uint16_t *a = (uint16_t *)__builtin_assume_aligned(A, __BIGGEST_ALIGNMENT__); + uint16_t *b = (uint16_t *)__builtin_assume_aligned(B, __BIGGEST_ALIGNMENT__); + uint32_t count = 0; + + for (uint32_t i = 0; i < (1<<20); i++) { + if (!b[i]) { + a[i] = 0; + } + count += BITCOUNT(a[i]); + } + return count; +} + + +inline void BITARRAY_AND4(uint32_t *restrict A, uint32_t *restrict B, uint32_t *restrict C, uint32_t *restrict D) +{ + A = __builtin_assume_aligned(A, __BIGGEST_ALIGNMENT__); + B = __builtin_assume_aligned(B, __BIGGEST_ALIGNMENT__); + C = __builtin_assume_aligned(C, __BIGGEST_ALIGNMENT__); + D = __builtin_assume_aligned(D, __BIGGEST_ALIGNMENT__); + for (uint32_t i = 0; i < (1<<19); i++) { + A[i] = B[i] & C[i] & D[i]; + } +} + + +inline void BITARRAY_OR(uint32_t *restrict A, uint32_t *restrict B) +{ + A = __builtin_assume_aligned(A, __BIGGEST_ALIGNMENT__); + B = __builtin_assume_aligned(B, __BIGGEST_ALIGNMENT__); + for (uint32_t i = 0; i < (1<<19); i++) { + A[i] |= B[i]; + } +} + + +inline uint32_t COUNT_BITARRAY_AND2(uint32_t *restrict A, uint32_t *restrict B) +{ + A = __builtin_assume_aligned(A, __BIGGEST_ALIGNMENT__); + B = __builtin_assume_aligned(B, __BIGGEST_ALIGNMENT__); + uint32_t count = 0; + for (uint32_t i = 0; i < (1<<19); i++) { + count += BITCOUNT(A[i] & B[i]); + } + return count; +} + + +inline uint32_t COUNT_BITARRAY_AND3(uint32_t *restrict A, uint32_t *restrict B, uint32_t *restrict C) +{ + A = __builtin_assume_aligned(A, __BIGGEST_ALIGNMENT__); + B = __builtin_assume_aligned(B, __BIGGEST_ALIGNMENT__); + C = __builtin_assume_aligned(C, __BIGGEST_ALIGNMENT__); + uint32_t count = 0; + for (uint32_t i = 0; i < (1<<19); i++) { + count += BITCOUNT(A[i] & B[i] & C[i]); + } + return count; +} + + +inline uint32_t COUNT_BITARRAY_AND4(uint32_t *restrict A, uint32_t *restrict B, uint32_t *restrict C, uint32_t *restrict D) +{ + A = __builtin_assume_aligned(A, __BIGGEST_ALIGNMENT__); + B = __builtin_assume_aligned(B, __BIGGEST_ALIGNMENT__); + C = __builtin_assume_aligned(C, __BIGGEST_ALIGNMENT__); + D = __builtin_assume_aligned(D, __BIGGEST_ALIGNMENT__); + uint32_t count = 0; + for (uint32_t i = 0; i < (1<<19); i++) { + count += BITCOUNT(A[i] & B[i] & C[i] & D[i]); + } + return count; +} + + +#ifndef __MMX__ + +// pointers to functions: +malloc_bitarray_t *malloc_bitarray_function_p = &malloc_bitarray_dispatch; +free_bitarray_t *free_bitarray_function_p = &free_bitarray_dispatch; +bitcount_t *bitcount_function_p = &bitcount_dispatch; +count_states_t *count_states_function_p = &count_states_dispatch; +bitarray_AND_t *bitarray_AND_function_p = &bitarray_AND_dispatch; +bitarray_low20_AND_t *bitarray_low20_AND_function_p = &bitarray_low20_AND_dispatch; +count_bitarray_AND_t *count_bitarray_AND_function_p = &count_bitarray_AND_dispatch; +count_bitarray_low20_AND_t *count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_dispatch; +bitarray_AND4_t *bitarray_AND4_function_p = &bitarray_AND4_dispatch; +bitarray_OR_t *bitarray_OR_function_p = &bitarray_OR_dispatch; +count_bitarray_AND2_t *count_bitarray_AND2_function_p = &count_bitarray_AND2_dispatch; +count_bitarray_AND3_t *count_bitarray_AND3_function_p = &count_bitarray_AND3_dispatch; +count_bitarray_AND4_t *count_bitarray_AND4_function_p = &count_bitarray_AND4_dispatch; + +// determine the available instruction set at runtime and call the correct function +uint32_t *malloc_bitarray_dispatch(uint32_t x) { +#if defined (__i386__) || defined (__x86_64__) + #if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8)) + #if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) + if (__builtin_cpu_supports("avx512f")) malloc_bitarray_function_p = &malloc_bitarray_AVX512; + else if (__builtin_cpu_supports("avx2")) malloc_bitarray_function_p = &malloc_bitarray_AVX2; + #else + if (__builtin_cpu_supports("avx2")) malloc_bitarray_function_p = &malloc_bitarray_AVX2; + #endif + else if (__builtin_cpu_supports("avx")) malloc_bitarray_function_p = &malloc_bitarray_AVX; + else if (__builtin_cpu_supports("sse2")) malloc_bitarray_function_p = &malloc_bitarray_SSE2; + else if (__builtin_cpu_supports("mmx")) malloc_bitarray_function_p = &malloc_bitarray_MMX; + else + #endif +#endif + malloc_bitarray_function_p = &malloc_bitarray_NOSIMD; + + // call the most optimized function for this CPU + return (*malloc_bitarray_function_p)(x); +} + +void free_bitarray_dispatch(uint32_t *x) { +#if defined (__i386__) || defined (__x86_64__) + #if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8)) + #if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) + if (__builtin_cpu_supports("avx512f")) free_bitarray_function_p = &free_bitarray_AVX512; + else if (__builtin_cpu_supports("avx2")) free_bitarray_function_p = &free_bitarray_AVX2; + #else + if (__builtin_cpu_supports("avx2")) free_bitarray_function_p = &free_bitarray_AVX2; + #endif + else if (__builtin_cpu_supports("avx")) free_bitarray_function_p = &free_bitarray_AVX; + else if (__builtin_cpu_supports("sse2")) free_bitarray_function_p = &free_bitarray_SSE2; + else if (__builtin_cpu_supports("mmx")) free_bitarray_function_p = &free_bitarray_MMX; + else + #endif +#endif + free_bitarray_function_p = &free_bitarray_NOSIMD; + + // call the most optimized function for this CPU + (*free_bitarray_function_p)(x); +} + +uint32_t bitcount_dispatch(uint32_t a) { +#if defined (__i386__) || defined (__x86_64__) + #if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8)) + #if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) + if (__builtin_cpu_supports("avx512f")) bitcount_function_p = &bitcount_AVX512; + else if (__builtin_cpu_supports("avx2")) bitcount_function_p = &bitcount_AVX2; + #else + if (__builtin_cpu_supports("avx2")) bitcount_function_p = &bitcount_AVX2; + #endif + else if (__builtin_cpu_supports("avx")) bitcount_function_p = &bitcount_AVX; + else if (__builtin_cpu_supports("sse2")) bitcount_function_p = &bitcount_SSE2; + else if (__builtin_cpu_supports("mmx")) bitcount_function_p = &bitcount_MMX; + else + #endif +#endif + bitcount_function_p = &bitcount_NOSIMD; + + // call the most optimized function for this CPU + return (*bitcount_function_p)(a); +} + +uint32_t count_states_dispatch(uint32_t *bitarray) { +#if defined (__i386__) || defined (__x86_64__) + #if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8)) + #if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) + if (__builtin_cpu_supports("avx512f")) count_states_function_p = &count_states_AVX512; + else if (__builtin_cpu_supports("avx2")) count_states_function_p = &count_states_AVX2; + #else + if (__builtin_cpu_supports("avx2")) count_states_function_p = &count_states_AVX2; + #endif + else if (__builtin_cpu_supports("avx")) count_states_function_p = &count_states_AVX; + else if (__builtin_cpu_supports("sse2")) count_states_function_p = &count_states_SSE2; + else if (__builtin_cpu_supports("mmx")) count_states_function_p = &count_states_MMX; + else + #endif +#endif + count_states_function_p = &count_states_NOSIMD; + + // call the most optimized function for this CPU + return (*count_states_function_p)(bitarray); +} + +void bitarray_AND_dispatch(uint32_t *A, uint32_t *B) { +#if defined (__i386__) || defined (__x86_64__) + #if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8)) + #if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) + if (__builtin_cpu_supports("avx512f")) bitarray_AND_function_p = &bitarray_AND_AVX512; + else if (__builtin_cpu_supports("avx2")) bitarray_AND_function_p = &bitarray_AND_AVX2; + #else + if (__builtin_cpu_supports("avx2")) bitarray_AND_function_p = &bitarray_AND_AVX2; + #endif + else if (__builtin_cpu_supports("avx")) bitarray_AND_function_p = &bitarray_AND_AVX; + else if (__builtin_cpu_supports("sse2")) bitarray_AND_function_p = &bitarray_AND_SSE2; + else if (__builtin_cpu_supports("mmx")) bitarray_AND_function_p = &bitarray_AND_MMX; + else + #endif +#endif + bitarray_AND_function_p = &bitarray_AND_NOSIMD; + + // call the most optimized function for this CPU + (*bitarray_AND_function_p)(A,B); +} + +void bitarray_low20_AND_dispatch(uint32_t *A, uint32_t *B) { +#if defined (__i386__) || defined (__x86_64__) + #if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8)) + #if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) + if (__builtin_cpu_supports("avx512f")) bitarray_low20_AND_function_p = &bitarray_low20_AND_AVX512; + else if (__builtin_cpu_supports("avx2")) bitarray_low20_AND_function_p = &bitarray_low20_AND_AVX2; + #else + if (__builtin_cpu_supports("avx2")) bitarray_low20_AND_function_p = &bitarray_low20_AND_AVX2; + #endif + else if (__builtin_cpu_supports("avx")) bitarray_low20_AND_function_p = &bitarray_low20_AND_AVX; + else if (__builtin_cpu_supports("sse2")) bitarray_low20_AND_function_p = &bitarray_low20_AND_SSE2; + else if (__builtin_cpu_supports("mmx")) bitarray_low20_AND_function_p = &bitarray_low20_AND_MMX; + else + #endif +#endif + bitarray_low20_AND_function_p = &bitarray_low20_AND_NOSIMD; + + // call the most optimized function for this CPU + (*bitarray_low20_AND_function_p)(A, B); +} + +uint32_t count_bitarray_AND_dispatch(uint32_t *A, uint32_t *B) { +#if defined (__i386__) || defined (__x86_64__) + #if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8)) + #if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) + if (__builtin_cpu_supports("avx512f")) count_bitarray_AND_function_p = &count_bitarray_AND_AVX512; + else if (__builtin_cpu_supports("avx2")) count_bitarray_AND_function_p = &count_bitarray_AND_AVX2; + #else + if (__builtin_cpu_supports("avx2")) count_bitarray_AND_function_p = &count_bitarray_AND_AVX2; + #endif + else if (__builtin_cpu_supports("avx")) count_bitarray_AND_function_p = &count_bitarray_AND_AVX; + else if (__builtin_cpu_supports("sse2")) count_bitarray_AND_function_p = &count_bitarray_AND_SSE2; + else if (__builtin_cpu_supports("mmx")) count_bitarray_AND_function_p = &count_bitarray_AND_MMX; + else + #endif +#endif + count_bitarray_AND_function_p = &count_bitarray_AND_NOSIMD; + + // call the most optimized function for this CPU + return (*count_bitarray_AND_function_p)(A, B); +} + +uint32_t count_bitarray_low20_AND_dispatch(uint32_t *A, uint32_t *B) { +#if defined (__i386__) || defined (__x86_64__) + #if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8)) + #if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) + if (__builtin_cpu_supports("avx512f")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_AVX512; + else if (__builtin_cpu_supports("avx2")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_AVX2; + #else + if (__builtin_cpu_supports("avx2")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_AVX2; + #endif + else if (__builtin_cpu_supports("avx")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_AVX; + else if (__builtin_cpu_supports("sse2")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_SSE2; + else if (__builtin_cpu_supports("mmx")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_MMX; + else + #endif +#endif + count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_NOSIMD; + + // call the most optimized function for this CPU + return (*count_bitarray_low20_AND_function_p)(A, B); +} + +void bitarray_AND4_dispatch(uint32_t *A, uint32_t *B, uint32_t *C, uint32_t *D) { +#if defined (__i386__) || defined (__x86_64__) + #if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8)) + #if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) + if (__builtin_cpu_supports("avx512f")) bitarray_AND4_function_p = &bitarray_AND4_AVX512; + else if (__builtin_cpu_supports("avx2")) bitarray_AND4_function_p = &bitarray_AND4_AVX2; + #else + if (__builtin_cpu_supports("avx2")) bitarray_AND4_function_p = &bitarray_AND4_AVX2; + #endif + else if (__builtin_cpu_supports("avx")) bitarray_AND4_function_p = &bitarray_AND4_AVX; + else if (__builtin_cpu_supports("sse2")) bitarray_AND4_function_p = &bitarray_AND4_SSE2; + else if (__builtin_cpu_supports("mmx")) bitarray_AND4_function_p = &bitarray_AND4_MMX; + else + #endif +#endif + bitarray_AND4_function_p = &bitarray_AND4_NOSIMD; + + // call the most optimized function for this CPU + (*bitarray_AND4_function_p)(A, B, C, D); +} + +void bitarray_OR_dispatch(uint32_t *A, uint32_t *B) { +#if defined (__i386__) || defined (__x86_64__) + #if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8)) + #if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) + if (__builtin_cpu_supports("avx512f")) bitarray_OR_function_p = &bitarray_OR_AVX512; + else if (__builtin_cpu_supports("avx2")) bitarray_OR_function_p = &bitarray_OR_AVX2; + #else + if (__builtin_cpu_supports("avx2")) bitarray_OR_function_p = &bitarray_OR_AVX2; + #endif + else if (__builtin_cpu_supports("avx")) bitarray_OR_function_p = &bitarray_OR_AVX; + else if (__builtin_cpu_supports("sse2")) bitarray_OR_function_p = &bitarray_OR_SSE2; + else if (__builtin_cpu_supports("mmx")) bitarray_OR_function_p = &bitarray_OR_MMX; + else + #endif +#endif + bitarray_OR_function_p = &bitarray_OR_NOSIMD; + + // call the most optimized function for this CPU + (*bitarray_OR_function_p)(A,B); +} + +uint32_t count_bitarray_AND2_dispatch(uint32_t *A, uint32_t *B) { +#if defined (__i386__) || defined (__x86_64__) + #if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8)) + #if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) + if (__builtin_cpu_supports("avx512f")) count_bitarray_AND2_function_p = &count_bitarray_AND2_AVX512; + else if (__builtin_cpu_supports("avx2")) count_bitarray_AND2_function_p = &count_bitarray_AND2_AVX2; + #else + if (__builtin_cpu_supports("avx2")) count_bitarray_AND2_function_p = &count_bitarray_AND2_AVX2; + #endif + else if (__builtin_cpu_supports("avx")) count_bitarray_AND2_function_p = &count_bitarray_AND2_AVX; + else if (__builtin_cpu_supports("sse2")) count_bitarray_AND2_function_p = &count_bitarray_AND2_SSE2; + else if (__builtin_cpu_supports("mmx")) count_bitarray_AND2_function_p = &count_bitarray_AND2_MMX; + else + #endif +#endif + count_bitarray_AND2_function_p = &count_bitarray_AND2_NOSIMD; + + // call the most optimized function for this CPU + return (*count_bitarray_AND2_function_p)(A, B); +} + +uint32_t count_bitarray_AND3_dispatch(uint32_t *A, uint32_t *B, uint32_t *C) { +#if defined (__i386__) || defined (__x86_64__) + #if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8)) + #if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) + if (__builtin_cpu_supports("avx512f")) count_bitarray_AND3_function_p = &count_bitarray_AND3_AVX512; + else if (__builtin_cpu_supports("avx2")) count_bitarray_AND3_function_p = &count_bitarray_AND3_AVX2; + #else + if (__builtin_cpu_supports("avx2")) count_bitarray_AND3_function_p = &count_bitarray_AND3_AVX2; + #endif + else if (__builtin_cpu_supports("avx")) count_bitarray_AND3_function_p = &count_bitarray_AND3_AVX; + else if (__builtin_cpu_supports("sse2")) count_bitarray_AND3_function_p = &count_bitarray_AND3_SSE2; + else if (__builtin_cpu_supports("mmx")) count_bitarray_AND3_function_p = &count_bitarray_AND3_MMX; + else + #endif +#endif + count_bitarray_AND3_function_p = &count_bitarray_AND3_NOSIMD; + + // call the most optimized function for this CPU + return (*count_bitarray_AND3_function_p)(A, B, C); +} + +uint32_t count_bitarray_AND4_dispatch(uint32_t *A, uint32_t *B, uint32_t *C, uint32_t *D) { +#if defined (__i386__) || defined (__x86_64__) + #if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8)) + #if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) + if (__builtin_cpu_supports("avx512f")) count_bitarray_AND4_function_p = &count_bitarray_AND4_AVX512; + else if (__builtin_cpu_supports("avx2")) count_bitarray_AND4_function_p = &count_bitarray_AND4_AVX2; + #else + if (__builtin_cpu_supports("avx2")) count_bitarray_AND4_function_p = &count_bitarray_AND4_AVX2; + #endif + else if (__builtin_cpu_supports("avx")) count_bitarray_AND4_function_p = &count_bitarray_AND4_AVX; + else if (__builtin_cpu_supports("sse2")) count_bitarray_AND4_function_p = &count_bitarray_AND4_SSE2; + else if (__builtin_cpu_supports("mmx")) count_bitarray_AND4_function_p = &count_bitarray_AND4_MMX; + else + #endif +#endif + count_bitarray_AND4_function_p = &count_bitarray_AND4_NOSIMD; + + // call the most optimized function for this CPU + return (*count_bitarray_AND4_function_p)(A, B, C, D); +} + + +///////////////////////////////////////////////77 +// Entries to dispatched function calls + +uint32_t *malloc_bitarray(uint32_t x) { + return (*malloc_bitarray_function_p)(x); +} + +void free_bitarray(uint32_t *x) { + (*free_bitarray_function_p)(x); +} + +uint32_t bitcount(uint32_t a) { + return (*bitcount_function_p)(a); +} + +uint32_t count_states(uint32_t *bitarray) { + return (*count_states_function_p)(bitarray); +} + +void bitarray_AND(uint32_t *A, uint32_t *B) { + (*bitarray_AND_function_p)(A, B); +} + +void bitarray_low20_AND(uint32_t *A, uint32_t *B) { + (*bitarray_low20_AND_function_p)(A, B); +} + +uint32_t count_bitarray_AND(uint32_t *A, uint32_t *B) { + return (*count_bitarray_AND_function_p)(A, B); +} + +uint32_t count_bitarray_low20_AND(uint32_t *A, uint32_t *B) { + return (*count_bitarray_low20_AND_function_p)(A, B); +} + +void bitarray_AND4(uint32_t *A, uint32_t *B, uint32_t *C, uint32_t *D) { + (*bitarray_AND4_function_p)(A, B, C, D); +} + +void bitarray_OR(uint32_t *A, uint32_t *B) { + (*bitarray_OR_function_p)(A, B); +} + +uint32_t count_bitarray_AND2(uint32_t *A, uint32_t *B) { + return (*count_bitarray_AND2_function_p)(A, B); +} + +uint32_t count_bitarray_AND3(uint32_t *A, uint32_t *B, uint32_t *C) { + return (*count_bitarray_AND3_function_p)(A, B, C); +} + +uint32_t count_bitarray_AND4(uint32_t *A, uint32_t *B, uint32_t *C, uint32_t *D) { + return (*count_bitarray_AND4_function_p)(A, B, C, D); +} + +#endif + diff --git a/client/hardnested/hardnested_bitarray_core.h b/client/hardnested/hardnested_bitarray_core.h new file mode 100644 index 00000000..0d92d6b9 --- /dev/null +++ b/client/hardnested/hardnested_bitarray_core.h @@ -0,0 +1,69 @@ +//----------------------------------------------------------------------------- +// Copyright (C) 2016, 2017 by piwi +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// Implements a card only attack based on crypto text (encrypted nonces +// received during a nested authentication) only. Unlike other card only +// attacks this doesn't rely on implementation errors but only on the +// inherent weaknesses of the crypto1 cypher. Described in +// Carlo Meijer, Roel Verdult, "Ciphertext-only Cryptanalysis on Hardened +// Mifare Classic Cards" in Proceedings of the 22nd ACM SIGSAC Conference on +// Computer and Communications Security, 2015 +//----------------------------------------------------------------------------- +// +// brute forcing is based on @aczids bitsliced brute forcer +// https://github.com/aczid/crypto1_bs with some modifications. Mainly: +// - don't rollback. Start with 2nd byte of nonce instead +// - reuse results of filter subfunctions +// - reuse results of previous nonces if some first bits are identical +// +//----------------------------------------------------------------------------- +// aczid's Copyright notice: +// +// Bit-sliced Crypto-1 brute-forcing implementation +// Builds on the data structures returned by CraptEV1 craptev1_get_space(nonces, threshold, uid) +/* +Copyright (c) 2015-2016 Aram Verstegen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +#ifndef HARDNESTED_BITARRAY_CORE_H__ +#define HARDNESTED_BITARRAY_CORE_H__ + +#include + +extern uint32_t *malloc_bitarray(uint32_t x); +extern void free_bitarray(uint32_t *x); +extern uint32_t bitcount(uint32_t a); +extern uint32_t count_states(uint32_t *A); +extern void bitarray_AND(uint32_t *A, uint32_t *B); +extern void bitarray_low20_AND(uint32_t *A, uint32_t *B); +extern uint32_t count_bitarray_AND(uint32_t *A, uint32_t *B); +extern uint32_t count_bitarray_low20_AND(uint32_t *A, uint32_t *B); +extern void bitarray_AND4(uint32_t *A, uint32_t *B, uint32_t *C, uint32_t *D); +extern void bitarray_OR(uint32_t *A, uint32_t *B); +extern uint32_t count_bitarray_AND2(uint32_t *A, uint32_t *B); +extern uint32_t count_bitarray_AND3(uint32_t *A, uint32_t *B, uint32_t *C); +extern uint32_t count_bitarray_AND4(uint32_t *A, uint32_t *B, uint32_t *C, uint32_t *D); + +#endif diff --git a/client/hardnested/hardnested_bruteforce.c b/client/hardnested/hardnested_bruteforce.c new file mode 100644 index 00000000..718b7c5d --- /dev/null +++ b/client/hardnested/hardnested_bruteforce.c @@ -0,0 +1,472 @@ +//----------------------------------------------------------------------------- +// Copyright (C) 2016, 2017 by piwi +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// Implements a card only attack based on crypto text (encrypted nonces +// received during a nested authentication) only. Unlike other card only +// attacks this doesn't rely on implementation errors but only on the +// inherent weaknesses of the crypto1 cypher. Described in +// Carlo Meijer, Roel Verdult, "Ciphertext-only Cryptanalysis on Hardened +// Mifare Classic Cards" in Proceedings of the 22nd ACM SIGSAC Conference on +// Computer and Communications Security, 2015 +//----------------------------------------------------------------------------- +// +// brute forcing is based on @aczids bitsliced brute forcer +// https://github.com/aczid/crypto1_bs with some modifications. Mainly: +// - don't rollback. Start with 2nd byte of nonce instead +// - reuse results of filter subfunctions +// - reuse results of previous nonces if some first bits are identical +// +//----------------------------------------------------------------------------- +// aczid's Copyright notice: +// +// Bit-sliced Crypto-1 brute-forcing implementation +// Builds on the data structures returned by CraptEV1 craptev1_get_space(nonces, threshold, uid) +/* +Copyright (c) 2015-2016 Aram Verstegen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +*/ + +#include "hardnested_bruteforce.h" + +#include +#include +#include +#include +#include +#include +#include "proxmark3.h" +#include "cmdhfmfhard.h" +#include "hardnested_bf_core.h" +#include "ui.h" +#include "util.h" +#include "util_posix.h" +#include "crapto1/crapto1.h" +#include "parity.h" + +#define NUM_BRUTE_FORCE_THREADS (num_CPUs()) +#define DEFAULT_BRUTE_FORCE_RATE (120000000.0) // if benchmark doesn't succeed +#define TEST_BENCH_SIZE (6000) // number of odd and even states for brute force benchmark +#define TEST_BENCH_FILENAME "hardnested/bf_bench_data.bin" +//#define WRITE_BENCH_FILE + +// debugging options +#define DEBUG_KEY_ELIMINATION +// #define DEBUG_BRUTE_FORCE + +typedef enum { + EVEN_STATE = 0, + ODD_STATE = 1 +} odd_even_t; + +static uint32_t nonces_to_bruteforce = 0; +static uint32_t bf_test_nonce[256]; +static uint8_t bf_test_nonce_2nd_byte[256]; +static uint8_t bf_test_nonce_par[256]; +static uint32_t bucket_count = 0; +static statelist_t* buckets[128]; +static uint32_t keys_found = 0; +static uint64_t num_keys_tested; + + +uint8_t trailing_zeros(uint8_t byte) +{ + static const uint8_t trailing_zeros_LUT[256] = { + 8, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, + 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 + }; + + return trailing_zeros_LUT[byte]; +} + + +bool verify_key(uint32_t cuid, noncelist_t *nonces, uint8_t *best_first_bytes, uint32_t odd, uint32_t even) +{ + struct Crypto1State pcs; + for (uint16_t test_first_byte = 1; test_first_byte < 256; test_first_byte++) { + noncelistentry_t *test_nonce = nonces[best_first_bytes[test_first_byte]].first; + while (test_nonce != NULL) { + pcs.odd = odd; + pcs.even = even; + lfsr_rollback_byte(&pcs, (cuid >> 24) ^ best_first_bytes[0], true); + for (int8_t byte_pos = 3; byte_pos >= 0; byte_pos--) { + uint8_t test_par_enc_bit = (test_nonce->par_enc >> byte_pos) & 0x01; // the encoded parity bit + uint8_t test_byte_enc = (test_nonce->nonce_enc >> (8*byte_pos)) & 0xff; // the encoded nonce byte + uint8_t test_byte_dec = crypto1_byte(&pcs, test_byte_enc /* ^ (cuid >> (8*byte_pos)) */, true) ^ test_byte_enc; // decode the nonce byte + uint8_t ks_par = filter(pcs.odd); // the keystream bit to encode/decode the parity bit + uint8_t test_par_enc2 = ks_par ^ evenparity8(test_byte_dec); // determine the decoded byte's parity and encode it + if (test_par_enc_bit != test_par_enc2) { + return false; + } + } + test_nonce = test_nonce->next; + } + } + return true; +} + + +static void* crack_states_thread(void* x){ + + struct arg { + bool silent; + int thread_ID; + uint32_t cuid; + uint32_t num_acquired_nonces; + uint64_t maximum_states; + noncelist_t *nonces; + uint8_t* best_first_bytes; + } *thread_arg; + + thread_arg = (struct arg *)x; + const int thread_id = thread_arg->thread_ID; + uint32_t current_bucket = thread_id; + while(current_bucket < bucket_count){ + statelist_t *bucket = buckets[current_bucket]; + if(bucket){ +#if defined (DEBUG_BRUTE_FORCE) + printf("Thread %u starts working on bucket %u\n", thread_id, current_bucket); +#endif + const uint64_t key = crack_states_bitsliced(thread_arg->cuid, thread_arg->best_first_bytes, bucket, &keys_found, &num_keys_tested, nonces_to_bruteforce, bf_test_nonce_2nd_byte, thread_arg->nonces); + if(key != -1){ + __sync_fetch_and_add(&keys_found, 1); + char progress_text[80]; + sprintf(progress_text, "Brute force phase completed. Key found: %012" PRIx64, key); + hardnested_print_progress(thread_arg->num_acquired_nonces, progress_text, 0.0, 0); + break; + } else if(keys_found){ + break; + } else { + if (!thread_arg->silent) { + char progress_text[80]; + sprintf(progress_text, "Brute force phase: %6.02f%%", 100.0*(float)num_keys_tested/(float)(thread_arg->maximum_states)); + float remaining_bruteforce = thread_arg->nonces[thread_arg->best_first_bytes[0]].expected_num_brute_force - (float)num_keys_tested/2; + hardnested_print_progress(thread_arg->num_acquired_nonces, progress_text, remaining_bruteforce, 5000); + } + } + } + current_bucket += NUM_BRUTE_FORCE_THREADS; + } + return NULL; +} + + +void prepare_bf_test_nonces(noncelist_t *nonces, uint8_t best_first_byte) +{ + // we do bitsliced brute forcing with best_first_bytes[0] only. + // Extract the corresponding 2nd bytes + noncelistentry_t *test_nonce = nonces[best_first_byte].first; + uint32_t i = 0; + while (test_nonce != NULL) { + bf_test_nonce[i] = test_nonce->nonce_enc; + bf_test_nonce_par[i] = test_nonce->par_enc; + bf_test_nonce_2nd_byte[i] = (test_nonce->nonce_enc >> 16) & 0xff; + test_nonce = test_nonce->next; + i++; + } + nonces_to_bruteforce = i; + + // printf("Nonces to bruteforce: %d\n", nonces_to_bruteforce); + // printf("Common bits of first 4 2nd nonce bytes (before sorting): %u %u %u\n", + // trailing_zeros(bf_test_nonce_2nd_byte[1] ^ bf_test_nonce_2nd_byte[0]), + // trailing_zeros(bf_test_nonce_2nd_byte[2] ^ bf_test_nonce_2nd_byte[1]), + // trailing_zeros(bf_test_nonce_2nd_byte[3] ^ bf_test_nonce_2nd_byte[2])); + + uint8_t best_4[4] = {0}; + int sum_best = -1; + for (uint16_t n1 = 0; n1 < nonces_to_bruteforce; n1++) { + for (uint16_t n2 = 0; n2 < nonces_to_bruteforce; n2++) { + if (n2 != n1) { + for (uint16_t n3 = 0; n3 < nonces_to_bruteforce; n3++) { + if ((n3 != n2 && n3 != n1) || nonces_to_bruteforce < 3 + // && trailing_zeros(bf_test_nonce_2nd_byte[n1] ^ bf_test_nonce_2nd_byte[n2]) + // > trailing_zeros(bf_test_nonce_2nd_byte[n2] ^ bf_test_nonce_2nd_byte[n3]) + ) { + for (uint16_t n4 = 0; n4 < nonces_to_bruteforce; n4++) { + if ((n4 != n3 && n4 != n2 && n4 != n1) || nonces_to_bruteforce < 4 + // && trailing_zeros(bf_test_nonce_2nd_byte[n2] ^ bf_test_nonce_2nd_byte[n3]) + // > trailing_zeros(bf_test_nonce_2nd_byte[n3] ^ bf_test_nonce_2nd_byte[n4]) + ) { + int sum = nonces_to_bruteforce > 1 ? trailing_zeros(bf_test_nonce_2nd_byte[n1] ^ bf_test_nonce_2nd_byte[n2]) : 0.0 + + nonces_to_bruteforce > 2 ? trailing_zeros(bf_test_nonce_2nd_byte[n2] ^ bf_test_nonce_2nd_byte[n3]) : 0.0 + + nonces_to_bruteforce > 3 ? trailing_zeros(bf_test_nonce_2nd_byte[n3] ^ bf_test_nonce_2nd_byte[n4]) : 0.0; + if (sum > sum_best) { + sum_best = sum; + best_4[0] = n1; + best_4[1] = n2; + best_4[2] = n3; + best_4[3] = n4; + } + } + } + } + } + } + } + } + + uint32_t bf_test_nonce_temp[4]; + uint8_t bf_test_nonce_par_temp[4]; + uint8_t bf_test_nonce_2nd_byte_temp[4]; + for (uint8_t i = 0; i < 4 && i < nonces_to_bruteforce; i++) { + bf_test_nonce_temp[i] = bf_test_nonce[best_4[i]]; + + bf_test_nonce_par_temp[i] = bf_test_nonce_par[best_4[i]]; + bf_test_nonce_2nd_byte_temp[i] = bf_test_nonce_2nd_byte[best_4[i]]; + } + for (uint8_t i = 0; i < 4 && i < nonces_to_bruteforce; i++) { + bf_test_nonce[i] = bf_test_nonce_temp[i]; + bf_test_nonce_par[i] = bf_test_nonce_par_temp[i]; + bf_test_nonce_2nd_byte[i] = bf_test_nonce_2nd_byte_temp[i]; + } +} + + +#if defined (WRITE_BENCH_FILE) +static void write_benchfile(statelist_t *candidates) { + + printf("Writing brute force benchmark data..."); + FILE *benchfile = fopen(TEST_BENCH_FILENAME, "wb"); + fwrite(&nonces_to_bruteforce, 1, sizeof(nonces_to_bruteforce), benchfile); + for (uint32_t i = 0; i < nonces_to_bruteforce; i++) { + fwrite(&(bf_test_nonce[i]), 1, sizeof(bf_test_nonce[i]), benchfile); + fwrite(&(bf_test_nonce_par[i]), 1, sizeof(bf_test_nonce_par[i]), benchfile); + } + uint32_t num_states = MIN(candidates->len[EVEN_STATE], TEST_BENCH_SIZE); + fwrite(&num_states, 1, sizeof(num_states), benchfile); + for (uint32_t i = 0; i < num_states; i++) { + fwrite(&(candidates->states[EVEN_STATE][i]), 1, sizeof(uint32_t), benchfile); + } + num_states = MIN(candidates->len[ODD_STATE], TEST_BENCH_SIZE); + fwrite(&num_states, 1, sizeof(num_states), benchfile); + for (uint32_t i = 0; i < num_states; i++) { + fwrite(&(candidates->states[ODD_STATE][i]), 1, sizeof(uint32_t), benchfile); + } + fclose(benchfile); + printf("done.\n"); +} +#endif + + +bool brute_force_bs(float *bf_rate, statelist_t *candidates, uint32_t cuid, uint32_t num_acquired_nonces, uint64_t maximum_states, noncelist_t *nonces, uint8_t *best_first_bytes) +{ +#if defined (WRITE_BENCH_FILE) + write_benchfile(candidates); +#endif + bool silent = (bf_rate != NULL); + + // if (!silent) { + // PrintAndLog("Brute force phase starting."); + // PrintAndLog("Using %u-bit bitslices", MAX_BITSLICES); + // } + + keys_found = 0; + num_keys_tested = 0; + + bitslice_test_nonces(nonces_to_bruteforce, bf_test_nonce, bf_test_nonce_par); + + // count number of states to go + bucket_count = 0; + for (statelist_t *p = candidates; p != NULL; p = p->next) { + if (p->states[ODD_STATE] != NULL && p->states[EVEN_STATE] != NULL) { + buckets[bucket_count] = p; + bucket_count++; + } + } + + uint64_t start_time = msclock(); + // enumerate states using all hardware threads, each thread handles one bucket + // if (!silent) { + // PrintAndLog("Starting %u cracking threads to search %u buckets containing a total of %" PRIu64" states...\n", NUM_BRUTE_FORCE_THREADS, bucket_count, maximum_states); + // printf("Common bits of first 4 2nd nonce bytes: %u %u %u\n", + // trailing_zeros(bf_test_nonce_2nd_byte[1] ^ bf_test_nonce_2nd_byte[0]), + // trailing_zeros(bf_test_nonce_2nd_byte[2] ^ bf_test_nonce_2nd_byte[1]), + // trailing_zeros(bf_test_nonce_2nd_byte[3] ^ bf_test_nonce_2nd_byte[2])); + // } + + pthread_t threads[NUM_BRUTE_FORCE_THREADS]; + struct args { + bool silent; + int thread_ID; + uint32_t cuid; + uint32_t num_acquired_nonces; + uint64_t maximum_states; + noncelist_t *nonces; + uint8_t *best_first_bytes; + } thread_args[NUM_BRUTE_FORCE_THREADS]; + + for(uint32_t i = 0; i < NUM_BRUTE_FORCE_THREADS; i++){ + thread_args[i].thread_ID = i; + thread_args[i].silent = silent; + thread_args[i].cuid = cuid; + thread_args[i].num_acquired_nonces = num_acquired_nonces; + thread_args[i].maximum_states = maximum_states; + thread_args[i].nonces = nonces; + thread_args[i].best_first_bytes = best_first_bytes; + pthread_create(&threads[i], NULL, crack_states_thread, (void*)&thread_args[i]); + } + for(uint32_t i = 0; i < NUM_BRUTE_FORCE_THREADS; i++){ + pthread_join(threads[i], 0); + } + + uint64_t elapsed_time = msclock() - start_time; + + // if (!silent) { + // printf("Brute force completed after testing %" PRIu64" (2^%1.1f) keys in %1.1f seconds at a rate of %1.0f (2^%1.1f) keys per second.\n", + // num_keys_tested, + // log(num_keys_tested) / log(2.0), + // (float)elapsed_time/1000.0, + // (float)num_keys_tested / ((float)elapsed_time / 1000.0), + // log((float)num_keys_tested / ((float)elapsed_time/1000.0)) / log(2.0)); + // } + + if (bf_rate != NULL) { + *bf_rate = (float)num_keys_tested / ((float)elapsed_time / 1000.0); + } + + return (keys_found != 0); +} + + +static bool read_bench_data(statelist_t *test_candidates) { + + size_t bytes_read = 0; + uint32_t temp = 0; + uint32_t num_states = 0; + uint32_t states_read = 0; + + char bench_file_path[strlen(get_my_executable_directory()) + strlen(TEST_BENCH_FILENAME) + 1]; + strcpy(bench_file_path, get_my_executable_directory()); + strcat(bench_file_path, TEST_BENCH_FILENAME); + + FILE *benchfile = fopen(bench_file_path, "rb"); + if (benchfile == NULL) { + return false; + } + bytes_read = fread(&nonces_to_bruteforce, 1, sizeof(nonces_to_bruteforce), benchfile); + if (bytes_read != sizeof(nonces_to_bruteforce)) { + fclose(benchfile); + return false; + } + for (uint16_t i = 0; i < nonces_to_bruteforce && i < 256; i++) { + bytes_read = fread(&bf_test_nonce[i], 1, sizeof(uint32_t), benchfile); + if (bytes_read != sizeof(uint32_t)) { + fclose(benchfile); + return false; + } + bf_test_nonce_2nd_byte[i] = (bf_test_nonce[i] >> 16) & 0xff; + bytes_read = fread(&bf_test_nonce_par[i], 1, sizeof(uint8_t), benchfile); + if (bytes_read != sizeof(uint8_t)) { + fclose(benchfile); + return false; + } + } + bytes_read = fread(&num_states, 1, sizeof(uint32_t), benchfile); + if (bytes_read != sizeof(uint32_t)) { + fclose(benchfile); + return false; + } + for (states_read = 0; states_read < MIN(num_states, TEST_BENCH_SIZE); states_read++) { + bytes_read = fread(test_candidates->states[EVEN_STATE] + states_read, 1, sizeof(uint32_t), benchfile); + if (bytes_read != sizeof(uint32_t)) { + fclose(benchfile); + return false; + } + } + for (uint32_t i = states_read; i < TEST_BENCH_SIZE; i++) { + test_candidates->states[EVEN_STATE][i] = test_candidates->states[EVEN_STATE][i-states_read]; + } + for (uint32_t i = states_read; i < num_states; i++) { + bytes_read = fread(&temp, 1, sizeof(uint32_t), benchfile); + if (bytes_read != sizeof(uint32_t)) { + fclose(benchfile); + return false; + } + } + for (states_read = 0; states_read < MIN(num_states, TEST_BENCH_SIZE); states_read++) { + bytes_read = fread(test_candidates->states[ODD_STATE] + states_read, 1, sizeof(uint32_t), benchfile); + if (bytes_read != sizeof(uint32_t)) { + fclose(benchfile); + return false; + } + } + for (uint32_t i = states_read; i < TEST_BENCH_SIZE; i++) { + test_candidates->states[ODD_STATE][i] = test_candidates->states[ODD_STATE][i-states_read]; + } + + fclose(benchfile); + return true; +} + + +float brute_force_benchmark() +{ + statelist_t test_candidates[NUM_BRUTE_FORCE_THREADS]; + + test_candidates[0].states[ODD_STATE] = malloc((TEST_BENCH_SIZE+1) * sizeof(uint32_t)); + test_candidates[0].states[EVEN_STATE] = malloc((TEST_BENCH_SIZE+1) * sizeof(uint32_t)); + for (uint8_t i = 0; i < NUM_BRUTE_FORCE_THREADS - 1; i++){ + test_candidates[i].next = test_candidates + i + 1; + test_candidates[i+1].states[ODD_STATE] = test_candidates[0].states[ODD_STATE]; + test_candidates[i+1].states[EVEN_STATE] = test_candidates[0].states[EVEN_STATE]; + } + test_candidates[NUM_BRUTE_FORCE_THREADS-1].next = NULL; + + if (!read_bench_data(test_candidates)) { + PrintAndLog("Couldn't read benchmark data. Assuming brute force rate of %1.0f states per second", DEFAULT_BRUTE_FORCE_RATE); + return DEFAULT_BRUTE_FORCE_RATE; + } + + for (uint8_t i = 0; i < NUM_BRUTE_FORCE_THREADS; i++) { + test_candidates[i].len[ODD_STATE] = TEST_BENCH_SIZE; + test_candidates[i].len[EVEN_STATE] = TEST_BENCH_SIZE; + test_candidates[i].states[ODD_STATE][TEST_BENCH_SIZE] = -1; + test_candidates[i].states[EVEN_STATE][TEST_BENCH_SIZE] = -1; + } + + uint64_t maximum_states = TEST_BENCH_SIZE*TEST_BENCH_SIZE*(uint64_t)NUM_BRUTE_FORCE_THREADS; + + float bf_rate; + brute_force_bs(&bf_rate, test_candidates, 0, 0, maximum_states, NULL, 0); + + free(test_candidates[0].states[ODD_STATE]); + free(test_candidates[0].states[EVEN_STATE]); + + return bf_rate; +} + + diff --git a/client/hardnested/hardnested_bruteforce.h b/client/hardnested/hardnested_bruteforce.h new file mode 100644 index 00000000..d4f6348d --- /dev/null +++ b/client/hardnested/hardnested_bruteforce.h @@ -0,0 +1,36 @@ +//----------------------------------------------------------------------------- +// Copyright (C) 2016, 2017 by piwi +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// Implements a card only attack based on crypto text (encrypted nonces +// received during a nested authentication) only. Unlike other card only +// attacks this doesn't rely on implementation errors but only on the +// inherent weaknesses of the crypto1 cypher. Described in +// Carlo Meijer, Roel Verdult, "Ciphertext-only Cryptanalysis on Hardened +// Mifare Classic Cards" in Proceedings of the 22nd ACM SIGSAC Conference on +// Computer and Communications Security, 2015 +//----------------------------------------------------------------------------- + +#ifndef HARDNESTED_BRUTEFORCE_H__ +#define HARDNESTED_BRUTEFORCE_H__ + +#include +#include +#include "cmdhfmfhard.h" + +typedef struct { + uint32_t *states[2]; + uint32_t len[2]; + void* next; +} statelist_t; + +extern void prepare_bf_test_nonces(noncelist_t *nonces, uint8_t best_first_byte); +extern bool brute_force_bs(float *bf_rate, statelist_t *candidates, uint32_t cuid, uint32_t num_acquired_nonces, uint64_t maximum_states, noncelist_t *nonces, uint8_t *best_first_bytes); +extern float brute_force_benchmark(); +extern uint8_t trailing_zeros(uint8_t byte); +extern bool verify_key(uint32_t cuid, noncelist_t *nonces, uint8_t *best_first_bytes, uint32_t odd, uint32_t even); + +#endif diff --git a/client/hardnested/hardnested_tables.c b/client/hardnested/hardnested_tables.c new file mode 100644 index 00000000..278ed959 --- /dev/null +++ b/client/hardnested/hardnested_tables.c @@ -0,0 +1,592 @@ +//----------------------------------------------------------------------------- +// Copyright (C) 2015, 2016 by piwi +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// Implements a card only attack based on crypto text (encrypted nonces +// received during a nested authentication) only. Unlike other card only +// attacks this doesn't rely on implementation errors but only on the +// inherent weaknesses of the crypto1 cypher. Described in +// Carlo Meijer, Roel Verdult, "Ciphertext-only Cryptanalysis on Hardened +// Mifare Classic Cards" in Proceedings of the 22nd ACM SIGSAC Conference on +// Computer and Communications Security, 2015 +//----------------------------------------------------------------------------- +// +// This program calculates tables with possible states for a given +// bitflip property. +// +//----------------------------------------------------------------------------- + +#include +#include +#include +#include +#include +#include +#include "crapto1/crapto1.h" +#include "parity.h" + + +#define NUM_PART_SUMS 9 +#define BITFLIP_2ND_BYTE 0x0200 + +typedef enum { + EVEN_STATE = 0, + ODD_STATE = 1 +} odd_even_t; + + +static uint16_t PartialSumProperty(uint32_t state, odd_even_t odd_even) +{ + uint16_t sum = 0; + for (uint16_t j = 0; j < 16; j++) { + uint32_t st = state; + uint16_t part_sum = 0; + if (odd_even == ODD_STATE) { + for (uint16_t i = 0; i < 5; i++) { + part_sum ^= filter(st); + st = (st << 1) | ((j >> (3-i)) & 0x01) ; + } + part_sum ^= 1; // XOR 1 cancelled out for the other 8 bits + } else { + for (uint16_t i = 0; i < 4; i++) { + st = (st << 1) | ((j >> (3-i)) & 0x01) ; + part_sum ^= filter(st); + } + } + sum += part_sum; + } + return sum; +} + + +////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// bitarray functions + +#define malloc_bitarray(x) __builtin_assume_aligned(_aligned_malloc(x, __BIGGEST_ALIGNMENT__), __BIGGEST_ALIGNMENT__) +#define free_bitarray(x) _aligned_free(x) + +static inline void clear_bitarray24(uint32_t *bitarray) +{ + memset(bitarray, 0x00, sizeof(uint32_t) * (1<<19)); +} + + +static inline uint32_t test_bit24(uint32_t *bitarray, uint32_t index) +{ + return bitarray[index>>5] & (0x80000000>>(index&0x0000001f)); +} + + +static inline void set_bit24(uint32_t *bitarray, uint32_t index) +{ + bitarray[index>>5] |= 0x80000000>>(index&0x0000001f); +} + + +static inline uint32_t next_state(uint32_t *bitset, uint32_t state) +{ + if (++state == 1<<24) return 1<<24; + uint32_t index = state >> 5; + uint_fast8_t bit = state & 0x1f; + uint32_t line = bitset[index] << bit; + while (bit <= 0x1f) { + if (line & 0x80000000) return state; + state++; + bit++; + line <<= 1; + } + index++; + while (bitset[index] == 0x00000000 && state < 1<<24) { + index++; + state += 0x20; + } + if (state >= 1<<24) return 1<<24; +#if defined __GNUC__ + return state + __builtin_clz(bitset[index]); +#else + bit = 0x00; + line = bitset[index]; + while (bit <= 0x1f) { + if (line & 0x80000000) return state; + state++; + bit++; + line <<= 1; + } + return 1<<24; +#endif +} + + +static inline uint32_t next_not_state(uint32_t *bitset, uint32_t state) +{ + if (++state == 1<<24) return 1<<24; + uint32_t index = state >> 5; + uint_fast8_t bit = state & 0x1f; + uint32_t line = bitset[index] << bit; + while (bit <= 0x1f) { + if ((line & 0x80000000) == 0) return state; + state++; + bit++; + line <<= 1; + } + index++; + while (bitset[index] == 0xffffffff && state < 1<<24) { + index++; + state += 0x20; + } + if (state >= 1<<24) return 1<<24; +#if defined __GNUC__ + return state + __builtin_clz(~bitset[index]); +#else + bit = 0x00; + line = bitset[index]; + while (bit <= 0x1f) { + if ((line & 0x80000000) == 0) return state; + state++; + bit++; + line <<= 1; + } + return 1<<24; +#endif +} + + +static inline uint32_t bitcount(uint32_t a) +{ +#if defined __GNUC__ + return __builtin_popcountl(a); +#else + a = a - ((a >> 1) & 0x55555555); + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); + return (((a + (a >> 4)) & 0x0f0f0f0f) * 0x01010101) >> 24; +#endif +} + + +static inline uint32_t count_states(uint32_t *bitset) +{ + uint32_t count = 0; + for (uint32_t i = 0; i < (1<<19); i++) { + count += bitcount(bitset[i]); + } + return count; +} + + +static void write_bitflips_file(odd_even_t odd_even, uint16_t bitflip, int sum_a0, uint32_t *bitset, uint32_t count) +{ + char filename[80]; + sprintf(filename, "bitflip_%d_%03" PRIx16 "_sum%d_states.bin", odd_even, bitflip, sum_a0); + FILE *outfile = fopen(filename, "wb"); + fwrite(&count, 1, sizeof(count), outfile); + fwrite(bitset, 1, sizeof(uint32_t)*(1<<19), outfile); + fclose(outfile); +} + + +uint32_t *restrict part_sum_a0_bitarrays[2][NUM_PART_SUMS]; + +static void init_part_sum_bitarrays(void) +{ + printf("init_part_sum_bitarrays()..."); + for (odd_even_t odd_even = EVEN_STATE; odd_even <= ODD_STATE; odd_even++) { + for (uint16_t part_sum_a0 = 0; part_sum_a0 < NUM_PART_SUMS; part_sum_a0++) { + part_sum_a0_bitarrays[odd_even][part_sum_a0] = (uint32_t *)malloc_bitarray(sizeof(uint32_t) * (1<<19)); + if (part_sum_a0_bitarrays[odd_even][part_sum_a0] == NULL) { + printf("Out of memory error in init_part_suma0_statelists(). Aborting...\n"); + exit(4); + } + clear_bitarray24(part_sum_a0_bitarrays[odd_even][part_sum_a0]); + } + } + for (odd_even_t odd_even = EVEN_STATE; odd_even <= ODD_STATE; odd_even++) { + //printf("(%d, %" PRIu16 ")...", odd_even, part_sum_a0); + for (uint32_t state = 0; state < (1<<20); state++) { + uint16_t part_sum_a0 = PartialSumProperty(state, odd_even) / 2; + for (uint16_t low_bits = 0; low_bits < 1<<4; low_bits++) { + set_bit24(part_sum_a0_bitarrays[odd_even][part_sum_a0], state<<4 | low_bits); + } + } + } + printf("done.\n"); +} + + +static void free_part_sum_bitarrays(void) +{ + printf("free_part_sum_bitarrays()..."); + for (int16_t part_sum_a0 = (NUM_PART_SUMS-1); part_sum_a0 >= 0; part_sum_a0--) { + free_bitarray(part_sum_a0_bitarrays[ODD_STATE][part_sum_a0]); + } + for (int16_t part_sum_a0 = (NUM_PART_SUMS-1); part_sum_a0 >= 0; part_sum_a0--) { + free_bitarray(part_sum_a0_bitarrays[EVEN_STATE][part_sum_a0]); + } + printf("done.\n"); +} + +uint32_t *restrict sum_a0_bitarray[2]; + +void init_sum_bitarray(uint16_t sum_a0) +{ + printf("init_sum_bitarray()...\n"); + for (odd_even_t odd_even = EVEN_STATE; odd_even <= ODD_STATE; odd_even++) { + sum_a0_bitarray[odd_even] = (uint32_t *)malloc_bitarray(sizeof(uint32_t) * (1<<19)); + if (sum_a0_bitarray[odd_even] == NULL) { + printf("Out of memory error in init_sum_bitarrays(). Aborting...\n"); + exit(4); + } + clear_bitarray24(sum_a0_bitarray[odd_even]); + } + for (uint8_t p = 0; p < NUM_PART_SUMS; p++) { + for (uint8_t q = 0; q < NUM_PART_SUMS; q++) { + if (sum_a0 == 2*p*(16-2*q) + (16-2*p)*2*q) { + for (uint32_t i = 0; i < (1<<19); i++) { + sum_a0_bitarray[EVEN_STATE][i] |= part_sum_a0_bitarrays[EVEN_STATE][q][i]; + sum_a0_bitarray[ODD_STATE][i] |= part_sum_a0_bitarrays[ODD_STATE][p][i]; + } + } + } + } + for (odd_even_t odd_even = EVEN_STATE; odd_even <= ODD_STATE; odd_even++) { + uint32_t count = count_states(sum_a0_bitarray[odd_even]); + printf("sum_a0_bitarray[%s] has %d states (%5.2f%%)\n", odd_even==EVEN_STATE?"even":"odd ", count, (float)count/(1<<24)*100.0); + } + printf("done.\n"); +} + + +static void free_sum_bitarray(void) +{ + printf("free_sum_bitarray()..."); + free_bitarray(sum_a0_bitarray[ODD_STATE]); + free_bitarray(sum_a0_bitarray[EVEN_STATE]); + printf("done.\n"); +} + + +static void precalculate_bit0_bitflip_bitarrays(uint8_t const bitflip, uint16_t const sum_a0) +{ + // #define TEST_RUN + #ifdef TEST_RUN + #define NUM_TEST_STATES (1<<10) + #else + #define NUM_TEST_STATES (1<<23) + #endif + + time_t start_time = time(NULL); + time_t last_check_time = start_time; + + uint32_t *restrict test_bitarray[2]; + uint32_t *restrict test_not_bitarray[2]; + + test_bitarray[EVEN_STATE] = malloc_bitarray(sizeof(uint32_t) * (1<<19)); + clear_bitarray24(test_bitarray[EVEN_STATE]); + test_bitarray[ODD_STATE] = malloc_bitarray(sizeof(uint32_t) * (1<<19)); + clear_bitarray24(test_bitarray[ODD_STATE]); + + test_not_bitarray[EVEN_STATE] = malloc_bitarray(sizeof(uint32_t) * (1<<19)); + clear_bitarray24(test_not_bitarray[EVEN_STATE]); + test_not_bitarray[ODD_STATE] = malloc_bitarray(sizeof(uint32_t) * (1<<19)); + clear_bitarray24(test_not_bitarray[ODD_STATE]); + + uint32_t count[2]; + bool all_odd_states_are_possible_for_notbitflip = false; + + printf("\n\nStarting search for crypto1 states resulting in bitflip property 0x%03x...\n", bitflip); + for (uint32_t even_state = next_state(sum_a0_bitarray[EVEN_STATE], -1); even_state < NUM_TEST_STATES; even_state = next_state(sum_a0_bitarray[EVEN_STATE], even_state)) { + bool even_state_is_possible = false; + time_t time_now = time(NULL); + if (difftime(time_now, last_check_time) > 5*60) { // print status every 5 minutes + float runtime = difftime(time_now, start_time); + float remaining_time = runtime * ((1<<23) - even_state) / even_state; + printf("\n%1.1f hours elapsed, expected completion in %1.1f hours (%1.1f days)", runtime/3600, remaining_time/3600, remaining_time/3600/24); + last_check_time = time_now; + } + for (uint32_t odd_state = next_state(sum_a0_bitarray[ODD_STATE], -1); odd_state < (1<<24); odd_state = next_state(test_bitarray[ODD_STATE], odd_state)) { + if (even_state_is_possible && test_bit24(test_bitarray[ODD_STATE], odd_state)) continue; + // load crypto1 state + struct Crypto1State cs; + cs.odd = odd_state >> 4; + cs.even = even_state >> 4; + + // track flipping bits in state + struct Crypto1DeltaState { + uint_fast8_t odd; + uint_fast8_t even; + } cs_delta; + cs_delta.odd = 0; + cs_delta.even = 0; + + uint_fast16_t keystream = 0; + + // decrypt 9 bits + for (int i = 0; i < 9; i++) { + uint_fast8_t keystream_bit = filter(cs.odd & 0x000fffff) ^ filter((cs.odd & 0x000fffff) ^ cs_delta.odd); + keystream = keystream << 1 | keystream_bit; + uint_fast8_t nt_bit = BIT(bitflip, i) ^ keystream_bit; + uint_fast8_t LSFR_feedback = BIT(cs_delta.odd, 2) ^ BIT(cs_delta.even, 2) ^ BIT(cs_delta.odd, 3); + + cs_delta.even = cs_delta.even << 1 | (LSFR_feedback ^ nt_bit); + uint_fast8_t tmp = cs_delta.odd; + cs_delta.odd = cs_delta.even; + cs_delta.even = tmp; + + cs.even = cs.odd; + if (i & 1) { + cs.odd = odd_state >> (7 - i) / 2; + } else { + cs.odd = even_state >> (7 - i) / 2; + } + } + + if (evenparity32(keystream) == evenparity32(bitflip)) { + // found valid bitflip state + even_state_is_possible = true; + set_bit24(test_bitarray[EVEN_STATE], even_state); + set_bit24(test_bitarray[EVEN_STATE], 1 << 23 | even_state); + set_bit24(test_bitarray[ODD_STATE], odd_state); + } else { + // found valid !bitflip state + set_bit24(test_not_bitarray[EVEN_STATE], even_state); + set_bit24(test_not_bitarray[EVEN_STATE], 1 << 23 | even_state); + set_bit24(test_not_bitarray[ODD_STATE], odd_state); + } + } + if (!even_state_is_possible) { + all_odd_states_are_possible_for_notbitflip = true; + } + } + + printf("\nAnalysis completed. Checking for effective bitflip properties...\n"); + for (odd_even_t odd_even = EVEN_STATE; odd_even <= ODD_STATE; odd_even++) { + count[odd_even] = count_states(test_bitarray[odd_even]); + if (count[odd_even] != 1<<24) { + printf("Writing %d possible %s states for bitflip property %03x (%d (%1.2f%%) states eliminated)\n", + count[odd_even], + odd_even==EVEN_STATE?"even":"odd", + bitflip, (1<<24) - count[odd_even], + (float)((1<<24) - count[odd_even]) / (1<<24) * 100.0); + #ifndef TEST_RUN + write_bitflips_file(odd_even, bitflip, sum_a0, test_bitarray[odd_even], count[odd_even]); + #endif + } else { + printf("All %s states for bitflip property %03x are possible. No file written.\n", odd_even==EVEN_STATE?"even":"odd", bitflip); + } + } + uint32_t *restrict test_bitarray_2nd = malloc_bitarray(sizeof(uint32_t) * (1<<19)); + clear_bitarray24(test_bitarray_2nd); + for (odd_even_t odd_even = EVEN_STATE; odd_even <= ODD_STATE; odd_even++) { + if (count[odd_even] != 1<<24) { + for (uint32_t state = 0; state < (1<<24); state += 1<<4) { + uint32_t line = test_bitarray[odd_even][state>>5]; + uint16_t half_line = state&0x000000010 ? line&0x0000ffff : line>>16; + if (half_line != 0) { + for (uint32_t low_bits = 0; low_bits < (1<<4); low_bits++) { + set_bit24(test_bitarray_2nd, low_bits << 20 | state >> 4); + } + } + } + count[odd_even] = count_states(test_bitarray_2nd); + if (count[odd_even] != 1<<24) { + printf("Writing %d possible %s states for bitflip property %03x (%d (%1.2f%%) states eliminated)\n", + count[odd_even], + odd_even==EVEN_STATE?"even":"odd", + bitflip | BITFLIP_2ND_BYTE, (1<<24) - count[odd_even], + (float)((1<<24) - count[odd_even]) / (1<<24) * 100.0); + #ifndef TEST_RUN + write_bitflips_file(odd_even, bitflip | BITFLIP_2ND_BYTE, sum_a0, test_bitarray_2nd, count[odd_even]); + #endif + } else { + printf("All %s states for bitflip property %03x are possible. No file written.\n", odd_even==EVEN_STATE?"even":"odd", bitflip | BITFLIP_2ND_BYTE); + } + } else { + printf("All %s states for bitflip property %03x are possible. No file written.\n", odd_even==EVEN_STATE?"even":"odd", bitflip | BITFLIP_2ND_BYTE); + } + } + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // second run for the remaining "not bitflip" states + printf("\n\nStarting search for crypto1 states resulting in bitflip property 0x%03x...", bitflip | 0x100); + start_time = time(NULL); + last_check_time = start_time; + for (uint32_t even_state = next_state(sum_a0_bitarray[EVEN_STATE], -1); even_state < NUM_TEST_STATES; even_state = next_state(sum_a0_bitarray[EVEN_STATE], even_state)) { + bool even_state_is_possible = test_bit24(test_not_bitarray[EVEN_STATE], even_state); + time_t time_now = time(NULL); + if (difftime(time_now, last_check_time) > 5*60) { // print status every 5 minutes + float runtime = difftime(time_now, start_time); + float remaining_time = runtime * ((1<<23) - even_state) / even_state; + printf("\n%1.1f hours elapsed, expected completion in %1.1f hours (%1.1f days)", runtime/3600, remaining_time/3600, remaining_time/3600/24); + last_check_time = time_now; + } + for (uint32_t odd_state = next_state(sum_a0_bitarray[ODD_STATE], -1); odd_state < (1<<24); odd_state = next_state(sum_a0_bitarray[ODD_STATE], odd_state)) { + if (even_state_is_possible) { + if (all_odd_states_are_possible_for_notbitflip) break; + if (test_bit24(test_not_bitarray[ODD_STATE], odd_state)) continue; + } + // load crypto1 state + struct Crypto1State cs; + cs.odd = odd_state >> 4; + cs.even = even_state >> 4; + + // track flipping bits in state + struct Crypto1DeltaState { + uint_fast8_t odd; + uint_fast8_t even; + } cs_delta; + cs_delta.odd = 0; + cs_delta.even = 0; + + uint_fast16_t keystream = 0; + // uint_fast16_t nt = 0; + + // decrypt 9 bits + for (int i = 0; i < 9; i++) { + uint_fast8_t keystream_bit = filter(cs.odd & 0x000fffff) ^ filter((cs.odd & 0x000fffff) ^ cs_delta.odd); + keystream = keystream << 1 | keystream_bit; + uint_fast8_t nt_bit = BIT(bitflip|0x100, i) ^ keystream_bit; + uint_fast8_t LSFR_feedback = BIT(cs_delta.odd, 2) ^ BIT(cs_delta.even, 2) ^ BIT(cs_delta.odd, 3); + + cs_delta.even = cs_delta.even << 1 | (LSFR_feedback ^ nt_bit); + uint_fast8_t tmp = cs_delta.odd; + cs_delta.odd = cs_delta.even; + cs_delta.even = tmp; + + cs.even = cs.odd; + if (i & 1) { + cs.odd = odd_state >> (7 - i) / 2; + } else { + cs.odd = even_state >> (7 - i) / 2; + } + } + + if (evenparity32(keystream) != evenparity32(bitflip)) { + // found valid !bitflip state + even_state_is_possible = true; + set_bit24(test_not_bitarray[EVEN_STATE], even_state); + set_bit24(test_not_bitarray[EVEN_STATE], 1 << 23 | even_state); + set_bit24(test_not_bitarray[ODD_STATE], odd_state); + } + } + } + + printf("\nAnalysis completed. Checking for effective !bitflip properties...\n"); + for (odd_even_t odd_even = EVEN_STATE; odd_even <= ODD_STATE; odd_even++) { + count[odd_even] = count_states(test_not_bitarray[odd_even]); + if (count[odd_even] != 1<<24) { + printf("Writing %d possible %s states for bitflip property %03x (%d (%1.2f%%) states eliminated)\n", + count[odd_even], + odd_even==EVEN_STATE?"even":"odd", + bitflip|0x100, (1<<24) - count[odd_even], + (float)((1<<24) - count[odd_even]) / (1<<24) * 100.0); + #ifndef TEST_RUN + write_bitflips_file(odd_even, bitflip|0x100, sum_a0, test_not_bitarray[odd_even], count[odd_even]); + #endif + } else { + printf("All %s states for bitflip property %03x are possible. No file written.\n", odd_even==EVEN_STATE?"even":"odd", bitflip|0x100); + } + } + + clear_bitarray24(test_bitarray_2nd); + for (odd_even_t odd_even = EVEN_STATE; odd_even <= ODD_STATE; odd_even++) { + if (count[odd_even] != 1<<24) { + for (uint32_t state = 0; state < (1<<24); state += 1<<4) { + uint32_t line = test_not_bitarray[odd_even][state>>5]; + uint16_t half_line = state&0x000000010 ? line&0x0000ffff : line>>16; + if (half_line != 0) { + for (uint32_t low_bits = 0; low_bits < (1<<4); low_bits++) { + set_bit24(test_bitarray_2nd, low_bits << 20 | state >> 4); + } + } + } + count[odd_even] = count_states(test_bitarray_2nd); + if (count[odd_even] != 1<<24) { + printf("Writing %d possible %s states for bitflip property %03x (%d (%1.2f%%) states eliminated)\n", + count[odd_even], + odd_even==EVEN_STATE?"even":"odd", + bitflip | 0x100| BITFLIP_2ND_BYTE, (1<<24) - count[odd_even], + (float)((1<<24) - count[odd_even]) / (1<<24) * 100.0); + #ifndef TEST_RUN + write_bitflips_file(odd_even, bitflip | 0x100 | BITFLIP_2ND_BYTE, sum_a0, test_bitarray_2nd, count[odd_even]); + #endif + } else { + printf("All %s states for bitflip property %03x are possible. No file written.\n", odd_even==EVEN_STATE?"even":"odd", bitflip | 0x100 | BITFLIP_2ND_BYTE); + } + } else { + printf("All %s states for bitflip property %03x are possible. No file written.\n", odd_even==EVEN_STATE?"even":"odd", bitflip | 0x100 | BITFLIP_2ND_BYTE); + } + } + + free_bitarray(test_bitarray_2nd); + free_bitarray(test_not_bitarray[ODD_STATE]); + free_bitarray(test_not_bitarray[EVEN_STATE]); + free_bitarray(test_bitarray[ODD_STATE]); + free_bitarray(test_bitarray[EVEN_STATE]); + + exit(0); +} + + +int main (int argc, char *argv[]) { + + unsigned int bitflip_in; + int sum_a0; + + printf("Create tables required by hardnested attack.\n"); + printf("Expect a runtime in the range of days or weeks.\n"); + printf("Single thread only. If you want to use several threads, start it multiple times :-)\n\n"); + + if (argc != 2 && argc != 3) { + printf(" syntax: %s []\n\n", argv[0]); + printf(" example: %s 1f\n", argv[0]); + return 1; + } + + sscanf(argv[1],"%x", &bitflip_in); + + if (bitflip_in > 255) { + printf("Bitflip property must be less than or equal to 0xff\n\n"); + return 1; + } + + if(argc == 3) { + sscanf(argv[2], "%d", &sum_a0); + } + + switch (sum_a0) { + case 0: + case 32: + case 56: + case 64: + case 80: + case 96: + case 104: + case 112: + case 120: + case 128: + case 136: + case 144: + case 152: + case 160: + case 176: + case 192: + case 200: + case 224: + case 256: break; + default: sum_a0 = -1; + } + + printf("Calculating for bitflip = %02x, sum_a0 = %d\n", bitflip_in, sum_a0); + + init_part_sum_bitarrays(); + init_sum_bitarray(sum_a0); + + precalculate_bit0_bitflip_bitarrays(bitflip_in, sum_a0); + + free_sum_bitarray(); + free_part_sum_bitarrays(); + + return 0; +} \ No newline at end of file diff --git a/client/hardnested/tables/bitflip_0_001_states.bin.z b/client/hardnested/tables/bitflip_0_001_states.bin.z new file mode 100644 index 00000000..d697d83c Binary files /dev/null and b/client/hardnested/tables/bitflip_0_001_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_003_states.bin.z b/client/hardnested/tables/bitflip_0_003_states.bin.z new file mode 100644 index 00000000..2973d69c Binary files /dev/null and b/client/hardnested/tables/bitflip_0_003_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_005_states.bin.z b/client/hardnested/tables/bitflip_0_005_states.bin.z new file mode 100644 index 00000000..01b274ab Binary files /dev/null and b/client/hardnested/tables/bitflip_0_005_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_007_states.bin.z b/client/hardnested/tables/bitflip_0_007_states.bin.z new file mode 100644 index 00000000..8a2ee553 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_007_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_009_states.bin.z b/client/hardnested/tables/bitflip_0_009_states.bin.z new file mode 100644 index 00000000..f1de49a7 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_009_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_00b_states.bin.z b/client/hardnested/tables/bitflip_0_00b_states.bin.z new file mode 100644 index 00000000..8c919a28 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_00b_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_00d_states.bin.z b/client/hardnested/tables/bitflip_0_00d_states.bin.z new file mode 100644 index 00000000..21445792 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_00d_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_00f_states.bin.z b/client/hardnested/tables/bitflip_0_00f_states.bin.z new file mode 100644 index 00000000..07f00ab0 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_00f_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_010_states.bin.z b/client/hardnested/tables/bitflip_0_010_states.bin.z new file mode 100644 index 00000000..3b5f8c3d Binary files /dev/null and b/client/hardnested/tables/bitflip_0_010_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_014_states.bin.z b/client/hardnested/tables/bitflip_0_014_states.bin.z new file mode 100644 index 00000000..ec220c70 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_014_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_01c_states.bin.z b/client/hardnested/tables/bitflip_0_01c_states.bin.z new file mode 100644 index 00000000..3d38583d Binary files /dev/null and b/client/hardnested/tables/bitflip_0_01c_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_021_states.bin.z b/client/hardnested/tables/bitflip_0_021_states.bin.z new file mode 100644 index 00000000..39fc37c1 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_021_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_023_states.bin.z b/client/hardnested/tables/bitflip_0_023_states.bin.z new file mode 100644 index 00000000..db4897a3 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_023_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_025_states.bin.z b/client/hardnested/tables/bitflip_0_025_states.bin.z new file mode 100644 index 00000000..339b9222 --- /dev/null +++ b/client/hardnested/tables/bitflip_0_025_states.bin.z @@ -0,0 +1,49 @@ +x밎-n  1WM9/điC$E߶=޿~{<۶pzᄒ̓߶o!v|m%ǿ~xsy967GCBG}?9K׏߶2??!?^/>Z=},??:,?scߧ響7>>俦i~????C:|}||{s^[^9;+K_*붭֓Ӷ;׊~?bjZm'??Ϻ?vRoVV'_B??矬r?i8w;cG;9o?ۣÿ{ {y~<<>?G误ח~ǻ篯;:]{~u{w[?!J~]k ?K鿆O߶?1{VoΣ~~{O׳m^O5ߨ߮???n%h_/cKC;;O1~|k~^[oڞ?}s'F0ml߲mbٶOHgj_+q?[!??\5z|{qݶ~B7GV\m :vr'y~%goy~yK_:|7υ-˟ozw^ΐj_?{/ſ=Kﯷ[?dO>XS_p#]ami_g?kOS?Km׭3y=2iO?z>z?[o?_?߶'vktOu<wnL?_G+޹?͍OJo'׎9 UO1>>9__𷍿)ſ&j_߮?צfû?c[n7mIK5,Ѷ_fm_s? +/_v?>8s{Fr?9c:Oo9Cy?3{Y_QԦ;?{?K!#[cП*PK=WOG٭cc[X{s꟯gS%KG?ǡw>SS//IC>Y~J?w +~m;_?k?/Yv/m;O]w{&O]-?۶G?}?GIet}_m_QvOO~o~~}~oGy]_ZO#>>oϢR[ _=RϜ륤?/j>߇ +sS-m{筿1ajֿ.iYt7/-Wu&#3Ko??;o=xti5?yէW؟=?_~?No[qgxP?#? Wy??cu?KgO?GϢGO:OS_cOOk<_ܷk}>U$R_!W~_tWV\j:u|z㟏υ?}o۹MN_}n׶[𯭿ܼ>Of/s?_þi3Y2??ۥ??U\'H'_2~rL/3/R_}??ӖcOe|/H_W2o'O忴OmѴt_{#'Ϫe g^-? ?__vHחz>82Vj—ֿ=?4|Hkſ4w>UzOq#=s?5ٔg69?i+s[#|??/_HW???z_?=z_gKJT]':+?ߙGA?_<iߏOwqCc\K?i<{9~m|.'/,yۑn=sУϿ[hGz_/#mcW?8U!??s [z=|:ם|}^<^ +vl_H'=KzÏߋskwy<=3W__~?ǟW__K?dOqpync?(Zo/_ߟ}OǺK??e_ ߺ76\s ^GӶő?Z{?-X^L:zϮGOdDmkSz?wg?'oFf̋G+6=O|Wï߶.?4CMs~X|O?9o??o# /KyU?1il|7~]/{?e?oY> 5zqܜt^^:ǫj=?~wvc.} O,$ז5|k/7/׾w?;;=?Oz2gj|?ϝo+ֿߚ'?f?m m?7_ >?z]7>|?Εw_5?7Ok#}𫭿km[v~:}[?~}q;:߮Cmt_uo`az_=_i߼cng9~R0x~??gK +?eߵj^5KjZ?w+{??|П~o-t7{8~R}w_б~:sK's_;??/?5o]Z>߶u˱POm___~ο6IӞ?]O쿈OO.[%'FڦυCkY;9J/_W?#g=_ٺ-?s?6n͵=翡MS +uHVYy?i'Ugߵz?+?/ٍcٶ#/\O+Y_%MwNQOO!}<gKr.W?6|u_'}~owi9|[U[]/_IGk֕?K|bx;/ߌ/pXǿrQ4MKORC۶6-=~KyN/f_ߓ'iJז|c^o?y%Ry_ϧ?gIϟh??xs/C:O։_+~'?ֱ8G'o[#-Uh?ƻbo}ُ#h]eU3?ͳ|RkZצ$,uV1cױ?Y?)t_GȿϿMiyGAw +go>mw~K<^ +?S_ +??b^E_?x/m{GK?}~GϏ?/qUg??MZJ?ݾ]Gyְl_o!???__|,?zmmџy~.x~gQceG#׿':!~Ea?|_[犟?쿜>_ܼ‡c8ԖoYs +zgz>?i9W/k?QJG~gk+No]`o_Ys1+G?CYaYo5l!_^q];K?w?z,%OWOzW[cٶۆO]?ޝǗCbHW?+d}zόkIvKG+6=×ʟz5|Y}9߂oi߭Zy^oO{f̿fu2]ߺeO?s?g[??9s[P?g7cycۮ|n/v~oS?ڮIݿm'Oߦݺ:mCNGv׮GooǶ_~s?uSD?n9g<|?SN~m!?=߭{y_5mo˼[ +?_~?/¿DciA[?;~^?qI?>sǗ[w^MIKoWKu/`}M6s__]϶xxzO뢤?<>N<~%)]W?ϿuM?ڟoGtdx??y]'_ +,|֯_n^{9S_?L`oPg+GqߺMB?4돬իJ?Yg,BWG7Ezo6_'GOghF[by$NS[TH?Y_jרoOOדd?=S{ܷk}>o_9|I?Bx5k2{߲/]m俿??׺o߂.?sO<>bg~?>K׿&>7Rk-_n^b{}Χ+ 3_)96O?_G͐goTs#_c+Ɨ^Gg>KƟ_si1_>dg+Gkn7M'_JWk>GOUgݿ??7#_7cck_[K~]}9W__̓Rwg)xƗJ߲^)>sxcןt_=?gW_^6y/?n_?џ49O/eHRl?_cy?{o59Ou_W3G?/+O5׉h[ik_c;<>79~RC?~~U??>WV?9ygyߴ=7O.{i?*_'ο^4kd^V9K~׮?_[3~~||_i:ѿ^VKKcn^ZRQ?Gxfj~DzW?3U׵׿uM?>^_;kҨuW?o/q~u:x\^~2/5EcAנXYJu +'?ϞC _g͒9Rc#_go]u1;3]H?? 5W9?l¾~+=CQ%3/ok?MD_w}Oc>^mbٶ#??CXCk[:3:X\Caww?7??o ???|x>sIׄ/?[?;R[׬q[9C篱9[a.gs#ioOO3e3_7gGێPv϶GOo^RZ_%5G?i +rpwWC<ޭx|wW'%wo?=_kC ];[]<$>r s.x痊?uߙ/tװ_oFǟ{}-/}?ד?-IO |9ꌿ~*rSZ'sR6RT_*>w۶I]?{miy04[a[ngk?Rۿ'??VsYWZ]' >"sW'ο?qO?6_k]U ??q^aO#5>cUyW;#~f_ ~??G%??s?2?|o?~?{-ەS?R??|Z󏮅$? op}^/}GFRxs{ֿ>Q&kߺ|6]?U߲9zjۿ'|߱4V_+q?OOC/+:n|o[8?>߹Qcevt'z~E~?ïs_I}/n^ZCm\1W<_-N^7_ǜn^~e_c~(ix;Ϳuek~iCwe}\?JO5?V[?j?W\i4mO~@9y=S~Hmbϒ''^ms+-lĿm'vktӮ^N[?K!o+~R׾Ko=gFWG;E_O?Oz^J?~.K?RkW߾_nǺm? {{'/=VGz?Yn?cF#ג2;Uߎ?nƗ/˿mto_U:=z}o?!F;[q=3;y׭_Ϳ6IӞ_O{ g?[a[YϮOb_/? /?٬g _>xRwOO?Mύ[c&GO?[K {rm[ Ƕ_ϭ?_?OK%;_7'?wo~x?C}K_8_ʗ|:v>1א^~w_*35vLOïS??[m|w4>,3*ߟǿ^iݥ?8x  f?ϻߎW6G}|}:7E? Я~/wZW-/)eۤ[c?լi]kӖon^ZޯLG!ױg؟#u.?vz#9I$ k¿9gO?{z4msY߷[ 8GmOY4H&+J_ϫٟ:??S?E7?_uP[TH?/ש'zxu?okK|IX9|I?Bx5k2{_uչu?o 9ο'?13_ ߶sHm_[y}8_ +_ w?t}f߳Oe?K׹NCOܿd_gd_>/~~-.8s=_οe<7Owiږi>GOUgݿ??7#_7cck_[K~]}/|Yqej~O׿)όmsiW_{g}Gϋk-_?CYy?{?ߕ>?ױ9Ou_W3G?y_G[?Ӿ]gV㾇&xƿs\O_YJ#z寯s8Go_g/43_^G%q?C??oD/zu;6}vx~zOz>Kח_U?הoy+{~kgeRR'׿>*w=?S6޿:jQa~~ _U/ۿ?vau_~=??>CQuol?;4mο#9?~,K}-Z߱t?]7?/;'n⟥#o;W?͋Oj=ߌ/ױ:W]m|{?<9_ÿm]h‡_qjw7?sï߲,:şGw?_,_+~7c1o_w?E.o]C߲}j5⼹9/鼼tW-Ֆ'6#{'5)y9Su\>koAY^I-k_n^Zs}]>?_ww^{~e;4f_W5GO٭3nXoW_>o(:|5~y8>?o|~+qjejon&KF?_W[sX?w.?umO~׿wxuֿ]7R7oGF0b{ԿҮy|oiKwrwa^4/~kY?jTh?kkjǗԶ~oW[N;GH??>?[uop|s{?<6́/_K]c}uO̿v'GCG^~Zkߺ'e5}~u?mmc믽|?CXCk޿.m=3]???Ko=9}/Oߍ?M} ?8w?s72<_6#~Gzu[:?l?&}k?9?{??Cꐬ.H+OwώkV?_mFg7%_:g^S-WD9J?G;v?Bϗyx|\$]\?]~~mʏ;{ϿO_?oߦr_կ? +9._ר+o1xw>+=^ +?Ŀ_Z^7>3-?i|Ɵ_o;2mm[-{_Vt?ӿ='OL-o߈bbKjK?=OOg7?ю0?_uΟѿWNNc?q?'O߶?GW[W;O'[kфw05[_RG8N91w?>~<~)-9_>Oo5~z9~ӏ6'__8sZ~|[-F}abٶ>k[bgg1C???^X~џw7u}/37 ?9} +/{(}oxWm/Hj_}g ~Cmk?;39&N7|}⦅ZRj?mI^e?_KV;Cv_SFo.Ǐ_뿥~UYotߊ]^/]6'O{?v׶$kß1omg??7~_Z'g2gKߙ? >??6?7b7?o%CW?/_o<^o/%[k??Rn7?k?S|=?-_ߜ??߭=?O/I*_)'S!Soze>Ϸ?_C{޿7=ly|[3? Om|?o߶?wsф?BO/kόbZƿn{ߎw~35<~~;ߏ_^?$B^o_?r|\/%U9i|P>S+߅j_ǿm?o_ WuM[yi?x3_a_JC??'O;/ _fY>AQugKro/?s?Fq?_gӼ#=;TOS)>_?gL??ƿFCGoR#On_?Zxjp\~~mkѿ~O;wUiuWxzCo;4dwԿ-_n^RpRk߹󑓟cogVX>俦ז?K^aÑ>x)'9Oiş +qKvz#3Ow3S^Zc<|j7z_?_YS7csOxCAԽs_|Iy}\u/Pmץy:Ϛ_ ѿ{eǻ_?G}m?ocI꿶Wg]K߼7=v<~?)rY? E[_nS?_u]1k36c)߿<צ$,u +'?Z_\gK#>6_-?_>ߩu?+_Mu?}߽>C/x)xOy|c\_ +??b^E_?x/m{GK?}~GϏ?~UmoUο箿<~kؿ?|sZ?ms?uOOCsW>tgy=ݶ{]߶p OqO~?~<]?3Gݨ12ߑ_\M>ïs_N}/n^ZCm\1w|jy,9x=G3=s_g~4}xe%RtW\3.mS/?q?!J__???L/ץiO;ǟRhyy=S~Hmbϒ''^ms+-lĿm'vktӮ^N[?K!o+~R׾Ko=gFWG;Eu^x}%WÿCk+$w>~}/}@6_Gk֟돮%}M-oq~bz¯ݿ>[zr?>2?¯6rϟ%~$yIWsƏ_*_ÿ4fEz'@ӗ?^a[>}Wcg׵dϳkmPgxګkuWß%g'fOM W_gw1~_O +z!o6_-?ŋП#_?ok8ẃ{?)ǟ?A7w*_3O??Lvmkߺ'g5uҿV9jۿ?u[If_ۖqTm+ο_[yII}!\NEv&GߙΟ/׳v'_пk;l?(#_ +_8/V$o<~u???ۥ?lGXzTo$#PIi?]Ht,_׍Y_mBg7UX_iR'oӮ/??nI +nT[w/R)Ï]m+~>sLJZ0y967GCBG}?9K׏ܾ!~5j2~VeG㟏xGis_/<ϟ?i↑_ϡ)Go_?mk?'mǜW~|Nƿʟ~!m+_ο6?vO忴_c#_t#'Ϫ]'C߶O'O?8?!|%N>w_OW{y~<<^YG_LwkuOna+?Rw_C<,?#[?[ϳ?YO9Ru?_{?ۖwfy-m3g??-sn#Y{oտi{nٟä]Ӧ;ןgO?#qqg#m'?s??)wϿk/ ?!m pZ?s-o۹џ +jk-?m;q?.m|y]:CwW/o?h?)>;cO??-}t}3g?ǦCw?Oa.+^(\_?mpoͲWYiƯW[cٶƟ?g?r<>޹1uݭ_ç6>u~o9h'}}YgFU??-O~oK|q~w?ǯvi?mkuo??Ko_/y𷂿ʟSJ9>sǿ4>|)_OįZ_RIyϿRYҺ-eܼ_יCacϰ?G/???]mGsIׄ/3sW^a Oi:οo9q_[9C_8aП/^i^LW'֩ƿWG/ͳ?u?o?v_#ws?#WN'_7_fS??_O|^sߦ¯ݿ?W-Is~j_e|Ck?;^Zs9./sO<>bg~?>m79}_or#p>5׿vֿ͐goTs#17lH=}{_2O[]>qlƗz#p?#]? _wyo?^?-G}~'??Ϻ?2oFn:s/{4 C-Km#]_H׳ZXy_ +_ZL?t?y W[=Ǚ׿6|̝gSaǟ?Ӯo]i׎"ZCi#_-?V jV1/+}RcusT?<&g?=O俎.?}?Ϻ ?߭}s/M#쳔~oG>oϢ_ig̿K_?V'?/m^?\?_w?mzx){" |/?ګv/υ)篯W>?>?_O}U{__m=/?h?)?u?VԢgkz뫶_?.{}}&|sw.3!yiO?Gr~X?kgG[Ŀcy3k?o?v_wOO?KGjw=$O5!{_#3/c?u$+>?x>r%?\ Є6c?o?_ǿeYu?4|οX.UVo寓cu2]ߺeo3kyss_yy;Z-~OmFKOj/SrBue}߂?糼_[𭭿ܼ_6}s߯8~o]ٵuoc۶=naooǷӉk?^a??S]:Iüi_߳/і)ǟ!~^{y//}?g7wmk߮cw|C9?ok{IK/ylk?O_ϻ~A .?/̙O~L}qe?oex>(UlF]gtgج3~M6:s?6O?+!Yf]VVGg7g#'nKڿts??[{gs59Gv??=/G1.I˹~ʻ_?וw^;韜k2MnWm_t s]<~%;?Q[WZ.s;c|Vz~* 3ýbso|E=gZ~߷6/?IweoZy/e3;忬C9{ ~O7?+_[߾_{[/-Kz~#'>.Ϣo'=a<8-?Y'ei6_-?_>ߩu?+_Mu?}߽>C/x)xOy|c|#O)xSx=[_s}}ok.s>mO +??\p>WM6k}*[w>w=s[m|Ck۟+c'??.}?Io_xGQ>F\bן}go~m+~r^~ys +kS[e)~~>Ɵ:hO+l_t?Gc~(ix;Ϳuek~iCwe}䯿? W:;"gge>yum6.H9GGo?_=m_qo)g#m>_vߗzwں7_}#_[]?3?R'?W-/=_W?^o?+>_*_j?צf[ m][kKyU?1g+w_C?8Qor?9c[;o79CSߌKo?|Okz'wm'O?zw?;[sDzs_J>_ASov7ϭi]ԵOS߆_3G?N<g]LJO9¿C迆;>-_ [Ow?8?\gCߧ/]Hm_[y}8_)%ϐ?6CZ.C]'Suj|5_gz?%>/~~-.;s=_οe<7Ow)_O?Vu.?,dߌ?u_? m/iwZ0W?̿_w1OKKߝGw>__;*{8ϑ_ol?3o_U^|]{[#|??/G_N4?뿘U#Hvm߶sL>זϷO=;K_gU7eO͜RٶǹV{𫍗_o?}|̝xQo[ak~s߿ߜW>}:{rM:Y~?]kWnPݿHW?YedҌ_m?_y|scyo +v?]WinW{?ivO1}}O +_{%Oc5|j{uts\-}sבR?=ONc}@a~/߶u6ߺ {,}o3)'j+ _דǘmC[.ҟ\to/y?Vʿ:Oď+՛ir=^×ƿʗ??Ӗ? uh^a[>/gkn$_md6>>Ӿ?k?#ϓm?]Ys/ccۿR WkO?ע;׻zЯ_z[Я/}|_]_|n}ϔRu|!霚GzMRZ//?돹yi?JG7y1?_=?gW_^6y/?K_IԦu׿Ǒ~^?sz? TϿ_cg)ב)o?{37KuwN[\U[K_?_<_]%_߳MsTh?kkjǗԶ~oW[N;GH??>i?^ǒ/ߪU]{y?sw\w?yK#Ͻm[9gGϏ_OulVmb?|?Zqg3߶C??__|,?zmm˿o[?>Fo۹џ +}Nfor ?%} +/{(}oxWm/Hj_}g ~Cmk?;39&N7|}⦅ZRj?mI^e?_KV;Cv_SFo.Ǐ_뿥~UYotߊ]^/]6'O{?v׶$kß1omg??7~_Z'g2gKߙ? >??6?7b7?o%CW?/_o<^o/%[k??Rn7?k?S|=?-_ߜ??߭=?O/I*_)'S!Soze>Ϸ?_C{޿7=ly|[3? Om|?o߶?wsф?BO/kόbZƿn{ߎw~35<~~;ߏ_^?$B^o_?r|\/%U9i|P>S+߅j_ǿm?o_ WuM[yi?x3_a_JC??'O;/ _fY>AQugKro/?s?Fq?_gӼ#=;TOS)>_?gL??ƿFCGoR#On_?ZEM_?/_?.Z$a% +𯍯?:׮xw׵WZWsש]/'_;˟x?|~.3!|or*s#߂m%G|j7+ 3ߝM!?-.?\:G?qco|ٞ{Sοd5ן||ؾύ/#G~F:d+?b-~j[O?Vu.?,dߌ?u_? m/iwZڶGgW!,@ +^+{3km7^;?]ΦW?3I]ߺӦw?/ECcavGZ\Ae_Ֆb!?c:_WJM_G?[]_9yLo?R??zo]CO~t%u?[[_GIks5?g)f?ϻߎwyo߶՟G}|}:7E??Ϙyo3?οa#O?_?<׹~R>gE?,]_K~<W^ _S__|f|\?JJ\|>9Lxz_!Rs?sE~5|IWmԿ*?os?]Y_-GM\gC?58./#i*gזv?ƿ$%؟l[ף{?[#I_Mk4/C?35Gg^_'?H_Ww|~|K~ w CmO_Ozߜ ?oi߭|]:ϫiߌO_'gǼe/?u?g朿8w>^W[_ی_OO]׵?sZgy%[[yi׿um!y?y9o|SK~|Ә_?m_?gϸ7ci_?m_}j?נTzqͿ_m,}:ο_qx|> _m}^ckߺkm{(?Î_YvK߼o׎"{?ףQJuϿ/Ku?%yg!?_R-S?;C!/V__~oSɿϿ]o=;#O# {ms׵6cϽ—;^7~<-w]_?3y\y~viT֦_/?_>cmztO?bEv-G ?y|7U$6}.w_zޙ\|P~ٌRy;=o9Ygwumu???8 mҟ?VCʻ4#`I?I߭R/?;׋YQn϶GOzO_3+kڿs׏/{<_c<q]tswC+?~w=?9eOCW*~yJww?_C]ws?x)Tf|i{?zϴto_m_߶o<_fv?wY6Lro?1KlWǿ}#_[//ϛGO_?}>]EO?~~|M[|˯?kmoU}{>g>Z#׶?Wo=c[O??\zcOGדmwm ǿ׏$s>?|ߍ+?Ů?+ +Xa3??Wa)>צυqOͧSc|?1'u?ОN߇Wپ*^ :P/?J;/=?>^[]w?Ҝ/o_^a?JtwlEϪ:Cg}_m'7my]s)?w}f+,z67R϶G6|lǿF?/uo3=d?F[m-]'֣f'^O[_z'\?CDUO1>>9__𷍿t#ſ1?X9~R߳k?K鿪|'iC{hk:3ֿ~g?-/Y#o_n|9OGK?J?Uףg?3Ngÿu3]+wzǾuk?{Pg~G^_ S_u/?$ߌ?'C'k??/gȿ$#?mҟ\Կ|qx꿔o'QH7߰lQzoNSWU[s8>=ާj~Jc%|~ȧ?O)|N_m? %˟{ww?Smn}4>eH~?ϱG?i?m?3߮iy}|;]Ϗo?~5O__K?Xid_{ccY_ zϣ?}]VWsT%~__M:}{7F3_v7m/?楥9b)_o[?o?2ϟ?O򿠿&;yg6Ͽ +yKG=u-}5οpp?ߖO?gR?Yg,N45?:il#3cY#[UO:uK4C?2o,i-zusK_WÿCE6?9>}Wÿ&_rO<W5^ҐI_S_[yII}3GN~YaK_[C[.ybG~Bk_O?%Ҳk_+/Ez'\~?OٿRgaziחuk믾߈bc?ַdϳ5g;:[+g'fO??a<'׆S*zW%q5οC]O +z!omO +???SWMWǷ_U߲S:^}abٶ>k[bgg1C???^X~џw7u}/37 ?9} +/Ԯ_ ׆˯>~l?9eW??[׾Kο_[R׮?G#5忶e]'[<^ +vtn{_Z/_Lg +=%_?NK ~-뽿~[O_SC3xo71l__ٟe_?7Cmo|5k~^ ߖe~?5/_}1񌿡_>?׹z*xWKJ~]J?)9ӯ?_Q?G}m?ocx _'}W_*歿{_;}????i֟w>׿Ǒ~u?1S<0xk7ׯ?_tב)o?ks/OoOu.۔]??ċ/C~kmߏrO7~<>2WOW>ߌcIek?93᷍T>KZzkmbٶ?"׹n'Cm[uS뷭^:m%'=Cqb9 C]~g:2ޛ_Ac{}E~~{\\_~ܿ~Gg+m[ş?n?S??,omiYcR4B'It!}z_7gG~Qv϶ OWmcJSEOTϿOv'?+OO=Hj \ No newline at end of file diff --git a/client/hardnested/tables/bitflip_0_027_states.bin.z b/client/hardnested/tables/bitflip_0_027_states.bin.z new file mode 100644 index 00000000..365da680 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_027_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_029_states.bin.z b/client/hardnested/tables/bitflip_0_029_states.bin.z new file mode 100644 index 00000000..32da1257 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_029_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_02b_states.bin.z b/client/hardnested/tables/bitflip_0_02b_states.bin.z new file mode 100644 index 00000000..3cb26a7e Binary files /dev/null and b/client/hardnested/tables/bitflip_0_02b_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_02d_states.bin.z b/client/hardnested/tables/bitflip_0_02d_states.bin.z new file mode 100644 index 00000000..84db51d1 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_02d_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_02f_states.bin.z b/client/hardnested/tables/bitflip_0_02f_states.bin.z new file mode 100644 index 00000000..8858e63b Binary files /dev/null and b/client/hardnested/tables/bitflip_0_02f_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_030_states.bin.z b/client/hardnested/tables/bitflip_0_030_states.bin.z new file mode 100644 index 00000000..a9643322 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_030_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_034_states.bin.z b/client/hardnested/tables/bitflip_0_034_states.bin.z new file mode 100644 index 00000000..959af96a Binary files /dev/null and b/client/hardnested/tables/bitflip_0_034_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_03c_states.bin.z b/client/hardnested/tables/bitflip_0_03c_states.bin.z new file mode 100644 index 00000000..7ee38499 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_03c_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_040_states.bin.z b/client/hardnested/tables/bitflip_0_040_states.bin.z new file mode 100644 index 00000000..372d2d4a Binary files /dev/null and b/client/hardnested/tables/bitflip_0_040_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_044_states.bin.z b/client/hardnested/tables/bitflip_0_044_states.bin.z new file mode 100644 index 00000000..ea932437 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_044_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_04c_states.bin.z b/client/hardnested/tables/bitflip_0_04c_states.bin.z new file mode 100644 index 00000000..2bf23856 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_04c_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_051_states.bin.z b/client/hardnested/tables/bitflip_0_051_states.bin.z new file mode 100644 index 00000000..0b78915a Binary files /dev/null and b/client/hardnested/tables/bitflip_0_051_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_053_states.bin.z b/client/hardnested/tables/bitflip_0_053_states.bin.z new file mode 100644 index 00000000..700af31b Binary files /dev/null and b/client/hardnested/tables/bitflip_0_053_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_055_states.bin.z b/client/hardnested/tables/bitflip_0_055_states.bin.z new file mode 100644 index 00000000..307828e6 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_055_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_057_states.bin.z b/client/hardnested/tables/bitflip_0_057_states.bin.z new file mode 100644 index 00000000..3e8d1b27 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_057_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_059_states.bin.z b/client/hardnested/tables/bitflip_0_059_states.bin.z new file mode 100644 index 00000000..1356800e Binary files /dev/null and b/client/hardnested/tables/bitflip_0_059_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_05b_states.bin.z b/client/hardnested/tables/bitflip_0_05b_states.bin.z new file mode 100644 index 00000000..efe41d50 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_05b_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_05d_states.bin.z b/client/hardnested/tables/bitflip_0_05d_states.bin.z new file mode 100644 index 00000000..2830ce68 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_05d_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_05f_states.bin.z b/client/hardnested/tables/bitflip_0_05f_states.bin.z new file mode 100644 index 00000000..89089305 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_05f_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_064_states.bin.z b/client/hardnested/tables/bitflip_0_064_states.bin.z new file mode 100644 index 00000000..05cd17e5 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_064_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_06c_states.bin.z b/client/hardnested/tables/bitflip_0_06c_states.bin.z new file mode 100644 index 00000000..d787bcc9 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_06c_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_071_states.bin.z b/client/hardnested/tables/bitflip_0_071_states.bin.z new file mode 100644 index 00000000..2d2f4a1c Binary files /dev/null and b/client/hardnested/tables/bitflip_0_071_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_073_states.bin.z b/client/hardnested/tables/bitflip_0_073_states.bin.z new file mode 100644 index 00000000..552cff66 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_073_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_075_states.bin.z b/client/hardnested/tables/bitflip_0_075_states.bin.z new file mode 100644 index 00000000..e37d90e2 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_075_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_077_states.bin.z b/client/hardnested/tables/bitflip_0_077_states.bin.z new file mode 100644 index 00000000..f03f0bba Binary files /dev/null and b/client/hardnested/tables/bitflip_0_077_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_079_states.bin.z b/client/hardnested/tables/bitflip_0_079_states.bin.z new file mode 100644 index 00000000..b05646ac Binary files /dev/null and b/client/hardnested/tables/bitflip_0_079_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_07b_states.bin.z b/client/hardnested/tables/bitflip_0_07b_states.bin.z new file mode 100644 index 00000000..184354a4 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_07b_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_07f_states.bin.z b/client/hardnested/tables/bitflip_0_07f_states.bin.z new file mode 100644 index 00000000..87ac36ab Binary files /dev/null and b/client/hardnested/tables/bitflip_0_07f_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_081_states.bin.z b/client/hardnested/tables/bitflip_0_081_states.bin.z new file mode 100644 index 00000000..b8f66386 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_081_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_083_states.bin.z b/client/hardnested/tables/bitflip_0_083_states.bin.z new file mode 100644 index 00000000..81c4c59f Binary files /dev/null and b/client/hardnested/tables/bitflip_0_083_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_085_states.bin.z b/client/hardnested/tables/bitflip_0_085_states.bin.z new file mode 100644 index 00000000..e642accd Binary files /dev/null and b/client/hardnested/tables/bitflip_0_085_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_087_states.bin.z b/client/hardnested/tables/bitflip_0_087_states.bin.z new file mode 100644 index 00000000..1a844e45 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_087_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_089_states.bin.z b/client/hardnested/tables/bitflip_0_089_states.bin.z new file mode 100644 index 00000000..d02b3c77 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_089_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_08b_states.bin.z b/client/hardnested/tables/bitflip_0_08b_states.bin.z new file mode 100644 index 00000000..9c546f94 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_08b_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_08d_states.bin.z b/client/hardnested/tables/bitflip_0_08d_states.bin.z new file mode 100644 index 00000000..e0e985fc Binary files /dev/null and b/client/hardnested/tables/bitflip_0_08d_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_08f_states.bin.z b/client/hardnested/tables/bitflip_0_08f_states.bin.z new file mode 100644 index 00000000..f5b38b58 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_08f_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_090_states.bin.z b/client/hardnested/tables/bitflip_0_090_states.bin.z new file mode 100644 index 00000000..f901235a Binary files /dev/null and b/client/hardnested/tables/bitflip_0_090_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_094_states.bin.z b/client/hardnested/tables/bitflip_0_094_states.bin.z new file mode 100644 index 00000000..f97d41f4 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_094_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_09c_states.bin.z b/client/hardnested/tables/bitflip_0_09c_states.bin.z new file mode 100644 index 00000000..7946dcf3 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_09c_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0a1_states.bin.z b/client/hardnested/tables/bitflip_0_0a1_states.bin.z new file mode 100644 index 00000000..23198e8a Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0a1_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0a3_states.bin.z b/client/hardnested/tables/bitflip_0_0a3_states.bin.z new file mode 100644 index 00000000..3d2cbe6d Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0a3_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0a5_states.bin.z b/client/hardnested/tables/bitflip_0_0a5_states.bin.z new file mode 100644 index 00000000..9e680357 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0a5_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0a7_states.bin.z b/client/hardnested/tables/bitflip_0_0a7_states.bin.z new file mode 100644 index 00000000..e7ad43a8 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0a7_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0a9_states.bin.z b/client/hardnested/tables/bitflip_0_0a9_states.bin.z new file mode 100644 index 00000000..cd17efb2 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0a9_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0ab_states.bin.z b/client/hardnested/tables/bitflip_0_0ab_states.bin.z new file mode 100644 index 00000000..8469638d Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0ab_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0ad_states.bin.z b/client/hardnested/tables/bitflip_0_0ad_states.bin.z new file mode 100644 index 00000000..59185187 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0ad_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0af_states.bin.z b/client/hardnested/tables/bitflip_0_0af_states.bin.z new file mode 100644 index 00000000..51e59ea2 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0af_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0b0_states.bin.z b/client/hardnested/tables/bitflip_0_0b0_states.bin.z new file mode 100644 index 00000000..09370ddf Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0b0_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0b4_states.bin.z b/client/hardnested/tables/bitflip_0_0b4_states.bin.z new file mode 100644 index 00000000..4048a702 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0b4_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0bc_states.bin.z b/client/hardnested/tables/bitflip_0_0bc_states.bin.z new file mode 100644 index 00000000..ab0b3755 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0bc_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0c0_states.bin.z b/client/hardnested/tables/bitflip_0_0c0_states.bin.z new file mode 100644 index 00000000..d3f655b0 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0c0_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0c4_states.bin.z b/client/hardnested/tables/bitflip_0_0c4_states.bin.z new file mode 100644 index 00000000..d5c5f5ed Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0c4_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0cc_states.bin.z b/client/hardnested/tables/bitflip_0_0cc_states.bin.z new file mode 100644 index 00000000..868afc9f Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0cc_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0d1_states.bin.z b/client/hardnested/tables/bitflip_0_0d1_states.bin.z new file mode 100644 index 00000000..f7dd752f Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0d1_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0d3_states.bin.z b/client/hardnested/tables/bitflip_0_0d3_states.bin.z new file mode 100644 index 00000000..68ef2a6d Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0d3_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0d5_states.bin.z b/client/hardnested/tables/bitflip_0_0d5_states.bin.z new file mode 100644 index 00000000..7720f54a Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0d5_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0d7_states.bin.z b/client/hardnested/tables/bitflip_0_0d7_states.bin.z new file mode 100644 index 00000000..5f05c9cd Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0d7_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0d9_states.bin.z b/client/hardnested/tables/bitflip_0_0d9_states.bin.z new file mode 100644 index 00000000..f9ead3d9 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0d9_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0db_states.bin.z b/client/hardnested/tables/bitflip_0_0db_states.bin.z new file mode 100644 index 00000000..c272e158 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0db_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0dd_states.bin.z b/client/hardnested/tables/bitflip_0_0dd_states.bin.z new file mode 100644 index 00000000..6247d26d Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0dd_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0df_states.bin.z b/client/hardnested/tables/bitflip_0_0df_states.bin.z new file mode 100644 index 00000000..63e00d2c Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0df_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0e4_states.bin.z b/client/hardnested/tables/bitflip_0_0e4_states.bin.z new file mode 100644 index 00000000..5b4d867f Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0e4_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0ec_states.bin.z b/client/hardnested/tables/bitflip_0_0ec_states.bin.z new file mode 100644 index 00000000..76418891 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0ec_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0f1_states.bin.z b/client/hardnested/tables/bitflip_0_0f1_states.bin.z new file mode 100644 index 00000000..9740a1a3 --- /dev/null +++ b/client/hardnested/tables/bitflip_0_0f1_states.bin.z @@ -0,0 +1,28 @@ +xѱ,W)$.!6r*p )%̞\~ #ۙ=Y B ! M<^8ò-y}_{߿ݦy}ÿoy{w44{ϻwơq?}ƭ-lpC߃sx<^q4ӼmTeoߺyyv?)~/&agJ /???O}[s?__>_3G-?^^{ݶqe9/㿞o?^im}÷=^m}w [_j~JޗesNiGz]j?;_u.H_gu\Ak_zYJn=?%uOXlI)ߗG#_IIuo_m|fc?krG-_ПgY`~z{׃O}?o3xm=|0['KYi??O[E#??J?5?_GۺO?_;|o7ykwo"q?a8Co;O~[/zG?t|jƿJr[̿f=?_?!?]Su#]92{?X%יYהam_kuC+5_I?-W 9vROrӿG%/Mu+?6՝߯׻$_9<={㟭ooOC?Dk_co8<8,,Ӽ,xM8,6<<8,,Ӽ,<>~RI׃/-s?N>>-uu|OGc-oY'my~?I?5?[ѰKg-O_gUM]_'?u?Rk5=OOkXƗnw/m=~gsO?/)W/uyg^)~8UJf7;{/;rCk~>5v7{Uq_[/?e=p>5׿v_t_?_FnZ.scC'N;Ŀ/Y'?,"Owvύ_si:{zԜt5;>]DZKyԲ=G{O?Vu.?_M/w_-~3~__'a{i~~j)kӼ<ךQc}ӦwECmIG]aK󟶬-EC;pkUFiKJtuwt8[u]Gjag?y_vmSo_ iGOwqYBci=&NgM?Zz_\c]QcN?<Ɵ?gM/_?jΗ=Wp?V'?_?XG;vߦsϏKv|IXg>_:˽rχע[]-v{wkw[eRCu}w_չo1ǟn_?p<4?[%]_xϟ~]Xc]ץwM_.u?\wo yosGϓ`Z5w쯎t5Ϻ϶6՝9%OUqZz8k5㟭vm4ͭ?/ZkZז?~_oH;~'_bç/;?CIt8.~O?)99Οov<=}l_Y~2/??__?v_76/p{DZ;×ߤ/?/G)BuYdǡ-eiuls./7t>{\wCs_?sWZOH{cw=[? M GG?|_Q'?Aq'lnm{ί<`O?׿r}sדWuO~.mT[q2=%@Cokο9ڏ/ٻvg)~RtZe+g^?>_G[wC!y߷<=jzoQqrcG>NMOk?ogsϾ}?Ϳ~ymKףE[_?i3s,K~zt/矮g6u민g["o'C_.m=+:P]???mG 8~}W$6-Km_\i;oww{Y???Ka!Io7+RI?IQiYg6gEg'v?߶g%__۫[C?o5??-ʍo?+I|ǯ C{wo_οՊs2efWW7hOy,?]Y#/[?~w~JO?o{3nv>+Y_=_ʿ+]?9x~nY_?[/F>ӯߺ˟?[/_nK?Ϻ?V?m]GOo)[I?/ߵ?˳kN=kןч_a]4o}my ?|_s+GOhcY>5)y'Ưgӏר?!ak=KJ?Wtuwߢmӕ-????'OoDzwo8q{oG帿~:z?}cRq_BW;צ_/eϾ=OczZO>j2'?[a~^~g??'MoSnYڮq8e>_?>ی_c_?:|C''?stO>;cyw9y\w>{}[q3 +~<~߫ Zqu=>ߎ+o_'K)|Mei ?㟟OM/?8qh*t~wmw߯g_)qq{\3eO*o]sst^js=Y>+/}lK_o+Um>[g,j?dOkߴVO?g{ϑ5[{Y:㯎ߥog[CنOmW'n?;_%\?Fr#-j';WS\#O+Z쟚WyyyqX}yyzޟqXkaYniii^}aYqii~ޟii^}}]{߇/?OÇ__j⯝ -u9[~+KW?kןw*QKbcCߺ'cw}'?s??-_y|߮/vnS?Z_EF_w?Mouu۾w?2ޥci9+9k_jGoH7?]nOsO]'?}-+Oc+}~$O-+|ړ4O_>%ewk?;M{o)۵ïT){'?hGmϚ׼??^u}?YoJƿ~?}*?v}o韚}G]o_???җ?-O +J:Rj}zO{? ߺ׭?=??e??6z#s>3?__A}o?=|/2~>O`;g?C6aq߶E-m?׏W/v6_y_e )Y~6wo9O]W՟k!?:~K5Kzsi[fN>ݻn=?/{?.~}_R^\>CK㿥W_g\;~>]^|#߷ǹogs߂ownso/8x|mos[o]yo +7Rk%޼~ΧJ ?#絑[˜m6?ӎ'xUw~Y{s_}nO[%?zԜt5;>]DZK쿑??]ٵI__￀?__[K4feO՗KM_ +6?Ӽm_' /j?[^;nJ?5GòC?Kc}ӦwECmk>_GW?SԮb^QzT:֟_cce?mon~ֿeߑ_o]qӶ?vg?Y??Ϯ߶O|3[?}om=uǫqضjn߻uv{X}b=§ ~89L>ה[W>[8lۧ9\?sq=?_?!?ە?_?+>q%ǂ//o^ۭgZ?? OiԿJ8zϞ-=,i{<['϶~%ON/Cg}qhu#l={}UgV%_M/ii^}aYeei~ޟkYeyޟqXkaYniii^}aYeei~ޟii^}}P쿳ϓ—|s=;O?s#Kz3>@_<^)9sJ-u._܃O{?~ymoO K_s֟2_?_Ouao{OӾ_ƿg_?J{_qd(Q?\y/yK_RKKӖ?X{XK=~ӟwU?n^x[+?*[Ϻ}?vR/t=? GGMwtOaOkqsxkۧ9lmx_=Ư_k^y۾~tǫ,pL4oTUGխOv#aYk]?Yvmio"6|??_JT?6㯻5=n[g9ߥskEnʿ"~_n,O?n:go_Jr_6R5oy:?.8N?H?cO#꿃?S/SߟJ>em ՟߫ gڮZ[I5Zο m_L_O6濼ןg[vR?Y׶w_Wsߢ/?e=p>5׿6#v]_OO.[Ɵ??6xx>sIׄ/h?s&[sOs8XM#`?K\7[+5;H?R%$_I?mu߶?߶'϶7ͭj!?oO%,O+_{ o_~s7ׄrs׿4e\0?Aq_wW;_uカk{s?=qضPdznߛV{}_o_[ϏK?7K~^w?-Kx3-뿔T_׆o~~JseibϾSq?ÿ~Oqض?__[_<r<=7VZ?_RGn-agJ?'/?h~Uq_??o?s^+?ۣĿD֟W~NYT[·>6ֿ~xs/GO_f_?H/YG~K% +g?-kkL?}_oo'>^ߑ-?}dž_m7e /Kh?\1,tϿ>_^>}/{LI}??]φ_?խ/'W??sGu#?| [n0g7w?򯗳_۟u?- {^ug8\}7-y)W<~߾.OwߛR_~ ??5_-?lq8_&UmWn~k?}~_z_e?οϝKm/?}lKvk?oG:cW'_~]ڥ?M/59ރ~ߣϒOu.+?6|lJ?q3*q7__o)Uo?j_bb˿u3Ӽ,8ò<0_*?3׫?wڭ<.m=o| _O%5)O/Xak-k7/,#o=-ܟmy!_&{AM=ҟYR4v{Rv?OGc^zO*zO^?c:x{϶~mK?n_ܗ㕂?ƿ_yO?r?}ȿYW󮎿T߯[vx>v?~oSY4wKi>7#Y_(;䯴}~sO^~swE_:KXiӿf_{i?$_F9s*gk/e/szG4~N\u _jE}x~n_eTi]ӗoy)?x-Cv9W??6z#Iyv'__5￴?;]/?/[ۿgq_?C_qdCe_rK$zToG/?u-?U7;wy~?ױ_H?_??#zc_ݽRE?9o_!1}>:xu뿧oUa+):[ߺ앷[h܃[.=??1=}[[CqWAJmۛx\o?~^im?C;:O\e=賴T_w>y??7~-w?Ss 3俺_Jw5kj/Sk?Yak-5??:i! C-R¯O4o_kI{Z94Ö׿6[?5GòC?ZODoO~u;a%jwS?[/ڲ^gU/+u_Ggߑ_o]qӶ?vg??_g-?+O}7?ߥe 폥_k;7m?k՚~swEI::m6k濼`ߺ_9_$m?_G[ş#?v?o#zcoݻn=?/{6Z$a3K|Ï/=_mkwi4v ߵ;=ߵoſJoWksC_=/?hRw\:vZo_×t}K_=>vau_~5??~C׶?j÷8^s--!罕GֿJiB?OӃ_?kqYmJ߱:g??ogUwp?W_qhu׌Wڵ:4OvDk_?k][}?e#]{߇?Þ|ÿoІ&?}o~?/;2[ǟGw?ڥܫ_I寗q{(ee#{ߒ-c.Yq\t\:fUw _E =пﳳ|=}!{:^zvrUK?\_}̿^Ε^׿6_O]}?zG/K(?Y׆Rn+_?/~\?עJ;[_j?~dIk95Sxz!^~Im¿~ߙ?~ ?|/??7OɿϿEWwoGjag?;_?7/?⯭e/}>~yR߻\7絁/_ϿO?X!okѲ/=r??W,_֭/m?l5O~tO?XBEv2[/_I]m#__c/K?/V3_ö}Ksrk??sfe?}eY.<$߬K?R'$Ge9W/ۆOm~igOuoo?Rk-?W+7=oGПru&%Ο 6|{Q~u:W+=Sk矖Ç__=to;qeSזo~:q?+_ +?韖_ˎ?ϸLOdI*m_+v}?|g}/Po]<O~Gזys/l~ӿ/)O/o?_YOv??Oo'l[~tV*XG'߲/ʯ2߮:a]Fu5=~ɯ>mǣ;o{gwCkO?_Cѿ/)4^-_GgߑWOWc|G[Gm_?mw߽!_Rq>9|}Kkwqض __:_~}>^54[pơMzߍö}wL~R[{wRqKϔ>5̿u:yCeKϏ?qK/u/?V?M#lmD/?ծm[RO ??D?G~oqgIg'댿:~ҿ?mg>_%矸|_~?s8HߪWu|^MsC?Dkj_:ni^}aYqii~ޟkyaYieݦyyyYqeyayyާyyYqxޟiV^qw|G߻k?m)OO_~_t^1w]-u9l/|WjҿW֓spy]ߣvmcG_1~{-RQ:/_w\w/?u8U{?_Ϳ6IӞ>O_Dm'?,?_ٵIO?A?O_<K/cV&GO[O;K\=_;ma'#CCq{nO''?o[R??迏z~g[?ҿRS_i/X~JJoߏ9kC>,yyW_*}O߭t{Z +~\t?[~WWyg?k;}_/{WھYj_u~/?C_do]o_3s_??K/Y\9|W3Η9=q{w#W~s]?'?U:/߾t{o2_翴.uYtfזC;+Ko=}Z/_r,~z?o-o]w-_w.˵Cn{۫Rο[nK +N{?3{~_)ۦ??X0'[??/{>ٯ/ })DQJK>?O"]Ox|iW +?Zwۧ/??|j7~WlYvu/?SSS{O_>zO^{_'z]J?)カO{Z-kmw)5=o'z&j.?[_*ڭvm=s??GC蟮?ׯտӄ_R"W?Ͽ/?yjgWG1_c?ߙb_?R?ֿx^ی_c_?:|C''?stO>;cyw9y\w>{}[q3 +~<~߫ Zqu=>ߎ+o_'K)|Mei ?㟟OM/?8qh*t~wmw߯g_)qq{\3eO*o]sst^js=Y>+/}lK_o+Um>[g,j?dOkߴVO?g{ϑ5[{Y:㯎ߥog[CنOmW'n?;_%\?Fr#-j';WS\#O+Z쟚WyyyqX}yyzޟqXkaYniii^}aYqii~ޟii^}}??bˇ\z?ά>{P_}sr?=~ K>n Rt'i ??_Sk_??Mq|b=~ڭبi=/>~323_Ǐy☷HZ_*q=Q{~-|?֯_#ſ?矜,?֟Z?'}Oo߮n]Tjj_??I?=~mrg]}ekvw1~ۥ¯knk;^9d/c}ߑW_׃:n}yO|=_m/_z}+_?~Lx?ע~k翺~o{Kk{J9>myۛ<~2xCO??nG/)4^-_GgߑWOWc?SCS3*e?՟= ~e;<)SvWw0t|/'O_7{?޿}??]ϭO׿[_??Gv?CجCk?[_չο&[{󒂓C!hXBEv2[ɸlz֎$ _ю:}\__#g=_q?V$oܿu???ۥ?lGXzk×?mOZIzN43mu?g_O??ujնi?RkROh_SӲ_*{?)__𷍿\{ϸ,s۷9oo{_LJiۧyx?^o7˲uO4o~\x.?矽mώ/q)4ö=Y/YhxtZ~.˱M=r/K;#?Goy?rk{//߿<~iT_Z#]_ƿ{׳/_n?%"}?"iOHӆ/=GO5g?V_m/_?? ѿds*G8#y?m?Wv۶'W_Rq븿^_ڿe9W|KR8Y+ҿ'[-gc vg>;?[_ +tQW_o]qW'?c\QKߣ?goe?g=-ؿs)?ퟞuǫCn?^m?_?LgϭO?O?Ws?C??a?-ߍߴ~s]|;B{)?m[sN!ꓼ_s/?Kƿ>e_<<|5)??뿇ڥR{\Yo/}H?)ù_ԢCky?RʞƽR??n{JaWV]Ww_u_K_n7}/?𞗒ڒ?o)ac?o?ҟk_K?yϿӅa{srn;{f=9pz?5AK??[g~ %^qĿOROO4RYKSrY?{?!?O_?C?_MOSӚ=7=ݻn=?/{?.\$aK{CCW_{?-_溒⯙ e^y=ξ߷?oM~nKϭyY'>O]F/]W絑[˜m6?ӎ'K_s>KH5ss\^c|?5<#M;dWv??R?,GOGOUgݾ??"_ 㯹k̟?ע,I^_/5Z)4o?O}.4A_Rv?Cm-j?Zտ{ZR_o'u]'5?mqsmfc?^j)uۗ~k7]j\X ӟ?Yw:^z}i8ɗi9mk?:__}C~-u9[~s{]:Ͻiϟ}_z9Wֿ_6??G-?͵K91pqcƎ_e%7KOj/}};P]:qh YZ-?K)Kͭy)׿v6]}v?y?S?:Xfu?ag9DkqBSOW߀I|{?n>;7a߮8?kߺ/Xte\ukߪmӯu~z}~m/_ܿ _ECI2C-o~KY/_ch<Ytі)?ව2sq-mϟ/[z}Gc|SCSS)7[rpY}g'/u{^qRzeyO̿v>-K//ߺ'srYMle+#|ۭIPf_K_iC/_D'o-o=e9t>?Mei ?o?s8l4?W.wGZz~[s?l]&^?Eҟ?zCқʻ#iOw}Zck/zY"]?mmI뗶9W'?_jV#O۲~}OO?rۣ6O+_Jyi_)߀kÇпW/}?5~oYvi9|诙U?qOî_>o;>mko}'S_i^/9[ݯϴJ_׆o +mOw<޽߷[1~֗eu㿑n/wDm??-k79Kr/=GOynU_;OzDkCӟq[ֽҏ˦?EGgwu?'ߪ?-*j?ogWX, [_j^W}<7y@gk?fY#5?{XgO_O'u]w(8itoGjag?_>?Ϯ߶O?,aNQe9/㿞wا~ܿF~m{KeX2{?LI~qض_Yn_}?Կ[ooYơ϶|6c׶?z?;G#?7;naX{~~no<]O~~߷ n|=V\by!ơ_?/?ߥI.7{R +kYSSK㿥{<okĿJ>_8lkxWwz{ +~\.=!~/=o׿LYS[;ڜ?t_9D_sR["`gC?O?S7m.ii8GsMw){<[gUrΟ)W3?Dz8K{_>WH?J^ieyayiiyz}qXmyyyqX}yy}yyyo;~Kϧ?פvk߂oi߭JyU/O{ge#{ߒ-c.X#"_?sGwFos'??;?%_} ]_ԶW׮C'oS[nga̿wXN;Jv{?n7c~[SvSW'?O_{}KJ?u_J}I|J',?? ׆/Cuu8'-iob?okNӞ[ +?ovm??_ +?%Q5/Ϗ׶}xO}[yR6=7G42'/]_A?y?moe,m_ym϶xO_%s58GKo忒οZOj·.un_oY?cMܟLO׿~'_:1[pEO,v~˯5vxϓ??؎goO}ؿ-agC?l?c˿]GiWfoGo]["?og;l:O'G!RGZGkOvߦsϏKv|߾?e×+??:<χ_oi2?΁Oq+)Y!G:[ߺ읷[h܃[.=??1=}[[C[W}ۯߍ 7/߇R/_sϺ?dGymV2??MI?^~՝cVW";GӖue |c|?5<#M;dWv??od=~'??Ϻ}?vREGG׻s/W_sז? ???AEYaG%RS¯O4o_kI{Z94Ö׿6[O,翬R6Xg}]Gk_>AڮO_ѬO-?uT!W {XnYO[[}[o5uwt8[u]Gjag?_V}:mckm?>s gmo*G=oZ[x~Ygm+ofr~ퟙǫm?_o-?[.g˿_??یYu/m'_,{?acgX{]_\+v_8S +vÍ߿Cq߷X9_2x)οF5sV4U*{O֯5i׻t_\u{\k/}H?)ùv?_9GkseI_~K3)a ??ۦvVk/,Z4s5=?K??_V?m;_wInwsyZz8}?[+^:ٟ_"_"qyyqX}YyYyZkY}qXmyyyqX}YyYy}yyyo1}>,_bnG=N>c9|r~9}>:{3kܽ?)??}|̯=Cl?W +~\oxRox{<^[)'j ׯד9G-X?mc?tY'}^W?Y? +wodr>zK^}RRR7Ưv?m#ֿh_{gFi9?V?Ǐֿ߲n]TK=]|_)_S5m/CZ_\<^Z>iۧyx?^Ɨjk#>ךi޶ߧ9*?zsd!=ߑuӿH~Xg__V]# ?נv習?M{ ?|ۖ%Y;sw?ڟ{t/gHx׭r?KߓO[-GCY>pR\iw%~[#ߺm;?R??S g?R?ok[ws'O?WSgM'mt=i5_K?..Vyzv{?η6?s?_?Eҟ?y/RI?IϤGg]g!m?mm;MsO[m>I?K?J?i??-^\ >50)> ?}0>|{?n>k*lWk]Wr{Ze}69lw!_o=ߧU|^{_tכ?{C?e4R R_L/e7U%/'>7_%__?/oܗ?qv[eܵ2߮:a蟮?񯮄3'~㕪SV#VϿ/?^rkR߾cфR~Im¿~ߙ?~ ?|/??7OɿϿEWwoGjag?>?eG!???ocYEf/q)e9g?=G>O)?׿g˞v/Rsu__O?OaOu민G>?_gѿm'?/x-rY=sߵwo ?߂xW2a#WߍC~^ +~no߷K]n>צOͧKy8_a۾=j=?xmޟ)믽}jWus矣ROyR]???ۦ}Xnն엟j׶ivOSKa`?#?k8u_Kߊ϶ ?O~>/wLJy$G[o۫Ov:>G!mW?5ow?L4/>,8L4O4?5͏?,4òn<<Ӽ,8ò<0]絁K 6'/?AIW_{;K׮:6|>~yRs+?K߫?eI^9_Ws׮QoV6#߯|?ZMoK(pڻ].]r?ʟ_Os]_Lo*vů_i?'?CׯSIMG6|_u/?_?bC'k??K?[Ŀu'/[%Gv^㿱A+o#c'wֿ-%.߶ov!8ſ߽?^'wʿ^W߷ϭ??uk=__R/a,?{x߷o}<|U/'ݽ?^-??Oݏ-?[?ǫ?M5R_Ϳ/Hj=+m?5e?:S_\c]QWN7^/m? ,vu}i.J+{ZKq=;+ ?ן*_×Zѿvo_u_:޽߷[u/_Z忬[{^J^3kKG!{yNGGo?cMHs>~RI׃/-s?N>>-uu|OGc-oY'my~?I?5?[ѰKg-O_gUM]_'?u?Rk5=OOkXƗnw/m=~gsO?/)W/uyg^)~8UJf7;{/;rCk~>5v7{Uq_[/?e=p>5׿v_t_?_FnZ.scC'N;Ŀ/Y'?,"Owvύ_si:{zԜt5;>]DZKyԲ=G{O?Vu.?_M/w_-~3~__'a{i~~j)kӼ<ךQc}ӦwECmIG]aK󟶬-EC;pkUFiKJtuwt8[u]Gjag?y_vmSo_ iGOwqYBci=&NgM?Zz_\c]QcN?<Ɵ?gM/_?jΗ=Wp?V'?_?XG;vߦsϏKv|IXg>_:˽rχע[]-v{wkw[eRCu}w_չo1ǟn_?p<4?[%]_xϟ~]Xc]ץwM_.u?\wo yosGϓ`Z5w쯎t5Ϻ϶6՝9%OUqZz8k5㟭vm4ͭ?/ZkZז?~_oH;~'_bç/;?CIt8.~O?)99Οov<=}l_Y~2/??__?v_76/p{DZ;×ߤ/?/G)BuYdǡ-eiuls./7t>{\wCs_?sWZOH{cw=[? M GG?|_Q'?Aq'lnm{ί<`O?׿r}sדWuO~.mT[q2=%@Cokο9ڏ/ٻvg)~RtZe+g^?>_G[wC!y߷<=jzoQqrcG>NMOk?ogsϾ}?Ϳ~ymKףE[_?i3s,K~zt/矮g6u민g["o'C_.m=+:P]???mG 8~}W$6-Km_\i;oww{Y???Ka!Io7+RI?IQiYg6gEg'v?߶g%__۫[C?o5??-ʍo?+I|ǯ C{wo_οՊs2efWW7hOy,?]Y#/[?~w~JO?o{3nv>+Y_=_ʿ+]?9x~nY_?[/F>ӯߺ˟?[/_nK?Ϻ?V?m]GOo)[I?/ߵ?˳kN=kןч_a]4o}my ?|_s+GOhcY>5)y'Ưgӏר?!ak=KJ?Wtuwߢmӕ-????'OoDzwo8q{oG帿~:z?}cRq_BW;צ_/eϾ=OczZO>j2'?[a~^~g??'MoSnYڮq8e>_?>ی_c_?:|C''?stO>;cyw9y\w>{}[q3 +~<~߫ Zqu=>ߎ+o_'K)|Mei ?㟟OM/?8qh*t~wmw߯g_)qq{\3eO*o]sst^js=Y>+/}lK_o+Um>[g,j?dOkߴVO?g{ϑ5[{Y:㯎ߥog[CنOmW'n?;_%\?Fr#-j';WS\#O+Z쟚WyyyqX}yyzޟqXkaYniii^}aYqii~ޟii^}}rC\}?9;oG?פvë/]̝ko? >}?<)|9ڟU$h?\^?tkfG(e???o^G_ >ŷwuKWݿ.?.zKO㇧|./gz^eRA)ѿ#_tE/vϺ?vRE???O%ǿ?ߺ-?|#;o??IG;_j?OjGoH7k^[;I_?O߫[s֟?:㵞_oo֏sT)0~?R~Rs{c?GZп>K>*{v_ߓw?'?j?kUٟc&N/__o?k e~nKЯx(+['ci?myk?m϶Rw~;?:>4}_={N\ωOK__/ۭ:L/o_V-]=/%%#=N< +Raos&[?_?)?֎$ g ?:voz?sk'k?#`?϶@VKno?_O-h?/G&?v_u?.үC:~K5Kc5{Dn~?hn> ׆\d}/_?9?[[v W{]r7?[[{󒂓^sόÞ_FgGkmko{;#p ϏK迴KB_$)-}}_=OSzH~z+>:??_Z,e֝-Kϭ??5ߺ 'u_#ſ_?z]g??bԿ??'׆0^~0qt*kO +?E{{<>k_}_G]}m?M_o>IɯϪ6ʿv]__ECC-u/s4ԯՏro{KeY՟s wCkO??nG/)4^-_GgߑWOWc|G[Gm_?mw߽!_Rq>9|uRq_BW;צ_/eϾ=OczZO>j2'?[~ʯeɯ?-?=럓n?uh_o]϶|6c׶?z?;G#?7;naX{~~no<]O~~߷ n|=V\by!ơ_?/?ߥI.7{R +kYSSK㿥{<okĿJ>_8lkxWwz{ +~\.=!~/=o׿LYS[;ڜ?t_9D_sR["`gC?O?S7m.ii8GsMw){<[gUrΟ)W3?Dz8K{_>WH?J^ieyayiiyz}qXmyyyqX}yy}yyyo?X!i6|53+/:Wu~ܳ?O-us羏{o$7nIo_;/הm?u|an?;s?;_ǟv.6j|O{2ߌLc8-?%ʿ?nn=瞯'.i-F?FuHonO:G'?ϟϽrI_6.~+ag'՟Z쟚ҟO_>zYgm_Y;];]_n?+_s_K_^_9=s??GC诟^R~k῏Gv/7?{'ƯegӏO[-?C_kk=KJ?Wtuwߢmӕ-??ПGJi?okxu'sk?_2~~>O +]- ;'?]{?}eK/m_;}zresu__OO6ss/_yCm϶inOP?6Pڶ֧?Gu%޼ा?-:P]???mG}|g:~2n??G?|/z㟹鿎߫?HY׾UC2?o]cϢvO?v>ֿO[޿ӯ4kgaLg]g?GmWuGO?'?C?T?W? \ No newline at end of file diff --git a/client/hardnested/tables/bitflip_0_0f3_states.bin.z b/client/hardnested/tables/bitflip_0_0f3_states.bin.z new file mode 100644 index 00000000..8f783f78 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0f3_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0f5_states.bin.z b/client/hardnested/tables/bitflip_0_0f5_states.bin.z new file mode 100644 index 00000000..aa13d9a1 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0f5_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0f7_states.bin.z b/client/hardnested/tables/bitflip_0_0f7_states.bin.z new file mode 100644 index 00000000..6d19ae6a Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0f7_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0f9_states.bin.z b/client/hardnested/tables/bitflip_0_0f9_states.bin.z new file mode 100644 index 00000000..2606b940 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0f9_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0fb_states.bin.z b/client/hardnested/tables/bitflip_0_0fb_states.bin.z new file mode 100644 index 00000000..b263f23a Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0fb_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0fd_states.bin.z b/client/hardnested/tables/bitflip_0_0fd_states.bin.z new file mode 100644 index 00000000..68b581ee Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0fd_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_0ff_states.bin.z b/client/hardnested/tables/bitflip_0_0ff_states.bin.z new file mode 100644 index 00000000..f73f50d8 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_0ff_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_104_states.bin.z b/client/hardnested/tables/bitflip_0_104_states.bin.z new file mode 100644 index 00000000..a65adef0 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_104_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_10c_states.bin.z b/client/hardnested/tables/bitflip_0_10c_states.bin.z new file mode 100644 index 00000000..f9cb945e Binary files /dev/null and b/client/hardnested/tables/bitflip_0_10c_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_111_states.bin.z b/client/hardnested/tables/bitflip_0_111_states.bin.z new file mode 100644 index 00000000..10cbb8de Binary files /dev/null and b/client/hardnested/tables/bitflip_0_111_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_113_states.bin.z b/client/hardnested/tables/bitflip_0_113_states.bin.z new file mode 100644 index 00000000..b350136d Binary files /dev/null and b/client/hardnested/tables/bitflip_0_113_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_115_states.bin.z b/client/hardnested/tables/bitflip_0_115_states.bin.z new file mode 100644 index 00000000..c6661ae8 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_115_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_117_states.bin.z b/client/hardnested/tables/bitflip_0_117_states.bin.z new file mode 100644 index 00000000..647feb09 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_117_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_119_states.bin.z b/client/hardnested/tables/bitflip_0_119_states.bin.z new file mode 100644 index 00000000..289598b1 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_119_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_11b_states.bin.z b/client/hardnested/tables/bitflip_0_11b_states.bin.z new file mode 100644 index 00000000..099dab12 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_11b_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_11d_states.bin.z b/client/hardnested/tables/bitflip_0_11d_states.bin.z new file mode 100644 index 00000000..3d9511d8 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_11d_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_11f_states.bin.z b/client/hardnested/tables/bitflip_0_11f_states.bin.z new file mode 100644 index 00000000..bb92ebe2 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_11f_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_124_states.bin.z b/client/hardnested/tables/bitflip_0_124_states.bin.z new file mode 100644 index 00000000..0a37cc5c Binary files /dev/null and b/client/hardnested/tables/bitflip_0_124_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_12c_states.bin.z b/client/hardnested/tables/bitflip_0_12c_states.bin.z new file mode 100644 index 00000000..ce9a966f Binary files /dev/null and b/client/hardnested/tables/bitflip_0_12c_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_131_states.bin.z b/client/hardnested/tables/bitflip_0_131_states.bin.z new file mode 100644 index 00000000..6928656f Binary files /dev/null and b/client/hardnested/tables/bitflip_0_131_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_133_states.bin.z b/client/hardnested/tables/bitflip_0_133_states.bin.z new file mode 100644 index 00000000..acdb9d97 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_133_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_135_states.bin.z b/client/hardnested/tables/bitflip_0_135_states.bin.z new file mode 100644 index 00000000..8ae5ed32 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_135_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_137_states.bin.z b/client/hardnested/tables/bitflip_0_137_states.bin.z new file mode 100644 index 00000000..73202f11 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_137_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_139_states.bin.z b/client/hardnested/tables/bitflip_0_139_states.bin.z new file mode 100644 index 00000000..e4394636 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_139_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_13b_states.bin.z b/client/hardnested/tables/bitflip_0_13b_states.bin.z new file mode 100644 index 00000000..742c3309 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_13b_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_13d_states.bin.z b/client/hardnested/tables/bitflip_0_13d_states.bin.z new file mode 100644 index 00000000..4b95e1ca Binary files /dev/null and b/client/hardnested/tables/bitflip_0_13d_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_13f_states.bin.z b/client/hardnested/tables/bitflip_0_13f_states.bin.z new file mode 100644 index 00000000..469361ed Binary files /dev/null and b/client/hardnested/tables/bitflip_0_13f_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_141_states.bin.z b/client/hardnested/tables/bitflip_0_141_states.bin.z new file mode 100644 index 00000000..61746bf7 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_141_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_143_states.bin.z b/client/hardnested/tables/bitflip_0_143_states.bin.z new file mode 100644 index 00000000..685cf9d0 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_143_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_145_states.bin.z b/client/hardnested/tables/bitflip_0_145_states.bin.z new file mode 100644 index 00000000..eab4935d Binary files /dev/null and b/client/hardnested/tables/bitflip_0_145_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_147_states.bin.z b/client/hardnested/tables/bitflip_0_147_states.bin.z new file mode 100644 index 00000000..4d667440 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_147_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_149_states.bin.z b/client/hardnested/tables/bitflip_0_149_states.bin.z new file mode 100644 index 00000000..b9da604a Binary files /dev/null and b/client/hardnested/tables/bitflip_0_149_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_14b_states.bin.z b/client/hardnested/tables/bitflip_0_14b_states.bin.z new file mode 100644 index 00000000..60833784 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_14b_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_14d_states.bin.z b/client/hardnested/tables/bitflip_0_14d_states.bin.z new file mode 100644 index 00000000..fd8e9285 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_14d_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_14f_states.bin.z b/client/hardnested/tables/bitflip_0_14f_states.bin.z new file mode 100644 index 00000000..f8af0a6f Binary files /dev/null and b/client/hardnested/tables/bitflip_0_14f_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_150_states.bin.z b/client/hardnested/tables/bitflip_0_150_states.bin.z new file mode 100644 index 00000000..587807ef Binary files /dev/null and b/client/hardnested/tables/bitflip_0_150_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_154_states.bin.z b/client/hardnested/tables/bitflip_0_154_states.bin.z new file mode 100644 index 00000000..56cb4f16 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_154_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_15c_states.bin.z b/client/hardnested/tables/bitflip_0_15c_states.bin.z new file mode 100644 index 00000000..4eb48785 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_15c_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_161_states.bin.z b/client/hardnested/tables/bitflip_0_161_states.bin.z new file mode 100644 index 00000000..ef9f67c0 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_161_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_163_states.bin.z b/client/hardnested/tables/bitflip_0_163_states.bin.z new file mode 100644 index 00000000..f08b3e0f Binary files /dev/null and b/client/hardnested/tables/bitflip_0_163_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_165_states.bin.z b/client/hardnested/tables/bitflip_0_165_states.bin.z new file mode 100644 index 00000000..9e846f20 --- /dev/null +++ b/client/hardnested/tables/bitflip_0_165_states.bin.z @@ -0,0 +1,31 @@ +x흍젮H+UtHhe @( G{fg21?wNw^~i9\޾ݲ~yw~~?,G5m4o-Kyi>߻/0/gyOu76vog}r/K~_?c~S׏S]~Kˏi]nK?,ztY~^]G~}GkVgGC_eE? >oĿ>wo~_94>#,#_ο6߾~?bRkZm'??Ϻ?vRWV'_B??矬ާ_Ҷ9?qvcc'rNA{o{oqo~K~<>??Ϗ~??~<>\/x4> '[׿c{yp`ei _[/n|?y]C}t4^z_!Rݽ?* HofWӜޗw}vuC~~?ߏ ~y4m8gݝh[/%Ofz?mmj{㟯%_^?G#>!߻4_;M{w:yӼޭw2ݺz<ޭwy??-wݺNwޭ4wݲL4{,ޭ4{7]l^?{zϷϯ~<'\?_ w?YX/[ 9_IK6,wuI^oe{'A#!e_Uߎ?=?9sSP?mw=c۬n/zǨjG_j䟽%NgOQqSFÿ?F?۫#C-G=Fs>dzOSߒ9WiAOlyzR)w/Y|g)_??>yJ?6Ӝ4sǐdߺ=7wSחKƧ-?۶[?{<ՏϱG~ i?m?=ߎiyߟ={tk=~z?ϧߎǯzo^?$_C +{]-WP9W{a??U/I/["{{~F=_v7m/?楦b?)_o[?o?2oϟ?O򿠿&'yg6ϿuϞ\__?s^ҟל 8GmOYԯOG'ƩƿWG/?u?o?v_-{}?#W7N'_7_fS??_O׷izx)>Er'i|_Ck?|:?^Rc~.{_^?qqw13_ >=J_}n׶k/yq>5׿vֿ?M!?-.)?\:/[?qm=#"όݣOyw%ϯ{?_>ewH_Wf_?7OOZi>GOUgݿ??#_7ccky_[KfywRޥYqU?//{Y4Zss_9Y{w#ywSt;_=g'k\6~/??c/گgO!{nYR?oz':?_GIߺCmg_z?GGGYa?o'Gc&xߍ_KcR~O?sO_/Y?2Ʊ,q?so''?E=qW4}tx~w"9?^>}E5<[gޏz߮o_Ou{3Jc_Y8<οw}翭Et}K_罿?vau_~3??CQum?#i6H\g,Yg?5X^L:zϮGOdDmeS-o'Wj?-K?{[W'[ou$ןƗ>>yiwW%?~ w CmOmO?z߂ ~gn.?ZbtGkӞ󟖿A׽7~\/{??e?oY> nkys}_yy=^W]=wo=_R_??ew_U.߻׵߂?_[-y׿um{!<7,K_WOgWk_{oMQ?v=֟c۶ >?~z~Ŀv$ ߇|Yf.s^mKW_cm{[v~:u=ϰ~at8߮Cut_u1?bgԿҮ>IگCiof!?/G[oOC__U{_kw}?{,{ە}R?R??>Ow@Oo6_]m?m?8IKn?}~<s,/'׿$~g?WvU_˿Ox|I[ԿjgmOsw˶WPOm__ο6IӞ?S=o쿈OO.[%'Zڦ]82O?s|P~Y\y;=o9Yw \9aqۤ?Pd4WiGulZ/gGE??o?v_}?OBD'KOi_ߪi7cYݞc<&ʹzgC+?ίO/}~ovi9|[U[Ws##~?}ߺv_8߹O:?gK7sWُ̽n3-?n|Ɵ_oۇ2,uk5{~7'忬C> o?1smoǿ~?o=F?o_R_/_7%?v??]xo1[8/+ʩu9?'r??gj9iC3f|[_Ǒh]Lw-_i?_ӿ߼!ğ??!^:8_+oT])?mOH??>Il_?o_Ưk~~<7? +mR{OG>'O:>Ku[x}|E?)%o]_;g*gz|5Gu_/m??k=_q/vm>?aG?{畏*lM޿~|s?~' _^ ?o?j#š?)+:9}K\RWy鿮}pS-߲~3y'?=^>g*7{5;J9R#wG\3;Io]`o'_Y]mw?o;۶EϪ:C/g?dw\i4mO|ky9kK?bϒ'NzG[cٶۆOW^zj$t7׏[#o;OZW!R_#7wޭ4{ݺNw-w2ݲx7O<ޭwy??-wݺNwޭ4{ݲx,<-w:M4{WzJK<|y7>׬?t>RCuom?4|cgXךtwgwƗ?>bmş?so_R}>w_\O^ <߽?:tůο$>~U?~Mxu-oGz{]?ӗ͵Hm_ZW#|jy,1Cm7Gsߴ,r?uR%_-Xߕ홻=w_2O[C>wl_#[tuj/{$u׵t_{#'Ϫe< wY-? _ouݙ˒wwjύf^Sݙ׿6k]O~ol?3_Qg}=Gk,_vIkiK1/+G?_ymݱ1O[*Y6_#_go]u63^H??]ut~v?;W?O?M]?{oG7//K~gkM}\v4~W78 ?o9:|<~(~X%_S8>)O_}uSc\Yޝo~Y~~Ϳw}?]~me>G2m?o=9Ǧ:]y?]kGn/_{7#i_?Yyw'361gGqo)g#mlǿZ?3l}}G&O'$'׎oyݺNwޭ4wݲL4{ޭ4Owwޭ߯wݲxw:ݺz,<-w:M4{W_?C?w'/> cX~ɧ~ %߽?:? ZR^GII?Ui>@fS +~`S6ߺ =ޫ`m?\_"_¿O]|/_뿢zhۥ??Es/]u{~?vi_'[G՛|=G%5|iKJ|ik?mn_ֿk>t˲^?Xm?]Yt+}|nJ/Y-? _K\E0?}}e9]8}vRח_/=>]z7L RSp:=mcS,?3_Qg}=Gk,_^JZT6㯽}~{eSʿ߾O<~tʿ"~>o[w şG/~_[c!?>aޱYfG)IR.|s_??DwC=W9?lo{'?Χn} [Co͟'O򿠿&gwG?ߖ=ߪ_EfοpZ|X>?ߢvO?濟#kH#qO/??v?ƿ꿎'?+bIGl_ai|X 8_f_z||3|5|`_[q~~~M?}˒^ocwzk|?~|K׏uߙ/tǰ_oZǟ_?{},/}??ד?-IO }s)T~n}J!_jR'S_WoK}WKub_+-.c| 9}G_ο?qO?6_m^_+O'[b ׏'uy_oOϓOxO>GA|Om{,[8~]u/Wo]op?ǓG_y{Wkֿ}3NI_/_O5//'-#?g=9?m??aG?| {?mY=+W1 i>]}~|FO֟دh&K\RWy鿮}pԖoYs +X?{woڃwW_}>g*7rG~gkw<ߺc2Ongo???-ӿ䟽/q]'K?w?]][o?_w7?R϶G6|lǿZ?^WK3=>g{'o#~R׺JowO+žn];unY[ifŻyin]λunY[un];ŻeinY[inٻo% =~^ro㏟_߯xOm/H/JOt{q?o}MxgWT߻$ho?\yl_ƿG%e???=SFUR?JkW_u[O;{ȟV[_\Lw(?_Ϳ6IӞ_P _<_wmG6O/ؖ=6Y+ÿdzOSߒ9WiAOlyzR)w/Y|g)_??>yJ?6Ӝ4sǐdߺ=7wSחKƧ-?۶[?{<ՏϱG~ i?m?=ߎiyߟ={tk=~z?ϧߎǯzo^?$_C +{]-WP9W{a??U/I/["{{~F=_v7m/?楦b?)_o[?o?2oϟ?O򿠿&'yg6ϿuϞ\__?s^ҟל 8GmOYԯOG'ƩƿWG/?u?o?v_-{}?#W7N'_7_fS??_O׷izx)>Er'i|_Ck?|:?^Rc~.{_^?qqw13_ >=J_}n׶k/yq>5׿vֿ?M!?-.)?\:/[?qm=#"όݣOyw%ϯ{?_>ewH_Wf_?7OOZi>GOUgݿ??#_7ccky_[KfywRޥYqU?//{Y4Zss_9Y{w#ywSt;_=g'k\6~/??c/گgO!{nYR?oz':?_GIߺCmg_z?GGGYa?o'Gc&xߍ_KcR~O?sO_/Y?2Ʊ,q?so''?E=qW4}tx~w"9?^>}E5<[gޏz߮o_Ou{3Jc_Y8<οw}翭Et}K_罿?vau_~3??CQum?#i6H\g,Yg?5X^L:zϮGOdDmeS-o'Wj?-K?{[W'[ou$ןƗ>>yiwW%?~ w CmOmO?z߂ ~gn.?ZbtGkӞ󟖿A׽7~\/{??e?oY> nkys}_yy=^W]=wo=_R_??ew_U.߻׵߂?_[-y׿um{!<7,K_WOgWk_{oMQ?v=֟c۶ >?~z~Ŀv$ ߇|Yf.s^mKW_cm{[v~:u=ϰ~at8߮Cut_u1?bgԿҮ>IگCiof!?/G[oOC__U{_kw}?{,{ە}R?R??>Ow@Oo6_]m?m?8IKn?}~<s,/'׿$~g?WvU_˿Ox|I[ԿjgmOsw˶WPOm__ο6IӞ?S=o쿈OO.[%'Zڦ]82O?s|P~Y\y;=o9Yw \9aqۤ?Pd4WiGulZ/gGE??o?v_}?OBD'KOi_ߪi7cYݞc<&ʹzgC+?ίO/}~ovi9|[U[Ws##~?}ߺv_8߹O:?gK7sWُ̽n3-?n|Ɵ_oۇ2,uk5{~7'忬C> o?1smoǿ~?o=F?o_R_/_7%?v??]xo1[8/+ʩu9?'r??gj9iC3f|[_Ǒh]Lw-_i?_ӿ߼!ğ??!^:8_+oT])?mOH??>Il_?o_Ưk~~<7? +mR{OG>'O:>Ku[x}|E?)%o]_;g*gz|5Gu_/m??k=_q/vm>?aG?{畏*lM޿~|s?~' _^ ?o?j#š?)+:9}K\RWy鿮}pS-߲~3y'?=^>g*7{5;J9R#wG\3;Io]`o'_Y]mw?o;۶EϪ:C/g?dw\i4mO|ky9kK?bϒ'NzG[cٶۆOW^zj$t7׏[#o;OZW!R_#7wޭ4{ݺNw-w2ݲx7O<ޭwy??-wݺNwޭ4{ݲx,<-w:M4{W~!![Oxޫ@mI?m)O wi__?nDz?޽jRj{W?XL;g?X1~W|?ʿYG_Mi +?_;~鮿wz{?)~AakmH׆cE/rϺ?vG???OQf?e^S=?|uowoJ6O??H_~__rߓǨGo{o??ǨnOyקx?O[#>Y?*>??Z~~7xW ?O?5^ +?c% }OW,?o{R?Oo̿[w/q|?O~ eKgᅴ9ho7yyYGQ??-OS4w~_ۑU?_/_ZO-_?>j2?_}~1#jW5/)eYyRYҺ-e¼|^מCac?[/???]mGsIׄ/=s=kKGw[c5?5?-B?|Hd8~N?#g#'ne}oW??Ʃ/?쿶q뉶Ͽ׹.n~~mkѿ~)O:OU_&_{_]?q^] >ք>5I_S_ZW󒂓\gmoό%?}M-or1[~BzK_O?%bRK_#/Eyٟg_)3sczn/_y>ϧ#}XJ?o=Ϯe~?u??zgw?6|5WU}W8<:Puץo~EeI^}O:~zMK#km)5cĿo{'Z__TUw[}/_g_? ca|w[R1M5+J#<[_RsMRkU߻Wxi6_צ$,q +'?Z_gK#>6_-?_>?u?#_Mu'mz}z_?¿zu͏_vu=/ot~k_rԽZw?ߊW_^g[¿_^ߗ_%ϻz|5?5_׾ϻabٶ>k[bgg1C??~^X?˫b4>/<[Va?]è6?2Q_mBc7 ?,O{Z_~ '?5_-Ng?w}_{~?isrW_c4/?r;/=?S?^[4/r>ߵ?&Vm_???LWC|um6.H9G?W}z#,īo?mmَ gz|NbHG?#du)'?W5oϋ}yݺNwޭ4{ݲx,<-w4ݺzwݲx,ޭ4{ݺNw-w2ݲx4OweJ~˗X>_>?Jd㟎_k>@mml>$m[¿7]t/Gkmo]COg_'ߝR}oǟV(zOW~_~N眷|HO3R+s;k[|zn?}Oֿ};f]G?wkiP\׾%m_ےO=cc?3׆u^۹pWח +/܊nK'v˒tK%ZO_37F:!^lI_+_Ka[}/_z}G}>EC{?}?Ҭ?Wo}yG=_?׭\ +Y>m~KOCk_8?yxcRIOӖG?ᇟ/П[f׵6o޷ /ݯxuuܽ~Jw?wcIk?nwE6yMϴ_7R_V?]ח_/m?#r?׶\>տ~s}+ռ>?[t"??o???z#ߙΟ_^Am_gWu?wk? 8oU9C:38o]ϢvO?v1ֿ#kH#qOt:ڧWo?m'n?OߢW]__'_;_?'?__S(_xlYr_-+V j>?סv;O#yq߃txY7\,y}>6y{?oxo,7>{ϻ_?Y7.!U׿^W/?h?){wZZ?s7+~iNxMu??C?xݺ!??}[_tnGӶNg4m?bϒ'K3~=R϶G6َgS?/Fc?[#M?OH]O&zλuf[i^Wջein][if;[ן_Żen];uջunYy[uil[o~ W=?~.KRKm׬t{q}׭MxgWT߻$j7c2=2/ժoGCws?wȿ_s?9[m?S6Z;_mo7C@?c?/I^3??V??8 +#_SOASova!ؖ#?_?oIdi?O]Yl'|<=~Ox);,M>]yJ/uձ~Z?u?o=/˟8޻ߞ|s>7Rk5ռH8__?tgos-I6{o|ޞgѧ;\cj|߲;g+[W3'OOѴt_{#'Ϫe< wY-? __rܻt})8V—ֿ=YN^,O^-׬k;;Mfc߳O{GOO~svǂEKjq?W[['_i])7#_go]u63^H??/=O#7]\ףvUK~ i<ƿW1?{)z?ϧߎ빧{,Uzo^??[K?mq_8J9??aG?v?o_Ou+|^<^ +tzy/]_K>xJJϢ_]-y3_=oKgeR?RпU{=WZ1i,A[Imk߻VԢgk}OJߟ}OǺK??e_ ߺ6\} 4HWqǏ.3^?w,by&mo=g#'nK _"˲gnw7gWGc׌o៽+-:JK<+ ;Є6?o? 3oi_1]:ϣi_O g?=SQJC[,mv75⼹>/鼼tR.;/?ϿL ;گ*_]_koAY^I-Kռ_6=}~?y/+m3Mm}&?OmOC _~?y=O]]?ou;WZYkϏ,s3wC]6+Jv1ֿ6?O=}?nO?mgX?wy:oWT[::/:`az3_i||oiKWrW_47~?ߗ_R-S?'C!/>}}=??O=}?>)?;_?7??탿 z_z~mK?O_χ~A9UǗ_?3+osު_<R__Vg6nemba'CEjO?Vڶ/ϿJ_iC7_'o[οp]g_oOm]鿮Gc'9{x>(UG]gtgج~Nmq???8 mҟ?FC2ʫ4#`I?IߍR:~]o]b?m7?/i>P'o!?%W״o?_,{nwE1P\x=3?וyt>?[i?>׭돎+~~o?>Fo]k}GC/'^lS_O+ߍǿrQ?7NKORC[:5=K_V ??N7߶_[_#k//GO}|?~v.csgt>Oߢ.]~UZ=NZJߣݺ]/o ϶|[Gm8z?;?#???mY^ Ϧywi>]/׷ FoBПhXǾg~g)|R+ռ‡_׾c8ԖoYs +X?{woڃўN/O}\o?~)#.i/s6G`ҿ˝m["ggeO2;kߴuiGӶT>ڵɿ׵%1gGu'^=}#-lĿm'vuS?^_x?swFm?-'vGOHw?ю{^;un];ŻeinYif;[ן_Żen];unY[ifŻufy+V[{ρ|T~ w_ Cmkz:O6şGWZtGkӞf\/{??e?oYS=y_s?9ok?Oso7C@um$_׶cA'oS[ng?y#o뵏XVNK׮GooǶ~s?oCdDA's_f<˲|g^~m!?3?k~_{-?۶?'i?\^9<6=R)s?Q?GX?{|?~wU?v忤G]韚;??NkwgOG<g<=^+3uϟ|~Rt{k?-g[ߴOC1^{|=6??{o=9?oLO_ʭO5mc'_,ۻ3;JKϟi~9]{?[?_gfqzF'Fޯ?o>?GϢGo=r:OoR#Of]??_O{&׷izx)>ﻯi{'i|_CeO_w_Z~ XRV<vnoοߣ +~o㽋߮~_gпZ_}n׶k/yq>5׿?c?}{yp`{Cѿ/|muIk?JM1zy,Kxxm,A[I??w߻.?޶c2q#]?}6wcC<oa.#^O_/?﬿_edҌ_m?_zT}#wD'_O}??{kɿ^n];uջunYy[Wuٻu;׻enY[iλuun][ifŻufy+VPݟ—~|sz,?w Oi|zxmCWB-}Ə#Kz4OsXW )~|)?omo^?~UO06?~./_/_ZR׮>/]_=_?u?" : ;4-_i|]R4%TͿd5ן|~[O_SCo׵t_{p~FeYZ_uoLsDG{Qu.?,d_zMsu>oL[זRY?AEp%waײ?.؏>_]_|rį¿_ߏY.=jύ?독y?8JG׶y1?zc(|]{[#?|??/_O%_S^R>{|w2xo_~w??OiK_z?O;?R#S_?h?k{3g~_G?[]_>M?R??;??Z7~W?[OW x|P3wO?=>_>ւ>?nve}??~vy&>eI^}71ܻ_=5>??>G:̗\^:ceϯ7ϯ>>G_C$9ꌿ~*? +Sak/|/e+?I>+ߺ]1Ci[߷?9[ߡ4A?/񿞿ֿOolڟ-GuwwoEU_We>|>}}_8?{_'O?6Y/U ??^:~Rso_c+~z_~?{Y?&>K +?e_|߇SɿϿ]o<'o#^6??GVzGu͏_{+ۮkK#}~zz>V_'Ǘu/'JmnCm|ƟK??su#?o>=yc,4ǿ܏߮>?_i>} +WhOwWsc}c~g)|R+ռ‡_׾c8_|jy,9z7_;+ׯ>O}OK9R#wG\3;Io]`o'_Yi?`ҿUu_?j?︮ץiO;ǟOU-^?K?;iqo)g#m>_z/«%7h_?o)e?k]%;GGkIvbwyw:y,-4Ow&NWz~R?K?]z?^]yJ/uձ~Z?u?o=/˟8޻ߞ|s>7Rk5ռH8__?tgos-I6{o|ޞgѧ;\cj|߲;g+[W3'OOѴt_{#'Ϫe< wY-? __rܻt})8V—ֿ=YN^,O^-׬k;;Mfc߳O{GOO~svǂEKjq?W[['_i])7#_go]u63^H??/=O#7]\ףvUK~ i<ƿW1?{)z?ϧߎ빧{,Uzo^??[K?mq_8J9??aG?v?o_Ou+|^<^ +tzy/]_K>xJJϢ_]-y3_=oKgeR?RпU{=WZ1i,A[Imk߻VԢgk}OJߟ}OǺK??e_ ߺ6\} 4HWqǏ.3^?w,by&mo=g#'nK _"˲gnw7gWGc׌o៽+-:JK<+ ;Є6?o? 3oi_1]:ϣi_O g?=SQJC[,mv75⼹>/鼼tR.;/?ϿL ;گ*_]_koAY^I-Kռ_6=}~?y/+m3Mm}&?OmOC _~?y=O]]?ou;WZYkϏ,s3wC]6+Jv1ֿ6?O=}?nO?mgX?wy:oWT[::/:`az3_i||oiKWrW_47~?ߗ_R-S?'C!/>}}=??O=}?>)?;_?7??탿 z_z~mK?O_χ~A9UǗ_?3+osު_<R__Vg6nemba'CEjO?Vڶ/ϿJ_iC7_'o[οp]g_oOm]鿮Gc'9{x>(UG]gtgج~Nmq???8 mҟ?FC2ʫ4#`I?IߍR:~]o]b?m7?/i>P'o!?%W״o?_,{nwE1P\x=3?וyt>?[i?>׭돎+~~o?>Fo]k}GC/'^lS_O+ߍǿrQ?7NKORC[:5=K_V ??N7߶_[_#k//GO}|?~v.csgt>Oߢ.]~UZ=NZJߣݺ]/o ϶|[Gm8z?;?#???mY^ Ϧywi>]/׷ FoBПhXǾg~g)|R+ռ‡_׾c8ԖoYs +X?{woڃўN/O}\o?~)#.i/s6G`ҿ˝m["ggeO2;kߴuiGӶT>ڵɿ׵%1gGu'^=}#-lĿm'vuS?^_x?swFm?-'vGOHw?ю{^;un];ŻeinYif;[ן_Żen];unY[ifŻufy+V[c?'?~UO 6 6AMOǿc?ğ w_O +_}g)G[Oe{X_&CG?G? >m^_,t篏뿦~Uu^ӿit߈nuk? ϰSu׶$k1omg??ף~_Z'g2{Kߞ >??:7;b7?o%CG?/?_^o/9kc??Rn7?c?S|u}Y' Oi|2m%S4C<,ӣ(ߟ~|yiK|v{Я|}{/`}M_7gOGB)5 er|% 5sύ?^ +S5,[mլi]kӖoa^j>kOG!DZ{؟-u.?vz#9I$ k9g^5K;u-y1οpp?ߖO>qO[oOiK~tY?S'GOghFg7ղ۾׷NS?uiue_[8ZDS\w_{7w?6|_g'?]i/?o=˟]/߮}kBԿk/yII}3]϶7gFX>俦ז?K^-?!}R?/'KORs1GYy/??O"]|z<ڏp3S1=^חeK민Ss[>ogj%vugWYϲOf?П?O=x3^O_>_ݫR\+?ɏ_u}RI]'o {fLJ׿6{۔1ZϪ->ʿ~__{/ÿCMoUe&Oo}O̵*+{_=nK~o:KǷ{~:^?5/?9_}oū/^3O-NI_/l?S˯]=NZJk]~ưl_o!?????|}֟U`l{]?I~_p}ϰ.aT(/~H_ѱq|_Z犟?\'_K-|Mu ?Om/??^wƟ˻>=Oy49W߫?/߱Vc~?O?R?nOy+{ȿ߶w/?V[?{x!_㺶MO^?mJ]][o?_w7?R϶G6|lǿZ?^WK3=>g{'o#~R׺JowO+žn];unY[ifŻyin]λunY[un];ŻeinY[inٻo%?K,J ϯ C͟}mAO_W ?6zkKGoGο-_ZR׮?:G#5忶e]'/ox)>߷uCocsTMe?X/]eg +ܿs[>~$'_NKꝵiw=o_focؾʝl?#ÿ;O?u(gkxҿ~6/m?_YSkÇ_:W\E+KKϗenE]_|ץo~EeI^}O:~?jȿϿM#m/ 6kߕ->ʿ~/J>׎"=[>?i֟zv珷>׿#?ǟ.GOoyJ,6AyC/?K¿cױ?Y_)t~_GȿϿMi~GAGgvOo-_?ok7 w O~וeKj^RpR?-{:]???ko=LO/]gO6w}E~sq|i;5ϟp*wǏt?.gCmO_?I?8z:+uَcٶAg7Us[_nR'oӮ/?nIj# \ No newline at end of file diff --git a/client/hardnested/tables/bitflip_0_167_states.bin.z b/client/hardnested/tables/bitflip_0_167_states.bin.z new file mode 100644 index 00000000..8aae9133 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_167_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_169_states.bin.z b/client/hardnested/tables/bitflip_0_169_states.bin.z new file mode 100644 index 00000000..a42857b5 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_169_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_16b_states.bin.z b/client/hardnested/tables/bitflip_0_16b_states.bin.z new file mode 100644 index 00000000..426210ad Binary files /dev/null and b/client/hardnested/tables/bitflip_0_16b_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_16d_states.bin.z b/client/hardnested/tables/bitflip_0_16d_states.bin.z new file mode 100644 index 00000000..5640076f Binary files /dev/null and b/client/hardnested/tables/bitflip_0_16d_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_16f_states.bin.z b/client/hardnested/tables/bitflip_0_16f_states.bin.z new file mode 100644 index 00000000..39d0d080 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_16f_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_170_states.bin.z b/client/hardnested/tables/bitflip_0_170_states.bin.z new file mode 100644 index 00000000..f49f4d24 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_170_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_174_states.bin.z b/client/hardnested/tables/bitflip_0_174_states.bin.z new file mode 100644 index 00000000..66acfea9 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_174_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_17c_states.bin.z b/client/hardnested/tables/bitflip_0_17c_states.bin.z new file mode 100644 index 00000000..c8f72c15 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_17c_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_184_states.bin.z b/client/hardnested/tables/bitflip_0_184_states.bin.z new file mode 100644 index 00000000..caa5e8bd Binary files /dev/null and b/client/hardnested/tables/bitflip_0_184_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_18c_states.bin.z b/client/hardnested/tables/bitflip_0_18c_states.bin.z new file mode 100644 index 00000000..da5c55a2 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_18c_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_191_states.bin.z b/client/hardnested/tables/bitflip_0_191_states.bin.z new file mode 100644 index 00000000..5a4b9aef Binary files /dev/null and b/client/hardnested/tables/bitflip_0_191_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_193_states.bin.z b/client/hardnested/tables/bitflip_0_193_states.bin.z new file mode 100644 index 00000000..5f7e0b48 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_193_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_195_states.bin.z b/client/hardnested/tables/bitflip_0_195_states.bin.z new file mode 100644 index 00000000..e15df41f Binary files /dev/null and b/client/hardnested/tables/bitflip_0_195_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_197_states.bin.z b/client/hardnested/tables/bitflip_0_197_states.bin.z new file mode 100644 index 00000000..d4b5fd31 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_197_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_199_states.bin.z b/client/hardnested/tables/bitflip_0_199_states.bin.z new file mode 100644 index 00000000..9117c86d Binary files /dev/null and b/client/hardnested/tables/bitflip_0_199_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_19b_states.bin.z b/client/hardnested/tables/bitflip_0_19b_states.bin.z new file mode 100644 index 00000000..ae144de8 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_19b_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_19d_states.bin.z b/client/hardnested/tables/bitflip_0_19d_states.bin.z new file mode 100644 index 00000000..1b7f08b3 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_19d_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_19f_states.bin.z b/client/hardnested/tables/bitflip_0_19f_states.bin.z new file mode 100644 index 00000000..81ef023c Binary files /dev/null and b/client/hardnested/tables/bitflip_0_19f_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1a4_states.bin.z b/client/hardnested/tables/bitflip_0_1a4_states.bin.z new file mode 100644 index 00000000..af0f7208 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1a4_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1ac_states.bin.z b/client/hardnested/tables/bitflip_0_1ac_states.bin.z new file mode 100644 index 00000000..5b2ddbf5 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1ac_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1b1_states.bin.z b/client/hardnested/tables/bitflip_0_1b1_states.bin.z new file mode 100644 index 00000000..61ce9107 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1b1_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1b3_states.bin.z b/client/hardnested/tables/bitflip_0_1b3_states.bin.z new file mode 100644 index 00000000..3825cf8b Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1b3_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1b5_states.bin.z b/client/hardnested/tables/bitflip_0_1b5_states.bin.z new file mode 100644 index 00000000..7750ad78 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1b5_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1b7_states.bin.z b/client/hardnested/tables/bitflip_0_1b7_states.bin.z new file mode 100644 index 00000000..1663d7a5 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1b7_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1b9_states.bin.z b/client/hardnested/tables/bitflip_0_1b9_states.bin.z new file mode 100644 index 00000000..f6b102d9 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1b9_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1bb_states.bin.z b/client/hardnested/tables/bitflip_0_1bb_states.bin.z new file mode 100644 index 00000000..0e667581 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1bb_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1bd_states.bin.z b/client/hardnested/tables/bitflip_0_1bd_states.bin.z new file mode 100644 index 00000000..8e991fcb Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1bd_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1bf_states.bin.z b/client/hardnested/tables/bitflip_0_1bf_states.bin.z new file mode 100644 index 00000000..9fe373bd Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1bf_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1c1_states.bin.z b/client/hardnested/tables/bitflip_0_1c1_states.bin.z new file mode 100644 index 00000000..1d6e2df3 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1c1_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1c3_states.bin.z b/client/hardnested/tables/bitflip_0_1c3_states.bin.z new file mode 100644 index 00000000..c4784564 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1c3_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1c5_states.bin.z b/client/hardnested/tables/bitflip_0_1c5_states.bin.z new file mode 100644 index 00000000..fd67e955 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1c5_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1c9_states.bin.z b/client/hardnested/tables/bitflip_0_1c9_states.bin.z new file mode 100644 index 00000000..88ab2a96 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1c9_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1cb_states.bin.z b/client/hardnested/tables/bitflip_0_1cb_states.bin.z new file mode 100644 index 00000000..31bd47cc Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1cb_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1d0_states.bin.z b/client/hardnested/tables/bitflip_0_1d0_states.bin.z new file mode 100644 index 00000000..8ac5e409 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1d0_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1d4_states.bin.z b/client/hardnested/tables/bitflip_0_1d4_states.bin.z new file mode 100644 index 00000000..ad91ddea Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1d4_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1dc_states.bin.z b/client/hardnested/tables/bitflip_0_1dc_states.bin.z new file mode 100644 index 00000000..f5b1dbb1 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1dc_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1e1_states.bin.z b/client/hardnested/tables/bitflip_0_1e1_states.bin.z new file mode 100644 index 00000000..d475d977 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1e1_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1e3_states.bin.z b/client/hardnested/tables/bitflip_0_1e3_states.bin.z new file mode 100644 index 00000000..64884ba5 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1e3_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1e5_states.bin.z b/client/hardnested/tables/bitflip_0_1e5_states.bin.z new file mode 100644 index 00000000..cd80ef83 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1e5_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1e7_states.bin.z b/client/hardnested/tables/bitflip_0_1e7_states.bin.z new file mode 100644 index 00000000..42483bdd Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1e7_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1e9_states.bin.z b/client/hardnested/tables/bitflip_0_1e9_states.bin.z new file mode 100644 index 00000000..d133b27a Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1e9_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1eb_states.bin.z b/client/hardnested/tables/bitflip_0_1eb_states.bin.z new file mode 100644 index 00000000..7a3b347b Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1eb_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1ed_states.bin.z b/client/hardnested/tables/bitflip_0_1ed_states.bin.z new file mode 100644 index 00000000..db5d216a Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1ed_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1ef_states.bin.z b/client/hardnested/tables/bitflip_0_1ef_states.bin.z new file mode 100644 index 00000000..15eeba04 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1ef_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1f0_states.bin.z b/client/hardnested/tables/bitflip_0_1f0_states.bin.z new file mode 100644 index 00000000..fb3df75b Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1f0_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1f4_states.bin.z b/client/hardnested/tables/bitflip_0_1f4_states.bin.z new file mode 100644 index 00000000..fe2d56c9 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1f4_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_1fc_states.bin.z b/client/hardnested/tables/bitflip_0_1fc_states.bin.z new file mode 100644 index 00000000..791352bf Binary files /dev/null and b/client/hardnested/tables/bitflip_0_1fc_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_210_states.bin.z b/client/hardnested/tables/bitflip_0_210_states.bin.z new file mode 100644 index 00000000..479bacb0 --- /dev/null +++ b/client/hardnested/tables/bitflip_0_210_states.bin.z @@ -0,0 +1 @@ +xMnFaWtщ|5o}4Lg ObOjzߟ1$_K߿rK->ɷޥ/~}K?kxzI,t_~[?~O}־}~;nnr|_O?鷷>ޯ_OCe9w}{}zǏa<㯿KŷwKIߧn;7I?鏗O/???O/O{??O_o/_?w_w_w?_?_?oO_w_Ow_?oO_w_OwO_o/_?w_w_w?_??O_o/_?w_w_w?_??_w?_??O_o/_?w_w_Ow_?oO_wO_o/_?w_w_w?_???oO_w_Ow_w?_??O_o/_?w_w__Ow_?oO_w?oO_w_Ow_w?_??O_o/_?w_w__Ow_?oO_wO_o/_?w_w_w?_??OO_ӿO??O??ӿ/?{g{gO??o??_'{???ӿ/???oO_w_Ow_??_oO????O/o?o??Oӿo????/?o?Oӿ/?O??w?_??O_o/_?w_w__o/_?w_w_w?_??O_o/_?w_w_w?_??OoO_w_Ow_?oO_w_Ow_?_oO????O/o?o??Oӿo????/?o?Oӿ/?O???_oO????O/o?o??Oӿo????/?o?Oӿ/?O?????_'{???ӿ/???OO_ӿO??O??ӿ/?{g{gO??o??_'{???ӿ/???OO_ӿO??O??ӿ/?{g{gO??oOw_?oO_w_Ow_?oO_w_O_w_Ow_?o???O/o?o??Oӿo????/?o?Oӿ/?O???_oO?_??O_o/_?w_w_w?_'{???ӿ/???OO_ӿO??O??ӿ/?{g{gO??o??????/?o?Oӿ/?O???_oO????O/o?o??Oӿow_w_w?_??O_o/_?_w_Ow_?oOw_w_w?_??O_o/_?_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_O_w_w?_??O_o/_?w_w_Ow_?oO_??O_o/_?w_w_w?_w_w?_??O_o/_?w_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_O_w_w?_??O_o/_?w_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_O_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_Ow_w?_??O_o/_?w_w_Ow_?oO_w_Ow_?oO_??O_o/_?w_w_w?__?oO_w_Ow_w?_??O_o/_?w_w_Ow_?oO_w_?oO_w_Ow_?oO_w_Ow[ \ No newline at end of file diff --git a/client/hardnested/tables/bitflip_0_225_states.bin.z b/client/hardnested/tables/bitflip_0_225_states.bin.z new file mode 100644 index 00000000..a4cc5d58 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_225_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_227_states.bin.z b/client/hardnested/tables/bitflip_0_227_states.bin.z new file mode 100644 index 00000000..f7bb63eb Binary files /dev/null and b/client/hardnested/tables/bitflip_0_227_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_22d_states.bin.z b/client/hardnested/tables/bitflip_0_22d_states.bin.z new file mode 100644 index 00000000..4e5b2ff2 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_22d_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_22f_states.bin.z b/client/hardnested/tables/bitflip_0_22f_states.bin.z new file mode 100644 index 00000000..f8686dba Binary files /dev/null and b/client/hardnested/tables/bitflip_0_22f_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_240_states.bin.z b/client/hardnested/tables/bitflip_0_240_states.bin.z new file mode 100644 index 00000000..e4f4b6ac --- /dev/null +++ b/client/hardnested/tables/bitflip_0_240_states.bin.z @@ -0,0 +1,2 @@ +xAP ,Ձ;w!щG +! {4܆.R-W/OOo??_=?ϟݿ_??{o???o??{??_w??㏿_?w?_?ǟ?_??ǟ_??㏿??g???{??_w??㏿_?w???{o???ow??㏿_?w???{o???o??{??_?㏿??g_?ǟ?_??ǟ_??ǟ?_??ǟ_??㏿??g_㏿??g_?ǟ?_??ǟ_???w???{o???o??{??_w??㏿_??{??_w??㏿_?w???{o???o??㏿_?w???{o???o??{??_w?{o???o??{??_w??㏿_?w???㏿_?w???{o???o??{??_w???㏿_?w???{o???o??{??_w?w???{o???o??{??_w??㏿_??g_?ǟ?_??ǟ_??㏿??ǟ_??㏿??g_?ǟ?_?g_?ǟ?_??ǟ_??㏿?????o??{??_w??㏿_?w???{o?㏿_?w???{o???o??{??_w????{o???o??{??_w??㏿_?w?{??_w??㏿_?w???{o???o???{o???o??{??_w??㏿_?w????{o???o??{??_w??㏿_?w??o??{??_w??㏿_?w???{o???_w??㏿_?w???{o???o??{᏿_?w???{o???o??{??_w??㏿㏿??g_?ǟ?_??ǟ_????{o???o??{??_w??㏿_?w??_?ǟ?_??ǟ_??㏿??g?ǟ_??㏿??g_?ǟ?_??㏿??g_?ǟ?_??ǟ_᏿??g_?ǟ?_??ǟ_??㏿??{o???o??{??_w??㏿_?w?_?ǟ?_??ǟ_??㏿??g???{??_w??㏿_?w???{o???ow??㏿_?w???{o???o??{??_?㏿??g_?ǟ?_??ǟ_??ǟ?_??ǟ_??㏿??g_㏿??g_?ǟ?_??ǟ_???w???{o???o??{??_w??㏿_??{??_w??㏿_?w???{o???o??㏿_?w???{o???o??{??_w?{o???o??{??_w??㏿_?w???㏿_?w???{o???o??{??_w???㏿_?w???{o???o??{??_w?w???{o???o??{??_w??㏿_??g_?ǟ?_??ǟ_??㏿??ǟ_??㏿??g_?ǟ?_?g_?ǟ?_??ǟ_??㏿?????o??{??_w??㏿_?w???{o?㏿_?w???{o???o??{??_w????{o???o??{??_w??㏿_?w?{??_w??㏿_?w???{o???o???{o???o??{??_w??㏿_?w????{o???o??{??_w??㏿_?w??o??{??_w??㏿_?w???{o???_w??㏿_?w???{o???o??{᏿_?w???{o???o??{??_w??㏿㏿??g_?ǟ?_??ǟ_????{o???o??{??_w??㏿_?w??_?ǟ?_??ǟ_??㏿??g?ǟ_??㏿??g_?ǟ?_??㏿??g_?ǟ?_??ǟ_᏿??g_?ǟ?;m \ No newline at end of file diff --git a/client/hardnested/tables/bitflip_0_275_states.bin.z b/client/hardnested/tables/bitflip_0_275_states.bin.z new file mode 100644 index 00000000..a4cc5d58 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_275_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_277_states.bin.z b/client/hardnested/tables/bitflip_0_277_states.bin.z new file mode 100644 index 00000000..f7bb63eb Binary files /dev/null and b/client/hardnested/tables/bitflip_0_277_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_27f_states.bin.z b/client/hardnested/tables/bitflip_0_27f_states.bin.z new file mode 100644 index 00000000..f8686dba Binary files /dev/null and b/client/hardnested/tables/bitflip_0_27f_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_294_states.bin.z b/client/hardnested/tables/bitflip_0_294_states.bin.z new file mode 100644 index 00000000..c8a8cf4a --- /dev/null +++ b/client/hardnested/tables/bitflip_0_294_states.bin.z @@ -0,0 +1 @@ +xOu3io%VkLSMd9E bJ!HHK{| us~~ןO?y}\כ7t{G{s6~W.כ{vw?~>߻oϿ^珟ϝ8_uܿ?}/~]?|כ>'{߿>kO1W}|p?~==|kymo7ogߏߎ_??6ÿ?_;~o\??G??y/^yXopaߧ{tWMkQ|Xկ|G7___5~9_/ߟkϷ;/? /7?j?4[<ֽ{okOkoG7}g?W˿?o<?cϏv?:v|j?}OG_FwƯ??j񏎿vƯikۿz=}]?3n_}4^]V?O_V_/dU{uSƯn[wo]}߻u?????_?yyOkC1xwouw Ͽ7:coooo_uھ//ko;?7QW^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>} \ No newline at end of file diff --git a/client/hardnested/tables/bitflip_0_2a1_states.bin.z b/client/hardnested/tables/bitflip_0_2a1_states.bin.z new file mode 100644 index 00000000..a4cc5d58 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_2a1_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_2a3_states.bin.z b/client/hardnested/tables/bitflip_0_2a3_states.bin.z new file mode 100644 index 00000000..f7bb63eb Binary files /dev/null and b/client/hardnested/tables/bitflip_0_2a3_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_2a9_states.bin.z b/client/hardnested/tables/bitflip_0_2a9_states.bin.z new file mode 100644 index 00000000..4e5b2ff2 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_2a9_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_2ab_states.bin.z b/client/hardnested/tables/bitflip_0_2ab_states.bin.z new file mode 100644 index 00000000..f8686dba Binary files /dev/null and b/client/hardnested/tables/bitflip_0_2ab_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_2c4_states.bin.z b/client/hardnested/tables/bitflip_0_2c4_states.bin.z new file mode 100644 index 00000000..c8a8cf4a --- /dev/null +++ b/client/hardnested/tables/bitflip_0_2c4_states.bin.z @@ -0,0 +1 @@ +xOu3io%VkLSMd9E bJ!HHK{| us~~ןO?y}\כ7t{G{s6~W.כ{vw?~>߻oϿ^珟ϝ8_uܿ?}/~]?|כ>'{߿>kO1W}|p?~==|kymo7ogߏߎ_??6ÿ?_;~o\??G??y/^yXopaߧ{tWMkQ|Xկ|G7___5~9_/ߟkϷ;/? /7?j?4[<ֽ{okOkoG7}g?W˿?o<?cϏv?:v|j?}OG_FwƯ??j񏎿vƯikۿz=}]?3n_}4^]V?O_V_/dU{uSƯn[wo]}߻u?????_?yyOkC1xwouw Ͽ7:coooo_uھ//ko;?7QW^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>} \ No newline at end of file diff --git a/client/hardnested/tables/bitflip_0_2f1_states.bin.z b/client/hardnested/tables/bitflip_0_2f1_states.bin.z new file mode 100644 index 00000000..a4cc5d58 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_2f1_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_2f3_states.bin.z b/client/hardnested/tables/bitflip_0_2f3_states.bin.z new file mode 100644 index 00000000..f7bb63eb Binary files /dev/null and b/client/hardnested/tables/bitflip_0_2f3_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_2f9_states.bin.z b/client/hardnested/tables/bitflip_0_2f9_states.bin.z new file mode 100644 index 00000000..4e5b2ff2 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_2f9_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_2fb_states.bin.z b/client/hardnested/tables/bitflip_0_2fb_states.bin.z new file mode 100644 index 00000000..f8686dba Binary files /dev/null and b/client/hardnested/tables/bitflip_0_2fb_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_335_states.bin.z b/client/hardnested/tables/bitflip_0_335_states.bin.z new file mode 100644 index 00000000..a4cc5d58 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_335_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_337_states.bin.z b/client/hardnested/tables/bitflip_0_337_states.bin.z new file mode 100644 index 00000000..f7bb63eb Binary files /dev/null and b/client/hardnested/tables/bitflip_0_337_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_33d_states.bin.z b/client/hardnested/tables/bitflip_0_33d_states.bin.z new file mode 100644 index 00000000..4e5b2ff2 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_33d_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_33f_states.bin.z b/client/hardnested/tables/bitflip_0_33f_states.bin.z new file mode 100644 index 00000000..f8686dba Binary files /dev/null and b/client/hardnested/tables/bitflip_0_33f_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_350_states.bin.z b/client/hardnested/tables/bitflip_0_350_states.bin.z new file mode 100644 index 00000000..479bacb0 --- /dev/null +++ b/client/hardnested/tables/bitflip_0_350_states.bin.z @@ -0,0 +1 @@ +xMnFaWtщ|5o}4Lg ObOjzߟ1$_K߿rK->ɷޥ/~}K?kxzI,t_~[?~O}־}~;nnr|_O?鷷>ޯ_OCe9w}{}zǏa<㯿KŷwKIߧn;7I?鏗O/???O/O{??O_o/_?w_w_w?_?_?oO_w_Ow_?oO_w_OwO_o/_?w_w_w?_??O_o/_?w_w_w?_??_w?_??O_o/_?w_w_Ow_?oO_wO_o/_?w_w_w?_???oO_w_Ow_w?_??O_o/_?w_w__Ow_?oO_w?oO_w_Ow_w?_??O_o/_?w_w__Ow_?oO_wO_o/_?w_w_w?_??OO_ӿO??O??ӿ/?{g{gO??o??_'{???ӿ/???oO_w_Ow_??_oO????O/o?o??Oӿo????/?o?Oӿ/?O??w?_??O_o/_?w_w__o/_?w_w_w?_??O_o/_?w_w_w?_??OoO_w_Ow_?oO_w_Ow_?_oO????O/o?o??Oӿo????/?o?Oӿ/?O???_oO????O/o?o??Oӿo????/?o?Oӿ/?O?????_'{???ӿ/???OO_ӿO??O??ӿ/?{g{gO??o??_'{???ӿ/???OO_ӿO??O??ӿ/?{g{gO??oOw_?oO_w_Ow_?oO_w_O_w_Ow_?o???O/o?o??Oӿo????/?o?Oӿ/?O???_oO?_??O_o/_?w_w_w?_'{???ӿ/???OO_ӿO??O??ӿ/?{g{gO??o??????/?o?Oӿ/?O???_oO????O/o?o??Oӿow_w_w?_??O_o/_?_w_Ow_?oOw_w_w?_??O_o/_?_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_O_w_w?_??O_o/_?w_w_Ow_?oO_??O_o/_?w_w_w?_w_w?_??O_o/_?w_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_O_w_w?_??O_o/_?w_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_O_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_Ow_w?_??O_o/_?w_w_Ow_?oO_w_Ow_?oO_??O_o/_?w_w_w?__?oO_w_Ow_w?_??O_o/_?w_w_Ow_?oO_w_?oO_w_Ow_?oO_w_Ow[ \ No newline at end of file diff --git a/client/hardnested/tables/bitflip_0_365_states.bin.z b/client/hardnested/tables/bitflip_0_365_states.bin.z new file mode 100644 index 00000000..a4cc5d58 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_365_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_367_states.bin.z b/client/hardnested/tables/bitflip_0_367_states.bin.z new file mode 100644 index 00000000..f7bb63eb Binary files /dev/null and b/client/hardnested/tables/bitflip_0_367_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_36d_states.bin.z b/client/hardnested/tables/bitflip_0_36d_states.bin.z new file mode 100644 index 00000000..4e5b2ff2 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_36d_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_36f_states.bin.z b/client/hardnested/tables/bitflip_0_36f_states.bin.z new file mode 100644 index 00000000..f8686dba Binary files /dev/null and b/client/hardnested/tables/bitflip_0_36f_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_384_states.bin.z b/client/hardnested/tables/bitflip_0_384_states.bin.z new file mode 100644 index 00000000..c8a8cf4a --- /dev/null +++ b/client/hardnested/tables/bitflip_0_384_states.bin.z @@ -0,0 +1 @@ +xOu3io%VkLSMd9E bJ!HHK{| us~~ןO?y}\כ7t{G{s6~W.כ{vw?~>߻oϿ^珟ϝ8_uܿ?}/~]?|כ>'{߿>kO1W}|p?~==|kymo7ogߏߎ_??6ÿ?_;~o\??G??y/^yXopaߧ{tWMkQ|Xկ|G7___5~9_/ߟkϷ;/? /7?j?4[<ֽ{okOkoG7}g?W˿?o<?cϏv?:v|j?}OG_FwƯ??j񏎿vƯikۿz=}]?3n_}4^]V?O_V_/dU{uSƯn[wo]}߻u?????_?yyOkC1xwouw Ͽ7:coooo_uھ//ko;?7QW^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>} \ No newline at end of file diff --git a/client/hardnested/tables/bitflip_0_3b1_states.bin.z b/client/hardnested/tables/bitflip_0_3b1_states.bin.z new file mode 100644 index 00000000..a4cc5d58 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_3b1_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_3b3_states.bin.z b/client/hardnested/tables/bitflip_0_3b3_states.bin.z new file mode 100644 index 00000000..f7bb63eb Binary files /dev/null and b/client/hardnested/tables/bitflip_0_3b3_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_3b9_states.bin.z b/client/hardnested/tables/bitflip_0_3b9_states.bin.z new file mode 100644 index 00000000..4e5b2ff2 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_3b9_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_3bb_states.bin.z b/client/hardnested/tables/bitflip_0_3bb_states.bin.z new file mode 100644 index 00000000..f8686dba Binary files /dev/null and b/client/hardnested/tables/bitflip_0_3bb_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_3d4_states.bin.z b/client/hardnested/tables/bitflip_0_3d4_states.bin.z new file mode 100644 index 00000000..c8a8cf4a --- /dev/null +++ b/client/hardnested/tables/bitflip_0_3d4_states.bin.z @@ -0,0 +1 @@ +xOu3io%VkLSMd9E bJ!HHK{| us~~ןO?y}\כ7t{G{s6~W.כ{vw?~>߻oϿ^珟ϝ8_uܿ?}/~]?|כ>'{߿>kO1W}|p?~==|kymo7ogߏߎ_??6ÿ?_;~o\??G??y/^yXopaߧ{tWMkQ|Xկ|G7___5~9_/ߟkϷ;/? /7?j?4[<ֽ{okOkoG7}g?W˿?o<?cϏv?:v|j?}OG_FwƯ??j񏎿vƯikۿz=}]?3n_}4^]V?O_V_/dU{uSƯn[wo]}߻u?????_?yyOkC1xwouw Ͽ7:coooo_uھ//ko;?7QW^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>} \ No newline at end of file diff --git a/client/hardnested/tables/bitflip_0_3e1_states.bin.z b/client/hardnested/tables/bitflip_0_3e1_states.bin.z new file mode 100644 index 00000000..a4cc5d58 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_3e1_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_3e3_states.bin.z b/client/hardnested/tables/bitflip_0_3e3_states.bin.z new file mode 100644 index 00000000..f7bb63eb Binary files /dev/null and b/client/hardnested/tables/bitflip_0_3e3_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_3e9_states.bin.z b/client/hardnested/tables/bitflip_0_3e9_states.bin.z new file mode 100644 index 00000000..4e5b2ff2 Binary files /dev/null and b/client/hardnested/tables/bitflip_0_3e9_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_0_3eb_states.bin.z b/client/hardnested/tables/bitflip_0_3eb_states.bin.z new file mode 100644 index 00000000..f8686dba Binary files /dev/null and b/client/hardnested/tables/bitflip_0_3eb_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_002_states.bin.z b/client/hardnested/tables/bitflip_1_002_states.bin.z new file mode 100644 index 00000000..226c37a2 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_002_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_008_states.bin.z b/client/hardnested/tables/bitflip_1_008_states.bin.z new file mode 100644 index 00000000..209bf5e9 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_008_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_00a_states.bin.z b/client/hardnested/tables/bitflip_1_00a_states.bin.z new file mode 100644 index 00000000..63f0a7a5 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_00a_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_012_states.bin.z b/client/hardnested/tables/bitflip_1_012_states.bin.z new file mode 100644 index 00000000..659e697f Binary files /dev/null and b/client/hardnested/tables/bitflip_1_012_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_018_states.bin.z b/client/hardnested/tables/bitflip_1_018_states.bin.z new file mode 100644 index 00000000..b825cfd6 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_018_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_01a_states.bin.z b/client/hardnested/tables/bitflip_1_01a_states.bin.z new file mode 100644 index 00000000..61d252b2 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_01a_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_020_states.bin.z b/client/hardnested/tables/bitflip_1_020_states.bin.z new file mode 100644 index 00000000..cc78af68 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_020_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_028_states.bin.z b/client/hardnested/tables/bitflip_1_028_states.bin.z new file mode 100644 index 00000000..1137886b Binary files /dev/null and b/client/hardnested/tables/bitflip_1_028_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_02a_states.bin.z b/client/hardnested/tables/bitflip_1_02a_states.bin.z new file mode 100644 index 00000000..12829c1b Binary files /dev/null and b/client/hardnested/tables/bitflip_1_02a_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_02e_states.bin.z b/client/hardnested/tables/bitflip_1_02e_states.bin.z new file mode 100644 index 00000000..44fb65c0 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_02e_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_032_states.bin.z b/client/hardnested/tables/bitflip_1_032_states.bin.z new file mode 100644 index 00000000..a8350cc1 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_032_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_036_states.bin.z b/client/hardnested/tables/bitflip_1_036_states.bin.z new file mode 100644 index 00000000..c14426d0 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_036_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_038_states.bin.z b/client/hardnested/tables/bitflip_1_038_states.bin.z new file mode 100644 index 00000000..ec0b39af Binary files /dev/null and b/client/hardnested/tables/bitflip_1_038_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_03a_states.bin.z b/client/hardnested/tables/bitflip_1_03a_states.bin.z new file mode 100644 index 00000000..e301254b Binary files /dev/null and b/client/hardnested/tables/bitflip_1_03a_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_03e_states.bin.z b/client/hardnested/tables/bitflip_1_03e_states.bin.z new file mode 100644 index 00000000..9e5c059f Binary files /dev/null and b/client/hardnested/tables/bitflip_1_03e_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_040_states.bin.z b/client/hardnested/tables/bitflip_1_040_states.bin.z new file mode 100644 index 00000000..d3f655b0 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_040_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_042_states.bin.z b/client/hardnested/tables/bitflip_1_042_states.bin.z new file mode 100644 index 00000000..d324368a Binary files /dev/null and b/client/hardnested/tables/bitflip_1_042_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_046_states.bin.z b/client/hardnested/tables/bitflip_1_046_states.bin.z new file mode 100644 index 00000000..ff59e740 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_046_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_048_states.bin.z b/client/hardnested/tables/bitflip_1_048_states.bin.z new file mode 100644 index 00000000..e21985aa Binary files /dev/null and b/client/hardnested/tables/bitflip_1_048_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_04a_states.bin.z b/client/hardnested/tables/bitflip_1_04a_states.bin.z new file mode 100644 index 00000000..45c58fce Binary files /dev/null and b/client/hardnested/tables/bitflip_1_04a_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_04e_states.bin.z b/client/hardnested/tables/bitflip_1_04e_states.bin.z new file mode 100644 index 00000000..3966d1b1 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_04e_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_052_states.bin.z b/client/hardnested/tables/bitflip_1_052_states.bin.z new file mode 100644 index 00000000..f0be53ef Binary files /dev/null and b/client/hardnested/tables/bitflip_1_052_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_056_states.bin.z b/client/hardnested/tables/bitflip_1_056_states.bin.z new file mode 100644 index 00000000..e92d411b Binary files /dev/null and b/client/hardnested/tables/bitflip_1_056_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_058_states.bin.z b/client/hardnested/tables/bitflip_1_058_states.bin.z new file mode 100644 index 00000000..00545917 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_058_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_05a_states.bin.z b/client/hardnested/tables/bitflip_1_05a_states.bin.z new file mode 100644 index 00000000..1dfa63c7 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_05a_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_05e_states.bin.z b/client/hardnested/tables/bitflip_1_05e_states.bin.z new file mode 100644 index 00000000..dc078968 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_05e_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_060_states.bin.z b/client/hardnested/tables/bitflip_1_060_states.bin.z new file mode 100644 index 00000000..72477c13 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_060_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_062_states.bin.z b/client/hardnested/tables/bitflip_1_062_states.bin.z new file mode 100644 index 00000000..53e85964 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_062_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_066_states.bin.z b/client/hardnested/tables/bitflip_1_066_states.bin.z new file mode 100644 index 00000000..de23de8b Binary files /dev/null and b/client/hardnested/tables/bitflip_1_066_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_068_states.bin.z b/client/hardnested/tables/bitflip_1_068_states.bin.z new file mode 100644 index 00000000..08b3e543 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_068_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_06a_states.bin.z b/client/hardnested/tables/bitflip_1_06a_states.bin.z new file mode 100644 index 00000000..052898c7 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_06a_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_06e_states.bin.z b/client/hardnested/tables/bitflip_1_06e_states.bin.z new file mode 100644 index 00000000..5e678bd4 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_06e_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_072_states.bin.z b/client/hardnested/tables/bitflip_1_072_states.bin.z new file mode 100644 index 00000000..404b482d Binary files /dev/null and b/client/hardnested/tables/bitflip_1_072_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_076_states.bin.z b/client/hardnested/tables/bitflip_1_076_states.bin.z new file mode 100644 index 00000000..ac58f16e Binary files /dev/null and b/client/hardnested/tables/bitflip_1_076_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_078_states.bin.z b/client/hardnested/tables/bitflip_1_078_states.bin.z new file mode 100644 index 00000000..47474d21 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_078_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_07a_states.bin.z b/client/hardnested/tables/bitflip_1_07a_states.bin.z new file mode 100644 index 00000000..8b4d446d Binary files /dev/null and b/client/hardnested/tables/bitflip_1_07a_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_07e_states.bin.z b/client/hardnested/tables/bitflip_1_07e_states.bin.z new file mode 100644 index 00000000..dff5034c Binary files /dev/null and b/client/hardnested/tables/bitflip_1_07e_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_080_states.bin.z b/client/hardnested/tables/bitflip_1_080_states.bin.z new file mode 100644 index 00000000..372d2d4a Binary files /dev/null and b/client/hardnested/tables/bitflip_1_080_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_082_states.bin.z b/client/hardnested/tables/bitflip_1_082_states.bin.z new file mode 100644 index 00000000..5d688299 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_082_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_086_states.bin.z b/client/hardnested/tables/bitflip_1_086_states.bin.z new file mode 100644 index 00000000..e640e39c Binary files /dev/null and b/client/hardnested/tables/bitflip_1_086_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_088_states.bin.z b/client/hardnested/tables/bitflip_1_088_states.bin.z new file mode 100644 index 00000000..07dae476 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_088_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_08a_states.bin.z b/client/hardnested/tables/bitflip_1_08a_states.bin.z new file mode 100644 index 00000000..449c46f3 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_08a_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_08e_states.bin.z b/client/hardnested/tables/bitflip_1_08e_states.bin.z new file mode 100644 index 00000000..bdea7a0f Binary files /dev/null and b/client/hardnested/tables/bitflip_1_08e_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_092_states.bin.z b/client/hardnested/tables/bitflip_1_092_states.bin.z new file mode 100644 index 00000000..6147f3fd Binary files /dev/null and b/client/hardnested/tables/bitflip_1_092_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_096_states.bin.z b/client/hardnested/tables/bitflip_1_096_states.bin.z new file mode 100644 index 00000000..575a3831 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_096_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_098_states.bin.z b/client/hardnested/tables/bitflip_1_098_states.bin.z new file mode 100644 index 00000000..dee21c52 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_098_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_09a_states.bin.z b/client/hardnested/tables/bitflip_1_09a_states.bin.z new file mode 100644 index 00000000..c4d76b45 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_09a_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_09e_states.bin.z b/client/hardnested/tables/bitflip_1_09e_states.bin.z new file mode 100644 index 00000000..dd57c590 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_09e_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_0a0_states.bin.z b/client/hardnested/tables/bitflip_1_0a0_states.bin.z new file mode 100644 index 00000000..32880a5c Binary files /dev/null and b/client/hardnested/tables/bitflip_1_0a0_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_0a2_states.bin.z b/client/hardnested/tables/bitflip_1_0a2_states.bin.z new file mode 100644 index 00000000..25d53d5f Binary files /dev/null and b/client/hardnested/tables/bitflip_1_0a2_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_0a6_states.bin.z b/client/hardnested/tables/bitflip_1_0a6_states.bin.z new file mode 100644 index 00000000..ca1f5f93 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_0a6_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_0a8_states.bin.z b/client/hardnested/tables/bitflip_1_0a8_states.bin.z new file mode 100644 index 00000000..c7d501ca Binary files /dev/null and b/client/hardnested/tables/bitflip_1_0a8_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_0aa_states.bin.z b/client/hardnested/tables/bitflip_1_0aa_states.bin.z new file mode 100644 index 00000000..5c194d17 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_0aa_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_0ae_states.bin.z b/client/hardnested/tables/bitflip_1_0ae_states.bin.z new file mode 100644 index 00000000..2ce45b01 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_0ae_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_0b2_states.bin.z b/client/hardnested/tables/bitflip_1_0b2_states.bin.z new file mode 100644 index 00000000..d81106d0 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_0b2_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_0b6_states.bin.z b/client/hardnested/tables/bitflip_1_0b6_states.bin.z new file mode 100644 index 00000000..e8c99c17 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_0b6_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_0b8_states.bin.z b/client/hardnested/tables/bitflip_1_0b8_states.bin.z new file mode 100644 index 00000000..25e77787 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_0b8_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_0ba_states.bin.z b/client/hardnested/tables/bitflip_1_0ba_states.bin.z new file mode 100644 index 00000000..240130a6 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_0ba_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_0be_states.bin.z b/client/hardnested/tables/bitflip_1_0be_states.bin.z new file mode 100644 index 00000000..05aca3b6 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_0be_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_0c0_states.bin.z b/client/hardnested/tables/bitflip_1_0c0_states.bin.z new file mode 100644 index 00000000..d3f655b0 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_0c0_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_0c2_states.bin.z b/client/hardnested/tables/bitflip_1_0c2_states.bin.z new file mode 100644 index 00000000..cbbb6370 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_0c2_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_0c6_states.bin.z b/client/hardnested/tables/bitflip_1_0c6_states.bin.z new file mode 100644 index 00000000..95d16200 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_0c6_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_0c8_states.bin.z b/client/hardnested/tables/bitflip_1_0c8_states.bin.z new file mode 100644 index 00000000..5eca50e2 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_0c8_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_0ca_states.bin.z b/client/hardnested/tables/bitflip_1_0ca_states.bin.z new file mode 100644 index 00000000..500be7d6 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_0ca_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_0ce_states.bin.z b/client/hardnested/tables/bitflip_1_0ce_states.bin.z new file mode 100644 index 00000000..583dc35e Binary files /dev/null and b/client/hardnested/tables/bitflip_1_0ce_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_0d2_states.bin.z b/client/hardnested/tables/bitflip_1_0d2_states.bin.z new file mode 100644 index 00000000..a2395d9d Binary files /dev/null and b/client/hardnested/tables/bitflip_1_0d2_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_0d6_states.bin.z b/client/hardnested/tables/bitflip_1_0d6_states.bin.z new file mode 100644 index 00000000..b2cc698a Binary files /dev/null and b/client/hardnested/tables/bitflip_1_0d6_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_0d8_states.bin.z b/client/hardnested/tables/bitflip_1_0d8_states.bin.z new file mode 100644 index 00000000..4188dbd1 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_0d8_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_0da_states.bin.z b/client/hardnested/tables/bitflip_1_0da_states.bin.z new file mode 100644 index 00000000..f4115044 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_0da_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_0de_states.bin.z b/client/hardnested/tables/bitflip_1_0de_states.bin.z new file mode 100644 index 00000000..42dfcc79 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_0de_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_0e0_states.bin.z b/client/hardnested/tables/bitflip_1_0e0_states.bin.z new file mode 100644 index 00000000..4af74d9a Binary files /dev/null and b/client/hardnested/tables/bitflip_1_0e0_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_0e8_states.bin.z b/client/hardnested/tables/bitflip_1_0e8_states.bin.z new file mode 100644 index 00000000..4ff8482f Binary files /dev/null and b/client/hardnested/tables/bitflip_1_0e8_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_0f8_states.bin.z b/client/hardnested/tables/bitflip_1_0f8_states.bin.z new file mode 100644 index 00000000..11466136 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_0f8_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_108_states.bin.z b/client/hardnested/tables/bitflip_1_108_states.bin.z new file mode 100644 index 00000000..31234583 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_108_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_111_states.bin.z b/client/hardnested/tables/bitflip_1_111_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_111_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_113_states.bin.z b/client/hardnested/tables/bitflip_1_113_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_113_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_115_states.bin.z b/client/hardnested/tables/bitflip_1_115_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_115_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_117_states.bin.z b/client/hardnested/tables/bitflip_1_117_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_117_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_118_states.bin.z b/client/hardnested/tables/bitflip_1_118_states.bin.z new file mode 100644 index 00000000..10afd75a Binary files /dev/null and b/client/hardnested/tables/bitflip_1_118_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_11a_states.bin.z b/client/hardnested/tables/bitflip_1_11a_states.bin.z new file mode 100644 index 00000000..e0e985fc Binary files /dev/null and b/client/hardnested/tables/bitflip_1_11a_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_11b_states.bin.z b/client/hardnested/tables/bitflip_1_11b_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_11b_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_120_states.bin.z b/client/hardnested/tables/bitflip_1_120_states.bin.z new file mode 100644 index 00000000..750af05d Binary files /dev/null and b/client/hardnested/tables/bitflip_1_120_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_122_states.bin.z b/client/hardnested/tables/bitflip_1_122_states.bin.z new file mode 100644 index 00000000..6d04a3c0 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_122_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_128_states.bin.z b/client/hardnested/tables/bitflip_1_128_states.bin.z new file mode 100644 index 00000000..18d33314 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_128_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_131_states.bin.z b/client/hardnested/tables/bitflip_1_131_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_131_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_135_states.bin.z b/client/hardnested/tables/bitflip_1_135_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_135_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_138_states.bin.z b/client/hardnested/tables/bitflip_1_138_states.bin.z new file mode 100644 index 00000000..bc154b4f Binary files /dev/null and b/client/hardnested/tables/bitflip_1_138_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_145_states.bin.z b/client/hardnested/tables/bitflip_1_145_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_145_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_147_states.bin.z b/client/hardnested/tables/bitflip_1_147_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_147_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_148_states.bin.z b/client/hardnested/tables/bitflip_1_148_states.bin.z new file mode 100644 index 00000000..ec5b774c Binary files /dev/null and b/client/hardnested/tables/bitflip_1_148_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_158_states.bin.z b/client/hardnested/tables/bitflip_1_158_states.bin.z new file mode 100644 index 00000000..631b39af Binary files /dev/null and b/client/hardnested/tables/bitflip_1_158_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_160_states.bin.z b/client/hardnested/tables/bitflip_1_160_states.bin.z new file mode 100644 index 00000000..32fb4f59 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_160_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_161_states.bin.z b/client/hardnested/tables/bitflip_1_161_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_161_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_163_states.bin.z b/client/hardnested/tables/bitflip_1_163_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_163_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_165_states.bin.z b/client/hardnested/tables/bitflip_1_165_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_165_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_168_states.bin.z b/client/hardnested/tables/bitflip_1_168_states.bin.z new file mode 100644 index 00000000..af6bf431 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_168_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_178_states.bin.z b/client/hardnested/tables/bitflip_1_178_states.bin.z new file mode 100644 index 00000000..17eec3aa Binary files /dev/null and b/client/hardnested/tables/bitflip_1_178_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_180_states.bin.z b/client/hardnested/tables/bitflip_1_180_states.bin.z new file mode 100644 index 00000000..d3f655b0 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_180_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_188_states.bin.z b/client/hardnested/tables/bitflip_1_188_states.bin.z new file mode 100644 index 00000000..d5012b1d Binary files /dev/null and b/client/hardnested/tables/bitflip_1_188_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_191_states.bin.z b/client/hardnested/tables/bitflip_1_191_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_191_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_198_states.bin.z b/client/hardnested/tables/bitflip_1_198_states.bin.z new file mode 100644 index 00000000..ca490c4f Binary files /dev/null and b/client/hardnested/tables/bitflip_1_198_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_199_states.bin.z b/client/hardnested/tables/bitflip_1_199_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_199_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_19d_states.bin.z b/client/hardnested/tables/bitflip_1_19d_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_19d_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_19f_states.bin.z b/client/hardnested/tables/bitflip_1_19f_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_19f_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_1a0_states.bin.z b/client/hardnested/tables/bitflip_1_1a0_states.bin.z new file mode 100644 index 00000000..d6041407 --- /dev/null +++ b/client/hardnested/tables/bitflip_1_1a0_states.bin.z @@ -0,0 +1 @@ +xMr,Inྚn<լ%HռE/hih03?_}~]_}M}߬O?=ǷϿ/o???/oӧO?SOOS~}WS>}?__>}gWN>zf~׏?+.wE>?ӧOT?}m/o''wӧO_G9__g7??O_'''[y=7ȧ??sϟz~ռ?g?99y|Z?wZ_O}"}???_%4v nn?޿jo₩_?rrr3?ɭɭoOOO???\/g?iڱ??N2zhmoM4M6m_o_4O~y?n}.Oo?7?>}i%ם4_M3O?ӧOU?Ow?????'͟O_?Xo??7?_>}?SOOC~}WSԏӟ?9m?ݿj[O??ǟU>$m'rINN'???>}y?}c/???/_H8~{//ww{/OOo???}????ӧoO>}OOOzS?~#''oONO?yo?wr????rrV~2e4D.>??JiZoKۏO/՘{_M3?g[o?[oߟo??ӧcO{؏o?_,z]g?7__?>}<ߥ7p]?ӧ_7;??9/?//i?ß_q'<;{_OM5/[c?[g_?i?}sOOCii_/'7?}wgI?Oy~f}????[ϴ_/}??O>}_EO/O_/gg;ϟOE~4w \;ꧯ_?_N4??7?_>}gO_Gӷ_???'y<7rrO?SOϯ?{7/'7?'''oO'WNOO\OO/WW䚦}nߍ|_W 4????ONNng/?99Z/?99/''/??5M;p_Oiiڦߺ7?Ɵ?o?oc?/|~Ͽ??OѧO5d;wg/o''wk_??ӧO]ag\Jiih/>}???ד<99y|s?}?zW _?痤4D.>??ҧO?o~LO~]u};Z/OOo=WQ/''/7~o'g??}5??ӧoW?_Oxo ~_5-nw_On'g?ONN*O㯬֟WSc'99_/'W5Mmi1i¿?/i?ß_3_rrrr_o?[?}oi?Oy~f}????OѧO?~^gK?~~_?}K/|{_49/wg[Q~8~?=5O??;?qD4🜜5ww/;i4????5MNiih4M/4MSSFOn?_?a?>~||{wu3Ϗ7~o'g?KO>Z֟Z??_O_/'ӧ˿/?oSӿߏWY.R|?_WuO>R ߿^_O>}?ӧO_S>}'Wߟo??$~FNN O>j{Ugw??id>ii~??\/}?\Ӵޖӿ/_x1?f'g??5?%'''_????#''WQq?rrgi<:t5_4M۴W[>}9mGZ?o@O??{)_߻]w~Ҵ~5}S|?_O>VL>?_N7>}2 XcYg@O??wK?Oi?? E_/ҧO_OO/WWzS?~#''oONO?tyo?wr????rrVy֟WSc'99_/'O~{؏I￴;o?7?}w!}ro?ӧOTu_?>}????/WOӗ?}W3O????IOA>9}ϟ??}oϞɍ??/[|_$''WS*i-m??m_w߿p{Uc}5O??kYKnONNn}/O?m?a?>~||{wu3Ϗ7~o'g?~)_O+u)ϟ/?|O~~_/OO_k/8l?Ͽǯcw_?rrr9?cȳ>[Ow???'5M3/o?[of'g?ii?? i???߈߭'K=ǷϿ/o???/oӧO?SOOS~}WS>}?__>}g?>}ʟ2ߥ7p]?ӧ_7;??ӧ_OO_//o@O??k?}?ӧO?<ԏӟ?9Om?=j[O??ǟU>_Y;?>Orrr??___Okcq7 _5z7^_ӌ??/?99g[[k'''[??_GN.??4O?=_i/?/_ҧO?gH_~|?>_'?7__?{?E>k{״y޿O֯?uӧߪ?ߧ;߿^ӧo_?_?N>wq)mWSc_??~_Oxo ~Ƕ_5v-nw_On'g?ONN*O__$''WS_I>?ϟ?1?v^??/?O_qM;k????oӧO_G7__g7??O_'''[y=7ȧ??sϟz~ռ?g?99y|Z?wZ_O}"}???_%4v nn?޿jo₩_?rrr3?ɭɭoOOOӿ~=ǷϿ/o???/_?E>izR.wEZ/O_MӜmGu4????ONN/8?WyV~rr?/'俦ieOӌ??/W4ms>9mWS4_4MOO/WW>}u}???ӧO/"'?ӧ/??ÿOѧO_~?~^_fK?~~_}?}K/|{?}?_?O>}3O/#[g_}ד<99y|s?}?W= _?ʧ+k'rINN'???UrMz[~L~>n?/Okg'''7?񟜜[_\G???cx/4K4m^^_OOoKOk{?ߏkx~f}????ӧ_?wIO?~~߻?}[37;??wy5/[c?[g}????ӧ.3?4}K>}??___OIOA>9}ϟ??oɍ??/[KwZ_O}"}????ӧ?a?']Ү|:?go@O??;?q7O>R}ם-o''??7?_>}gO_Gӷ_???'y<7rrO?SOϯ?{7/'7?'''oO'WNOO\OO/WW䚦}nߍ|_W 4????ONNng/?99Z/?>}7u}k{?????qi;-(?r?f'g??ɝ8}"oONN;o?^4_?Xo?igm?4&k?#ӧO~v/z?~X;o?7?ÿ%O~o?LOi??ME_/ҧO_OO/WWWQ?_?)_tO+ˬu)ϟ/:|O~~_/OO/OOs???}????ӧoO>}OOOzS?~#''oONO?yo?wr????rrV~2e4D.>??JiZoKۏO/՘{_M3?g[o?[oߟo??89_??_Ӵc ?eߚf/im߫߿?iI>?|?{6#}m\~-Ϗ7~o'g??}]Kvy;?iZ)gϟ/{?O~~&||{N?O3~o'g?;}%֟_O/~ӧ'???=7ȧ??sռ?g?99y<}~INOO\OO/WW'}O?=t_z]g?7__?;>}9?q7f^ӧ_?__O>}?ӧO_S>}'Wߟo??$~FNN O>j{Ugw??id>ii~??\/}?\Ӵޖӿ/_x1?f'g??5?%'''_????ӧOYz?~X;o?7?}_}/yֿKoOk?ӧOT?}m/o''w/5Ms__1?^;Wӌ??/?99\OYyM[w-w'k_?M3?_]Ӵ֟_OOM4??___Oo%[˷^??i)mWSc_?O>}??_//O_??vן?E>izR.wE_Z/O_WQi/''/7~o'g??}5??ӧoW?_Oxo ~_5-nw_On'g?ONN*O㯬֟WSc'99_/'W5Mmi1i¿?/i?ß_3_rrrr_o?[?rrr_OO_/#'?kvlL_[e/MӴM_{{o???uo/?ӧg~_~?۟˯??/O5?kZ_Y;?>Orrr??___Okcq7 _5z7^_ӌ??/?99g[[k'''[X??[˷^??/OE?~4?w \;zꧯ_?_Nir_϶q:zjg'''w?<+Oi?99yk^w{??w_42 XcYi?k9Oi_i'???O>~||b|:?go@O??>}3?4}K>}??___OӧO_G_?ߎӧ/?M/]jץN?c>_k>}k{?????>}????/WOӗ?}W3O????IOA>9}ϟ??}oϞɍ??/[|_$''WS*i-m??m_w߿p{Uc}5O??kYKnONNn}/GNN}???oMӎ1ytzCkokiik~//'''}s؏ ws}};o<}egXןZ??_O_/'$~FNN Ol{Ugw??%i;?>Orrr??___Oş?iWwu3Ϗ7~o'g?C8{O~ο7[?}z?_?O>}3O/#[g_}ד<99y|s?}?W= _?ʧ+k'rINN'???UrMz[~L~>n?/Okg'''7?񟜜[_O>g~||b|:?go@O??SӿhߏW~Y.R|?_WO>R ߿^84_q 9_O{_M3?rs>g7?'''o}Nkf_?4O??wM6Z??M5M??! \ No newline at end of file diff --git a/client/hardnested/tables/bitflip_1_1a8_states.bin.z b/client/hardnested/tables/bitflip_1_1a8_states.bin.z new file mode 100644 index 00000000..10dd5e6b Binary files /dev/null and b/client/hardnested/tables/bitflip_1_1a8_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_1b3_states.bin.z b/client/hardnested/tables/bitflip_1_1b3_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_1b3_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_1b5_states.bin.z b/client/hardnested/tables/bitflip_1_1b5_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_1b5_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_1b7_states.bin.z b/client/hardnested/tables/bitflip_1_1b7_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_1b7_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_1b8_states.bin.z b/client/hardnested/tables/bitflip_1_1b8_states.bin.z new file mode 100644 index 00000000..add474d0 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_1b8_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_1b9_states.bin.z b/client/hardnested/tables/bitflip_1_1b9_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_1b9_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_1bd_states.bin.z b/client/hardnested/tables/bitflip_1_1bd_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_1bd_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_1c1_states.bin.z b/client/hardnested/tables/bitflip_1_1c1_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_1c1_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_1c3_states.bin.z b/client/hardnested/tables/bitflip_1_1c3_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_1c3_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_1c8_states.bin.z b/client/hardnested/tables/bitflip_1_1c8_states.bin.z new file mode 100644 index 00000000..3a748e8d Binary files /dev/null and b/client/hardnested/tables/bitflip_1_1c8_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_1c9_states.bin.z b/client/hardnested/tables/bitflip_1_1c9_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_1c9_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_1cd_states.bin.z b/client/hardnested/tables/bitflip_1_1cd_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_1cd_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_1cf_states.bin.z b/client/hardnested/tables/bitflip_1_1cf_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_1cf_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_1d8_states.bin.z b/client/hardnested/tables/bitflip_1_1d8_states.bin.z new file mode 100644 index 00000000..806157d2 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_1d8_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_1e0_states.bin.z b/client/hardnested/tables/bitflip_1_1e0_states.bin.z new file mode 100644 index 00000000..b7f69972 --- /dev/null +++ b/client/hardnested/tables/bitflip_1_1e0_states.bin.z @@ -0,0 +1 @@ +xmn4In`@WM|$ـCwGCʎbǓBCUeE$?>_?7ҧOo?z?~X;o?7?ÿ%O~o?LOi??ME_/ҧO_OO/WWWQ?_?_;}WOO_?>oOO>R ߿^_O>}?ӧO_S>}'Wߟo??$~FNN O>j{Ugw??id>ii~??\/}?\Ӵޖӿ/_x1?f'g??5?%'''_????#''WQq?rrgi<:t5_4M۴W[>}9mGZ?o@O??{)_߻]w~Ҵ~5}S|?_O>VL>?_N7>}2 XcYg@O??wK?Oi?? E_/ҧO_OO/WWzS?~#''oONO?tyo?wr????rrVy֟WSc'99_/'O~{؏I￴;o?7?}w!}ro?ӧOTu_?>}????/WOӗ?}W3O????IOA>9}ϟ??}oϞɍ??/[|_$''WS*i-m??m_w߿p{Uc}5O??kYKnONNn}/O?m?a?>~x|{wu3Ϗ7~o'g?~)_O+u)ϟ/?|O~~_/OO_k/8l?Ͽǯcw_?rrr9?cȳ>[Ow???'5M3/o?[of'g?ii?? i???߈߭'K=Ͽ/o???/oӧO?SOOS~}WS>}?__>}g?>}ʟ2ߥ7p]?ӧ_7;??ӧ_OO_//o@O??k?}?ӧO?<ԏӟ?9Om?=j[O??ǟU>_Y;?>Orrr??___Okcq7 _5z7^_ӌ??/?99g[[k'''[??_GN.??4O?=_i/?/_ҧO?gH_~~?>_'?7__?{?E>k{״y޿O֯?uӧߪ?ߧ;߿^ӧo_?_?N>wq)mWSc_??~_Oxo ~Ƕ_5v-nw_On'g?ONN*O__$''WS_I>?ϟ?1?v^??/?O_qM;k????oӧO_G7__g7??O_'''[y=7ȧ??sϟz~ռ?g?99y|Z?wZ_O}"}???_%4v nn?޿jo₩_?rrr3?ɭɭoOOOӿ~=Ͽ/o???/_?E>izR.wEZ/O_MӜmGu4????ONN/8?WyV~rr?/'俦ieOӌ??/W4ms>9mWS4_4MOO/WW>}u}???ӧO/"'?ӧ/??ÿOѧO_~?~^_fK?~~_}?}K/|{?}?_?O>}3O/#[g_}ד<99y|s?}?W= _?ʧ+k'rINN'???UrMz[~L~>n?/Okg'''7?񟜜[_\G???cx/4K4m^^_OOoKOk{?kx~f}????ӧ_?wIO?~~߻?}[37;??wy5/[c?[g}????ӧ.3?4}K>}??___OIOA>9}ϟ??oɍ??/[KwZ_O}"}????ӧ?a?']Ү|:?go@O??;?q7O>R}ם-o''??7?_>}gO_Gӷ_???'y<7rrO?SOϯ?{7/'7?'''oO'WNOO\OO/WW䚦}nߍ|_W 4????ONNng/?99Z/?>}7u}k{?????qi;-(?r?f'g??ɝ8}"oONN;o?^4_?Xo?igm?4&k?#ӧO~v/z?~X;o?7?ÿ%O~o?LOi??ME_/ҧO_OO/WWWQ?_?)_tO+ˬu)ϟ/:|O~~_/OO/OOs???}????ӧoO>}OOOzS?~#''oONO?yo?wr????rrV~2e4D.>??JiZoKۏO/՘{_M3?g[o?[oߟo??89_??_Ӵc ?eߚf/im߫߿?iI>?|?{6#}m\~-Ϗ7~o'g??}]Kvy;?iZ)gϟ/{?O~~&||{N?O3~o'g?;}%֟_O/~ӧ'???=7ȧ??sռ?g?99y<}~INOO\OO/WW'}O?=t_z]g?7__?;>}9?q7f^ӧ_?__O>}?ӧO_S>}'Wߟo??$~FNN O>j{Ugw??id>ii~??\/}?\Ӵޖӿ/_x1?f'g??5?%'''_????ӧOYz?~X;o?7?}_}/yֿKoOk?ӧOT?}m/o''w/5Ms__1?^;Wӌ??/?99\OYyM[w-w'k_?M3?_]Ӵ֟_OOM4??___Oo%[ߏ˷^??i)mWSc_?O>}??_//O_??vן?E>izR.wE_Z/O_WQi/''/7~o'g??}5??ӧoW?_Oxo ~_5-nw_On'g?ONN*O㯬֟WSc'99_/'W5Mmi1i¿?/i?ß_3_rrrr_o?[?rrr_OO_/#'?kvlL_[e/MӴM_{{o???uo/?ӧg~_~?۟˯??/O5?kZ_Y;?>Orrr??___Okcq7 _5z7^_ӌ??/?99g[[k'''[X??[ߏ˷^??/OE?~4?w \;zꧯ_?_Nir_϶q:zjg'''w?<+Oi?99yk^w{??w_42 XcYi?k9Oi_i'???O>~|~b|:?go@O??>}3?4}K>}??___OӧO_G_?ߎӧ/?M/]jץN?c>_k>}k{?????>}????/WOӗ?}W3O????IOA>9}ϟ??}oϞɍ??/[|_$''WS*i-m??m_w߿p{Uc}5O??kYKnONNn}/GNN}???oMӎ1ytzCkokiik~//'''}s؏ ws}};o<}egXןZ??_O_/'$~FNN Ol{Ugw??%i;?>Orrr??___Oş?iWwu3Ϗ7~o'g?C8{O~ο7[?}z?_?O>}3O/#[g_}ד<99y|s?}?W= _?ʧ+k'rINN'???UrMz[~L~>n?/Okg'''7?񟜜[_O>g~|~b|:?go@O??SӿhߏW~Y.R|?_WO>R ߿^84_q 9_O{_M3?rs>g7?'''o}Nkf_?4O??wM6Z??M5M??ӧ[?Oz{؏o?^,z]g?7__?ӧO7֟_O/~ӧ'????}/??}???_}/:?eֿKoOk?ӧOT?}m/o''wӧO_G9__g7??O_'''[y=7ȧ??sϟz~ռ?g?99y|Z?wZ_O}"}???_%4v nn?޿jo₩_?rrr3?ɭɭoOOO???\/g?iڱ??N2zhmoM4M6m_o_4O~y?n}.Oo?7?>}i%ם4_M3O?ӧOU?Ow?????'͟O_?Xo??7?_>}?SOOC~}WSԏӟ?9m?ݿj[O??ǟU>$m'rINN'???>}y?}c/???/_H8~{//ww{/OOo???}????ӧoO>}OOOzS?~#''oONO?yo?wr????rrV~2e4D.>??JiZoKۏO/՘{_M3?g[o?[oߟo??ӧcO{؏o?^,z]g?7__?>}<ߥ7p]?ӧ_7;??9/?//i?ß_q'<;{_OM5/[c?[g_?i?}sOOCii_/'7?}wgI?NjOy~f}????[ϴ_/}??O>}_EO/O_/gg;ϟOE~4w \;ꧯ_?_N4??7?_>}gO_Gӷ_???'y<7rrO?SOϯ?{7/'7?'''oO'WNOO\OO/WW䚦}nߍ|_W 4????ONNng/?99Z/?99/''/??5M;p_Oiiڦߺ7?Ɵ?o?oc?/|~Ͽ??OѧO5d;wg/o''wk_??ӧO]ag\Jiih/>}???ד<99y|s?}?zW _?痤4D.>??ҧO?o~LO~]u};Z/OOo=WQ/''/7~o'g??}5??ӧoW?_Oxo ~_5-nw_On'g?ONN*O㯬֟WSc'99_/'W5Mmi1i¿?/i?ß_3_rrrr_o?[?}oi?NjOy~f}????OѧO?~^gK?~~_?}K/|{_49/wg[Q~8~?=5O??;?qD4🜜5ww/;i4????5MNiih4M/4MSS{+ \ No newline at end of file diff --git a/client/hardnested/tables/bitflip_1_1e1_states.bin.z b/client/hardnested/tables/bitflip_1_1e1_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_1e1_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_1e5_states.bin.z b/client/hardnested/tables/bitflip_1_1e5_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_1e5_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_1e7_states.bin.z b/client/hardnested/tables/bitflip_1_1e7_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_1e7_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_1e8_states.bin.z b/client/hardnested/tables/bitflip_1_1e8_states.bin.z new file mode 100644 index 00000000..a68398e4 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_1e8_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_1e9_states.bin.z b/client/hardnested/tables/bitflip_1_1e9_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_1e9_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_1eb_states.bin.z b/client/hardnested/tables/bitflip_1_1eb_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_1eb_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_1ed_states.bin.z b/client/hardnested/tables/bitflip_1_1ed_states.bin.z new file mode 100644 index 00000000..9840a5eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_1ed_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_1f8_states.bin.z b/client/hardnested/tables/bitflip_1_1f8_states.bin.z new file mode 100644 index 00000000..dc0f16fc Binary files /dev/null and b/client/hardnested/tables/bitflip_1_1f8_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_208_states.bin.z b/client/hardnested/tables/bitflip_1_208_states.bin.z new file mode 100644 index 00000000..c8a8cf4a --- /dev/null +++ b/client/hardnested/tables/bitflip_1_208_states.bin.z @@ -0,0 +1 @@ +xOu3io%VkLSMd9E bJ!HHK{| us~~ןO?y}\כ7t{G{s6~W.כ{vw?~>߻oϿ^珟ϝ8_uܿ?}/~]?|כ>'{߿>kO1W}|p?~==|kymo7ogߏߎ_??6ÿ?_;~o\??G??y/^yXopaߧ{tWMkQ|Xկ|G7___5~9_/ߟkϷ;/? /7?j?4[<ֽ{okOkoG7}g?W˿?o<?cϏv?:v|j?}OG_FwƯ??j񏎿vƯikۿz=}]?3n_}4^]V?O_V_/dU{uSƯn[wo]}߻u?????_?yyOkC1xwouw Ͽ7:coooo_uھ//ko;?7QW^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>} \ No newline at end of file diff --git a/client/hardnested/tables/bitflip_1_220_states.bin.z b/client/hardnested/tables/bitflip_1_220_states.bin.z new file mode 100644 index 00000000..479bacb0 --- /dev/null +++ b/client/hardnested/tables/bitflip_1_220_states.bin.z @@ -0,0 +1 @@ +xMnFaWtщ|5o}4Lg ObOjzߟ1$_K߿rK->ɷޥ/~}K?kxzI,t_~[?~O}־}~;nnr|_O?鷷>ޯ_OCe9w}{}zǏa<㯿KŷwKIߧn;7I?鏗O/???O/O{??O_o/_?w_w_w?_?_?oO_w_Ow_?oO_w_OwO_o/_?w_w_w?_??O_o/_?w_w_w?_??_w?_??O_o/_?w_w_Ow_?oO_wO_o/_?w_w_w?_???oO_w_Ow_w?_??O_o/_?w_w__Ow_?oO_w?oO_w_Ow_w?_??O_o/_?w_w__Ow_?oO_wO_o/_?w_w_w?_??OO_ӿO??O??ӿ/?{g{gO??o??_'{???ӿ/???oO_w_Ow_??_oO????O/o?o??Oӿo????/?o?Oӿ/?O??w?_??O_o/_?w_w__o/_?w_w_w?_??O_o/_?w_w_w?_??OoO_w_Ow_?oO_w_Ow_?_oO????O/o?o??Oӿo????/?o?Oӿ/?O???_oO????O/o?o??Oӿo????/?o?Oӿ/?O?????_'{???ӿ/???OO_ӿO??O??ӿ/?{g{gO??o??_'{???ӿ/???OO_ӿO??O??ӿ/?{g{gO??oOw_?oO_w_Ow_?oO_w_O_w_Ow_?o???O/o?o??Oӿo????/?o?Oӿ/?O???_oO?_??O_o/_?w_w_w?_'{???ӿ/???OO_ӿO??O??ӿ/?{g{gO??o??????/?o?Oӿ/?O???_oO????O/o?o??Oӿow_w_w?_??O_o/_?_w_Ow_?oOw_w_w?_??O_o/_?_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_O_w_w?_??O_o/_?w_w_Ow_?oO_??O_o/_?w_w_w?_w_w?_??O_o/_?w_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_O_w_w?_??O_o/_?w_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_O_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_Ow_w?_??O_o/_?w_w_Ow_?oO_w_Ow_?oO_??O_o/_?w_w_w?__?oO_w_Ow_w?_??O_o/_?w_w_Ow_?oO_w_?oO_w_Ow_?oO_w_Ow[ \ No newline at end of file diff --git a/client/hardnested/tables/bitflip_1_24a_states.bin.z b/client/hardnested/tables/bitflip_1_24a_states.bin.z new file mode 100644 index 00000000..a4cc5d58 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_24a_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_24e_states.bin.z b/client/hardnested/tables/bitflip_1_24e_states.bin.z new file mode 100644 index 00000000..f7bb63eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_24e_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_25a_states.bin.z b/client/hardnested/tables/bitflip_1_25a_states.bin.z new file mode 100644 index 00000000..4e5b2ff2 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_25a_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_25e_states.bin.z b/client/hardnested/tables/bitflip_1_25e_states.bin.z new file mode 100644 index 00000000..f8686dba Binary files /dev/null and b/client/hardnested/tables/bitflip_1_25e_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_262_states.bin.z b/client/hardnested/tables/bitflip_1_262_states.bin.z new file mode 100644 index 00000000..a4cc5d58 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_262_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_266_states.bin.z b/client/hardnested/tables/bitflip_1_266_states.bin.z new file mode 100644 index 00000000..f7bb63eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_266_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_272_states.bin.z b/client/hardnested/tables/bitflip_1_272_states.bin.z new file mode 100644 index 00000000..4e5b2ff2 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_272_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_276_states.bin.z b/client/hardnested/tables/bitflip_1_276_states.bin.z new file mode 100644 index 00000000..f8686dba Binary files /dev/null and b/client/hardnested/tables/bitflip_1_276_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_280_states.bin.z b/client/hardnested/tables/bitflip_1_280_states.bin.z new file mode 100644 index 00000000..e4f4b6ac --- /dev/null +++ b/client/hardnested/tables/bitflip_1_280_states.bin.z @@ -0,0 +1,2 @@ +xAP ,Ձ;w!щG +! {4܆.R-W/OOo??_=?ϟݿ_??{o???o??{??_w??㏿_?w?_?ǟ?_??ǟ_??㏿??g???{??_w??㏿_?w???{o???ow??㏿_?w???{o???o??{??_?㏿??g_?ǟ?_??ǟ_??ǟ?_??ǟ_??㏿??g_㏿??g_?ǟ?_??ǟ_???w???{o???o??{??_w??㏿_??{??_w??㏿_?w???{o???o??㏿_?w???{o???o??{??_w?{o???o??{??_w??㏿_?w???㏿_?w???{o???o??{??_w???㏿_?w???{o???o??{??_w?w???{o???o??{??_w??㏿_??g_?ǟ?_??ǟ_??㏿??ǟ_??㏿??g_?ǟ?_?g_?ǟ?_??ǟ_??㏿?????o??{??_w??㏿_?w???{o?㏿_?w???{o???o??{??_w????{o???o??{??_w??㏿_?w?{??_w??㏿_?w???{o???o???{o???o??{??_w??㏿_?w????{o???o??{??_w??㏿_?w??o??{??_w??㏿_?w???{o???_w??㏿_?w???{o???o??{᏿_?w???{o???o??{??_w??㏿㏿??g_?ǟ?_??ǟ_????{o???o??{??_w??㏿_?w??_?ǟ?_??ǟ_??㏿??g?ǟ_??㏿??g_?ǟ?_??㏿??g_?ǟ?_??ǟ_᏿??g_?ǟ?_??ǟ_??㏿??{o???o??{??_w??㏿_?w?_?ǟ?_??ǟ_??㏿??g???{??_w??㏿_?w???{o???ow??㏿_?w???{o???o??{??_?㏿??g_?ǟ?_??ǟ_??ǟ?_??ǟ_??㏿??g_㏿??g_?ǟ?_??ǟ_???w???{o???o??{??_w??㏿_??{??_w??㏿_?w???{o???o??㏿_?w???{o???o??{??_w?{o???o??{??_w??㏿_?w???㏿_?w???{o???o??{??_w???㏿_?w???{o???o??{??_w?w???{o???o??{??_w??㏿_??g_?ǟ?_??ǟ_??㏿??ǟ_??㏿??g_?ǟ?_?g_?ǟ?_??ǟ_??㏿?????o??{??_w??㏿_?w???{o?㏿_?w???{o???o??{??_w????{o???o??{??_w??㏿_?w?{??_w??㏿_?w???{o???o???{o???o??{??_w??㏿_?w????{o???o??{??_w??㏿_?w??o??{??_w??㏿_?w???{o???_w??㏿_?w???{o???o??{᏿_?w???{o???o??{??_w??㏿㏿??g_?ǟ?_??ǟ_????{o???o??{??_w??㏿_?w??_?ǟ?_??ǟ_??㏿??g?ǟ_??㏿??g_?ǟ?_??㏿??g_?ǟ?_??ǟ_᏿??g_?ǟ?;m \ No newline at end of file diff --git a/client/hardnested/tables/bitflip_1_2a8_states.bin.z b/client/hardnested/tables/bitflip_1_2a8_states.bin.z new file mode 100644 index 00000000..c8a8cf4a --- /dev/null +++ b/client/hardnested/tables/bitflip_1_2a8_states.bin.z @@ -0,0 +1 @@ +xOu3io%VkLSMd9E bJ!HHK{| us~~ןO?y}\כ7t{G{s6~W.כ{vw?~>߻oϿ^珟ϝ8_uܿ?}/~]?|כ>'{߿>kO1W}|p?~==|kymo7ogߏߎ_??6ÿ?_;~o\??G??y/^yXopaߧ{tWMkQ|Xկ|G7___5~9_/ߟkϷ;/? /7?j?4[<ֽ{okOkoG7}g?W˿?o<?cϏv?:v|j?}OG_FwƯ??j񏎿vƯikۿz=}]?3n_}4^]V?O_V_/dU{uSƯn[wo]}߻u?????_?yyOkC1xwouw Ͽ7:coooo_uھ//ko;?7QW^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>} \ No newline at end of file diff --git a/client/hardnested/tables/bitflip_1_2c2_states.bin.z b/client/hardnested/tables/bitflip_1_2c2_states.bin.z new file mode 100644 index 00000000..a4cc5d58 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_2c2_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_2c6_states.bin.z b/client/hardnested/tables/bitflip_1_2c6_states.bin.z new file mode 100644 index 00000000..f7bb63eb Binary files /dev/null and b/client/hardnested/tables/bitflip_1_2c6_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_2d2_states.bin.z b/client/hardnested/tables/bitflip_1_2d2_states.bin.z new file mode 100644 index 00000000..4e5b2ff2 Binary files /dev/null and b/client/hardnested/tables/bitflip_1_2d2_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_2d6_states.bin.z b/client/hardnested/tables/bitflip_1_2d6_states.bin.z new file mode 100644 index 00000000..f8686dba Binary files /dev/null and b/client/hardnested/tables/bitflip_1_2d6_states.bin.z differ diff --git a/client/hardnested/tables/bitflip_1_328_states.bin.z b/client/hardnested/tables/bitflip_1_328_states.bin.z new file mode 100644 index 00000000..c8a8cf4a --- /dev/null +++ b/client/hardnested/tables/bitflip_1_328_states.bin.z @@ -0,0 +1 @@ +xOu3io%VkLSMd9E bJ!HHK{| us~~ןO?y}\כ7t{G{s6~W.כ{vw?~>߻oϿ^珟ϝ8_uܿ?}/~]?|כ>'{߿>kO1W}|p?~==|kymo7ogߏߎ_??6ÿ?_;~o\??G??y/^yXopaߧ{tWMkQ|Xկ|G7___5~9_/ߟkϷ;/? /7?j?4[<ֽ{okOkoG7}g?W˿?o<?cϏv?:v|j?}OG_FwƯ??j񏎿vƯikۿz=}]?3n_}4^]V?O_V_/dU{uSƯn[wo]}߻u?????_?yyOkC1xwouw Ͽ7:coooo_uھ//ko;?7QW^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>} \ No newline at end of file diff --git a/client/hardnested/tables/bitflip_1_388_states.bin.z b/client/hardnested/tables/bitflip_1_388_states.bin.z new file mode 100644 index 00000000..c8a8cf4a --- /dev/null +++ b/client/hardnested/tables/bitflip_1_388_states.bin.z @@ -0,0 +1 @@ +xOu3io%VkLSMd9E bJ!HHK{| us~~ןO?y}\כ7t{G{s6~W.כ{vw?~>߻oϿ^珟ϝ8_uܿ?}/~]?|כ>'{߿>kO1W}|p?~==|kymo7ogߏߎ_??6ÿ?_;~o\??G??y/^yXopaߧ{tWMkQ|Xկ|G7___5~9_/ߟkϷ;/? /7?j?4[<ֽ{okOkoG7}g?W˿?o<?cϏv?:v|j?}OG_FwƯ??j񏎿vƯikۿz=}]?3n_}4^]V?O_V_/dU{uSƯn[wo]}߻u?????_?yyOkC1xwouw Ͽ7:coooo_uھ//ko;?7QW^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>;5z[g?j?߿?{G{s6~Wߚ?O?﷼6~OϮ&~mh<_'g?[nw~p:?Y]/ fWOoi]Yvu2~g;s??[?oOs57777_o/?z{mƯmkM]_$I$I$]W^#NQ??vtu֟o㽿9_+o?o?O?_??[Y_g_o_}4^~;~?8?__.,U?J:w?Q??o?????_?97?]i׶{|/I$I$I.+~~|~_Nͨ֟o;:o7_篍?O?/????o-篍믷w_>/uV?O_V_/dU{uSƯn[wo]}߻\O???o[?/??__כnϮ_kۇ=ZSGח$I$I$Irq?>/f_oϷG]}x[s??O???_~7_{bįmGo_ǟO/a)W-7ϮNlO{O?o?O?oO__7~g_oo?K$I$I$}_3꯷ǎ.Mwt?kwEg?O????/??=o~?k]1k׶ˣu]~vOo?_EjgW_'n|'=G??o[?O?OO?GWW_/g믷?ma|Ͽԟo%I$I$I{u܏>icG?{Q_m&{;:"O???מ{v5kG??y?w__7jK_{7?o?_[??O[z_k6~m|_kϷ$I$I$I:wqe׌mv=p ~|y]kG???kۿz=}?z{Wh|]ן5wt}I$I$I$wy^{8}2wkF|Ϟ~[<mg5??oyg=m>]+Mxy4O~u???_~'2~u;W*dލ϶Dw?[??Okoooo_uv_>6ךm;$I$I$I<G>} \ No newline at end of file diff --git a/client/hardnested/tables/bitflip_1_3a0_states.bin.z b/client/hardnested/tables/bitflip_1_3a0_states.bin.z new file mode 100644 index 00000000..479bacb0 --- /dev/null +++ b/client/hardnested/tables/bitflip_1_3a0_states.bin.z @@ -0,0 +1 @@ +xMnFaWtщ|5o}4Lg ObOjzߟ1$_K߿rK->ɷޥ/~}K?kxzI,t_~[?~O}־}~;nnr|_O?鷷>ޯ_OCe9w}{}zǏa<㯿KŷwKIߧn;7I?鏗O/???O/O{??O_o/_?w_w_w?_?_?oO_w_Ow_?oO_w_OwO_o/_?w_w_w?_??O_o/_?w_w_w?_??_w?_??O_o/_?w_w_Ow_?oO_wO_o/_?w_w_w?_???oO_w_Ow_w?_??O_o/_?w_w__Ow_?oO_w?oO_w_Ow_w?_??O_o/_?w_w__Ow_?oO_wO_o/_?w_w_w?_??OO_ӿO??O??ӿ/?{g{gO??o??_'{???ӿ/???oO_w_Ow_??_oO????O/o?o??Oӿo????/?o?Oӿ/?O??w?_??O_o/_?w_w__o/_?w_w_w?_??O_o/_?w_w_w?_??OoO_w_Ow_?oO_w_Ow_?_oO????O/o?o??Oӿo????/?o?Oӿ/?O???_oO????O/o?o??Oӿo????/?o?Oӿ/?O?????_'{???ӿ/???OO_ӿO??O??ӿ/?{g{gO??o??_'{???ӿ/???OO_ӿO??O??ӿ/?{g{gO??oOw_?oO_w_Ow_?oO_w_O_w_Ow_?o???O/o?o??Oӿo????/?o?Oӿ/?O???_oO?_??O_o/_?w_w_w?_'{???ӿ/???OO_ӿO??O??ӿ/?{g{gO??o??????/?o?Oӿ/?O???_oO????O/o?o??Oӿow_w_w?_??O_o/_?_w_Ow_?oOw_w_w?_??O_o/_?_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_O_w_w?_??O_o/_?w_w_Ow_?oO_??O_o/_?w_w_w?_w_w?_??O_o/_?w_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_O_w_w?_??O_o/_?w_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_O_w_Ow_?oO_??O_o/_?w_w_w?w_?oO_w_Ow_w?_??O_o/_?w_w_Ow_?oO_w_Ow_?oO_??O_o/_?w_w_w?__?oO_w_Ow_w?_??O_o/_?w_w_Ow_?oO_w_?oO_w_Ow_?oO_w_Ow[ \ No newline at end of file diff --git a/client/mfkey.c b/client/mfkey.c new file mode 100644 index 00000000..a1fdbba1 --- /dev/null +++ b/client/mfkey.c @@ -0,0 +1,96 @@ +//----------------------------------------------------------------------------- +// Merlok - June 2011 +// Roel - Dec 2009 +// Unknown author +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// MIFARE Darkside hack +//----------------------------------------------------------------------------- +#include "mfkey.h" +#include "crapto1/crapto1.h" + +// recover key from 2 different reader responses on same tag challenge +bool mfkey32(nonces_t data, uint64_t *outputkey) { + struct Crypto1State *s,*t; + uint64_t outkey = 0; + uint64_t key = 0; // recovered key + bool isSuccess = false; + uint8_t counter = 0; + + s = lfsr_recovery32(data.ar ^ prng_successor(data.nonce, 64), 0); + + for(t = s; t->odd | t->even; ++t) { + lfsr_rollback_word(t, 0, 0); + lfsr_rollback_word(t, data.nr, 1); + lfsr_rollback_word(t, data.cuid ^ data.nonce, 0); + crypto1_get_lfsr(t, &key); + crypto1_word(t, data.cuid ^ data.nonce, 0); + crypto1_word(t, data.nr2, 1); + if (data.ar2 == (crypto1_word(t, 0, 0) ^ prng_successor(data.nonce, 64))) { + outkey = key; + counter++; + if (counter == 20) break; + } + } + isSuccess = (counter == 1); + *outputkey = ( isSuccess ) ? outkey : 0; + crypto1_destroy(s); + return isSuccess; +} + +// recover key from 2 reader responses on 2 different tag challenges +bool mfkey32_moebius(nonces_t data, uint64_t *outputkey) { + struct Crypto1State *s, *t; + uint64_t outkey = 0; + uint64_t key = 0; // recovered key + bool isSuccess = false; + int counter = 0; + + s = lfsr_recovery32(data.ar ^ prng_successor(data.nonce, 64), 0); + + for(t = s; t->odd | t->even; ++t) { + lfsr_rollback_word(t, 0, 0); + lfsr_rollback_word(t, data.nr, 1); + lfsr_rollback_word(t, data.cuid ^ data.nonce, 0); + crypto1_get_lfsr(t, &key); + + crypto1_word(t, data.cuid ^ data.nonce2, 0); + crypto1_word(t, data.nr2, 1); + if (data.ar2 == (crypto1_word(t, 0, 0) ^ prng_successor(data.nonce2, 64))) { + outkey=key; + ++counter; + if (counter==20) + break; + } + } + isSuccess = (counter == 1); + *outputkey = ( isSuccess ) ? outkey : 0; + crypto1_destroy(s); + return isSuccess; +} + +// recover key from reader response and tag response of one authentication sequence +int mfkey64(nonces_t data, uint64_t *outputkey){ + uint64_t key = 0; // recovered key + uint32_t ks2; // keystream used to encrypt reader response + uint32_t ks3; // keystream used to encrypt tag response + struct Crypto1State *revstate; + + // Extract the keystream from the messages + ks2 = data.ar ^ prng_successor(data.nonce, 64); + ks3 = data.at ^ prng_successor(data.nonce, 96); + revstate = lfsr_recovery64(ks2, ks3); + lfsr_rollback_word(revstate, 0, 0); + lfsr_rollback_word(revstate, 0, 0); + lfsr_rollback_word(revstate, data.nr, 1); + lfsr_rollback_word(revstate, data.cuid ^ data.nonce, 0); + crypto1_get_lfsr(revstate, &key); + crypto1_destroy(revstate); + *outputkey = key; + return 0; +} + + diff --git a/client/mfkey.h b/client/mfkey.h new file mode 100644 index 00000000..be32fe1b --- /dev/null +++ b/client/mfkey.h @@ -0,0 +1,24 @@ +//----------------------------------------------------------------------------- +// Merlok - June 2011 +// Roel - Dec 2009 +// Unknown author +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// MIFARE Darkside hack +//----------------------------------------------------------------------------- + +#ifndef MFKEY_H +#define MFKEY_H + +#include +#include +#include "mifare.h" + +extern bool mfkey32(nonces_t data, uint64_t *outputkey); +extern bool mfkey32_moebius(nonces_t data, uint64_t *outputkey); +extern int mfkey64(nonces_t data, uint64_t *outputkey); + +#endif diff --git a/client/usb_cmd_h2lua.awk b/client/usb_cmd_h2lua.awk new file mode 100644 index 00000000..8e003562 --- /dev/null +++ b/client/usb_cmd_h2lua.awk @@ -0,0 +1,15 @@ +BEGIN { + print "--[[" + print "These are Proxmark command definitions." + print "This file is automatically generated from usb_cmd.h - DON'T EDIT MANUALLY." + print "--]]" + print "local __commands = {" +} + +#$1 ~ /#define/ && $2 ~ /^CMD_([[:alnum:]_])+/ { print $2, "=", $3, "," } +$1 ~ /#define/ && $2 ~ /^CMD_[A-Za-z0-9_]+/ { sub(/\r/, ""); print $2, "=", $3 "," } + +END { + print "}" + print "return __commands" +} diff --git a/client/util_posix.c b/client/util_posix.c new file mode 100644 index 00000000..dd3d714c --- /dev/null +++ b/client/util_posix.c @@ -0,0 +1,133 @@ +//----------------------------------------------------------------------------- +// Copyright (C) 2010 iZsh +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// utilities requiring Posix library functions +//----------------------------------------------------------------------------- + +#if !defined(_WIN32) +#define _POSIX_C_SOURCE 199309L // need nanosleep() +#else +#include +#endif + +#include "util_posix.h" +#include +#include + + +// Timer functions +#if !defined (_WIN32) +#include + +static void nsleep(uint64_t n) { + struct timespec timeout; + timeout.tv_sec = n/1000000000; + timeout.tv_nsec = n%1000000000; + while (nanosleep(&timeout, &timeout) && errno == EINTR); +} + +void msleep(uint32_t n) { + nsleep(1000000 * (uint64_t)n); +} +#endif // _WIN32 + +#ifdef __MACH__ + + #define CLOCK_MONOTONIC (1) + #define CLOCK_REALTIME (2) + + #include + #include + #include + #include + + /* clock_gettime is not implemented on OSX prior to 10.12 */ + int _civet_clock_gettime(int clk_id, struct timespec *t); + + int _civet_clock_gettime(int clk_id, struct timespec *t) + { + memset(t, 0, sizeof(*t)); + if (clk_id == CLOCK_REALTIME) { + struct timeval now; + int rv = gettimeofday(&now, NULL); + if (rv) { + return rv; + } + t->tv_sec = now.tv_sec; + t->tv_nsec = now.tv_usec * 1000; + return 0; + + } else if (clk_id == CLOCK_MONOTONIC) { + static uint64_t clock_start_time = 0; + static mach_timebase_info_data_t timebase_ifo = {0, 0}; + + uint64_t now = mach_absolute_time(); + + if (clock_start_time == 0) { + //kern_return_t mach_status = mach_timebase_info(&timebase_ifo); + // appease "unused variable" warning for release builds + //(void)mach_status; + clock_start_time = now; + } + + now = (uint64_t)((double)(now - clock_start_time) + * (double)timebase_ifo.numer + / (double)timebase_ifo.denom); + + t->tv_sec = now / 1000000000; + t->tv_nsec = now % 1000000000; + return 0; + } + return -1; // EINVAL - Clock ID is unknown + } + + /* if clock_gettime is declared, then __CLOCK_AVAILABILITY will be defined */ + #ifdef __CLOCK_AVAILABILITY + /* If we compiled with Mac OSX 10.12 or later, then clock_gettime will be declared + * but it may be NULL at runtime. So we need to check before using it. */ + int _civet_safe_clock_gettime(int clk_id, struct timespec *t); + + int _civet_safe_clock_gettime(int clk_id, struct timespec *t) { + if( clock_gettime ) { + return clock_gettime(clk_id, t); + } + return _civet_clock_gettime(clk_id, t); + } + #define clock_gettime _civet_safe_clock_gettime + #else + #define clock_gettime _civet_clock_gettime + #endif + +#endif + + +// a milliseconds timer for performance measurement +uint64_t msclock() { +#if defined(_WIN32) + #include + + // WORKAROUND FOR MinGW (some versions - use if normal code does not compile) + // It has no _ftime_s and needs explicit inclusion of timeb.h + #include + struct _timeb t; + _ftime(&t); + return 1000 * t.time + t.millitm; + +// NORMAL CODE (use _ftime_s) + //struct _timeb t; + //if (_ftime_s(&t)) { + // return 0; + //} else { + // return 1000 * t.time + t.millitm; + //} +#else + struct timespec t; + clock_gettime(CLOCK_MONOTONIC, &t); + return (t.tv_sec * 1000 + t.tv_nsec / 1000000); +#endif +} + diff --git a/client/util_posix.h b/client/util_posix.h new file mode 100644 index 00000000..dcf9d99a --- /dev/null +++ b/client/util_posix.h @@ -0,0 +1,26 @@ +//----------------------------------------------------------------------------- +// Copyright (C) 2010 iZsh +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// utilities requiring Posix library functions +//----------------------------------------------------------------------------- + +#ifndef UTIL_POSIX_H__ +#define UTIL_POSIX_H__ + +#include + +#ifdef _WIN32 +# include +# define sleep(n) Sleep(1000 *(n)) +# define msleep(n) Sleep((n)) +#else +extern void msleep(uint32_t n); // sleep n milliseconds +#endif // _WIN32 + +extern uint64_t msclock(); // a milliseconds clock + +#endif diff --git a/common/crapto1/crapto1.c b/common/crapto1/crapto1.c new file mode 100644 index 00000000..54fbbbff --- /dev/null +++ b/common/crapto1/crapto1.c @@ -0,0 +1,556 @@ +/* crapto1.c + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, US$ + + Copyright (C) 2008-2014 bla +*/ +#include "crapto1.h" + +#include +#include "parity.h" + +#if !defined LOWMEM && defined __GNUC__ +static uint8_t filterlut[1 << 20]; +static void __attribute__((constructor)) fill_lut() +{ + uint32_t i; + for(i = 0; i < 1 << 20; ++i) + filterlut[i] = filter(i); +} +#define filter(x) (filterlut[(x) & 0xfffff]) +#endif + + + +typedef struct bucket { + uint32_t *head; + uint32_t *bp; +} bucket_t; + +typedef bucket_t bucket_array_t[2][0x100]; + +typedef struct bucket_info { + struct { + uint32_t *head, *tail; + } bucket_info[2][0x100]; + uint32_t numbuckets; + } bucket_info_t; + + +static void bucket_sort_intersect(uint32_t* const estart, uint32_t* const estop, + uint32_t* const ostart, uint32_t* const ostop, + bucket_info_t *bucket_info, bucket_array_t bucket) +{ + uint32_t *p1, *p2; + uint32_t *start[2]; + uint32_t *stop[2]; + + start[0] = estart; + stop[0] = estop; + start[1] = ostart; + stop[1] = ostop; + + // init buckets to be empty + for (uint32_t i = 0; i < 2; i++) { + for (uint32_t j = 0x00; j <= 0xff; j++) { + bucket[i][j].bp = bucket[i][j].head; + } + } + + // sort the lists into the buckets based on the MSB (contribution bits) + for (uint32_t i = 0; i < 2; i++) { + for (p1 = start[i]; p1 <= stop[i]; p1++) { + uint32_t bucket_index = (*p1 & 0xff000000) >> 24; + *(bucket[i][bucket_index].bp++) = *p1; + } + } + + + // write back intersecting buckets as sorted list. + // fill in bucket_info with head and tail of the bucket contents in the list and number of non-empty buckets. + uint32_t nonempty_bucket; + for (uint32_t i = 0; i < 2; i++) { + p1 = start[i]; + nonempty_bucket = 0; + for (uint32_t j = 0x00; j <= 0xff; j++) { + if (bucket[0][j].bp != bucket[0][j].head && bucket[1][j].bp != bucket[1][j].head) { // non-empty intersecting buckets only + bucket_info->bucket_info[i][nonempty_bucket].head = p1; + for (p2 = bucket[i][j].head; p2 < bucket[i][j].bp; *p1++ = *p2++); + bucket_info->bucket_info[i][nonempty_bucket].tail = p1 - 1; + nonempty_bucket++; + } + } + bucket_info->numbuckets = nonempty_bucket; + } +} +/** binsearch + * Binary search for the first occurence of *stop's MSB in sorted [start,stop] + */ +/* static inline uint32_t* binsearch(uint32_t *start, uint32_t *stop) +{ + uint32_t mid, val = *stop & 0xff000000; + while(start != stop) + if(start[mid = (stop - start) >> 1] > val) + stop = &start[mid]; + else + start += mid + 1; + + return start; +} + */ +/** update_contribution + * helper, calculates the partial linear feedback contributions and puts in MSB + */ +static inline void update_contribution(uint32_t *item, const uint32_t mask1, const uint32_t mask2) +{ + uint32_t p = *item >> 25; + + p = p << 1 | evenparity32(*item & mask1); + p = p << 1 | evenparity32(*item & mask2); + *item = p << 24 | (*item & 0xffffff); +} + +/** extend_table + * using a bit of the keystream extend the table of possible lfsr states + */ +static inline void extend_table(uint32_t *tbl, uint32_t **end, int bit, int m1, int m2, uint32_t in) +{ + in <<= 24; + for(*tbl <<= 1; tbl <= *end; *++tbl <<= 1) + if(filter(*tbl) ^ filter(*tbl | 1)) { + *tbl |= filter(*tbl) ^ bit; + update_contribution(tbl, m1, m2); + *tbl ^= in; + } else if(filter(*tbl) == bit) { + *++*end = tbl[1]; + tbl[1] = tbl[0] | 1; + update_contribution(tbl, m1, m2); + *tbl++ ^= in; + update_contribution(tbl, m1, m2); + *tbl ^= in; + } else + *tbl-- = *(*end)--; +} +/** extend_table_simple + * using a bit of the keystream extend the table of possible lfsr states + */ +static inline void extend_table_simple(uint32_t *tbl, uint32_t **end, int bit) +{ + for(*tbl <<= 1; tbl <= *end; *++tbl <<= 1) { + if(filter(*tbl) ^ filter(*tbl | 1)) { // replace + *tbl |= filter(*tbl) ^ bit; + } else if(filter(*tbl) == bit) { // insert + *++*end = *++tbl; + *tbl = tbl[-1] | 1; + } else { // drop + *tbl-- = *(*end)--; +} + } +} +/** recover + * recursively narrow down the search space, 4 bits of keystream at a time + */ +static struct Crypto1State* +recover(uint32_t *o_head, uint32_t *o_tail, uint32_t oks, + uint32_t *e_head, uint32_t *e_tail, uint32_t eks, int rem, + struct Crypto1State *sl, uint32_t in, bucket_array_t bucket) +{ + uint32_t *o, *e; + bucket_info_t bucket_info; + + if(rem == -1) { + for(e = e_head; e <= e_tail; ++e) { + *e = *e << 1 ^ evenparity32(*e & LF_POLY_EVEN) ^ !!(in & 4); + for(o = o_head; o <= o_tail; ++o, ++sl) { + sl->even = *o; + sl->odd = *e ^ evenparity32(*o & LF_POLY_ODD); + sl[1].odd = sl[1].even = 0; + } + } + return sl; + } + + for(uint32_t i = 0; i < 4 && rem--; i++) { + oks >>= 1; + eks >>= 1; + in >>= 2; + extend_table(o_head, &o_tail, oks & 1, LF_POLY_EVEN << 1 | 1, LF_POLY_ODD << 1, 0); + if(o_head > o_tail) + return sl; + + extend_table(e_head, &e_tail, eks & 1, LF_POLY_ODD, LF_POLY_EVEN << 1 | 1, in & 3); + if(e_head > e_tail) + return sl; + } + + bucket_sort_intersect(e_head, e_tail, o_head, o_tail, &bucket_info, bucket); + + for (int i = bucket_info.numbuckets - 1; i >= 0; i--) { + sl = recover(bucket_info.bucket_info[1][i].head, bucket_info.bucket_info[1][i].tail, oks, + bucket_info.bucket_info[0][i].head, bucket_info.bucket_info[0][i].tail, eks, + rem, sl, in, bucket); + } + + return sl; +} +/** lfsr_recovery + * recover the state of the lfsr given 32 bits of the keystream + * additionally you can use the in parameter to specify the value + * that was fed into the lfsr at the time the keystream was generated + */ +struct Crypto1State* lfsr_recovery32(uint32_t ks2, uint32_t in) +{ + struct Crypto1State *statelist; + uint32_t *odd_head = 0, *odd_tail = 0, oks = 0; + uint32_t *even_head = 0, *even_tail = 0, eks = 0; + int i; + + // split the keystream into an odd and even part + for(i = 31; i >= 0; i -= 2) + oks = oks << 1 | BEBIT(ks2, i); + for(i = 30; i >= 0; i -= 2) + eks = eks << 1 | BEBIT(ks2, i); + + odd_head = odd_tail = malloc(sizeof(uint32_t) << 21); + even_head = even_tail = malloc(sizeof(uint32_t) << 21); + statelist = malloc(sizeof(struct Crypto1State) << 18); + if(!odd_tail-- || !even_tail-- || !statelist) { + free(statelist); + statelist = 0; + goto out; + } + + statelist->odd = statelist->even = 0; + + // allocate memory for out of place bucket_sort + bucket_array_t bucket; + + for (uint32_t i = 0; i < 2; i++) { + for (uint32_t j = 0; j <= 0xff; j++) { + bucket[i][j].head = malloc(sizeof(uint32_t)<<14); + if (!bucket[i][j].head) { + goto out; + } + } + } + + // initialize statelists: add all possible states which would result into the rightmost 2 bits of the keystream + for(i = 1 << 20; i >= 0; --i) { + if(filter(i) == (oks & 1)) + *++odd_tail = i; + if(filter(i) == (eks & 1)) + *++even_tail = i; + } + + // extend the statelists. Look at the next 8 Bits of the keystream (4 Bit each odd and even): + for(i = 0; i < 4; i++) { + extend_table_simple(odd_head, &odd_tail, (oks >>= 1) & 1); + extend_table_simple(even_head, &even_tail, (eks >>= 1) & 1); + } + + // the statelists now contain all states which could have generated the last 10 Bits of the keystream. + // 22 bits to go to recover 32 bits in total. From now on, we need to take the "in" + // parameter into account. + in = (in >> 16 & 0xff) | (in << 16) | (in & 0xff00); // Byte swapping + recover(odd_head, odd_tail, oks, even_head, even_tail, eks, 11, statelist, in << 1, bucket); + +out: + free(odd_head); + free(even_head); + for (uint32_t i = 0; i < 2; i++) + for (uint32_t j = 0; j <= 0xff; j++) + free(bucket[i][j].head); + + return statelist; +} + +static const uint32_t S1[] = { 0x62141, 0x310A0, 0x18850, 0x0C428, 0x06214, + 0x0310A, 0x85E30, 0xC69AD, 0x634D6, 0xB5CDE, 0xDE8DA, 0x6F46D, 0xB3C83, + 0x59E41, 0xA8995, 0xD027F, 0x6813F, 0x3409F, 0x9E6FA}; +static const uint32_t S2[] = { 0x3A557B00, 0x5D2ABD80, 0x2E955EC0, 0x174AAF60, + 0x0BA557B0, 0x05D2ABD8, 0x0449DE68, 0x048464B0, 0x42423258, 0x278192A8, + 0x156042D0, 0x0AB02168, 0x43F89B30, 0x61FC4D98, 0x765EAD48, 0x7D8FDD20, + 0x7EC7EE90, 0x7F63F748, 0x79117020}; +static const uint32_t T1[] = { + 0x4F37D, 0x279BE, 0x97A6A, 0x4BD35, 0x25E9A, 0x12F4D, 0x097A6, 0x80D66, + 0xC4006, 0x62003, 0xB56B4, 0x5AB5A, 0xA9318, 0xD0F39, 0x6879C, 0xB057B, + 0x582BD, 0x2C15E, 0x160AF, 0x8F6E2, 0xC3DC4, 0xE5857, 0x72C2B, 0x39615, + 0x98DBF, 0xC806A, 0xE0680, 0x70340, 0x381A0, 0x98665, 0x4C332, 0xA272C}; +static const uint32_t T2[] = { 0x3C88B810, 0x5E445C08, 0x2982A580, 0x14C152C0, + 0x4A60A960, 0x253054B0, 0x52982A58, 0x2FEC9EA8, 0x1156C4D0, 0x08AB6268, + 0x42F53AB0, 0x217A9D58, 0x161DC528, 0x0DAE6910, 0x46D73488, 0x25CB11C0, + 0x52E588E0, 0x6972C470, 0x34B96238, 0x5CFC3A98, 0x28DE96C8, 0x12CFC0E0, + 0x4967E070, 0x64B3F038, 0x74F97398, 0x7CDC3248, 0x38CE92A0, 0x1C674950, + 0x0E33A4A8, 0x01B959D0, 0x40DCACE8, 0x26CEDDF0}; +static const uint32_t C1[] = { 0x846B5, 0x4235A, 0x211AD}; +static const uint32_t C2[] = { 0x1A822E0, 0x21A822E0, 0x21A822E0}; +/** Reverse 64 bits of keystream into possible cipher states + * Variation mentioned in the paper. Somewhat optimized version + */ +struct Crypto1State* lfsr_recovery64(uint32_t ks2, uint32_t ks3) +{ + struct Crypto1State *statelist, *sl; + uint8_t oks[32], eks[32], hi[32]; + uint32_t low = 0, win = 0; + uint32_t *tail, table[1 << 16]; + int i, j; + + sl = statelist = malloc(sizeof(struct Crypto1State) << 4); + if(!sl) + return 0; + sl->odd = sl->even = 0; + + for(i = 30; i >= 0; i -= 2) { + oks[i >> 1] = BEBIT(ks2, i); + oks[16 + (i >> 1)] = BEBIT(ks3, i); + } + for(i = 31; i >= 0; i -= 2) { + eks[i >> 1] = BEBIT(ks2, i); + eks[16 + (i >> 1)] = BEBIT(ks3, i); + } + + for(i = 0xfffff; i >= 0; --i) { + if (filter(i) != oks[0]) + continue; + + *(tail = table) = i; + for(j = 1; tail >= table && j < 29; ++j) + extend_table_simple(table, &tail, oks[j]); + + if(tail < table) + continue; + + for(j = 0; j < 19; ++j) + low = low << 1 | evenparity32(i & S1[j]); + for(j = 0; j < 32; ++j) + hi[j] = evenparity32(i & T1[j]); + + for(; tail >= table; --tail) { + for(j = 0; j < 3; ++j) { + *tail = *tail << 1; + *tail |= evenparity32((i & C1[j]) ^ (*tail & C2[j])); + if(filter(*tail) != oks[29 + j]) + goto continue2; + } + + for(j = 0; j < 19; ++j) + win = win << 1 | evenparity32(*tail & S2[j]); + + win ^= low; + for(j = 0; j < 32; ++j) { + win = win << 1 ^ hi[j] ^ evenparity32(*tail & T2[j]); + if(filter(win) != eks[j]) + goto continue2; + } + + *tail = *tail << 1 | evenparity32(LF_POLY_EVEN & *tail); + sl->odd = *tail ^ evenparity32(LF_POLY_ODD & win); + sl->even = win; + ++sl; + sl->odd = sl->even = 0; + continue2:; + } + } + return statelist; +} + +/** lfsr_rollback_bit + * Rollback the shift register in order to get previous states + */ +uint8_t lfsr_rollback_bit(struct Crypto1State *s, uint32_t in, int fb) +{ + int out; + uint8_t ret; + uint32_t t; + + s->odd &= 0xffffff; + t = s->odd, s->odd = s->even, s->even = t; + + out = s->even & 1; + out ^= LF_POLY_EVEN & (s->even >>= 1); + out ^= LF_POLY_ODD & s->odd; + out ^= !!in; + out ^= (ret = filter(s->odd)) & !!fb; + + s->even |= evenparity32(out) << 23; + return ret; +} +/** lfsr_rollback_byte + * Rollback the shift register in order to get previous states + */ +uint8_t lfsr_rollback_byte(struct Crypto1State *s, uint32_t in, int fb) +{ + int i, ret=0; + for (i = 7; i >= 0; --i) + ret |= lfsr_rollback_bit(s, BIT(in, i), fb) << i; + return ret; +} +/** lfsr_rollback_word + * Rollback the shift register in order to get previous states + */ +uint32_t lfsr_rollback_word(struct Crypto1State *s, uint32_t in, int fb) +{ + int i; + uint32_t ret = 0; + for (i = 31; i >= 0; --i) + ret |= lfsr_rollback_bit(s, BEBIT(in, i), fb) << (i ^ 24); + return ret; +} + +/** nonce_distance + * x,y valid tag nonces, then prng_successor(x, nonce_distance(x, y)) = y + */ +static uint16_t *dist = 0; +int nonce_distance(uint32_t from, uint32_t to) +{ + uint16_t x, i; + if(!dist) { + dist = malloc(2 << 16); + if(!dist) + return -1; + for (x = i = 1; i; ++i) { + dist[(x & 0xff) << 8 | x >> 8] = i; + x = x >> 1 | (x ^ x >> 2 ^ x >> 3 ^ x >> 5) << 15; + } + } + return (65535 + dist[to >> 16] - dist[from >> 16]) % 65535; +} + +/** validate_prng_nonce + * Determine if nonce is deterministic. ie: Suspectable to Darkside attack. + * returns + * true = weak prng + * false = hardend prng + */ +bool validate_prng_nonce(uint32_t nonce) { + // init prng table: + nonce_distance(nonce, nonce); + return ((65535 - dist[nonce >> 16] + dist[nonce & 0xffff]) % 65535) == 16; +} + +static uint32_t fastfwd[2][8] = { + { 0, 0x4BC53, 0xECB1, 0x450E2, 0x25E29, 0x6E27A, 0x2B298, 0x60ECB}, + { 0, 0x1D962, 0x4BC53, 0x56531, 0xECB1, 0x135D3, 0x450E2, 0x58980}}; + + +/** lfsr_prefix_ks + * + * Is an exported helper function from the common prefix attack + * Described in the "dark side" paper. It returns an -1 terminated array + * of possible partial(21 bit) secret state. + * The required keystream(ks) needs to contain the keystream that was used to + * encrypt the NACK which is observed when varying only the 3 last bits of Nr + * only correct iff [NR_3] ^ NR_3 does not depend on Nr_3 + */ +uint32_t *lfsr_prefix_ks(uint8_t ks[8], int isodd) +{ + uint32_t *candidates = malloc(4 << 10); + if(!candidates) return 0; + + uint32_t c, entry; + int size = 0, i, good; + + for(i = 0; i < 1 << 21; ++i) { + for(c = 0, good = 1; good && c < 8; ++c) { + entry = i ^ fastfwd[isodd][c]; + good &= (BIT(ks[c], isodd) == filter(entry >> 1)); + good &= (BIT(ks[c], isodd + 2) == filter(entry)); + } + if(good) + candidates[size++] = i; + } + + candidates[size] = -1; + + return candidates; +} + +/** check_pfx_parity + * helper function which eliminates possible secret states using parity bits + */ +static struct Crypto1State* +check_pfx_parity(uint32_t prefix, uint32_t rresp, uint8_t parities[8][8], + uint32_t odd, uint32_t even, struct Crypto1State* sl, uint32_t no_par) +{ + uint32_t ks1, nr, ks2, rr, ks3, c, good = 1; + + for(c = 0; good && c < 8; ++c) { + sl->odd = odd ^ fastfwd[1][c]; + sl->even = even ^ fastfwd[0][c]; + + lfsr_rollback_bit(sl, 0, 0); + lfsr_rollback_bit(sl, 0, 0); + + ks3 = lfsr_rollback_bit(sl, 0, 0); + ks2 = lfsr_rollback_word(sl, 0, 0); + ks1 = lfsr_rollback_word(sl, prefix | c << 5, 1); + + if (no_par) + break; + + nr = ks1 ^ (prefix | c << 5); + rr = ks2 ^ rresp; + + good &= evenparity32(nr & 0x000000ff) ^ parities[c][3] ^ BIT(ks2, 24); + good &= evenparity32(rr & 0xff000000) ^ parities[c][4] ^ BIT(ks2, 16); + good &= evenparity32(rr & 0x00ff0000) ^ parities[c][5] ^ BIT(ks2, 8); + good &= evenparity32(rr & 0x0000ff00) ^ parities[c][6] ^ BIT(ks2, 0); + good &= evenparity32(rr & 0x000000ff) ^ parities[c][7] ^ ks3; + } + + return sl + good; +} + + +/** lfsr_common_prefix + * Implentation of the common prefix attack. + * Requires the 28 bit constant prefix used as reader nonce (pfx) + * The reader response used (rr) + * The keystream used to encrypt the observed NACK's (ks) + * The parity bits (par) + * It returns a zero terminated list of possible cipher states after the + * tag nonce was fed in + */ +struct Crypto1State* +lfsr_common_prefix(uint32_t pfx, uint32_t rr, uint8_t ks[8], uint8_t par[8][8], uint32_t no_par) +{ + struct Crypto1State *statelist, *s; + uint32_t *odd, *even, *o, *e, top; + + odd = lfsr_prefix_ks(ks, 1); + even = lfsr_prefix_ks(ks, 0); + + s = statelist = malloc((sizeof *statelist) << 24); // was << 20. Need more for no_par special attack. Enough??? + if(!s || !odd || !even) { + free(statelist); + statelist = 0; + goto out; + } + + for(o = odd; *o + 1; ++o) + for(e = even; *e + 1; ++e) + for(top = 0; top < 64; ++top) { + *o += 1 << 21; + *e += (!(top & 7) + 1) << 21; + s = check_pfx_parity(pfx, rr, par, *o, *e, s, no_par); + } + + s->odd = s->even = 0; +out: + free(odd); + free(even); + return statelist; +} diff --git a/common/crapto1/crapto1.h b/common/crapto1/crapto1.h new file mode 100644 index 00000000..154e4cc8 --- /dev/null +++ b/common/crapto1/crapto1.h @@ -0,0 +1,82 @@ +/* crapto1.h + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, US$ + + Copyright (C) 2008-2014 bla +*/ +#ifndef CRAPTO1_INCLUDED +#define CRAPTO1_INCLUDED +#include +#include +#ifdef __cplusplus +extern "C" { +#endif + +struct Crypto1State {uint32_t odd, even;}; +#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); +#endif +void crypto1_destroy(struct Crypto1State*); +void crypto1_get_lfsr(struct Crypto1State*, uint64_t*); +uint8_t crypto1_bit(struct Crypto1State*, uint8_t, int); +uint8_t crypto1_byte(struct Crypto1State*, uint8_t, int); +uint32_t crypto1_word(struct Crypto1State*, uint32_t, int); +uint32_t prng_successor(uint32_t x, uint32_t n); + +struct Crypto1State* lfsr_recovery32(uint32_t ks2, uint32_t in); +struct Crypto1State* lfsr_recovery64(uint32_t ks2, uint32_t ks3); +uint32_t *lfsr_prefix_ks(uint8_t ks[8], int isodd); +struct Crypto1State* +lfsr_common_prefix(uint32_t pfx, uint32_t rr, uint8_t ks[8], uint8_t par[8][8], uint32_t no_par); + + +uint8_t lfsr_rollback_bit(struct Crypto1State* s, uint32_t in, int fb); +uint8_t lfsr_rollback_byte(struct Crypto1State* s, uint32_t in, int fb); +uint32_t lfsr_rollback_word(struct Crypto1State* s, uint32_t in, int fb); +int nonce_distance(uint32_t from, uint32_t to); +extern bool validate_prng_nonce(uint32_t nonce); +#define FOREACH_VALID_NONCE(N, FILTER, FSIZE)\ + uint32_t __n = 0,__M = 0, N = 0;\ + int __i;\ + for(; __n < 1 << 16; N = prng_successor(__M = ++__n, 16))\ + for(__i = FSIZE - 1; __i >= 0; __i--)\ + if(BIT(FILTER, __i) ^ evenparity32(__M & 0xFF01))\ + break;\ + else if(__i)\ + __M = prng_successor(__M, (__i == 7) ? 48 : 8);\ + else + +#define LF_POLY_ODD (0x29CE5C) +#define LF_POLY_EVEN (0x870804) +#define BIT(x, n) ((x) >> (n) & 1) +#define BEBIT(x, n) BIT(x, (n) ^ 24) +static inline int filter(uint32_t const x) +{ + uint32_t f; + + f = 0xf22c0 >> (x & 0xf) & 16; + f |= 0x6c9c0 >> (x >> 4 & 0xf) & 8; + f |= 0x3c8b0 >> (x >> 8 & 0xf) & 4; + f |= 0x1e458 >> (x >> 12 & 0xf) & 2; + f |= 0x0d938 >> (x >> 16 & 0xf) & 1; + return BIT(0xEC57E80A, f); +} +#ifdef __cplusplus +} +#endif +#endif diff --git a/common/crapto1/crypto1.c b/common/crapto1/crypto1.c new file mode 100644 index 00000000..4ddcb23d --- /dev/null +++ b/common/crapto1/crypto1.c @@ -0,0 +1,119 @@ +/* crypto1.c + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, US + + 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__) && !defined(__linux__) && !defined(_WIN32) && !defined(__APPLE__) // bare metal ARM Proxmark lacks malloc()/free() +void crypto1_create(struct Crypto1State *s, uint64_t key) +{ + 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; +} +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)); + if ( !s ) return NULL; + + s->odd = s->even = 0; + + int i; + //for(i = 47;s && i > 0; i -= 2) { + for(i = 47; 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); +} +#endif +void crypto1_get_lfsr(struct Crypto1State *state, uint64_t *lfsr) +{ + int i; + for(*lfsr = 0, i = 23; i >= 0; --i) { + *lfsr = *lfsr << 1 | BIT(state->odd, i ^ 3); + *lfsr = *lfsr << 1 | BIT(state->even, i ^ 3); + } +} +uint8_t crypto1_bit(struct Crypto1State *s, uint8_t in, int is_encrypted) +{ + uint32_t feedin, tmp; + 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 | evenparity32(feedin); + + tmp = s->odd; + s->odd = s->even; + s->even = tmp; + + return ret; +} +uint8_t crypto1_byte(struct Crypto1State *s, uint8_t in, int is_encrypted) +{ + uint8_t i, ret = 0; + + for (i = 0; i < 8; ++i) + ret |= crypto1_bit(s, BIT(in, i), is_encrypted) << i; + + return ret; +} +uint32_t crypto1_word(struct Crypto1State *s, uint32_t in, int is_encrypted) +{ + uint32_t i, ret = 0; + + for (i = 0; i < 32; ++i) + ret |= crypto1_bit(s, BEBIT(in, i), is_encrypted) << (i ^ 24); + + return ret; +} + +/* prng_successor + * helper used to obscure the keystream during authentication + */ +uint32_t prng_successor(uint32_t x, uint32_t n) +{ + SWAPENDIAN(x); + while(n--) + x = x >> 1 | (x >> 16 ^ x >> 18 ^ x >> 19 ^ x >> 21) << 31; + + return SWAPENDIAN(x); +} diff --git a/common/crapto1/readme b/common/crapto1/readme new file mode 100644 index 00000000..d57fa3e0 --- /dev/null +++ b/common/crapto1/readme @@ -0,0 +1,27 @@ +CRAPTO1 +------- + Provides a set of library functions which aid the verification + of crypto1 weaknesses. + + In short a partial implementation of: + Dismantling MIFARE Classic + URL: http://www.sos.cs.ru.nl/applications/rfid/2008-esorics.pdf + Flavio D. Garcia, Gerhard de Koning Gans, Ruben Muijrers, + Peter van Rossum, Roel Verdult, Ronny Wichers Schreur, Bart Jacobs + Institute for Computing and Information Sciences, + Radboud University Nijmegen, The Netherlands + {{flaviog,petervr,ronny,bart}@cs, {gkoningg,rmuijrer,rverdult}@sci}.ru.nl + and + Wirelessly Pickpocketing a Mifare Classic Card + URL: http://www.cs.ru.nl/~flaviog/publications/Pickpocketing.Mifare.pdf + Flavio D. Garcia, Peter van Rossum, Roel Verdult, Ronny Wichers Schreur + Radboud University Nijmegen, The Netherlands + {flaviog,petervr,rverdult,ronny}@cs.ru.nl + and + THE DARK SIDE OF SECURITY BY OBSCURITY + URL: http://eprint.iacr.org/2009/137 + and Cloning MiFare Classic Rail and Building Passes, Anywhere, Anytime + Nicolas T. Courtois + University College London, Computer Science, + Gower street, WC1E 6BT, London, UK + diff --git a/uart/README.md b/uart/README.md new file mode 100644 index 00000000..218e983c --- /dev/null +++ b/uart/README.md @@ -0,0 +1,13 @@ +# uart + +This contains functionality for talking to UART/Serial devices on different platforms. The official client will build either `uart_posix.c` and `uart_win32.c`. Build targets for these files are contained in `client/Makefile`. + +If you want to implement support for other platforms, you need to implement the methods provided in `uart.h`. + +## Implementing a new driver + +Each driver is called with a string, typically containing a path or other reference to a serial port on the host. The methods outlined in `uart.h` need to be implemented. + +The hardware uses `common/usb_cdc.c` to implement a USB CDC endpoint exposed by the Atmel MCU. + + diff --git a/uart/uart.h b/uart/uart.h new file mode 100644 index 00000000..fe75a683 --- /dev/null +++ b/uart/uart.h @@ -0,0 +1,98 @@ +/* + * Generic uart / rs232/ serial port library + * + * Copyright (c) 2013, Roel Verdult + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @file uart.h + */ + +#ifndef _PM3_UART_H_ +#define _PM3_UART_H_ + +#include +#include +#include + +#include +#include + +typedef unsigned char byte_t; + +/* serial_port is declared as a void*, which you should cast to whatever type + * makes sense to your connection method. Both the posix and win32 + * implementations define their own structs in place. + */ +typedef void* serial_port; + +/* Returned by uart_open if the serial port specified was invalid. + */ +#define INVALID_SERIAL_PORT (void*)(~1) + +/* Returned by uart_open if the serial port specified is in use by another + * process. + */ +#define CLAIMED_SERIAL_PORT (void*)(~2) + +/* Given a user-specified port name, connect to the port and return a structure + * used for future references to that port. + * + * On errors, this method returns INVALID_SERIAL_PORT or CLAIMED_SERIAL_PORT. + */ +serial_port uart_open(const char* pcPortName); + +/* Closes the given port. + */ +void uart_close(const serial_port sp); + +/* Reads from the given serial port for up to 30ms. + * pbtRx: A pointer to a buffer for the returned data to be written to. + * pszMaxRxLen: The maximum data size we want to be sent. + * pszRxLen: The number of bytes that we were actually sent. + * + * Returns TRUE if any data was fetched, even if it was less than pszMaxRxLen. + * + * Returns FALSE if there was an error reading from the device. Note that a + * partial read may have completed into the buffer by the corresponding + * implementation, so pszRxLen should be checked to see if any data was written. + */ +bool uart_receive(const serial_port sp, byte_t* pbtRx, size_t pszMaxRxLen, size_t* pszRxLen); + +/* Sends a buffer to a given serial port. + * pbtTx: A pointer to a buffer containing the data to send. + * szTxLen: The amount of data to be sent. + */ +bool uart_send(const serial_port sp, const byte_t* pbtTx, const size_t szTxLen); + +/* Sets the current speed of the serial port, in baud. + */ +bool uart_set_speed(serial_port sp, const uint32_t uiPortSpeed); + +/* Gets the current speed of the serial port, in baud. + */ +uint32_t uart_get_speed(const serial_port sp); + +#endif // _PM3_UART_H_ + diff --git a/uart/uart_posix.c b/uart/uart_posix.c new file mode 100644 index 00000000..3db8873e --- /dev/null +++ b/uart/uart_posix.c @@ -0,0 +1,337 @@ +/* + * Generic uart / rs232/ serial port library + * + * Copyright (c) 2013, Roel Verdult + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @file uart_posix.c + * + * This version of the library has functionality removed which was not used by + * proxmark3 project. + */ + +#include "uart.h" + +// Test if we are dealing with posix operating systems +#ifndef _WIN32 +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef struct termios term_info; +typedef struct { + int fd; // Serial port file descriptor + term_info tiOld; // Terminal info before using the port + term_info tiNew; // Terminal info during the transaction +} serial_port_unix; + +// Set time-out on 30 miliseconds +const struct timeval timeout = { + .tv_sec = 0, // 0 second + .tv_usec = 30000 // 30000 micro seconds +}; + +serial_port uart_open(const char* pcPortName) +{ + serial_port_unix* sp = malloc(sizeof(serial_port_unix)); + if (sp == 0) return INVALID_SERIAL_PORT; + + sp->fd = open(pcPortName, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK); + if(sp->fd == -1) { + uart_close(sp); + return INVALID_SERIAL_PORT; + } + + // Finally figured out a way to claim a serial port interface under unix + // We just try to set a (advisory) lock on the file descriptor + struct flock fl; + fl.l_type = F_WRLCK; + fl.l_whence = SEEK_SET; + fl.l_start = 0; + fl.l_len = 0; + fl.l_pid = getpid(); + + // Does the system allows us to place a lock on this file descriptor + if (fcntl(sp->fd, F_SETLK, &fl) == -1) { + // A conflicting lock is held by another process + free(sp); + return CLAIMED_SERIAL_PORT; + } + + // Try to retrieve the old (current) terminal info struct + if(tcgetattr(sp->fd,&sp->tiOld) == -1) { + uart_close(sp); + return INVALID_SERIAL_PORT; + } + + // Duplicate the (old) terminal info struct + sp->tiNew = sp->tiOld; + + // Configure the serial port + sp->tiNew.c_cflag = CS8 | CLOCAL | CREAD; + sp->tiNew.c_iflag = IGNPAR; + sp->tiNew.c_oflag = 0; + sp->tiNew.c_lflag = 0; + + // Block until n bytes are received + sp->tiNew.c_cc[VMIN] = 0; + // Block until a timer expires (n * 100 mSec.) + sp->tiNew.c_cc[VTIME] = 0; + + // Try to set the new terminal info struct + if(tcsetattr(sp->fd,TCSANOW,&sp->tiNew) == -1) { + uart_close(sp); + return INVALID_SERIAL_PORT; + } + + // Flush all lingering data that may exist + tcflush(sp->fd, TCIOFLUSH); + + // set speed, works for UBUNTU 14.04 + bool err = uart_set_speed(sp, 460800); + if (!err) + uart_set_speed(sp, 115200); + + return sp; +} + +void uart_close(const serial_port sp) { + serial_port_unix* spu = (serial_port_unix*)sp; + tcflush(spu->fd,TCIOFLUSH); + tcsetattr(spu->fd,TCSANOW,&(spu->tiOld)); + struct flock fl; + fl.l_type = F_UNLCK; + fl.l_whence = SEEK_SET; + fl.l_start = 0; + fl.l_len = 0; + fl.l_pid = getpid(); + + // Does the system allows us to place a lock on this file descriptor + int err = fcntl(spu->fd, F_SETLK, &fl); + if ( err == -1) { + //perror("fcntl"); + } + close(spu->fd); + free(sp); +} + +bool uart_cts(const serial_port sp) { + char status; + if (ioctl(((serial_port_unix*)sp)->fd,TIOCMGET,&status) < 0) return false; + return (status & TIOCM_CTS); +} + +bool uart_receive(const serial_port sp, byte_t* pbtRx, size_t pszMaxRxLen, size_t* pszRxLen) { + int res; + int byteCount; + fd_set rfds; + struct timeval tv; + + // Reset the output count + *pszRxLen = 0; + + do { + // Reset file descriptor + FD_ZERO(&rfds); + FD_SET(((serial_port_unix*)sp)->fd,&rfds); + tv = timeout; + res = select(((serial_port_unix*)sp)->fd+1, &rfds, NULL, NULL, &tv); + + // Read error + if (res < 0) { + return false; + } + + // Read time-out + if (res == 0) { + if (*pszRxLen == 0) { + // Error, we received no data + return false; + } else { + // We received some data, but nothing more is available + return true; + } + } + + // Retrieve the count of the incoming bytes + res = ioctl(((serial_port_unix*)sp)->fd, FIONREAD, &byteCount); + if (res < 0) return false; + + // Cap the number of bytes, so we don't overrun the buffer + if (pszMaxRxLen - (*pszRxLen) < byteCount) { + byteCount = pszMaxRxLen - (*pszRxLen); + } + + // There is something available, read the data + res = read(((serial_port_unix*)sp)->fd, pbtRx+(*pszRxLen), byteCount); + + // Stop if the OS has some troubles reading the data + if (res <= 0) return false; + + *pszRxLen += res; + + if (*pszRxLen == pszMaxRxLen) { + // We have all the data we wanted. + return true; + } + + } while (byteCount); + + return true; +} + +bool uart_send(const serial_port sp, const byte_t* pbtTx, const size_t szTxLen) { + int32_t res; + size_t szPos = 0; + fd_set rfds; + struct timeval tv; + + while (szPos < szTxLen) { + // Reset file descriptor + FD_ZERO(&rfds); + FD_SET(((serial_port_unix*)sp)->fd,&rfds); + tv = timeout; + res = select(((serial_port_unix*)sp)->fd+1, NULL, &rfds, NULL, &tv); + + // Write error + if (res < 0) { + printf("write error\n"); + return false; + } + + // Write time-out + if (res == 0) { + printf("write time-out\n"); + return false; + } + + // Send away the bytes + res = write(((serial_port_unix*)sp)->fd,pbtTx+szPos,szTxLen-szPos); + + // Stop if the OS has some troubles sending the data + if (res <= 0) { + printf("os troubles\n"); + return false; + } + + szPos += res; + } + return true; +} + +bool uart_set_speed(serial_port sp, const uint32_t uiPortSpeed) { + const serial_port_unix* spu = (serial_port_unix*)sp; + speed_t stPortSpeed; + switch (uiPortSpeed) { + case 0: stPortSpeed = B0; break; + case 50: stPortSpeed = B50; break; + case 75: stPortSpeed = B75; break; + case 110: stPortSpeed = B110; break; + case 134: stPortSpeed = B134; break; + case 150: stPortSpeed = B150; break; + case 300: stPortSpeed = B300; break; + case 600: stPortSpeed = B600; break; + case 1200: stPortSpeed = B1200; break; + case 1800: stPortSpeed = B1800; break; + case 2400: stPortSpeed = B2400; break; + case 4800: stPortSpeed = B4800; break; + case 9600: stPortSpeed = B9600; break; + case 19200: stPortSpeed = B19200; break; + case 38400: stPortSpeed = B38400; break; +# ifdef B57600 + case 57600: stPortSpeed = B57600; break; +# endif +# ifdef B115200 + case 115200: stPortSpeed = B115200; break; +# endif +# ifdef B230400 + case 230400: stPortSpeed = B230400; break; +# endif +# ifdef B460800 + case 460800: stPortSpeed = B460800; break; +# endif +# ifdef B921600 + case 921600: stPortSpeed = B921600; break; +# endif + default: return false; + }; + struct termios ti; + if (tcgetattr(spu->fd,&ti) == -1) return false; + // Set port speed (Input and Output) + cfsetispeed(&ti,stPortSpeed); + cfsetospeed(&ti,stPortSpeed); + return (tcsetattr(spu->fd,TCSANOW,&ti) != -1); +} + +uint32_t uart_get_speed(const serial_port sp) { + struct termios ti; + uint32_t uiPortSpeed; + const serial_port_unix* spu = (serial_port_unix*)sp; + if (tcgetattr(spu->fd,&ti) == -1) return 0; + // Set port speed (Input) + speed_t stPortSpeed = cfgetispeed(&ti); + switch (stPortSpeed) { + case B0: uiPortSpeed = 0; break; + case B50: uiPortSpeed = 50; break; + case B75: uiPortSpeed = 75; break; + case B110: uiPortSpeed = 110; break; + case B134: uiPortSpeed = 134; break; + case B150: uiPortSpeed = 150; break; + case B300: uiPortSpeed = 300; break; + case B600: uiPortSpeed = 600; break; + case B1200: uiPortSpeed = 1200; break; + case B1800: uiPortSpeed = 1800; break; + case B2400: uiPortSpeed = 2400; break; + case B4800: uiPortSpeed = 4800; break; + case B9600: uiPortSpeed = 9600; break; + case B19200: uiPortSpeed = 19200; break; + case B38400: uiPortSpeed = 38400; break; +# ifdef B57600 + case B57600: uiPortSpeed = 57600; break; +# endif +# ifdef B115200 + case B115200: uiPortSpeed = 115200; break; +# endif +# ifdef B230400 + case B230400: uiPortSpeed = 230400; break; +# endif +# ifdef B460800 + case B460800: uiPortSpeed = 460800; break; +# endif +# ifdef B921600 + case B921600: uiPortSpeed = 921600; break; +# endif + default: return 0; + }; + return uiPortSpeed; +} + +#endif diff --git a/uart/uart_win32.c b/uart/uart_win32.c new file mode 100644 index 00000000..9213753d --- /dev/null +++ b/uart/uart_win32.c @@ -0,0 +1,140 @@ +/* + * Generic uart / rs232/ serial port library + * + * Copyright (c) 2013, Roel Verdult + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * @file uart_win32.c + * + * Note: the win32 version of this library has also been seen under the GPLv3+ + * license as part of the libnfc project, which appears to have additional + * contributors. + * + * This version of the library has functionality removed which was not used by + * proxmark3 project. + */ + +#include "uart.h" + +// The windows serial port implementation +#ifdef _WIN32 +#include + +typedef struct { + HANDLE hPort; // Serial port handle + DCB dcb; // Device control settings + COMMTIMEOUTS ct; // Serial port time-out configuration +} serial_port_windows; + +void upcase(char *p) { + while(*p != '\0') { + if(*p >= 97 && *p <= 122) { + *p -= 32; + } + ++p; + } +} + +serial_port uart_open(const char* pcPortName) { + char acPortName[255]; + serial_port_windows* sp = malloc(sizeof(serial_port_windows)); + + // Copy the input "com?" to "\\.\COM?" format + sprintf(acPortName,"\\\\.\\%s",pcPortName); + upcase(acPortName); + + // Try to open the serial port + sp->hPort = CreateFileA(acPortName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL); + if (sp->hPort == INVALID_HANDLE_VALUE) { + uart_close(sp); + return INVALID_SERIAL_PORT; + } + + // Prepare the device control + memset(&sp->dcb, 0, sizeof(DCB)); + sp->dcb.DCBlength = sizeof(DCB); + if(!BuildCommDCBA("baud=115200 parity=N data=8 stop=1",&sp->dcb)) { + uart_close(sp); + return INVALID_SERIAL_PORT; + } + + // Update the active serial port + if(!SetCommState(sp->hPort,&sp->dcb)) { + uart_close(sp); + return INVALID_SERIAL_PORT; + } + // all zero's configure: no timeout for read/write used. + sp->ct.ReadIntervalTimeout = 0;//1; + sp->ct.ReadTotalTimeoutMultiplier = 0;//1; + sp->ct.ReadTotalTimeoutConstant = 30; + sp->ct.WriteTotalTimeoutMultiplier = 0;//1; + sp->ct.WriteTotalTimeoutConstant = 30; + + if(!SetCommTimeouts(sp->hPort,&sp->ct)) { + uart_close(sp); + return INVALID_SERIAL_PORT; + } + + PurgeComm(sp->hPort, PURGE_RXABORT | PURGE_RXCLEAR); + + bool err = uart_set_speed(sp, 460800); + if (!err) + uart_set_speed(sp, 115200); + + return sp; +} + +void uart_close(const serial_port sp) { + CloseHandle(((serial_port_windows*)sp)->hPort); + free(sp); +} + +bool uart_receive(const serial_port sp, byte_t* pbtRx, size_t pszMaxRxLen, size_t* pszRxLen) { + ReadFile(((serial_port_windows*)sp)->hPort,pbtRx,pszMaxRxLen,(LPDWORD)pszRxLen,NULL); + return (*pszRxLen != 0); +} + +bool uart_send(const serial_port sp, const byte_t* pbtTx, const size_t szTxLen) { + DWORD dwTxLen = 0; + return WriteFile(((serial_port_windows*)sp)->hPort,pbtTx,szTxLen,&dwTxLen,NULL); + return (dwTxLen != 0); +} + +bool uart_set_speed(serial_port sp, const uint32_t uiPortSpeed) { + serial_port_windows* spw; + spw = (serial_port_windows*)sp; + spw->dcb.BaudRate = uiPortSpeed; + return SetCommState(spw->hPort, &spw->dcb); +} + +uint32_t uart_get_speed(const serial_port sp) { + const serial_port_windows* spw = (serial_port_windows*)sp; + if (!GetCommState(spw->hPort, (serial_port)&spw->dcb)) { + return spw->dcb.BaudRate; + } + return 0; +} + +#endif