--- Functions for generating random data -- -- The strings generated here are not cryptographically secure, but they should -- be sufficient for most purposes. -- -- @author Daniel Miller -- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html -- @class module -- @name rand local require = require local have_openssl, openssl = pcall(require, "openssl") local math = require "math" local random = math.random local string = require "string" local byte = string.byte local char = string.char local sub = string.sub local table = require "table" local concat = table.concat local type = type local _ENV = {} local get_random_bytes if have_openssl then get_random_bytes = openssl.rand_pseudo_bytes else get_random_bytes = require "nmap".get_random_bytes end --- Generate a random string. -- -- You can either provide your own charset or the function will generate random -- bytes, which may include null bytes. -- @param len Length of the string we want to generate. -- @param charset Charset that will be used to generate the string. String or table -- @return A random string of length len consisting of -- characters from charset if one was provided, or random bytes otherwise. random_string = function(len, charset) local t = {} if charset then if type(charset) == "string" then for i=1,len do local r = random(#charset) t[i] = sub(charset, r, r) end else for i=1,len do t[i]=charset[random(#charset)] end end else return get_random_bytes(len) end return concat(t) end local random_string = random_string --- Generate a charset that can be passed to random_string -- -- @param left_bound The lower bound character or byte value of the set -- @param right_bound The upper bound character or byte value of the set -- @param charset Optional, a charset table to augment. By default a new charset is created. -- @return A charset table function charset(left_bound, right_bound, charset) local t = charset or {} left_bound = type(left_bound)=="string" and byte(left_bound) or left_bound right_bound = type(right_bound)=="string" and byte(right_bound) or right_bound if left_bound > right_bound then return t end for i=left_bound,right_bound do t[#t+1] = char(i) end return t end local charset = charset local alpha_charset = charset('a', 'z') --- Generate a random alpha word -- -- Convenience wrapper around random_string to generate a random -- string of lowercase alphabetic characters. -- @param len The length of word to return -- @return A string of random characters between 'a' and 'z' inclusive. function random_alpha (len) return random_string(len, alpha_charset) end return _ENV