summaryrefslogtreecommitdiff
path: root/libs/libsodium/src/randombytes/nativeclient/randombytes_nativeclient.c
blob: 85ffa9b29bbf961bf1f1960a762dd52698329caf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61

#include <assert.h>
#include <stdint.h>
#include <stdlib.h>

#ifdef __native_client__
# include <irt.h>

# include "core.h"
# include "utils.h"
# include "randombytes.h"
# include "randombytes_nativeclient.h"

static void
randombytes_nativeclient_buf(void * const buf, const size_t size)
{
    unsigned char          *buf_ = (unsigned char *) buf;
    struct nacl_irt_random  rand_intf;
    size_t                  readnb = (size_t) 0U;
    size_t                  toread = size;

    if (nacl_interface_query(NACL_IRT_RANDOM_v0_1, &rand_intf,
                             sizeof rand_intf) != sizeof rand_intf) {
        sodium_misuse();
    }
    while (toread > (size_t) 0U) {
        if (rand_intf.get_random_bytes(buf_, size, &readnb) != 0 ||
            readnb > size) {
            sodium_misuse();
        }
        toread -= readnb;
        buf_ += readnb;
    }
}

static uint32_t
randombytes_nativeclient_random(void)
{
    uint32_t r;

    randombytes_nativeclient_buf(&r, sizeof r);

    return r;
}

static const char *
randombytes_nativeclient_implementation_name(void)
{
    return "nativeclient";
}

struct randombytes_implementation randombytes_nativeclient_implementation = {
    SODIUM_C99(.implementation_name =) randombytes_nativeclient_implementation_name,
    SODIUM_C99(.random =) randombytes_nativeclient_random,
    SODIUM_C99(.stir =) NULL,
    SODIUM_C99(.uniform =) NULL,
    SODIUM_C99(.buf =) randombytes_nativeclient_buf,
    SODIUM_C99(.close =) NULL
};

#endif