Compare commits

...

1 Commits

Author SHA1 Message Date
Charlotte Som 1b04a1ad33 Refine ! 2021-11-03 13:21:29 +00:00
2 changed files with 51 additions and 20 deletions

3
.gitignore vendored
View File

@ -1 +1,2 @@
/target /target
/keys.log

View File

@ -1,4 +1,7 @@
use std::{ use std::{
fs::OpenOptions,
io::Write,
pin::Pin,
thread::{spawn, JoinHandle}, thread::{spawn, JoinHandle},
time::Duration, time::Duration,
}; };
@ -10,9 +13,9 @@ struct ProgressCounter(pub *mut u64);
unsafe impl Send for ProgressCounter {} unsafe impl Send for ProgressCounter {}
unsafe impl Sync for ProgressCounter {} unsafe impl Sync for ProgressCounter {}
impl ProgressCounter { impl ProgressCounter {
fn incr(&mut self) { fn incr(&mut self, n: u64) {
unsafe { unsafe {
*self.0 += 1; *self.0 += n;
} }
} }
} }
@ -24,49 +27,76 @@ fn work(mut progress: ProgressCounter) -> JoinHandle<()> {
rand_xoshiro::Xoshiro256StarStar::from_rng(rand::thread_rng()).unwrap() rand_xoshiro::Xoshiro256StarStar::from_rng(rand::thread_rng()).unwrap()
}; };
const ITERS: u64 = 256;
loop { loop {
let key = cpu::generate_privkey(&mut rng); for _ in 0..ITERS {
let pub_key = cpu::get_pubkey(&key); let key = cpu::generate_privkey(&mut rng);
let pub_key = cpu::get_pubkey(&key);
progress.incr(); // b64(pub_key).starts_with("char") && b64(pub_key)[4] in ["+", "/"]
if pub_key[0] == 0x72
&& pub_key[1] == 0x16
&& pub_key[2] == 0xab
&& pub_key[3] >= 0xf8
{
let key_str = base64::encode(key);
let pub_key_str = base64::encode(pub_key);
println!("{} -> {}", key_str, pub_key_str);
// b64(pub_key).starts_with("char/") {
if pub_key[0] == 0x72 && pub_key[1] == 0x16 && pub_key[2] == 0xab && pub_key[3] >= 0xfc let mut file = OpenOptions::new()
{ .create(true)
let key_str = base64::encode(key); .append(true)
let pub_key_str = base64::encode(pub_key); .open("keys.log")
println!("{} -> {}", key_str, pub_key_str); .unwrap();
let _ = writeln!(file, "{} -> {}", key_str, pub_key_str);
}
}
} }
progress.incr(ITERS);
} }
}) })
} }
const NUM_THREADS: usize = 32; const NUM_THREADS: usize = 24;
struct Progress([u64; NUM_THREADS]); struct Progress(Pin<Box<[u64; NUM_THREADS]>>);
impl Progress { impl Progress {
fn new() -> Self { fn new() -> Self {
Progress([0; NUM_THREADS]) Progress(Box::pin([0; NUM_THREADS]))
}
unsafe fn the_pointer(&mut self) -> *mut u64 {
self.0.as_mut_ptr()
}
fn total(&self) -> u64 {
self.0.iter().sum()
} }
} }
fn main() { fn main() {
let mut progress = Box::pin(Progress::new()); let mut progress = Progress::new();
let _handles: Vec<_> = (0..NUM_THREADS) let _handles: Vec<_> = (0..NUM_THREADS)
.map(|id| { .map(|id| {
let ptr = unsafe { progress.0.as_mut_ptr().add(id) }; let ptr = unsafe { progress.the_pointer().add(id) };
let progress = ProgressCounter(ptr); let progress = ProgressCounter(ptr);
work(progress) work(progress)
}) })
.collect(); .collect();
let mut last_total_progress = 0; let mut last_total_progress = 0;
let mut sleep_secs = 1.0;
loop { loop {
let total_progress = progress.0.iter().sum(); let total_progress = progress.total();
let delta = total_progress - last_total_progress; let delta = total_progress - last_total_progress;
last_total_progress = total_progress; last_total_progress = total_progress;
println!("Guess/sec ≈ {}", delta); println!("Guesses/sec ≈ {:.0}", delta as f64 / sleep_secs);
std::thread::sleep(Duration::from_millis(1000)); std::thread::sleep(Duration::from_secs_f64(sleep_secs));
sleep_secs *= 1.05;
} }
} }