util-src/crand.c
author Kim Alvefur <zash@zash.se>
Mon, 12 Dec 2022 07:03:31 +0100
branch0.11
changeset 12802 c4b1b5cbc20b
parent 8454 770f79a9635c
child 12474 80f3123053e2
permissions -rw-r--r--
Tag 0.11.14
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7190
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
/* Prosody IM
7832
1fb477d19fdd util.crand: Update copyright header
Kim Alvefur <zash@zash.se>
parents: 7829
diff changeset
     2
-- Copyright (C) 2008-2017 Matthew Wild
1fb477d19fdd util.crand: Update copyright header
Kim Alvefur <zash@zash.se>
parents: 7829
diff changeset
     3
-- Copyright (C) 2008-2017 Waqas Hussain
1fb477d19fdd util.crand: Update copyright header
Kim Alvefur <zash@zash.se>
parents: 7829
diff changeset
     4
-- Copyright (C) 2016-2017 Kim Alvefur
7190
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
--
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
-- This project is MIT/X11 licensed. Please see the
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
-- COPYING file in the source package for more information.
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
--
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
*/
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
/*
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    12
* crand.c
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
* C PRNG interface
7833
b9910a507250 util.crand: Add comment describing purpose of module
Kim Alvefur <zash@zash.se>
parents: 7832
diff changeset
    14
*
b9910a507250 util.crand: Add comment describing purpose of module
Kim Alvefur <zash@zash.se>
parents: 7832
diff changeset
    15
* The purpose of this module is to provide access to a PRNG in
b9910a507250 util.crand: Add comment describing purpose of module
Kim Alvefur <zash@zash.se>
parents: 7832
diff changeset
    16
* environments without /dev/urandom
b9910a507250 util.crand: Add comment describing purpose of module
Kim Alvefur <zash@zash.se>
parents: 7832
diff changeset
    17
*
b9910a507250 util.crand: Add comment describing purpose of module
Kim Alvefur <zash@zash.se>
parents: 7832
diff changeset
    18
* Caution! This has not been extensively tested.
b9910a507250 util.crand: Add comment describing purpose of module
Kim Alvefur <zash@zash.se>
parents: 7832
diff changeset
    19
*
7190
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    20
*/
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    21
7934
b619b85e01aa util.pposix, configure: Move _GNU_SOURCE macro into source files
Kim Alvefur <zash@zash.se>
parents: 7921
diff changeset
    22
#define _DEFAULT_SOURCE
b619b85e01aa util.pposix, configure: Move _GNU_SOURCE macro into source files
Kim Alvefur <zash@zash.se>
parents: 7921
diff changeset
    23
8425
6eecf82ccd8e util.crand: Always include stdlib to be sure __GLIBC_PREREQ is defined
Kim Alvefur <zash@zash.se>
parents: 8130
diff changeset
    24
#include <stdlib.h>
8426
65c82a7d0537 util.crand: Reorder includes so system ones are first
Kim Alvefur <zash@zash.se>
parents: 8425
diff changeset
    25
#include <string.h>
65c82a7d0537 util.crand: Reorder includes so system ones are first
Kim Alvefur <zash@zash.se>
parents: 8425
diff changeset
    26
#include <errno.h>
8425
6eecf82ccd8e util.crand: Always include stdlib to be sure __GLIBC_PREREQ is defined
Kim Alvefur <zash@zash.se>
parents: 8130
diff changeset
    27
7190
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    28
#include "lualib.h"
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    29
#include "lauxlib.h"
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    30
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    31
#if defined(WITH_GETRANDOM)
7937
485b9e66fedf util.crand: Only include getrandom shiv with glibc older than 2.25
Kim Alvefur <zash@zash.se>
parents: 7936
diff changeset
    32
8130
3e443d6791e6 util.crand: Build with musl/non-glibc (can't have undefined argument-taking macros?)
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
    33
#ifndef __GLIBC_PREREQ
8428
91c220f43826 util.crand: Add comments about defines
Kim Alvefur <zash@zash.se>
parents: 8427
diff changeset
    34
/* Not compiled with glibc at all */
8130
3e443d6791e6 util.crand: Build with musl/non-glibc (can't have undefined argument-taking macros?)
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
    35
#define __GLIBC_PREREQ(a,b) 0
3e443d6791e6 util.crand: Build with musl/non-glibc (can't have undefined argument-taking macros?)
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
    36
#endif
3e443d6791e6 util.crand: Build with musl/non-glibc (can't have undefined argument-taking macros?)
Kim Alvefur <zash@zash.se>
parents: 7972
diff changeset
    37
7937
485b9e66fedf util.crand: Only include getrandom shiv with glibc older than 2.25
Kim Alvefur <zash@zash.se>
parents: 7936
diff changeset
    38
#if ! __GLIBC_PREREQ(2,25)
8428
91c220f43826 util.crand: Add comments about defines
Kim Alvefur <zash@zash.se>
parents: 8427
diff changeset
    39
/* Not compiled with a glibc that provides getrandom() */
7190
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    40
#include <unistd.h>
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    41
#include <sys/syscall.h>
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    42
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    43
#ifndef SYS_getrandom
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    44
#error getrandom() requires Linux 3.17 or later
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    45
#endif
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    46
7937
485b9e66fedf util.crand: Only include getrandom shiv with glibc older than 2.25
Kim Alvefur <zash@zash.se>
parents: 7936
diff changeset
    47
/* This wasn't present before glibc 2.25 */
7936
c91ec7689424 util.crand: Change argumen names to match some man page
Kim Alvefur <zash@zash.se>
parents: 7935
diff changeset
    48
int getrandom(void *buf, size_t buflen, unsigned int flags) {
c91ec7689424 util.crand: Change argumen names to match some man page
Kim Alvefur <zash@zash.se>
parents: 7935
diff changeset
    49
	return syscall(SYS_getrandom, buf, buflen, flags);
7190
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    50
}
7937
485b9e66fedf util.crand: Only include getrandom shiv with glibc older than 2.25
Kim Alvefur <zash@zash.se>
parents: 7936
diff changeset
    51
#else
485b9e66fedf util.crand: Only include getrandom shiv with glibc older than 2.25
Kim Alvefur <zash@zash.se>
parents: 7936
diff changeset
    52
#include <sys/random.h>
485b9e66fedf util.crand: Only include getrandom shiv with glibc older than 2.25
Kim Alvefur <zash@zash.se>
parents: 7936
diff changeset
    53
#endif
7190
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    54
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    55
#elif defined(WITH_OPENSSL)
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    56
#include <openssl/rand.h>
8451
f516a52f19e8 util.crand: Make it possible to use arc4random on Linux (needs libbsd)
Kim Alvefur <zash@zash.se>
parents: 8450
diff changeset
    57
#elif defined(WITH_ARC4RANDOM)
f516a52f19e8 util.crand: Make it possible to use arc4random on Linux (needs libbsd)
Kim Alvefur <zash@zash.se>
parents: 8450
diff changeset
    58
#ifdef __linux__
f516a52f19e8 util.crand: Make it possible to use arc4random on Linux (needs libbsd)
Kim Alvefur <zash@zash.se>
parents: 8450
diff changeset
    59
#include <bsd/stdlib.h>
f516a52f19e8 util.crand: Make it possible to use arc4random on Linux (needs libbsd)
Kim Alvefur <zash@zash.se>
parents: 8450
diff changeset
    60
#endif
f516a52f19e8 util.crand: Make it possible to use arc4random on Linux (needs libbsd)
Kim Alvefur <zash@zash.se>
parents: 8450
diff changeset
    61
#else
7190
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    62
#error util.crand compiled without a random source
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    63
#endif
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    64
8450
200f4f1b7833 util.crand: Use a small buffer on the stack for small pieces of random, should be faster
Kim Alvefur <zash@zash.se>
parents: 8449
diff changeset
    65
#ifndef SMALLBUFSIZ
200f4f1b7833 util.crand: Use a small buffer on the stack for small pieces of random, should be faster
Kim Alvefur <zash@zash.se>
parents: 8449
diff changeset
    66
#define SMALLBUFSIZ 32
200f4f1b7833 util.crand: Use a small buffer on the stack for small pieces of random, should be faster
Kim Alvefur <zash@zash.se>
parents: 8449
diff changeset
    67
#endif
200f4f1b7833 util.crand: Use a small buffer on the stack for small pieces of random, should be faster
Kim Alvefur <zash@zash.se>
parents: 8449
diff changeset
    68
7190
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    69
int Lrandom(lua_State *L) {
8450
200f4f1b7833 util.crand: Use a small buffer on the stack for small pieces of random, should be faster
Kim Alvefur <zash@zash.se>
parents: 8449
diff changeset
    70
	char smallbuf[SMALLBUFSIZ];
200f4f1b7833 util.crand: Use a small buffer on the stack for small pieces of random, should be faster
Kim Alvefur <zash@zash.se>
parents: 8449
diff changeset
    71
	char *buf = &smallbuf[0];
8452
b572a708fd41 util.crand: Throw an error for sizes smaller than 1 byte
Kim Alvefur <zash@zash.se>
parents: 8451
diff changeset
    72
	const lua_Integer l = luaL_checkinteger(L, 1);
b572a708fd41 util.crand: Throw an error for sizes smaller than 1 byte
Kim Alvefur <zash@zash.se>
parents: 8451
diff changeset
    73
	const size_t len = l;
b572a708fd41 util.crand: Throw an error for sizes smaller than 1 byte
Kim Alvefur <zash@zash.se>
parents: 8451
diff changeset
    74
	luaL_argcheck(L, l >= 0, 1, "must be > 0");
8450
200f4f1b7833 util.crand: Use a small buffer on the stack for small pieces of random, should be faster
Kim Alvefur <zash@zash.se>
parents: 8449
diff changeset
    75
8454
770f79a9635c util.crand: Return early if a zero bytes are requested
Kim Alvefur <zash@zash.se>
parents: 8452
diff changeset
    76
	if(len == 0) {
770f79a9635c util.crand: Return early if a zero bytes are requested
Kim Alvefur <zash@zash.se>
parents: 8452
diff changeset
    77
		lua_pushliteral(L, "");
770f79a9635c util.crand: Return early if a zero bytes are requested
Kim Alvefur <zash@zash.se>
parents: 8452
diff changeset
    78
		return 1;
770f79a9635c util.crand: Return early if a zero bytes are requested
Kim Alvefur <zash@zash.se>
parents: 8452
diff changeset
    79
	}
770f79a9635c util.crand: Return early if a zero bytes are requested
Kim Alvefur <zash@zash.se>
parents: 8452
diff changeset
    80
8450
200f4f1b7833 util.crand: Use a small buffer on the stack for small pieces of random, should be faster
Kim Alvefur <zash@zash.se>
parents: 8449
diff changeset
    81
	if(len > SMALLBUFSIZ) {
200f4f1b7833 util.crand: Use a small buffer on the stack for small pieces of random, should be faster
Kim Alvefur <zash@zash.se>
parents: 8449
diff changeset
    82
		buf = lua_newuserdata(L, len);
200f4f1b7833 util.crand: Use a small buffer on the stack for small pieces of random, should be faster
Kim Alvefur <zash@zash.se>
parents: 8449
diff changeset
    83
	}
200f4f1b7833 util.crand: Use a small buffer on the stack for small pieces of random, should be faster
Kim Alvefur <zash@zash.se>
parents: 8449
diff changeset
    84
7190
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    85
#if defined(WITH_GETRANDOM)
7935
6c5e4f24b51e util.crand: Move comment block
Kim Alvefur <zash@zash.se>
parents: 7934
diff changeset
    86
	/*
6c5e4f24b51e util.crand: Move comment block
Kim Alvefur <zash@zash.se>
parents: 7934
diff changeset
    87
	 * This acts like a read from /dev/urandom with the exception that it
6c5e4f24b51e util.crand: Move comment block
Kim Alvefur <zash@zash.se>
parents: 7934
diff changeset
    88
	 * *does* block if the entropy pool is not yet initialized.
6c5e4f24b51e util.crand: Move comment block
Kim Alvefur <zash@zash.se>
parents: 7934
diff changeset
    89
	 */
8446
980885ba062c util.crand: Try getrandom() again until buffer is filled
Kim Alvefur <zash@zash.se>
parents: 8428
diff changeset
    90
	int left = len;
8447
adb079840714 util.crand: Only keep return value of getrandom() as the others don't return partial results
Kim Alvefur <zash@zash.se>
parents: 8446
diff changeset
    91
	char *p = buf;
8446
980885ba062c util.crand: Try getrandom() again until buffer is filled
Kim Alvefur <zash@zash.se>
parents: 8428
diff changeset
    92
980885ba062c util.crand: Try getrandom() again until buffer is filled
Kim Alvefur <zash@zash.se>
parents: 8428
diff changeset
    93
	do {
8447
adb079840714 util.crand: Only keep return value of getrandom() as the others don't return partial results
Kim Alvefur <zash@zash.se>
parents: 8446
diff changeset
    94
		int ret = getrandom(p, left, 0);
7190
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    95
8446
980885ba062c util.crand: Try getrandom() again until buffer is filled
Kim Alvefur <zash@zash.se>
parents: 8428
diff changeset
    96
		if(ret < 0) {
980885ba062c util.crand: Try getrandom() again until buffer is filled
Kim Alvefur <zash@zash.se>
parents: 8428
diff changeset
    97
			lua_pushstring(L, strerror(errno));
980885ba062c util.crand: Try getrandom() again until buffer is filled
Kim Alvefur <zash@zash.se>
parents: 8428
diff changeset
    98
			return lua_error(L);
980885ba062c util.crand: Try getrandom() again until buffer is filled
Kim Alvefur <zash@zash.se>
parents: 8428
diff changeset
    99
		}
980885ba062c util.crand: Try getrandom() again until buffer is filled
Kim Alvefur <zash@zash.se>
parents: 8428
diff changeset
   100
8447
adb079840714 util.crand: Only keep return value of getrandom() as the others don't return partial results
Kim Alvefur <zash@zash.se>
parents: 8446
diff changeset
   101
		p += ret;
8446
980885ba062c util.crand: Try getrandom() again until buffer is filled
Kim Alvefur <zash@zash.se>
parents: 8428
diff changeset
   102
		left -= ret;
980885ba062c util.crand: Try getrandom() again until buffer is filled
Kim Alvefur <zash@zash.se>
parents: 8428
diff changeset
   103
	} while(left > 0);
980885ba062c util.crand: Try getrandom() again until buffer is filled
Kim Alvefur <zash@zash.se>
parents: 8428
diff changeset
   104
7190
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   105
#elif defined(WITH_ARC4RANDOM)
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   106
	arc4random_buf(buf, len);
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   107
#elif defined(WITH_OPENSSL)
8427
b0a267f77d9e util.crand: Apply formatter
Kim Alvefur <zash@zash.se>
parents: 8426
diff changeset
   108
7918
e3d3ebd417f4 util.crand: Throw error if OpenSSLs RNG is not seeded
Kim Alvefur <zash@zash.se>
parents: 7835
diff changeset
   109
	if(!RAND_status()) {
e3d3ebd417f4 util.crand: Throw error if OpenSSLs RNG is not seeded
Kim Alvefur <zash@zash.se>
parents: 7835
diff changeset
   110
		lua_pushliteral(L, "OpenSSL PRNG not seeded");
7921
12e5a54907b6 util.crand: Clarify that lua_error does not return
Kim Alvefur <zash@zash.se>
parents: 7918
diff changeset
   111
		return lua_error(L);
7918
e3d3ebd417f4 util.crand: Throw error if OpenSSLs RNG is not seeded
Kim Alvefur <zash@zash.se>
parents: 7835
diff changeset
   112
	}
e3d3ebd417f4 util.crand: Throw error if OpenSSLs RNG is not seeded
Kim Alvefur <zash@zash.se>
parents: 7835
diff changeset
   113
8448
2d3a3d12ec87 util.crand: Silence signedness warning
Kim Alvefur <zash@zash.se>
parents: 8447
diff changeset
   114
	if(RAND_bytes((unsigned char *)buf, len) != 1) {
7835
d02ef0ae94af util.crand: TODOs
Kim Alvefur <zash@zash.se>
parents: 7834
diff changeset
   115
		/* TODO ERR_get_error() */
7829
7702ce682427 util.crand: Raise hard errors
Kim Alvefur <zash@zash.se>
parents: 7828
diff changeset
   116
		lua_pushstring(L, "RAND_bytes() failed");
7702ce682427 util.crand: Raise hard errors
Kim Alvefur <zash@zash.se>
parents: 7828
diff changeset
   117
		return lua_error(L);
7190
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   118
	}
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   119
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   120
#endif
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   121
8447
adb079840714 util.crand: Only keep return value of getrandom() as the others don't return partial results
Kim Alvefur <zash@zash.se>
parents: 8446
diff changeset
   122
	lua_pushlstring(L, buf, len);
7190
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   123
	return 1;
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   124
}
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   125
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   126
int luaopen_util_crand(lua_State *L) {
7821
54669df178c2 util-src: Make C modules assert that the Lua runtime matches what it was compiled for
Kim Alvefur <zash@zash.se>
parents: 7442
diff changeset
   127
#if (LUA_VERSION_NUM > 501)
54669df178c2 util-src: Make C modules assert that the Lua runtime matches what it was compiled for
Kim Alvefur <zash@zash.se>
parents: 7442
diff changeset
   128
	luaL_checkversion(L);
54669df178c2 util-src: Make C modules assert that the Lua runtime matches what it was compiled for
Kim Alvefur <zash@zash.se>
parents: 7442
diff changeset
   129
#endif
7918
e3d3ebd417f4 util.crand: Throw error if OpenSSLs RNG is not seeded
Kim Alvefur <zash@zash.se>
parents: 7835
diff changeset
   130
7972
1c6a07606309 util-src: Specify size of various tables to be allocated
Kim Alvefur <zash@zash.se>
parents: 7937
diff changeset
   131
	lua_createtable(L, 0, 2);
7190
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   132
	lua_pushcfunction(L, Lrandom);
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   133
	lua_setfield(L, -2, "bytes");
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   134
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   135
#if defined(WITH_GETRANDOM)
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   136
	lua_pushstring(L, "Linux");
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   137
#elif defined(WITH_ARC4RANDOM)
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   138
	lua_pushstring(L, "arc4random()");
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   139
#elif defined(WITH_OPENSSL)
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   140
	lua_pushstring(L, "OpenSSL");
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   141
#endif
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   142
	lua_setfield(L, -2, "_source");
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   143
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   144
	return 1;
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   145
}
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff changeset
   146