EVE 1.0
arch-random.c
1 #include <stdint.h>
2 #include <string.h>
3 #include <core/uwork.h>
4 #include <lib/sha1.h>
5 
6 static uint8_t random_state[20] __attribute__((section(".persistent")));
7 
8 /*---------------------------------------------------------------------------*/
9 void
10 random_init(unsigned short seed)
11 {
12  struct sha1_state_t sha1;
13  uwork_time_t now = uwork_now();
14 
15  sha1_init(&sha1);
16  sha1_calc(&sha1, &seed, sizeof(seed));
17  sha1_calc(&sha1, &random_state, sizeof(random_state));
18  sha1_calc(&sha1, &now, sizeof(now));
19  sha1_commit(&sha1, random_state);
20 }
21 /*---------------------------------------------------------------------------*/
22 unsigned long
23 random_rand32(void)
24 {
25  struct sha1_state_t sha1;
26  uwork_time_t now = uwork_now();
27 
28  sha1_init(&sha1);
29  sha1_calc(&sha1, &random_state, sizeof(random_state));
30  sha1_calc(&sha1, &now, sizeof(now));
31  sha1_commit(&sha1, random_state);
32 
33  memcpy(&now, random_state, sizeof(now));
34 
35  return now;
36 }
37 /*---------------------------------------------------------------------------*/
38 unsigned short
39 random_rand(void)
40 {
41  return (unsigned short) random_rand32();
42 }
43 /*---------------------------------------------------------------------------*/
void sha1_commit(struct sha1_state_t *state, unsigned char *hash)
void sha1_calc(struct sha1_state_t *state, const void *src, int bytelength)
int32_t uwork_time_t
Definition: uwork.h:108
__attribute__((always_inline)) static inline void swint_enable_indirect_adapter(swint_state_t *state)
Definition: work.h:245
Header file for the EVE microsecond-scale work scheduling.
void sha1_init(struct sha1_state_t *state)
SHA1 implementation.
uwork_time_t uwork_now(void)