From f889c26bfd29385e7a5414c3764d8beb0f59e17f Mon Sep 17 00:00:00 2001 From: psykose Date: Wed, 27 Apr 2022 03:12:07 +0000 Subject: [PATCH] wireguard-vanity-address: more features less bugs --- wireguard-vanity-address/APKBUILD | 11 +- wireguard-vanity-address/more-features.patch | 122 +++++++++++++++++++ 2 files changed, 127 insertions(+), 6 deletions(-) create mode 100644 wireguard-vanity-address/more-features.patch diff --git a/wireguard-vanity-address/APKBUILD b/wireguard-vanity-address/APKBUILD index 3b1b95f..caed1d2 100644 --- a/wireguard-vanity-address/APKBUILD +++ b/wireguard-vanity-address/APKBUILD @@ -2,19 +2,17 @@ # Maintainer: psykose pkgname=wireguard-vanity-address pkgver=0.4.0 -pkgrel=0 +pkgrel=1 pkgdesc="generate Wireguard keypairs with a given prefix string" url="https://github.com/warner/wireguard-vanity-address" arch="all" license="MIT" makedepends="cargo" -source="https://github.com/warner/wireguard-vanity-address/archive/refs/tags/v$pkgver/wireguard-vanity-address-v$pkgver.tar.gz" +source="https://github.com/warner/wireguard-vanity-address/archive/refs/tags/v$pkgver/wireguard-vanity-address-v$pkgver.tar.gz + more-features.patch + " export CARGO_HOME="$srcdir" -export CARGO_PROFILE_RELEASE_CODEGEN_UNITS=1 -export CARGO_PROFILE_RELEASE_LTO="true" -export CARGO_PROFILE_RELEASE_OPT_LEVEL="s" -export CARGO_PROFILE_RELEASE_PANIC="abort" prepare() { default_prepare @@ -36,4 +34,5 @@ package() { sha512sums=" 7be6823b01dc7741018f6e98a3a91ad84f290d586d4418c9f65f5966141c89bd5e5bd80e856286d6c7ff2f756ca20342169d4b57016ac90882a5c9f74643a11e wireguard-vanity-address-v0.4.0.tar.gz +e5801d0d6ad448fec2a5db7152d9f3fe17324cb79f7d09941106b7a0c9126e1d0ebce5a3157d07f69d3a8879dde6c95232d901ccbdbc054fac1aa3ae70d6f6e8 more-features.patch " diff --git a/wireguard-vanity-address/more-features.patch b/wireguard-vanity-address/more-features.patch new file mode 100644 index 0000000..d8338ae --- /dev/null +++ b/wireguard-vanity-address/more-features.patch @@ -0,0 +1,122 @@ +From 89b5d55f62bcfdc7c13b43981e0725b6860ebad2 Mon Sep 17 00:00:00 2001 +From: ThinkChaos +Date: Fri, 24 Apr 2020 22:21:55 +0200 +Subject: [PATCH] Add `--case-sensitive` and allow `--in 0` meaning actual + prefix + +--- + src/bin.rs | 20 +++++++++++++------- + src/lib.rs | 15 +++++++++++---- + 2 files changed, 24 insertions(+), 11 deletions(-) + +diff --git a/src/bin.rs b/src/bin.rs +index a5a6f35..c18d430 100644 +--- a/src/bin.rs ++++ b/src/bin.rs +@@ -8,12 +8,11 @@ use num_cpus; + use rayon::prelude::*; + use wireguard_vanity_lib::trial; + +-fn estimate_one_trial() -> Duration { +- let prefix = "prefix"; ++fn estimate_one_trial(prefix: &str, end: usize, case_sensitive: bool) -> Duration { + let start = SystemTime::now(); + const COUNT: u32 = 100; + (0..COUNT).for_each(|_| { +- trial(&prefix, 0, 10); ++ trial(&prefix, end, case_sensitive); + }); + let elapsed = start.elapsed().unwrap(); + elapsed.checked_div(COUNT).unwrap() +@@ -86,11 +85,16 @@ fn main() -> Result<(), Box> { + .version("0.3.1") + .author("Brian Warner ") + .about("finds Wireguard keypairs with a given string prefix") ++ .arg( ++ Arg::with_name("CASE") ++ .long("case-sensitive") ++ .help("Use case-sensitive matching"), ++ ) + .arg( + Arg::with_name("RANGE") + .long("in") + .takes_value(true) +- .help("NAME must be found within first RANGE chars of pubkey (default: 10)"), ++ .help("NAME must be found within first RANGE chars of pubkey (default: 10, 0 means actual prefix)"), + ) + .arg( + Arg::with_name("NAME") +@@ -98,6 +102,7 @@ fn main() -> Result<(), Box> { + .help("string to find near the start of the pubkey"), + ) + .get_matches(); ++ let case_sensitive = matches.is_present("CASE"); + let prefix = matches.value_of("NAME").unwrap().to_ascii_lowercase(); + let len = prefix.len(); + let end: usize = 44.min(match matches.value_of("RANGE") { +@@ -110,6 +115,7 @@ fn main() -> Result<(), Box> { + } + } + }); ++ let end = if end == 0 { len } else { end }; + if end < len { + return Err(ParseError(format!("range {} is too short for len={}", end, len)).into()); + } +@@ -119,7 +125,7 @@ fn main() -> Result<(), Box> { + let mut num = offsets; + let mut denom = 1u64; + prefix.chars().for_each(|c| { +- if c.is_ascii_alphabetic() { ++ if !case_sensitive && c.is_ascii_alphabetic() { + num *= 2; // letters can match both uppercase and lowercase + } + denom *= 64; // base64 +@@ -136,7 +142,7 @@ fn main() -> Result<(), Box> { + // run at half the speed that this predicts. + + if trials_per_key < 2u64.pow(32) { +- let est = estimate_one_trial(); ++ let est = estimate_one_trial(&prefix, end, case_sensitive); + println!( + "one trial takes {}, CPU cores available: {}", + format_time(duration_to_f64(est)), +@@ -162,7 +168,7 @@ fn main() -> Result<(), Box> { + // 1M trials takes about 10s on my laptop, so let it run for 1000s + (0..100_000_000) + .into_par_iter() +- .map(|_| trial(&prefix, 0, end)) ++ .map(|_| trial(&prefix, end, case_sensitive)) + .filter_map(|r| r) + .try_for_each(print)?; + Ok(()) +diff --git a/src/lib.rs b/src/lib.rs +index 31138c5..fb95581 100644 +--- a/src/lib.rs ++++ b/src/lib.rs +@@ -1,15 +1,22 @@ + use base64; + use rand::thread_rng; ++use std::borrow::Cow; + use x25519_dalek::{PublicKey, StaticSecret}; + +-pub fn trial(prefix: &str, start: usize, end: usize) -> Option<(String, String)> { ++pub fn trial(prefix: &str, end: usize, case_sensitive: bool) -> Option<(String, String)> { + let mut rng = thread_rng(); + let private = StaticSecret::new(&mut rng); + let public = PublicKey::from(&private); ++ + let public_b64 = base64::encode(public.as_bytes()); +- if public_b64[start..end] +- .to_ascii_lowercase() +- .contains(&prefix) ++ ++ let b64_prefix = if case_sensitive { ++ Cow::Borrowed(&public_b64[..end]) ++ } else { ++ Cow::Owned(public_b64[..end].to_ascii_lowercase()) ++ }; ++ ++ if b64_prefix.contains(prefix) + { + let private_b64 = base64::encode(&private.to_bytes()); + Some((private_b64, public_b64))