util/random.lua
author Kim Alvefur <zash@zash.se>
Wed, 27 Mar 2024 19:33:11 +0100
changeset 13471 c2a476f4712a
parent 12979 d10957394a3c
permissions -rw-r--r--
util.startup: Fix exiting on pidfile trouble prosody.shutdown() relies on prosody.main_thread, which has not been set yet at this point. Doing a clean shutdown might actually be harmful in case it tears down things set up by the conflicting Prosody, such as the very pidfile we were looking at. Thanks again SigmaTel71 for noticing
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6376
bd812a7713ad util.random: Generic util lib for generating strings of random bytes
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     1
-- Prosody IM
bd812a7713ad util.random: Generic util lib for generating strings of random bytes
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     2
-- Copyright (C) 2008-2014 Matthew Wild
bd812a7713ad util.random: Generic util lib for generating strings of random bytes
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     3
-- Copyright (C) 2008-2014 Waqas Hussain
bd812a7713ad util.random: Generic util lib for generating strings of random bytes
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     4
--
bd812a7713ad util.random: Generic util lib for generating strings of random bytes
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     5
-- This project is MIT/X11 licensed. Please see the
bd812a7713ad util.random: Generic util lib for generating strings of random bytes
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     6
-- COPYING file in the source package for more information.
bd812a7713ad util.random: Generic util lib for generating strings of random bytes
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     7
--
bd812a7713ad util.random: Generic util lib for generating strings of random bytes
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
     8
12979
d10957394a3c util: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents: 12450
diff changeset
     9
local ok, crand = pcall(require, "prosody.util.crand");
12450
e54b8a5e35ad util.random: Test whether util.crand works before using it (fix #1734)
Kim Alvefur <zash@zash.se>
parents: 10020
diff changeset
    10
if ok and pcall(crand.bytes, 1) then return crand; end
7190
3d2c2f0809ee util.crand: C binding to one of OpenSSL, Linux getrandom() or OpenBSD arc4random() CSPRNG
Kim Alvefur <zash@zash.se>
parents: 7117
diff changeset
    11
7117
51cf09bb74eb util.random: Restore friendlier error from 0.9/util.uuid
Kim Alvefur <zash@zash.se>
parents: 7086
diff changeset
    12
local urandom, urandom_err = io.open("/dev/urandom", "r");
6376
bd812a7713ad util.random: Generic util lib for generating strings of random bytes
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    13
bd812a7713ad util.random: Generic util lib for generating strings of random bytes
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    14
local function bytes(n)
10018
5d2f7144fa12 util.random: Handle unlikely read errors from /dev/urandom (see #1313)
Kim Alvefur <zash@zash.se>
parents: 8246
diff changeset
    15
	local data, err = urandom:read(n);
5d2f7144fa12 util.random: Handle unlikely read errors from /dev/urandom (see #1313)
Kim Alvefur <zash@zash.se>
parents: 8246
diff changeset
    16
	if not data then
10020
af8c514e5cf7 util.random: Throw different error for EOL condition
Kim Alvefur <zash@zash.se>
parents: 10019
diff changeset
    17
		if err then
af8c514e5cf7 util.random: Throw different error for EOL condition
Kim Alvefur <zash@zash.se>
parents: 10019
diff changeset
    18
			error("Unable to retrieve data from secure random number generator (/dev/urandom): "..tostring(err));
af8c514e5cf7 util.random: Throw different error for EOL condition
Kim Alvefur <zash@zash.se>
parents: 10019
diff changeset
    19
		else
af8c514e5cf7 util.random: Throw different error for EOL condition
Kim Alvefur <zash@zash.se>
parents: 10019
diff changeset
    20
			error("Secure random number generator (/dev/urandom) returned an end-of-file condition");
af8c514e5cf7 util.random: Throw different error for EOL condition
Kim Alvefur <zash@zash.se>
parents: 10019
diff changeset
    21
		end
10018
5d2f7144fa12 util.random: Handle unlikely read errors from /dev/urandom (see #1313)
Kim Alvefur <zash@zash.se>
parents: 8246
diff changeset
    22
	end
5d2f7144fa12 util.random: Handle unlikely read errors from /dev/urandom (see #1313)
Kim Alvefur <zash@zash.se>
parents: 8246
diff changeset
    23
	return data;
6376
bd812a7713ad util.random: Generic util lib for generating strings of random bytes
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    24
end
bd812a7713ad util.random: Generic util lib for generating strings of random bytes
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    25
7117
51cf09bb74eb util.random: Restore friendlier error from 0.9/util.uuid
Kim Alvefur <zash@zash.se>
parents: 7086
diff changeset
    26
if not urandom then
51cf09bb74eb util.random: Restore friendlier error from 0.9/util.uuid
Kim Alvefur <zash@zash.se>
parents: 7086
diff changeset
    27
	function bytes()
51cf09bb74eb util.random: Restore friendlier error from 0.9/util.uuid
Kim Alvefur <zash@zash.se>
parents: 7086
diff changeset
    28
		error("Unable to obtain a secure random number generator, please see https://prosody.im/doc/random ("..urandom_err..")");
51cf09bb74eb util.random: Restore friendlier error from 0.9/util.uuid
Kim Alvefur <zash@zash.se>
parents: 7086
diff changeset
    29
	end
51cf09bb74eb util.random: Restore friendlier error from 0.9/util.uuid
Kim Alvefur <zash@zash.se>
parents: 7086
diff changeset
    30
end
51cf09bb74eb util.random: Restore friendlier error from 0.9/util.uuid
Kim Alvefur <zash@zash.se>
parents: 7086
diff changeset
    31
6376
bd812a7713ad util.random: Generic util lib for generating strings of random bytes
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    32
return {
bd812a7713ad util.random: Generic util lib for generating strings of random bytes
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    33
	bytes = bytes;
8245
177873dc9cf3 util.random: Add a _source field to match util.crand
Kim Alvefur <zash@zash.se>
parents: 7190
diff changeset
    34
	_source = "/dev/urandom";
6376
bd812a7713ad util.random: Generic util lib for generating strings of random bytes
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
    35
};