19#ifdef HAVE_SYS_RANDOM_H
20#include <sys/random.h>
23#if defined(__ZEPHYR__)
24#include <zephyr/random/random.h>
25#elif defined(WITH_CONTIKI)
26#include "lib/csprng.h"
31#if defined(MBEDTLS_ENTROPY_HARDWARE_ALT)
32#include <entropy_poll.h>
37errno_t __cdecl rand_s(_Out_
unsigned int *_RandomValue);
44coap_prng_impl(
unsigned char *buf,
size_t len) {
51 for (i = 0; i < len && i < 4; i++) {
79#if defined(WITH_LWIP) && defined(LWIP_RAND)
81static unsigned int random_seed;
90 unsigned char *buf = (
unsigned char *)bufp;
91 u32_t v = LWIP_RAND() + random_seed;
93 while (len >
sizeof(v)) {
94 memcpy(buf, &v,
sizeof(v));
100 memcpy(buf, &v, len);
112#if defined(MBEDTLS_ENTROPY_HARDWARE_ALT)
114 return (mbedtls_hardware_poll(
NULL, buf, len,
NULL) ? 0 : 1);
116#elif defined(__ZEPHYR__)
118 if (!buf || len == 0) {
123 return (sys_csrand_get(buf, len) ? 0 : 1);
125#elif defined(HAVE_GETRANDOM)
126 return (getrandom(buf, len, 0) > 0) ? 1 : 0;
128#elif defined(HAVE_GETENTROPY)
129 return (getentropy(buf, len) == 0) ? 1 : 0;
131#elif defined(HAVE_RANDOM)
132#warning "Using random() for crypto randoms is not secure! Multiple CVEs raised."
133#warning "Please update your C-library and rerun the auto-configuration."
134#define RAND_BYTES (RAND_MAX >= 0xffffff ? 3 : (RAND_MAX >= 0xffff ? 2 : 1))
135 unsigned char *dst = (
unsigned char *)buf;
138 uint8_t byte_counter = RAND_BYTES;
139 uint32_t r_v = random();
146 if (--byte_counter) {
150 byte_counter = RAND_BYTES;
155#elif defined(RIOT_VERSION)
157 random_bytes(buf, len);
160#elif defined(WITH_CONTIKI)
161 return csprng_rand(buf, len);
164 return coap_prng_impl(buf,len);
168#error "Using rand() for crypto randoms is not secure! Multiple CVEs raised."
169#error "Please update your C-library and rerun the auto-configuration."
170 unsigned char *dst = (
unsigned char *)buf;
172 *dst++ = rand() & 0xFF;
190#elif defined(HAVE_RANDOM)
Library specific build wrapper for coap_internal.h.
static int coap_prng_default(void *buf, size_t len)
static coap_rand_func_t rand_func
void coap_prng_init_lkd(unsigned int seed)
Seeds the default random number generation function with the given seed.
int coap_prng_lkd(void *buf, size_t len)
Fills buf with len random bytes using the default pseudo random number generator.
int(* coap_rand_func_t)(void *out, size_t len)
Data type for random number generator function.
void coap_set_prng(coap_rand_func_t rng)
Replaces the current random number generation function with the default function rng.
COAP_API int coap_prng(void *buf, size_t len)
Fills buf with len random bytes using the default pseudo random number generator.
COAP_API void coap_prng_init(unsigned int seed)
Seeds the default random number generation function with the given seed.
#define coap_lock_unlock()
Dummy for no thread-safe code.
#define coap_lock_lock(failed)
Dummy for no thread-safe code.
#define COAP_STATIC_INLINE