|
@@ -433,9 +433,9 @@ static int crng_init_cnt = 0;
|
|
|
static unsigned long crng_global_init_time = 0;
|
|
|
#define CRNG_INIT_CNT_THRESH (2*CHACHA20_KEY_SIZE)
|
|
|
static void _extract_crng(struct crng_state *crng,
|
|
|
- __u32 out[CHACHA20_BLOCK_WORDS]);
|
|
|
+ __u8 out[CHACHA20_BLOCK_SIZE]);
|
|
|
static void _crng_backtrack_protect(struct crng_state *crng,
|
|
|
- __u32 tmp[CHACHA20_BLOCK_WORDS], int used);
|
|
|
+ __u8 tmp[CHACHA20_BLOCK_SIZE], int used);
|
|
|
static void process_random_ready_list(void);
|
|
|
static void _get_random_bytes(void *buf, int nbytes);
|
|
|
|
|
@@ -921,7 +921,7 @@ static void crng_reseed(struct crng_state *crng, struct entropy_store *r)
|
|
|
unsigned long flags;
|
|
|
int i, num;
|
|
|
union {
|
|
|
- __u32 block[CHACHA20_BLOCK_WORDS];
|
|
|
+ __u8 block[CHACHA20_BLOCK_SIZE];
|
|
|
__u32 key[8];
|
|
|
} buf;
|
|
|
|
|
@@ -968,7 +968,7 @@ static void crng_reseed(struct crng_state *crng, struct entropy_store *r)
|
|
|
}
|
|
|
|
|
|
static void _extract_crng(struct crng_state *crng,
|
|
|
- __u32 out[CHACHA20_BLOCK_WORDS])
|
|
|
+ __u8 out[CHACHA20_BLOCK_SIZE])
|
|
|
{
|
|
|
unsigned long v, flags;
|
|
|
|
|
@@ -985,7 +985,7 @@ static void _extract_crng(struct crng_state *crng,
|
|
|
spin_unlock_irqrestore(&crng->lock, flags);
|
|
|
}
|
|
|
|
|
|
-static void extract_crng(__u32 out[CHACHA20_BLOCK_WORDS])
|
|
|
+static void extract_crng(__u8 out[CHACHA20_BLOCK_SIZE])
|
|
|
{
|
|
|
struct crng_state *crng = NULL;
|
|
|
|
|
@@ -1003,7 +1003,7 @@ static void extract_crng(__u32 out[CHACHA20_BLOCK_WORDS])
|
|
|
* enough) to mutate the CRNG key to provide backtracking protection.
|
|
|
*/
|
|
|
static void _crng_backtrack_protect(struct crng_state *crng,
|
|
|
- __u32 tmp[CHACHA20_BLOCK_WORDS], int used)
|
|
|
+ __u8 tmp[CHACHA20_BLOCK_SIZE], int used)
|
|
|
{
|
|
|
unsigned long flags;
|
|
|
__u32 *s, *d;
|
|
@@ -1015,14 +1015,14 @@ static void _crng_backtrack_protect(struct crng_state *crng,
|
|
|
used = 0;
|
|
|
}
|
|
|
spin_lock_irqsave(&crng->lock, flags);
|
|
|
- s = &tmp[used / sizeof(__u32)];
|
|
|
+ s = (__u32 *) &tmp[used];
|
|
|
d = &crng->state[4];
|
|
|
for (i=0; i < 8; i++)
|
|
|
*d++ ^= *s++;
|
|
|
spin_unlock_irqrestore(&crng->lock, flags);
|
|
|
}
|
|
|
|
|
|
-static void crng_backtrack_protect(__u32 tmp[CHACHA20_BLOCK_WORDS], int used)
|
|
|
+static void crng_backtrack_protect(__u8 tmp[CHACHA20_BLOCK_SIZE], int used)
|
|
|
{
|
|
|
struct crng_state *crng = NULL;
|
|
|
|
|
@@ -1038,7 +1038,7 @@ static void crng_backtrack_protect(__u32 tmp[CHACHA20_BLOCK_WORDS], int used)
|
|
|
static ssize_t extract_crng_user(void __user *buf, size_t nbytes)
|
|
|
{
|
|
|
ssize_t ret = 0, i = CHACHA20_BLOCK_SIZE;
|
|
|
- __u32 tmp[CHACHA20_BLOCK_WORDS];
|
|
|
+ __u8 tmp[CHACHA20_BLOCK_SIZE] __aligned(4);
|
|
|
int large_request = (nbytes > 256);
|
|
|
|
|
|
while (nbytes) {
|
|
@@ -1617,7 +1617,7 @@ static void _warn_unseeded_randomness(const char *func_name, void *caller,
|
|
|
*/
|
|
|
static void _get_random_bytes(void *buf, int nbytes)
|
|
|
{
|
|
|
- __u32 tmp[CHACHA20_BLOCK_WORDS];
|
|
|
+ __u8 tmp[CHACHA20_BLOCK_SIZE] __aligned(4);
|
|
|
|
|
|
trace_get_random_bytes(nbytes, _RET_IP_);
|
|
|
|
|
@@ -2243,7 +2243,7 @@ u64 get_random_u64(void)
|
|
|
if (use_lock)
|
|
|
read_lock_irqsave(&batched_entropy_reset_lock, flags);
|
|
|
if (batch->position % ARRAY_SIZE(batch->entropy_u64) == 0) {
|
|
|
- extract_crng((__u32 *)batch->entropy_u64);
|
|
|
+ extract_crng((u8 *)batch->entropy_u64);
|
|
|
batch->position = 0;
|
|
|
}
|
|
|
ret = batch->entropy_u64[batch->position++];
|
|
@@ -2273,7 +2273,7 @@ u32 get_random_u32(void)
|
|
|
if (use_lock)
|
|
|
read_lock_irqsave(&batched_entropy_reset_lock, flags);
|
|
|
if (batch->position % ARRAY_SIZE(batch->entropy_u32) == 0) {
|
|
|
- extract_crng(batch->entropy_u32);
|
|
|
+ extract_crng((u8 *)batch->entropy_u32);
|
|
|
batch->position = 0;
|
|
|
}
|
|
|
ret = batch->entropy_u32[batch->position++];
|