1 2 #include <assert.h> 3 #include <stdint.h> 4 #include <stdlib.h> 5 6 #ifdef __native_client__ 7 # include <irt.h> 8 9 # include "core.h" 10 # include "utils.h" 11 # include "randombytes.h" 12 # include "randombytes_nativeclient.h" 13 14 static void 15 randombytes_nativeclient_buf(void * const buf, const size_t size) 16 { 17 unsigned char *buf_ = (unsigned char *) buf; 18 struct nacl_irt_random rand_intf; 19 size_t readnb = (size_t) 0U; 20 size_t toread = size; 21 22 if (nacl_interface_query(NACL_IRT_RANDOM_v0_1, &rand_intf, 23 sizeof rand_intf) != sizeof rand_intf) { 24 sodium_misuse(); 25 } 26 while (toread > (size_t) 0U) { 27 if (rand_intf.get_random_bytes(buf_, size, &readnb) != 0 || 28 readnb > size) { 29 sodium_misuse(); 30 } 31 toread -= readnb; 32 buf_ += readnb; 33 } 34 } 35 36 static uint32_t 37 randombytes_nativeclient_random(void) 38 { 39 uint32_t r; 40 41 randombytes_nativeclient_buf(&r, sizeof r); 42 43 return r; 44 } 45 46 static const char * 47 randombytes_nativeclient_implementation_name(void) 48 { 49 return "nativeclient"; 50 } 51 52 struct randombytes_implementation randombytes_nativeclient_implementation = { 53 SODIUM_C99(.implementation_name =) randombytes_nativeclient_implementation_name, 54 SODIUM_C99(.random =) randombytes_nativeclient_random, 55 SODIUM_C99(.stir =) NULL, 56 SODIUM_C99(.uniform =) NULL, 57 SODIUM_C99(.buf =) randombytes_nativeclient_buf, 58 SODIUM_C99(.close =) NULL 59 }; 60 61 #endif 62