From 73f2e7134247aff3e7f85fd7c0e632a79581fe97 Mon Sep 17 00:00:00 2001 From: LoRd_MuldeR Date: Sat, 27 Mar 2021 16:19:26 +0100 Subject: [PATCH] Revamped the stepping algorithm. --- frontend/src/main.c | 6 ++-- libslunkcrypt/src/slunkcrypt.c | 58 +++++++++++++++++++--------------- 2 files changed, 36 insertions(+), 28 deletions(-) diff --git a/frontend/src/main.c b/frontend/src/main.c index 0981bce..49a0e02 100644 --- a/frontend/src/main.c +++ b/frontend/src/main.c @@ -57,6 +57,8 @@ static const char PASSWD_SYMBOLS[] = static const size_t RCMD_PWDLEN_LENGTH = 12U; static const size_t DFLT_PWDLEN_LENGTH = 20U; +static const clock_t UPDATE_INTERVAL = (clock_t)(1.5708 * CLOCKS_PER_SEC); + static const uint64_t MAGIC_NUMBER = 0x243F6A8885A308D3ull; // ========================================================================== @@ -349,7 +351,7 @@ static int encrypt(const char* const passphrase, const CHR* const input_path, co { break; /*EOF*/ } - if ((clk_now = clock()) - clk_update > CLOCKS_PER_SEC) + if ((clk_now = clock()) - clk_update > UPDATE_INTERVAL) { FPRINTF(stderr, T("\b\b\b\b\b\b\b%5.1f%% "), (bytes_read / ((double)file_size)) * 100.0); fflush(stderr); @@ -521,7 +523,7 @@ static int decrypt(const char* const passphrase, const CHR* const input_path, co { break; /*EOF*/ } - if ((clk_now = clock()) - clk_update > CLOCKS_PER_SEC) + if ((clk_now = clock()) - clk_update > UPDATE_INTERVAL) { FPRINTF(stderr, T("\b\b\b\b\b\b\b%5.1f%% "), (bytes_read / ((double)read_limit)) * 100.0); fflush(stderr); diff --git a/libslunkcrypt/src/slunkcrypt.c b/libslunkcrypt/src/slunkcrypt.c index 8f27c81..2201323 100644 --- a/libslunkcrypt/src/slunkcrypt.c +++ b/libslunkcrypt/src/slunkcrypt.c @@ -54,10 +54,10 @@ typedef struct { uint8_t wheel_fwd[256U][256U]; uint8_t wheel_bwd[256U][256U]; - uint8_t step_fwd[256U]; - uint8_t step_bwd[256U]; - uint8_t rotation_fwd[2U][256U]; - uint8_t rotation_bwd[2U][256U]; + uint8_t step_fwd[247U]; + uint8_t step_bwd[247U]; + uint8_t rotation_fwd[256U]; + uint8_t rotation_bwd[256U]; uint8_t counter; } crypt_state_t; @@ -230,8 +230,7 @@ static int initialize_state(crypt_state_t* const crypt_state, const uint64_t non for (r = 0U; r < 256U; ++r) { random_seed(&rand_state, nonce, (uint16_t)r, passwd, passwd_len); - crypt_state->rotation_bwd[0U][255U - r] = crypt_state->rotation_fwd[0U][r] = (uint8_t)random_next(&rand_state); - crypt_state->rotation_bwd[1U][255U - r] = crypt_state->rotation_fwd[1U][r] = 0U; + crypt_state->rotation_bwd[255U - r] = crypt_state->rotation_fwd[r] = (uint8_t)random_next(&rand_state); for (i = 0U; i < 256U; ++i) { const size_t j = random_next(&rand_state) % (i + 1U); @@ -251,7 +250,7 @@ static int initialize_state(crypt_state_t* const crypt_state, const uint64_t non /* set up stepping */ random_seed(&rand_state, nonce, 256U, passwd, passwd_len); - for (i = 0U; i < 256U; ++i) + for (i = 0U; i < 247U; ++i) { const size_t j = random_next(&rand_state) % (i + 1U); if (j != i) @@ -259,8 +258,8 @@ static int initialize_state(crypt_state_t* const crypt_state, const uint64_t non crypt_state->step_fwd[i] = crypt_state->step_fwd[j]; crypt_state->step_bwd[i] = crypt_state->step_bwd[j]; } - crypt_state->step_fwd[j] = (uint8_t)i; - crypt_state->step_bwd[j] = (uint8_t)(255U - i); + crypt_state->step_fwd[j] = (uint8_t)( 6U + i); + crypt_state->step_bwd[j] = (uint8_t)(249U - i); } slunkcrypt_bzero(&rand_state, sizeof(rand_state_t)); @@ -271,41 +270,48 @@ static int initialize_state(crypt_state_t* const crypt_state, const uint64_t non // Encrypt / Decrypt // ========================================================================== -static FORCE_INLINE void increment(uint8_t *const arr, const int rev) +static FORCE_INLINE void odometer_step(uint8_t *const arr, const int bwd) { size_t i; - for (i = 0U; i < 256U; ++i) + for (i = 0U; i < 6U; ++i) { - if (++arr[rev ? (255U - i) : i] != 0U) + if (++arr[bwd ? (255U - i) : i] != 0U) + { + break; + } + } + for (i = 0U; i < 3U; ++i) + { + if (++arr[bwd ? i : (255U - i)] != 0U) { break; } } } -static FORCE_INLINE uint8_t process_enc(crypt_state_t* const crypt_state, uint8_t value) +static FORCE_INLINE uint8_t process_encrypt(crypt_state_t* const crypt_state, uint8_t value) { size_t i; for (i = 0U; i < 256U; ++i) { - const uint8_t offset = crypt_state->rotation_fwd[0U][i] + crypt_state->rotation_fwd[1U][i]; - value = crypt_state->wheel_fwd[i][(value + offset) & 0xFF]; + value = crypt_state->wheel_fwd[i][(value + crypt_state->rotation_fwd[i]) & 0xFF]; } - ++crypt_state->rotation_fwd[0U][crypt_state->step_fwd[crypt_state->counter++]]; - increment(crypt_state->rotation_fwd[1U], 0); + ++crypt_state->rotation_fwd[crypt_state->step_fwd[crypt_state->counter]]; + odometer_step(crypt_state->rotation_fwd, 0); + crypt_state->counter = (crypt_state->counter + 1U) % 247U; return value; } -static FORCE_INLINE uint8_t process_dec(crypt_state_t* const crypt_state, uint8_t value) +static FORCE_INLINE uint8_t process_decrypt(crypt_state_t* const crypt_state, uint8_t value) { size_t i; for (i = 0U; i < 256U; ++i) { - const uint8_t offset = crypt_state->rotation_bwd[0U][i] + crypt_state->rotation_bwd[1U][i]; - value = (crypt_state->wheel_bwd[i][value] - offset) & 0xFF; + value = (crypt_state->wheel_bwd[i][value] - crypt_state->rotation_bwd[i]) & 0xFF; } - ++crypt_state->rotation_bwd[0U][crypt_state->step_bwd[crypt_state->counter++]]; - increment(crypt_state->rotation_bwd[1U], 1); + ++crypt_state->rotation_bwd[crypt_state->step_bwd[crypt_state->counter]]; + odometer_step(crypt_state->rotation_bwd, 1); + crypt_state->counter = (crypt_state->counter + 1U) % 247U; return value; } @@ -379,7 +385,7 @@ int slunkcrypt_encrypt(const slunkcrypt_t context, const uint8_t* const input, u size_t i; for (i = 0; i < length; ++i) { - output[i] = process_enc(state, input[i]); + output[i] = process_encrypt(state, input[i]); CHECK_ABORTED(); } } @@ -398,7 +404,7 @@ int slunkcrypt_encrypt_inplace(const slunkcrypt_t context, uint8_t* const buffer size_t i; for (i = 0; i < length; ++i) { - buffer[i] = process_enc(state, buffer[i]); + buffer[i] = process_encrypt(state, buffer[i]); CHECK_ABORTED(); } } @@ -418,7 +424,7 @@ int slunkcrypt_decrypt(const slunkcrypt_t context, const uint8_t* const input, u size_t i; for (i = 0; i < length; ++i) { - output[i] = process_dec(state, input[i]); + output[i] = process_decrypt(state, input[i]); CHECK_ABORTED(); } } @@ -437,7 +443,7 @@ int slunkcrypt_decrypt_inplace(const slunkcrypt_t context, uint8_t* const buffer size_t i; for (i = 0; i < length; ++i) { - buffer[i] = process_dec(state, buffer[i]); + buffer[i] = process_decrypt(state, buffer[i]); CHECK_ABORTED(); } }