#ifndef RANDOM_HPP_
#define RANDOM_HPP_
#include "openthread-core-config.h"
#include <stdint.h>
#include <openthread/error.h>
#include "common/debug.hpp"
#include "common/random_manager.hpp"
namespace ot {
namespace Random {
namespace NonCrypto {
inline uint32_t GetUint32(void)
{
return ot::RandomManager::NonCryptoGetUint32();
}
inline uint8_t GetUint8(void)
{
return static_cast<uint8_t>(GetUint32() & 0xff);
}
inline uint16_t GetUint16(void)
{
return static_cast<uint16_t>(GetUint32() & 0xffff);
}
inline uint8_t GetUint8InRange(uint8_t aMin, uint8_t aMax)
{
OT_ASSERT(aMax > aMin);
return (aMin + (GetUint8() % (aMax - aMin)));
}
inline uint16_t GetUint16InRange(uint16_t aMin, uint16_t aMax)
{
OT_ASSERT(aMax > aMin);
return (aMin + (GetUint16() % (aMax - aMin)));
}
inline uint32_t GetUint32InRange(uint32_t aMin, uint32_t aMax)
{
OT_ASSERT(aMax > aMin);
return (aMin + (GetUint32() % (aMax - aMin)));
}
inline void FillBuffer(uint8_t *aBuffer, uint16_t aSize)
{
while (aSize-- != 0)
{
*aBuffer++ = GetUint8();
}
}
inline uint32_t AddJitter(uint32_t aValue, uint16_t aJitter)
{
aJitter = (aJitter <= aValue) ? aJitter : static_cast<uint16_t>(aValue);
return aValue + GetUint32InRange(0, 2 * aJitter + 1) - aJitter;
}
}
#if !OPENTHREAD_RADIO
namespace Crypto {
inline otError FillBuffer(uint8_t *aBuffer, uint16_t aSize)
{
return RandomManager::CryptoFillBuffer(aBuffer, aSize);
}
inline mbedtls_ctr_drbg_context *MbedTlsContextGet(void)
{
return RandomManager::GetMbedTlsCtrDrbgContext();
}
}
#endif
} }
#endif