dualcone 0.0.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,44 @@
1
+ #include <mbedtls/ctr_drbg.h>
2
+ #include <mbedtls/entropy.h>
3
+
4
+ #if defined(MBEDTLS_ENTROPY_C)
5
+
6
+ static int
7
+ hydro_random_init(void)
8
+ {
9
+ mbedtls_entropy_context entropy;
10
+ uint16_t pos = 0;
11
+
12
+ mbedtls_entropy_init(&entropy);
13
+
14
+ // Pull data directly out of the entropy pool for the state, as it's small enough.
15
+ if (mbedtls_entropy_func(&entropy, (uint8_t *) &hydro_random_context.counter,
16
+ sizeof hydro_random_context.counter) != 0) {
17
+ return -1;
18
+ }
19
+ // mbedtls_entropy_func can't provide more than MBEDTLS_ENTROPY_BLOCK_SIZE in one go.
20
+ // This constant depends of mbedTLS configuration (whether the PRNG is backed by SHA256/SHA512
21
+ // at this time) Therefore, if necessary, we get entropy multiple times.
22
+
23
+ do {
24
+ const uint8_t dataLeftToConsume = gimli_BLOCKBYTES - pos;
25
+ const uint8_t currentChunkSize = (dataLeftToConsume > MBEDTLS_ENTROPY_BLOCK_SIZE)
26
+ ? MBEDTLS_ENTROPY_BLOCK_SIZE
27
+ : dataLeftToConsume;
28
+
29
+ // Forces mbedTLS to fetch fresh entropy, then get some to feed libhydrogen.
30
+ if (mbedtls_entropy_gather(&entropy) != 0 ||
31
+ mbedtls_entropy_func(&entropy, &hydro_random_context.state[pos], currentChunkSize) !=
32
+ 0) {
33
+ return -1;
34
+ }
35
+ pos += MBEDTLS_ENTROPY_BLOCK_SIZE;
36
+ } while (pos < gimli_BLOCKBYTES);
37
+
38
+ mbedtls_entropy_free(&entropy);
39
+
40
+ return 0;
41
+ }
42
+ #else
43
+ #error Need an entropy source
44
+ #endif
@@ -0,0 +1,41 @@
1
+ // Important: The SoftDevice *must* be activated to enable reading from the RNG
2
+ // http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.nrf52832.ps.v1.1%2Frng.html
3
+
4
+ #include <nrf_soc.h>
5
+
6
+ static int
7
+ hydro_random_init(void)
8
+ {
9
+ const char ctx[hydro_hash_CONTEXTBYTES] = { 'h', 'y', 'd', 'r', 'o', 'P', 'R', 'G' };
10
+ hydro_hash_state st;
11
+ const uint8_t total_bytes = 32;
12
+ uint8_t remaining_bytes = total_bytes;
13
+ uint8_t available_bytes;
14
+ uint8_t rand_buffer[32];
15
+
16
+ hydro_hash_init(&st, ctx, NULL);
17
+
18
+ for (;;) {
19
+ if (sd_rand_application_bytes_available_get(&available_bytes) != NRF_SUCCESS) {
20
+ return -1;
21
+ }
22
+ if (available_bytes > 0) {
23
+ if (available_bytes > remaining_bytes) {
24
+ available_bytes = remaining_bytes;
25
+ }
26
+ if (sd_rand_application_vector_get(rand_buffer, available_bytes) != NRF_SUCCESS) {
27
+ return -1;
28
+ }
29
+ hydro_hash_update(&st, rand_buffer, total_bytes);
30
+ remaining_bytes -= available_bytes;
31
+ }
32
+ if (remaining_bytes <= 0) {
33
+ break;
34
+ }
35
+ delay(10);
36
+ }
37
+ hydro_hash_final(&st, hydro_random_context.state, sizeof hydro_random_context.state);
38
+ hydro_random_context.counter = ~LOAD64_LE(hydro_random_context.state);
39
+
40
+ return 0;
41
+ }
@@ -0,0 +1,26 @@
1
+ // Note: All particle platforms except for the Spark Core have a HW RNG. Only allow building on
2
+ // supported platforms for now. PLATFORM_ID definitions:
3
+ // https://github.com/particle-iot/device-os/blob/mesh-develop/hal/shared/platforms.h
4
+
5
+ #include <Particle.h>
6
+
7
+ static int
8
+ hydro_random_init(void)
9
+ {
10
+ const char ctx[hydro_hash_CONTEXTBYTES] = { 'h', 'y', 'd', 'r', 'o', 'P', 'R', 'G' };
11
+ hydro_hash_state st;
12
+ uint16_t ebits = 0;
13
+
14
+ hydro_hash_init(&st, ctx, NULL);
15
+
16
+ while (ebits < 256) {
17
+ uint32_t r = HAL_RNG_GetRandomNumber();
18
+ hydro_hash_update(&st, (const uint32_t *) &r, sizeof r);
19
+ ebits += 32;
20
+ }
21
+
22
+ hydro_hash_final(&st, hydro_random_context.state, sizeof hydro_random_context.state);
23
+ hydro_random_context.counter = ~LOAD64_LE(hydro_random_context.state);
24
+
25
+ return 0;
26
+ }
@@ -0,0 +1,10 @@
1
+ #include <random.h>
2
+
3
+ static int
4
+ hydro_random_init(void)
5
+ {
6
+ random_bytes(hydro_random_context.state, sizeof(hydro_random_context.state));
7
+ hydro_random_context.counter = ~LOAD64_LE(hydro_random_context.state);
8
+
9
+ return 0;
10
+ }
@@ -0,0 +1,37 @@
1
+ #include <rtthread.h>
2
+ #include <hw_rng.h>
3
+
4
+ #define DBG_TAG "libhydrogen"
5
+ #define DBG_LVL DBG_LOG
6
+ #include <rtdbg.h>
7
+
8
+ static int
9
+ hydrogen_init(void) {
10
+ if (hydro_init() != 0) {
11
+ abort();
12
+ }
13
+ LOG_I("libhydrogen initialized");
14
+ return 0;
15
+ }
16
+ INIT_APP_EXPORT(hydrogen_init);
17
+
18
+ static int
19
+ hydro_random_init(void)
20
+ {
21
+ const char ctx[hydro_hash_CONTEXTBYTES] = { 'h', 'y', 'd', 'r', 'o', 'P', 'R', 'G' };
22
+ hydro_hash_state st;
23
+ uint16_t ebits = 0;
24
+
25
+ hydro_hash_init(&st, ctx, NULL);
26
+
27
+ while (ebits < 256) {
28
+ uint32_t r = rt_hwcrypto_rng_update();
29
+ hydro_hash_update(&st, (const uint32_t *) &r, sizeof r);
30
+ ebits += 32;
31
+ }
32
+
33
+ hydro_hash_final(&st, hydro_random_context.state, sizeof hydro_random_context.state);
34
+ hydro_random_context.counter = ~LOAD64_LE(hydro_random_context.state);
35
+
36
+ return 0;
37
+ }
@@ -0,0 +1,47 @@
1
+
2
+ // Use hardware RNG peripheral
3
+ // Working with HAL, LL Driver (untested)
4
+
5
+ #ifdef STM32F4
6
+
7
+ #include "stm32f4xx.h"
8
+
9
+ static int
10
+ hydro_random_init(void)
11
+ {
12
+ const char ctx[hydro_hash_CONTEXTBYTES] = { 'h', 'y', 'd', 'r', 'o', 'P', 'R', 'G' };
13
+ hydro_hash_state st;
14
+ uint16_t ebits = 0;
15
+
16
+ __IO uint32_t tmpreg;
17
+
18
+ // Enable RNG clock source
19
+ SET_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);
20
+
21
+ // Delay after an RCC peripheral clock enabling
22
+ tmpreg = READ_BIT(RCC->AHB2ENR, RCC_AHB2ENR_RNGEN);
23
+ UNUSED(tmpreg);
24
+
25
+ // RNG Peripheral enable
26
+ SET_BIT(RNG->CR, RNG_CR_RNGEN);
27
+
28
+ hydro_hash_init(&st, ctx, NULL);
29
+
30
+ while (ebits < 256) {
31
+ while (!(READ_BIT(RNG->SR, RNG_SR_DRDY))) {
32
+ }
33
+
34
+ uint32_t r = RNG->DR;
35
+ hydro_hash_update(&st, (const uint32_t*) &r, sizeof r);
36
+ ebits += 32;
37
+ }
38
+
39
+ hydro_hash_final(&st, hydro_random_context.state, sizeof hydro_random_context.state);
40
+ hydro_random_context.counter = ~LOAD64_LE(hydro_random_context.state);
41
+
42
+ return 0;
43
+ }
44
+
45
+ #else
46
+ # error SMT32 implementation missing!
47
+ #endif
@@ -0,0 +1,85 @@
1
+ #include <errno.h>
2
+ #include <fcntl.h>
3
+ #ifdef __linux__
4
+ #include <poll.h>
5
+ #endif
6
+ #include <sys/types.h>
7
+ #include <unistd.h>
8
+
9
+ #ifdef __linux__
10
+ static int
11
+ hydro_random_block_on_dev_random(void)
12
+ {
13
+ struct pollfd pfd;
14
+ int fd;
15
+ int pret;
16
+
17
+ fd = open("/dev/random", O_RDONLY);
18
+ if (fd == -1) {
19
+ return 0;
20
+ }
21
+ pfd.fd = fd;
22
+ pfd.events = POLLIN;
23
+ pfd.revents = 0;
24
+ do {
25
+ pret = poll(&pfd, 1, -1);
26
+ } while (pret < 0 && (errno == EINTR || errno == EAGAIN));
27
+ if (pret != 1) {
28
+ (void) close(fd);
29
+ errno = EIO;
30
+ return -1;
31
+ }
32
+ return close(fd);
33
+ }
34
+ #endif
35
+
36
+ static ssize_t
37
+ hydro_random_safe_read(const int fd, void *const buf_, size_t len)
38
+ {
39
+ unsigned char *buf = (unsigned char *) buf_;
40
+ ssize_t readnb;
41
+
42
+ do {
43
+ while ((readnb = read(fd, buf, len)) < (ssize_t) 0 && (errno == EINTR || errno == EAGAIN)) {
44
+ }
45
+ if (readnb < (ssize_t) 0) {
46
+ return readnb;
47
+ }
48
+ if (readnb == (ssize_t) 0) {
49
+ break;
50
+ }
51
+ len -= (size_t) readnb;
52
+ buf += readnb;
53
+ } while (len > (ssize_t) 0);
54
+
55
+ return (ssize_t) (buf - (unsigned char *) buf_);
56
+ }
57
+
58
+ static int
59
+ hydro_random_init(void)
60
+ {
61
+ uint8_t tmp[gimli_BLOCKBYTES + 8];
62
+ int fd;
63
+ int ret = -1;
64
+
65
+ #ifdef __linux__
66
+ if (hydro_random_block_on_dev_random() != 0) {
67
+ return -1;
68
+ }
69
+ #endif
70
+ do {
71
+ fd = open("/dev/urandom", O_RDONLY);
72
+ if (fd == -1 && errno != EINTR) {
73
+ return -1;
74
+ }
75
+ } while (fd == -1);
76
+ if (hydro_random_safe_read(fd, tmp, sizeof tmp) == (ssize_t) sizeof tmp) {
77
+ memcpy(hydro_random_context.state, tmp, gimli_BLOCKBYTES);
78
+ memcpy(&hydro_random_context.counter, tmp + gimli_BLOCKBYTES, 8);
79
+ hydro_memzero(tmp, sizeof tmp);
80
+ ret = 0;
81
+ }
82
+ ret |= close(fd);
83
+
84
+ return ret;
85
+ }
@@ -0,0 +1,12 @@
1
+ #include <unistd.h>
2
+
3
+ static int
4
+ hydro_random_init(void)
5
+ {
6
+ if (getentropy(hydro_random_context.state, sizeof hydro_random_context.state) != 0) {
7
+ return -1;
8
+ }
9
+ hydro_random_context.counter = ~LOAD64_LE(hydro_random_context.state);
10
+
11
+ return 0;
12
+ }
@@ -0,0 +1,20 @@
1
+ #include <windows.h>
2
+ #define RtlGenRandom SystemFunction036
3
+ #if defined(__cplusplus)
4
+ extern "C"
5
+ #endif
6
+ BOOLEAN NTAPI
7
+ RtlGenRandom(PVOID RandomBuffer, ULONG RandomBufferLength);
8
+ #pragma comment(lib, "advapi32.lib")
9
+
10
+ static int
11
+ hydro_random_init(void)
12
+ {
13
+ if (!RtlGenRandom((PVOID) hydro_random_context.state,
14
+ (ULONG) sizeof hydro_random_context.state)) {
15
+ return -1;
16
+ }
17
+ hydro_random_context.counter = ~LOAD64_LE(hydro_random_context.state);
18
+
19
+ return 0;
20
+ }