Software / code / prosody
Annotate
util-src/crand.c @ 9232:65c83bfcf2ee
util.pubsub: Comments describing the return values of methods
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Wed, 22 Aug 2018 13:27:36 +0200 |
| parent | 8451:770f79a9635c |
| child | 12470:80f3123053e2 |
| rev | line source |
|---|---|
|
7187
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 |
|
7829
1fb477d19fdd
util.crand: Update copyright header
Kim Alvefur <zash@zash.se>
parents:
7826
diff
changeset
|
2 -- Copyright (C) 2008-2017 Matthew Wild |
|
1fb477d19fdd
util.crand: Update copyright header
Kim Alvefur <zash@zash.se>
parents:
7826
diff
changeset
|
3 -- Copyright (C) 2008-2017 Waqas Hussain |
|
1fb477d19fdd
util.crand: Update copyright header
Kim Alvefur <zash@zash.se>
parents:
7826
diff
changeset
|
4 -- Copyright (C) 2016-2017 Kim Alvefur |
|
7187
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 |
|
7830
b9910a507250
util.crand: Add comment describing purpose of module
Kim Alvefur <zash@zash.se>
parents:
7829
diff
changeset
|
14 * |
|
b9910a507250
util.crand: Add comment describing purpose of module
Kim Alvefur <zash@zash.se>
parents:
7829
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:
7829
diff
changeset
|
16 * environments without /dev/urandom |
|
b9910a507250
util.crand: Add comment describing purpose of module
Kim Alvefur <zash@zash.se>
parents:
7829
diff
changeset
|
17 * |
|
b9910a507250
util.crand: Add comment describing purpose of module
Kim Alvefur <zash@zash.se>
parents:
7829
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:
7829
diff
changeset
|
19 * |
|
7187
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 |
|
7931
b619b85e01aa
util.pposix, configure: Move _GNU_SOURCE macro into source files
Kim Alvefur <zash@zash.se>
parents:
7918
diff
changeset
|
22 #define _DEFAULT_SOURCE |
|
b619b85e01aa
util.pposix, configure: Move _GNU_SOURCE macro into source files
Kim Alvefur <zash@zash.se>
parents:
7918
diff
changeset
|
23 |
|
8422
6eecf82ccd8e
util.crand: Always include stdlib to be sure __GLIBC_PREREQ is defined
Kim Alvefur <zash@zash.se>
parents:
8127
diff
changeset
|
24 #include <stdlib.h> |
|
8423
65c82a7d0537
util.crand: Reorder includes so system ones are first
Kim Alvefur <zash@zash.se>
parents:
8422
diff
changeset
|
25 #include <string.h> |
|
65c82a7d0537
util.crand: Reorder includes so system ones are first
Kim Alvefur <zash@zash.se>
parents:
8422
diff
changeset
|
26 #include <errno.h> |
|
8422
6eecf82ccd8e
util.crand: Always include stdlib to be sure __GLIBC_PREREQ is defined
Kim Alvefur <zash@zash.se>
parents:
8127
diff
changeset
|
27 |
|
7187
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) |
|
7934
485b9e66fedf
util.crand: Only include getrandom shiv with glibc older than 2.25
Kim Alvefur <zash@zash.se>
parents:
7933
diff
changeset
|
32 |
|
8127
3e443d6791e6
util.crand: Build with musl/non-glibc (can't have undefined argument-taking macros?)
Kim Alvefur <zash@zash.se>
parents:
7969
diff
changeset
|
33 #ifndef __GLIBC_PREREQ |
|
8425
91c220f43826
util.crand: Add comments about defines
Kim Alvefur <zash@zash.se>
parents:
8424
diff
changeset
|
34 /* Not compiled with glibc at all */ |
|
8127
3e443d6791e6
util.crand: Build with musl/non-glibc (can't have undefined argument-taking macros?)
Kim Alvefur <zash@zash.se>
parents:
7969
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:
7969
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:
7969
diff
changeset
|
37 |
|
7934
485b9e66fedf
util.crand: Only include getrandom shiv with glibc older than 2.25
Kim Alvefur <zash@zash.se>
parents:
7933
diff
changeset
|
38 #if ! __GLIBC_PREREQ(2,25) |
|
8425
91c220f43826
util.crand: Add comments about defines
Kim Alvefur <zash@zash.se>
parents:
8424
diff
changeset
|
39 /* Not compiled with a glibc that provides getrandom() */ |
|
7187
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 |
|
7934
485b9e66fedf
util.crand: Only include getrandom shiv with glibc older than 2.25
Kim Alvefur <zash@zash.se>
parents:
7933
diff
changeset
|
47 /* This wasn't present before glibc 2.25 */ |
|
7933
c91ec7689424
util.crand: Change argumen names to match some man page
Kim Alvefur <zash@zash.se>
parents:
7932
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:
7932
diff
changeset
|
49 return syscall(SYS_getrandom, buf, buflen, flags); |
|
7187
3d2c2f0809ee
util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
50 } |
|
7934
485b9e66fedf
util.crand: Only include getrandom shiv with glibc older than 2.25
Kim Alvefur <zash@zash.se>
parents:
7933
diff
changeset
|
51 #else |
|
485b9e66fedf
util.crand: Only include getrandom shiv with glibc older than 2.25
Kim Alvefur <zash@zash.se>
parents:
7933
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:
7933
diff
changeset
|
53 #endif |
|
7187
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> |
|
8448
f516a52f19e8
util.crand: Make it possible to use arc4random on Linux (needs libbsd)
Kim Alvefur <zash@zash.se>
parents:
8447
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:
8447
diff
changeset
|
58 #ifdef __linux__ |
|
f516a52f19e8
util.crand: Make it possible to use arc4random on Linux (needs libbsd)
Kim Alvefur <zash@zash.se>
parents:
8447
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:
8447
diff
changeset
|
60 #endif |
|
f516a52f19e8
util.crand: Make it possible to use arc4random on Linux (needs libbsd)
Kim Alvefur <zash@zash.se>
parents:
8447
diff
changeset
|
61 #else |
|
7187
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 |
|
8447
200f4f1b7833
util.crand: Use a small buffer on the stack for small pieces of random, should be faster
Kim Alvefur <zash@zash.se>
parents:
8446
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:
8446
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:
8446
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:
8446
diff
changeset
|
68 |
|
7187
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) { |
|
8447
200f4f1b7833
util.crand: Use a small buffer on the stack for small pieces of random, should be faster
Kim Alvefur <zash@zash.se>
parents:
8446
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:
8446
diff
changeset
|
71 char *buf = &smallbuf[0]; |
|
8449
b572a708fd41
util.crand: Throw an error for sizes smaller than 1 byte
Kim Alvefur <zash@zash.se>
parents:
8448
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:
8448
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:
8448
diff
changeset
|
74 luaL_argcheck(L, l >= 0, 1, "must be > 0"); |
|
8447
200f4f1b7833
util.crand: Use a small buffer on the stack for small pieces of random, should be faster
Kim Alvefur <zash@zash.se>
parents:
8446
diff
changeset
|
75 |
|
8451
770f79a9635c
util.crand: Return early if a zero bytes are requested
Kim Alvefur <zash@zash.se>
parents:
8449
diff
changeset
|
76 if(len == 0) { |
|
770f79a9635c
util.crand: Return early if a zero bytes are requested
Kim Alvefur <zash@zash.se>
parents:
8449
diff
changeset
|
77 lua_pushliteral(L, ""); |
|
770f79a9635c
util.crand: Return early if a zero bytes are requested
Kim Alvefur <zash@zash.se>
parents:
8449
diff
changeset
|
78 return 1; |
|
770f79a9635c
util.crand: Return early if a zero bytes are requested
Kim Alvefur <zash@zash.se>
parents:
8449
diff
changeset
|
79 } |
|
770f79a9635c
util.crand: Return early if a zero bytes are requested
Kim Alvefur <zash@zash.se>
parents:
8449
diff
changeset
|
80 |
|
8447
200f4f1b7833
util.crand: Use a small buffer on the stack for small pieces of random, should be faster
Kim Alvefur <zash@zash.se>
parents:
8446
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:
8446
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:
8446
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:
8446
diff
changeset
|
84 |
|
7187
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) |
| 7932 | 86 /* |
| 87 * This acts like a read from /dev/urandom with the exception that it | |
| 88 * *does* block if the entropy pool is not yet initialized. | |
| 89 */ | |
|
8443
980885ba062c
util.crand: Try getrandom() again until buffer is filled
Kim Alvefur <zash@zash.se>
parents:
8425
diff
changeset
|
90 int left = len; |
|
8444
adb079840714
util.crand: Only keep return value of getrandom() as the others don't return partial results
Kim Alvefur <zash@zash.se>
parents:
8443
diff
changeset
|
91 char *p = buf; |
|
8443
980885ba062c
util.crand: Try getrandom() again until buffer is filled
Kim Alvefur <zash@zash.se>
parents:
8425
diff
changeset
|
92 |
|
980885ba062c
util.crand: Try getrandom() again until buffer is filled
Kim Alvefur <zash@zash.se>
parents:
8425
diff
changeset
|
93 do { |
|
8444
adb079840714
util.crand: Only keep return value of getrandom() as the others don't return partial results
Kim Alvefur <zash@zash.se>
parents:
8443
diff
changeset
|
94 int ret = getrandom(p, left, 0); |
|
7187
3d2c2f0809ee
util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
95 |
|
8443
980885ba062c
util.crand: Try getrandom() again until buffer is filled
Kim Alvefur <zash@zash.se>
parents:
8425
diff
changeset
|
96 if(ret < 0) { |
|
980885ba062c
util.crand: Try getrandom() again until buffer is filled
Kim Alvefur <zash@zash.se>
parents:
8425
diff
changeset
|
97 lua_pushstring(L, strerror(errno)); |
|
980885ba062c
util.crand: Try getrandom() again until buffer is filled
Kim Alvefur <zash@zash.se>
parents:
8425
diff
changeset
|
98 return lua_error(L); |
|
980885ba062c
util.crand: Try getrandom() again until buffer is filled
Kim Alvefur <zash@zash.se>
parents:
8425
diff
changeset
|
99 } |
|
980885ba062c
util.crand: Try getrandom() again until buffer is filled
Kim Alvefur <zash@zash.se>
parents:
8425
diff
changeset
|
100 |
|
8444
adb079840714
util.crand: Only keep return value of getrandom() as the others don't return partial results
Kim Alvefur <zash@zash.se>
parents:
8443
diff
changeset
|
101 p += ret; |
|
8443
980885ba062c
util.crand: Try getrandom() again until buffer is filled
Kim Alvefur <zash@zash.se>
parents:
8425
diff
changeset
|
102 left -= ret; |
|
980885ba062c
util.crand: Try getrandom() again until buffer is filled
Kim Alvefur <zash@zash.se>
parents:
8425
diff
changeset
|
103 } while(left > 0); |
|
980885ba062c
util.crand: Try getrandom() again until buffer is filled
Kim Alvefur <zash@zash.se>
parents:
8425
diff
changeset
|
104 |
|
7187
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) |
| 8424 | 108 |
|
7915
e3d3ebd417f4
util.crand: Throw error if OpenSSLs RNG is not seeded
Kim Alvefur <zash@zash.se>
parents:
7832
diff
changeset
|
109 if(!RAND_status()) { |
|
e3d3ebd417f4
util.crand: Throw error if OpenSSLs RNG is not seeded
Kim Alvefur <zash@zash.se>
parents:
7832
diff
changeset
|
110 lua_pushliteral(L, "OpenSSL PRNG not seeded"); |
|
7918
12e5a54907b6
util.crand: Clarify that lua_error does not return
Kim Alvefur <zash@zash.se>
parents:
7915
diff
changeset
|
111 return lua_error(L); |
|
7915
e3d3ebd417f4
util.crand: Throw error if OpenSSLs RNG is not seeded
Kim Alvefur <zash@zash.se>
parents:
7832
diff
changeset
|
112 } |
|
e3d3ebd417f4
util.crand: Throw error if OpenSSLs RNG is not seeded
Kim Alvefur <zash@zash.se>
parents:
7832
diff
changeset
|
113 |
|
8445
2d3a3d12ec87
util.crand: Silence signedness warning
Kim Alvefur <zash@zash.se>
parents:
8444
diff
changeset
|
114 if(RAND_bytes((unsigned char *)buf, len) != 1) { |
| 7832 | 115 /* TODO ERR_get_error() */ |
| 7826 | 116 lua_pushstring(L, "RAND_bytes() failed"); |
| 117 return lua_error(L); | |
|
7187
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 |
|
8444
adb079840714
util.crand: Only keep return value of getrandom() as the others don't return partial results
Kim Alvefur <zash@zash.se>
parents:
8443
diff
changeset
|
122 lua_pushlstring(L, buf, len); |
|
7187
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) { |
|
7818
54669df178c2
util-src: Make C modules assert that the Lua runtime matches what it was compiled for
Kim Alvefur <zash@zash.se>
parents:
7439
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:
7439
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:
7439
diff
changeset
|
129 #endif |
|
7915
e3d3ebd417f4
util.crand: Throw error if OpenSSLs RNG is not seeded
Kim Alvefur <zash@zash.se>
parents:
7832
diff
changeset
|
130 |
|
7969
1c6a07606309
util-src: Specify size of various tables to be allocated
Kim Alvefur <zash@zash.se>
parents:
7934
diff
changeset
|
131 lua_createtable(L, 0, 2); |
|
7187
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 |