Skip to content

Commit 3dc9719

Browse files
committed
Remove num-bigint dependency
#3 was the right call
1 parent 7264941 commit 3dc9719

2 files changed

Lines changed: 36 additions & 11 deletions

File tree

Cargo.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,11 @@ name = "codebreaker"
1717

1818
[dependencies]
1919
bytemuck = "1"
20-
num-bigint = "0.4.2"
2120

2221
[dev-dependencies]
2322
doc-comment = "0.3"
2423
pretty_assertions = "1"
2524

2625
[features]
2726
default = ["std"]
28-
std = ["num-bigint/std"]
27+
std = []

src/cb7.rs

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ impl Default for Cb7 {
2929
impl fmt::Debug for Cb7 {
3030
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3131
f.debug_struct("Cb7")
32-
.field("seeds[0][0..16]", &self.seeds[0][0..16].to_vec())
32+
.field("seeds[0][0..16]", &&self.seeds[0][0..16])
3333
.field("key", &self.key)
3434
.field("beefcodf", &self.beefcodf)
3535
.field("initialized", &self.initialized)
@@ -310,17 +310,43 @@ const fn mod_inverse(x: u32) -> u32 {
310310

311311
// RSA encryption/decryption
312312
fn rsa_crypt(addr: &mut u32, val: &mut u32, rsakey: u64, modulus: u64) {
313-
use num_bigint::BigUint;
314-
315-
let code = BigUint::from_slice(&[*val, *addr]);
316-
let m = BigUint::from(modulus);
313+
let code = u64::from(*val) | (u64::from(*addr) << 32);
317314

318315
// Exponentiation is only invertible if code < modulus
319-
if code < m {
320-
let digits = code.modpow(&BigUint::from(rsakey), &m).to_u32_digits();
321-
*addr = digits[1];
322-
*val = digits[0];
316+
if code >= modulus {
317+
return;
318+
}
319+
320+
let result = mod_pow(code, rsakey, modulus);
321+
*addr = (result >> 32) as u32;
322+
*val = result as u32;
323+
}
324+
325+
// Fast modular exponentiation for 64-bit values
326+
#[inline]
327+
const fn mod_pow(mut base: u64, mut exp: u64, modulus: u64) -> u64 {
328+
if modulus == 1 {
329+
return 0;
330+
}
331+
332+
let mut result = 1u64;
333+
base %= modulus;
334+
335+
while exp > 0 {
336+
if exp & 1 == 1 {
337+
result = mul_mod(result, base, modulus);
338+
}
339+
exp >>= 1;
340+
base = mul_mod(base, base, modulus);
323341
}
342+
343+
result
344+
}
345+
346+
// Computes (a * b) % modulus using 128-bit intermediates to avoid overflow
347+
#[inline]
348+
const fn mul_mod(a: u64, b: u64, modulus: u64) -> u64 {
349+
((a as u128 * b as u128) % modulus as u128) as u64
324350
}
325351

326352
const BEEFCODE: u32 = 0xbeef_c0de;

0 commit comments

Comments
 (0)