mirror of
https://github.com/martijnvanbrummelen/nwipe.git
synced 2026-02-20 05:32:14 +00:00
Replaced the old memmove-based stash buffer with a true circular (ring) buffer for the thread-local AES-CTR PRNG prefetch mechanism Increased Buffers to 1M stash and 128 KiB block. Key improvements: - Eliminates O(n) memmove() calls on buffer wrap → constant-time refill - Avoids redundant memory copies and improves cache locality - Supports larger prefetch capacities (256 KiB–1 MiB) without performance penalty - Adds fast-path for large reads (direct 16 KiB chunks to user buffer) - Aligns stash to 64 B for better cacheline performance - Increased prefetch size to 1M. Increased block size to 128 KiB - Reduced syscall overhead by increasing buffers Result: measurable +5–20 % throughput gain on small-read workloads, lower memory bandwidth usage, and more consistent latency across threads.
61 lines
1.6 KiB
C
61 lines
1.6 KiB
C
#ifndef AES_CTR_PRNG_H
|
||
#define AES_CTR_PRNG_H
|
||
|
||
/* Minimal public header for AES-256-CTR PRNG (Linux AF_ALG backend)
|
||
*
|
||
* Implementation detail:
|
||
* - Uses a persistent AF_ALG "ctr(aes)" operation socket opened at init.
|
||
* - No socket setup overhead during generation – only sendmsg + read.
|
||
* - Thread-safety: Not safe unless externally synchronized.
|
||
*
|
||
* Public state remains exactly 256 bits (4×64-bit words) to allow for
|
||
* minimalistic integration in nwipe and similar tools.
|
||
*/
|
||
|
||
#include <stdint.h>
|
||
#include <stddef.h>
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
/* PRNG state: exactly 256 bits (4 × 64-bit words)
|
||
*
|
||
* s[0] = counter low
|
||
* s[1] = counter high
|
||
* s[2], s[3] = reserved
|
||
*/
|
||
typedef struct aes_ctr_state_s {
|
||
uint64_t s[4];
|
||
} aes_ctr_state_t;
|
||
|
||
/* Initialize with >=32 bytes of seed (init_key as unsigned-long array)
|
||
*
|
||
* On first call, also opens the persistent AF_ALG socket.
|
||
* Returns 0 on success, -1 on failure.
|
||
*/
|
||
int aes_ctr_prng_init(aes_ctr_state_t *state,
|
||
unsigned long init_key[],
|
||
unsigned long key_length);
|
||
|
||
/* Generate one 128 KiB chunk of random data into bufpos.
|
||
*
|
||
* Returns 0 on success, -1 on failure.
|
||
* Uses the persistent AF_ALG socket.
|
||
*/
|
||
int aes_ctr_prng_genrand_128k_to_buf(aes_ctr_state_t *state,
|
||
unsigned char *bufpos);
|
||
|
||
/* Optional: Close the persistent AF_ALG socket at program shutdown.
|
||
*
|
||
* Not required by nwipe, but recommended for tools embedding this code.
|
||
*/
|
||
int aes_ctr_prng_shutdown(void);
|
||
|
||
#ifdef __cplusplus
|
||
} /* extern "C" */
|
||
#endif
|
||
|
||
#endif /* AES_CTR_PRNG_H */
|
||
|