64 lines
1.4 KiB
C
64 lines
1.4 KiB
C
/*
|
|
* Copyright (c) 2018 Oticon A/S
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
* Pseudo-random entropy generator for the ARCH_POSIX architecture:
|
|
* Following the principle of reproducibility of the native_posix board
|
|
* this entropy device will always generate the same random sequence when
|
|
* initialized with the same seed
|
|
*/
|
|
|
|
#include "device.h"
|
|
#include "entropy.h"
|
|
#include "init.h"
|
|
#include "misc/util.h"
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
static unsigned int seed = 0x5678;
|
|
|
|
void entropy_native_posix_set_seed(unsigned int seed_i)
|
|
{
|
|
seed = seed_i;
|
|
}
|
|
|
|
static int entropy_native_posix_get_entropy(struct device *dev, u8_t *buffer,
|
|
u16_t length)
|
|
{
|
|
ARG_UNUSED(dev);
|
|
|
|
while (length) {
|
|
/*
|
|
* Note that only 1 thread (Zephyr thread or HW models), runs at
|
|
* a time, therefore there is no need to use random_r()
|
|
*/
|
|
long int value = random();
|
|
|
|
size_t to_copy = min(length, sizeof(long int));
|
|
|
|
memcpy(buffer, &value, to_copy);
|
|
buffer += to_copy;
|
|
length -= to_copy;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int entropy_native_posix_init(struct device *dev)
|
|
{
|
|
ARG_UNUSED(dev);
|
|
srandom(seed);
|
|
return 0;
|
|
}
|
|
|
|
static const struct entropy_driver_api entropy_native_posix_api_funcs = {
|
|
.get_entropy = entropy_native_posix_get_entropy
|
|
};
|
|
|
|
DEVICE_AND_API_INIT(entropy_native_posix, CONFIG_ENTROPY_NAME,
|
|
entropy_native_posix_init, NULL, NULL,
|
|
PRE_KERNEL_2, CONFIG_KERNEL_INIT_PRIORITY_DEVICE,
|
|
&entropy_native_posix_api_funcs);
|
|
|