From 66affa2b9595c618c2745ed790350486cd8ae4cb Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Wed, 30 May 2018 17:40:16 +0200 Subject: [PATCH] Use a simpler increment seed iterator. (#186) * Use a simpler increment seed iterator. * Use more secure seeding. --- substrate/Cargo.lock | 1 + substrate/subkey/Cargo.toml | 1 + substrate/subkey/src/main.rs | 21 +++++++++++++++++++-- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/substrate/Cargo.lock b/substrate/Cargo.lock index 4eab41a990..ddcbc1936e 100644 --- a/substrate/Cargo.lock +++ b/substrate/Cargo.lock @@ -1851,6 +1851,7 @@ name = "subkey" version = "0.1.0" dependencies = [ "ed25519 0.1.0", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "substrate-primitives 0.1.0", ] diff --git a/substrate/subkey/Cargo.toml b/substrate/subkey/Cargo.toml index 942da8bdd6..8ea7a05fc1 100644 --- a/substrate/subkey/Cargo.toml +++ b/substrate/subkey/Cargo.toml @@ -6,3 +6,4 @@ authors = ["Parity Technologies "] [dependencies] ed25519 = { version = "*", path = "../substrate/ed25519" } substrate-primitives = { version = "*", path = "../substrate/primitives" } +rand = "0.4" diff --git a/substrate/subkey/src/main.rs b/substrate/subkey/src/main.rs index dba14ef37f..1186ad8a51 100644 --- a/substrate/subkey/src/main.rs +++ b/substrate/subkey/src/main.rs @@ -1,6 +1,8 @@ extern crate ed25519; extern crate substrate_primitives; +extern crate rand; +use rand::{OsRng, Rng}; use std::env::args; use ed25519::Pair; use substrate_primitives::hexdisplay::HexDisplay; @@ -14,6 +16,16 @@ fn good_waypoint(done: u64) -> u64 { } } +fn next_seed(mut seed: [u8; 32]) -> [u8; 32] { + for i in 0..32 { + match seed[i] { + 255 => { seed[i] = 0; } + _ => { seed[i] += 1; break; } + } + } + return seed; +} + fn main() { if args().len() != 2 { println!("Usage: subkey "); @@ -32,9 +44,14 @@ fn main() { }; let top = 30 + (desired.len() * 32); let mut best = 0; - let mut seed = Pair::generate().public().0; + let mut seed = [0u8; 32]; let mut done = 0; loop { + // reset to a new random seed at beginning and regularly after for paranoia. + if done % 100000 == 0 { + OsRng::new().unwrap().fill_bytes(&mut seed[..]); + } + let p = Pair::from_seed(&seed); let ss58 = p.public().to_ss58check(); let s = score(&ss58); @@ -45,7 +62,7 @@ fn main() { break; } } - seed = p.public().0; + seed = next_seed(seed); done += 1; if done % good_waypoint(done) == 0 {