Revamped the stepping algorithm.

This commit is contained in:
LoRd_MuldeR 2021-03-31 00:05:40 +02:00
parent 163dee5e9d
commit 26cfd32d24
Signed by: mulder
GPG Key ID: 2B5913365F57E03F

View File

@ -24,6 +24,9 @@
# define UNUSED
#endif
/* Utilities */
#define LOGICAL_XOR(X,Y) ((Y) ? (!(X)) : (X))
/* Version info */
const uint16_t SLUNKCRYPT_VERSION_MAJOR = MY_VERSION_MAJOR;
const uint16_t SLUNKCRYPT_VERSION_MINOR = MY_VERSION_MINOR;
@ -54,8 +57,8 @@ typedef struct
{
uint8_t wheel_fwd[256U][256U];
uint8_t wheel_bwd[256U][256U];
uint8_t step_fwd[247U];
uint8_t step_bwd[247U];
uint8_t step_fwd[241U];
uint8_t step_bwd[241U];
uint8_t rotation_fwd[256U];
uint8_t rotation_bwd[256U];
uint8_t counter;
@ -249,7 +252,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 < 247U; ++i)
for (i = 0U; i < 241U; ++i)
{
const size_t j = random_next(&rand_state) % (i + 1U);
if (j != i)
@ -269,25 +272,26 @@ static int initialize_state(crypt_state_t* const crypt_state, const uint64_t non
// Encrypt / Decrypt
// ==========================================================================
static FORCE_INLINE void odometer_step(uint8_t *const arr, const int bwd)
static FORCE_INLINE void increment(uint8_t *const arr, const size_t offset, const size_t limit, const int bwd)
{
size_t i;
for (i = 0U; i < 6U; ++i)
for (i = offset; i < limit; ++i)
{
if (++arr[bwd ? (255U - i) : i] != 0U)
{
break;
}
}
for (i = 0U; i < 3U; ++i)
{
if (++arr[bwd ? i : (255U - i)] != 0U)
{
break;
break; /*no carry*/
}
}
}
static FORCE_INLINE void odometer_step(uint8_t *const arr, const int bwd)
{
increment(arr, 0U, 6U, LOGICAL_XOR(bwd, 0));
increment(arr, 0U, 3U, LOGICAL_XOR(bwd, 1));
increment(arr, 3U, 6U, LOGICAL_XOR(bwd, 1));
increment(arr, 6U, 9U, LOGICAL_XOR(bwd, 1));
}
static FORCE_INLINE uint8_t process_encrypt(crypt_state_t* const crypt_state, uint8_t value)
{
size_t i;
@ -297,7 +301,7 @@ static FORCE_INLINE uint8_t process_encrypt(crypt_state_t* const crypt_state, ui
}
++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;
crypt_state->counter = (crypt_state->counter + 1U) % 241U;
return value;
}
@ -310,7 +314,7 @@ static FORCE_INLINE uint8_t process_decrypt(crypt_state_t* const crypt_state, ui
}
++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;
crypt_state->counter = (crypt_state->counter + 1U) % 241U;
return value;
}