util-src/crand.c
author Matthew Wild <mwild1@gmail.com>
Wed, 27 Mar 2024 15:35:15 +0000
branch0.12
changeset 13469 54a936345aaa
parent 8454 770f79a9635c
child 12474 80f3123053e2
permissions -rw-r--r--
prosodyctl check: Warn about invalid domain names in the config file This ensures that domain names of virtual hosts and components are valid in XMPP, and that they are encoded correctly.
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