Revamped the stepping algorithm.
This commit is contained in:
parent
bdab06cd80
commit
73f2e71342
@ -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);
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user