Software / code / prosody
Annotate
util-src/crand.c @ 13801:a5d5fefb8b68 13.0
mod_tls: Enable Prosody's certificate checking for incoming s2s connections (fixes #1916) (thanks Damian, Zash)
Various options in Prosody allow control over the behaviour of the certificate
verification process For example, some deployments choose to allow falling
back to traditional "dialback" authentication (XEP-0220), while others verify
via DANE, hard-coded fingerprints, or other custom plugins.
Implementing this flexibility requires us to override OpenSSL's default
certificate verification, to allow Prosody to verify the certificate itself,
apply custom policies and make decisions based on the outcome.
To enable our custom logic, we have to suppress OpenSSL's default behaviour of
aborting the connection with a TLS alert message. With LuaSec, this can be
achieved by using the verifyext "lsec_continue" flag.
We also need to use the lsec_ignore_purpose flag, because XMPP s2s uses server
certificates as "client" certificates (for mutual TLS verification in outgoing
s2s connections).
Commit 99d2100d2918 moved these settings out of the defaults and into mod_s2s,
because we only really need these changes for s2s, and they should be opt-in,
rather than automatically applied to all TLS services we offer.
That commit was incomplete, because it only added the flags for incoming
direct TLS connections. StartTLS connections are handled by mod_tls, which was
not applying the lsec_* flags. It previously worked because they were already
in the defaults.
This resulted in incoming s2s connections with "invalid" certificates being
aborted early by OpenSSL, even if settings such as `s2s_secure_auth = false`
or DANE were present in the config.
Outgoing s2s connections inherit verify "none" from the defaults, which means
OpenSSL will receive the cert but will not terminate the connection when it is
deemed invalid. This means we don't need lsec_continue there, and we also
don't need lsec_ignore_purpose (because the remote peer is a "server").
Wondering why we can't just use verify "none" for incoming s2s? It's because
in that mode, OpenSSL won't request a certificate from the peer for incoming
connections. Setting verify "peer" is how you ask OpenSSL to request a
certificate from the client, but also what triggers its built-in verification.
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Tue, 01 Apr 2025 17:26:56 +0100 |
| parent | 12976:a187600ec7d6 |
| 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 */ |
|
12470
80f3123053e2
util.crand: Reduce scope here too
Kim Alvefur <zash@zash.se>
parents:
8451
diff
changeset
|
48 static int getrandom(void *buf, size_t buflen, unsigned int flags) { |
|
7933
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 |
|
12470
80f3123053e2
util.crand: Reduce scope here too
Kim Alvefur <zash@zash.se>
parents:
8451
diff
changeset
|
69 static 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 |
|
12976
a187600ec7d6
util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents:
12575
diff
changeset
|
126 int luaopen_prosody_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 luaL_checkversion(L); |
|
7915
e3d3ebd417f4
util.crand: Throw error if OpenSSLs RNG is not seeded
Kim Alvefur <zash@zash.se>
parents:
7832
diff
changeset
|
128 |
|
7969
1c6a07606309
util-src: Specify size of various tables to be allocated
Kim Alvefur <zash@zash.se>
parents:
7934
diff
changeset
|
129 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
|
130 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
|
131 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
|
132 |
|
3d2c2f0809ee
util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
133 #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
|
134 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
|
135 #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
|
136 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
|
137 #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
|
138 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
|
139 #endif |
|
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_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
|
141 |
|
3d2c2f0809ee
util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
142 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
|
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 |
|
12976
a187600ec7d6
util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents:
12575
diff
changeset
|
145 int luaopen_util_crand(lua_State *L) { |
|
a187600ec7d6
util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents:
12575
diff
changeset
|
146 return luaopen_prosody_util_crand(L); |
|
a187600ec7d6
util: Add compat for prosody module name change to C sources
Kim Alvefur <zash@zash.se>
parents:
12575
diff
changeset
|
147 } |