Slightly tweak stepping algorithm to include a counter.
This commit is contained in:
parent
80db0ac404
commit
874a54a665
@ -57,6 +57,7 @@ typedef struct
|
|||||||
{
|
{
|
||||||
int reverse_mode;
|
int reverse_mode;
|
||||||
uint8_t wheel[256U][256U];
|
uint8_t wheel[256U][256U];
|
||||||
|
uint32_t counter;
|
||||||
rand_state_t random;
|
rand_state_t random;
|
||||||
}
|
}
|
||||||
crypt_state_t;
|
crypt_state_t;
|
||||||
@ -229,6 +230,10 @@ static int initialize_state(crypt_state_t *const state, const uint64_t nonce, co
|
|||||||
slunkcrypt_bzero(state, sizeof(crypt_state_t));
|
slunkcrypt_bzero(state, sizeof(crypt_state_t));
|
||||||
state->reverse_mode = reverse;
|
state->reverse_mode = reverse;
|
||||||
|
|
||||||
|
/* initialize counter */
|
||||||
|
random_seed(&state->random, nonce, (uint16_t)(-1), passwd, passwd_len);
|
||||||
|
state->counter = random_next(&state->random);
|
||||||
|
|
||||||
/* set up the wheel permutations */
|
/* set up the wheel permutations */
|
||||||
for (r = 0U; r < 256U; ++r)
|
for (r = 0U; r < 256U; ++r)
|
||||||
{
|
{
|
||||||
@ -266,7 +271,7 @@ static int initialize_state(crypt_state_t *const state, const uint64_t nonce, co
|
|||||||
random_seed(&state->random, nonce, 256U, passwd, passwd_len);
|
random_seed(&state->random, nonce, 256U, passwd, passwd_len);
|
||||||
return SLUNKCRYPT_SUCCESS;
|
return SLUNKCRYPT_SUCCESS;
|
||||||
|
|
||||||
/* user abort request */
|
/* aborted */
|
||||||
aborted:
|
aborted:
|
||||||
slunkcrypt_bzero(state, sizeof(crypt_state_t));
|
slunkcrypt_bzero(state, sizeof(crypt_state_t));
|
||||||
return SLUNKCRYPT_ABORTED;
|
return SLUNKCRYPT_ABORTED;
|
||||||
@ -276,28 +281,27 @@ aborted:
|
|||||||
// Encrypt / Decrypt
|
// Encrypt / Decrypt
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
|
||||||
static FORCE_INLINE void calculate_offsets(uint8_t *const offset, rand_state_t *const state, const int reverse)
|
static FORCE_INLINE void update_offset(uint8_t *const offset, uint32_t seed, rand_state_t *const state, const int reverse)
|
||||||
{
|
{
|
||||||
uint32_t temp = 0U;
|
|
||||||
size_t i;
|
size_t i;
|
||||||
for (i = 0U; i < 256U; ++i, temp >>= CHAR_BIT)
|
for (i = 0U; i < 256U; ++i, seed >>= CHAR_BIT)
|
||||||
{
|
{
|
||||||
if (!temp)
|
if (i && (!(i & 3U)))
|
||||||
{
|
{
|
||||||
temp = random_next(state);
|
seed = random_next(state);
|
||||||
}
|
}
|
||||||
offset[reverse ? (255U - i) : i] = (uint8_t)temp;
|
offset[reverse ? (255U - i) : i] = (uint8_t)seed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE uint8_t process_next_symbol(crypt_state_t *const crypt_state_t, uint8_t value)
|
static FORCE_INLINE uint8_t process_next_symbol(crypt_state_t *const state, uint8_t value)
|
||||||
{
|
{
|
||||||
uint8_t offset[256U];
|
uint8_t offset[256U];
|
||||||
size_t i;
|
size_t i;
|
||||||
calculate_offsets(offset, &crypt_state_t->random, crypt_state_t->reverse_mode);
|
update_offset(offset, state->counter++, &state->random, state->reverse_mode);
|
||||||
for (i = 0U; i < 256U; ++i)
|
for (i = 0U; i < 256U; ++i)
|
||||||
{
|
{
|
||||||
value = (crypt_state_t->wheel[i][(value + offset[i]) & 0xFF] - offset[i]) & 0xFF;
|
value = (state->wheel[i][(value + offset[i]) & 0xFF] - offset[i]) & 0xFF;
|
||||||
}
|
}
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user