#include "config.h" #include #include #include #include #include #include #include "logerr.h" #include "util.h" #include "random.h" struct Random { FILE *const file_handle; }; int urandom_bytes(const size_t n, uint8_t (*const addr)[]) { int rc = -1; uint8_t *ret = NULL; FILE *f = NULL; ret = malloc(n); if (ret == NULL) { logerr("malloc(): %s", strerror(errno)); goto out; } f = fopen("/dev/urandom", "r"); if (f == NULL) { logerr("fopen(): %s", strerror(errno)); goto out; } const size_t read_count = fread(ret, 1U, n, f); if (ferror(f)) { logerr("fread(): %s", strerror(errno)); goto out; } assert(read_count == n); if (fclose(f)) { logerr("fclose(): %s", strerror(errno)); goto out; } f = NULL; memcpy(addr, ret, n); rc = 0; out: if (f != NULL) { if (fclose(f)) { logerr("fclose(): %s", strerror(errno)); rc = -1; } } if (ret != NULL) { freeit((void *)&ret); } return rc; } int random_generate( const struct Random *const r, const size_t length, uint8_t (*const out)[] ) { int rc = -1; const size_t read_count = fread(out, 1U, length, r->file_handle); if (ferror(r->file_handle)) { logerr("fread(): %s", strerror(errno)); goto out; } assert(read_count == length); rc = 0; out: return rc; } int random_new(const struct Random **const out) { int rc = -1; const struct Random *ret = NULL; FILE *f = NULL; ret = malloc(sizeof(*ret)); if (ret == NULL) { logerr("malloc(): %s", strerror(errno)); goto out; } f = fopen("/dev/urandom", "r"); if (f == NULL) { logerr("fopen(): %s", strerror(errno)); goto out; } memcpy((void *)ret, &(struct Random) { .file_handle = f, }, sizeof(*ret)); *out = ret; rc = 0; out: if (rc) { random_free(&ret); } return rc; } int random_free(const struct Random **const r) { if (r == NULL) { return 0; } if (*r == NULL) { return 0; } int rc = -1; if (fclose((*r)->file_handle)) { logerr("fclose(): %s", strerror(errno)); goto out; } rc = 0; out: freeit((void *)r); return rc; }