#include <CommonCrypto/CommonRandomSPI.h>
#include "ccDispatch.h"
#include <corecrypto/ccaes.h>
#include <corecrypto/ccdrbg.h>
#include <corecrypto/ccrng.h>
#include "ccGlobals.h"
#include "ccErrors.h"
#include "ccdebug.h"
static const int ccRandomDefaultStruct;
const CCRandomRef kCCRandomDefault = &ccRandomDefaultStruct;
const CCRandomRef kCCRandomDevRandom = &ccRandomDefaultStruct;
struct ccrng_state *
ccDRBGGetRngState(void)
{
int status;
struct ccrng_state *rng = ccrng(&status);
CC_DEBUG_LOG("ccrng returned %d\n", status);
return rng;
}
struct ccrng_state *
ccDevRandomGetRngState(void)
{
return ccDRBGGetRngState();
}
int CCRandomCopyBytes(CCRandomRef rnd, void *bytes, size_t count)
{
(void) rnd;
return CCRandomGenerateBytes(bytes, count);
}
CCRNGStatus CCRandomGenerateBytes(void *bytes, size_t count)
{
int err;
struct ccrng_state *rng;
if (0 == count) {
return kCCSuccess;
}
if (NULL == bytes) {
return kCCParamError;
}
rng = ccDRBGGetRngState();
err = ccrng_generate(rng, count, bytes);
if (err == CCERR_OK) {
return kCCSuccess;
}
return kCCRNGFailure;
}
CCRNGStatus CCRandomUniform(uint64_t bound, uint64_t *rand)
{
int err;
struct ccrng_state *rng;
rng = ccDRBGGetRngState();
err = ccrng_uniform(rng, bound, rand);
if (err == CCERR_OK) {
return kCCSuccess;
}
return kCCRNGFailure;
}