Add a global-context-less-secure feature which skips randomization
This is useful for us downstream as we wish to target WASM with a global context, and using rand in such a build doesn't seem like a safe idea.
This commit is contained in:
parent
cf8921a338
commit
ce930ab6b7
|
@ -23,7 +23,8 @@ std = ["secp256k1-sys/std"]
|
||||||
rand-std = ["rand/std"]
|
rand-std = ["rand/std"]
|
||||||
recovery = ["secp256k1-sys/recovery"]
|
recovery = ["secp256k1-sys/recovery"]
|
||||||
lowmemory = ["secp256k1-sys/lowmemory"]
|
lowmemory = ["secp256k1-sys/lowmemory"]
|
||||||
global-context = ["std", "rand-std"]
|
global-context = ["std", "rand-std", "global-context-less-secure"]
|
||||||
|
global-context-less-secure = []
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
secp256k1-sys = { version = "0.4.0", default-features = false, path = "./secp256k1-sys" }
|
secp256k1-sys = { version = "0.4.0", default-features = false, path = "./secp256k1-sys" }
|
||||||
|
|
|
@ -8,10 +8,12 @@ use Secp256k1;
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
pub use self::std_only::*;
|
pub use self::std_only::*;
|
||||||
|
|
||||||
#[cfg(feature = "global-context")]
|
#[cfg(feature = "global-context-less-secure")]
|
||||||
/// Module implementing a singleton pattern for a global `Secp256k1` context
|
/// Module implementing a singleton pattern for a global `Secp256k1` context
|
||||||
pub mod global {
|
pub mod global {
|
||||||
|
#[cfg(feature = "global-context")]
|
||||||
use rand;
|
use rand;
|
||||||
|
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
use std::sync::Once;
|
use std::sync::Once;
|
||||||
use {Secp256k1, All};
|
use {Secp256k1, All};
|
||||||
|
@ -22,6 +24,9 @@ pub mod global {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A global, static context to avoid repeatedly creating contexts where one can't be passed
|
/// A global, static context to avoid repeatedly creating contexts where one can't be passed
|
||||||
|
///
|
||||||
|
/// If the global-context feature is enabled (and not just the global-context-less-secure),
|
||||||
|
/// this will have been randomized.
|
||||||
pub static SECP256K1: &GlobalContext = &GlobalContext { __private: () };
|
pub static SECP256K1: &GlobalContext = &GlobalContext { __private: () };
|
||||||
|
|
||||||
impl Deref for GlobalContext {
|
impl Deref for GlobalContext {
|
||||||
|
@ -32,7 +37,10 @@ pub mod global {
|
||||||
static mut CONTEXT: Option<Secp256k1<All>> = None;
|
static mut CONTEXT: Option<Secp256k1<All>> = None;
|
||||||
ONCE.call_once(|| unsafe {
|
ONCE.call_once(|| unsafe {
|
||||||
let mut ctx = Secp256k1::new();
|
let mut ctx = Secp256k1::new();
|
||||||
ctx.randomize(&mut rand::thread_rng());
|
#[cfg(feature = "global-context")]
|
||||||
|
{
|
||||||
|
ctx.randomize(&mut rand::thread_rng());
|
||||||
|
}
|
||||||
CONTEXT = Some(ctx);
|
CONTEXT = Some(ctx);
|
||||||
});
|
});
|
||||||
unsafe { CONTEXT.as_ref().unwrap() }
|
unsafe { CONTEXT.as_ref().unwrap() }
|
||||||
|
|
|
@ -158,7 +158,7 @@ use core::ops::Deref;
|
||||||
use core::mem;
|
use core::mem;
|
||||||
use ffi::{CPtr, types::AlignedType};
|
use ffi::{CPtr, types::AlignedType};
|
||||||
|
|
||||||
#[cfg(feature = "global-context")]
|
#[cfg(feature = "global-context-less-secure")]
|
||||||
pub use context::global::SECP256K1;
|
pub use context::global::SECP256K1;
|
||||||
|
|
||||||
#[cfg(feature = "bitcoin_hashes")]
|
#[cfg(feature = "bitcoin_hashes")]
|
||||||
|
@ -1269,7 +1269,7 @@ mod tests {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "global-context")]
|
#[cfg(feature = "global-context-less-secure")]
|
||||||
#[test]
|
#[test]
|
||||||
fn test_global_context() {
|
fn test_global_context() {
|
||||||
use super::SECP256K1;
|
use super::SECP256K1;
|
||||||
|
|
Loading…
Reference in New Issue