diff --git a/Cargo.toml b/Cargo.toml index a12f6ff9ff3..4b121eb5d05 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,7 @@ members = [ "lightning-background-processor", "lightning-rapid-gossip-sync", "lightning-custom-message", + "possiblyrandom", ] exclude = [ diff --git a/possiblyrandom/Cargo.toml b/possiblyrandom/Cargo.toml new file mode 100644 index 00000000000..9829007f06c --- /dev/null +++ b/possiblyrandom/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "possiblyrandom" +version = "0.1.0" +authors = ["Matt Corallo"] +license = "MIT OR Apache-2.0" +repository = "https://github.com/lightningdevkit/rust-lightning/" +description = """ +A crate which wraps getrandom and always compiles, returning 0s when no randomness is available. +""" +edition = "2021" + +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] + +[dependencies] +getrandom = { version = "0.2", optional = true, default-features = false } + +# Enable getrandom if we are on a platform that (likely) supports it +[target.'cfg(not(any(target_os = "unknown", target_os = "none")))'.dependencies] +getrandom = { version = "0.2", default-features = false } diff --git a/possiblyrandom/src/lib.rs b/possiblyrandom/src/lib.rs new file mode 100644 index 00000000000..5302d1bd53e --- /dev/null +++ b/possiblyrandom/src/lib.rs @@ -0,0 +1,38 @@ +// This file is Copyright its original authors, visible in version control +// history. +// +// This file is licensed under the Apache License, Version 2.0 or the MIT license +// , at your option. +// You may not use this file except in accordance with one or both of these +// licenses. + +//! [`getrandom`] provides access to OS randomness, but will fail to compile on platforms which do +//! not support fetching OS randomness. This is exactly what you want when you're doing +//! cryptographic operations, but when you're just opportunistically randomizing, we're fine with +//! compiling and simply disabling randomization. +//! +//! This crate does that, returning only possibly-random data. +//! +//! Note that this crate only enables getrandom on a subset of platforms it supports. As getrandom +//! evolves this crate is unlikely to carefully track all getrandom-supported platforms, however +//! will use random data on popular platforms. + +#[cfg(feature = "getrandom")] +extern crate getrandom; + +/// Possibly fills `dest` with random data. May fill it with zeros. +#[cfg(feature = "getrandom")] +#[inline] +pub fn getpossiblyrandom(dest: &mut [u8]) { + if getrandom::getrandom(dest).is_err() { + dest.fill(0); + } +} + +/// Possibly fills `dest` with random data. May fill it with zeros. +#[cfg(not(feature = "getrandom"))] +#[inline] +pub fn getpossiblyrandom(dest: &mut [u8]) { + dest.fill(0); +}