1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/pkg/mbedtls/contrib/entropy/entropy_sources_mbedtls_riot.c
2022-01-17 23:22:14 +01:00

128 lines
3.0 KiB
C

/*
* Copyright (C) 2020 HAW Hamburg
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @ingroup pkg_mbedtls_entropy
*
* @{
* @file
* @brief
*
* @author Peter Kietzmann <peter.kietzmann@haw-hamburg.de>
*
* @}
*/
#include <assert.h>
#include "mbedtls/entropy.h"
#include "mbedtls/entropy_poll.h"
#include "entropy_sources_mbedtls_riot.h"
#include "kernel_defines.h"
#if IS_USED(MODULE_MBEDTLS_ENTROPY_SOURCE_HWRNG)
#include "periph/hwrng.h"
#endif
#if IS_USED(MODULE_MBEDTLS_ENTROPY_SOURCE_ADC)
#include "entropy_source/adc_noise.h"
#endif
/**
* @brief Number of available entropy sources.
*/
#define NUM_ENTROPY_FUNCS ARRAY_SIZE(entropy_funcs)
/**
* @brief Configuration of available entropy sources.
*
* @note First source must be the best source available. It is
* expected to be strong.
* @note An entropy source is configured if the platform provides
the underlying feature and the PSEUDOMODULE (which is
included by default) is not manually disabled.
* @{
*/
const entropy_source_mbedtls_riot_t entropy_funcs[] = {
#if IS_USED(MODULE_MBEDTLS_ENTROPY_SOURCE_HWRNG)
{ .func = riot_hwrng_poll, .strong = MBEDTLS_ENTROPY_SOURCE_STRONG },
#endif
#if IS_USED(MODULE_MBEDTLS_ENTROPY_SOURCE_ADC)
{ .func = riot_adc_poll, .strong = MBEDTLS_ENTROPY_SOURCE_WEAK },
#endif
/* Additional sources need to be added here */
};
/** @} */
/* Connect first entropy source because this function
* is used for internal tests
*/
int mbedtls_hardware_poll(void *data, unsigned char *output, size_t len,
size_t *olen)
{
assert(output != NULL && olen!= NULL);
return entropy_funcs[0].func(data, output, len, olen);
}
/* Add more entropy sources. Start from index=1 because index=0 is used in
* mbedtls_hardware_poll already
*/
int riot_add_entropy_src_avail(mbedtls_entropy_context *ctx)
{
assert(ctx);
int ret = 0;
#if IS_USED(MODULE_MBEDTLS_ENTROPY_SOURCE_ADC)
entropy_source_adc_init();
#endif
for (unsigned i = 1; i < NUM_ENTROPY_FUNCS; i++) {
ret = mbedtls_entropy_add_source(ctx, entropy_funcs[i].func, NULL,
1, entropy_funcs[i].strong);
if (ret != 0) {
return ret;
}
}
return ret;
}
#if IS_USED(MODULE_MBEDTLS_ENTROPY_SOURCE_HWRNG)
int riot_hwrng_poll(void *data, unsigned char *output, size_t len,
size_t *olen)
{
assert(output != NULL && olen!= NULL);
(void)data;
hwrng_read(output, len);
*olen = len;
return 0;
}
#endif
#if IS_USED(MODULE_MBEDTLS_ENTROPY_SOURCE_ADC)
int riot_adc_poll(void *data, unsigned char *output, size_t len,
size_t *olen)
{
assert(output != NULL && olen!= NULL);
(void)data;
if (entropy_source_adc_get(output, len) < 0) {
return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED;
}
*olen=len;
return 0;
}
#endif