From 612c8051b428aa14d74716fd01f6c39952e8bd78 Mon Sep 17 00:00:00 2001 From: Daniel Roethlisberger Date: Sat, 2 Mar 2024 06:40:12 +0100 Subject: [PATCH] Double aesrand performance by using all bytes from each block (#801) --- src/aesrand.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/aesrand.c b/src/aesrand.c index cf957d5bb..a12c690b1 100644 --- a/src/aesrand.c +++ b/src/aesrand.c @@ -8,6 +8,7 @@ #include #include +#include #include #include @@ -28,6 +29,7 @@ struct aesrand { uint32_t input[AES_BLOCK_WORDS]; uint32_t sched[(AES_ROUNDS + 1) * 4]; uint8_t output[OUTPUT_BYTES]; + bool remaining; }; static aesrand_t *_aesrand_init(uint8_t *key) @@ -38,6 +40,7 @@ static aesrand_t *_aesrand_init(uint8_t *key) log_fatal("aesrand", "could not initialize AES key"); } memset(aes->output, 0, OUTPUT_BYTES); + aes->remaining = false; return aes; } @@ -62,10 +65,18 @@ aesrand_t *aesrand_init_from_random(void) uint64_t aesrand_getword(aesrand_t *aes) { + uint64_t retval; + + if (aes->remaining) { + memcpy(&retval, &aes->output[sizeof(retval)], sizeof(retval)); + aes->remaining = false; + return retval; + } + memcpy(aes->input, aes->output, sizeof(aes->input)); rijndaelEncrypt(aes->sched, AES_ROUNDS, (uint8_t *)aes->input, aes->output); - uint64_t retval; memcpy(&retval, aes->output, sizeof(retval)); + aes->remaining = true; return retval; }