diff --git a/umskt/src/confid/black_box.rs b/umskt/src/confid/black_box.rs index cebcf90..fc5fe50 100644 --- a/umskt/src/confid/black_box.rs +++ b/umskt/src/confid/black_box.rs @@ -449,35 +449,35 @@ fn polynomial_xgcd( *pmult2deg = mult2deg; } -unsafe fn u2poly(src: *const TDivisor, polyu: *mut u64, polyv: *mut u64) -> i32 { - if (*src).u[1_i32 as usize] != BAD { - *polyu.offset(0_i32 as isize) = (*src).u[0_i32 as usize]; - *polyu.offset(1_i32 as isize) = (*src).u[1_i32 as usize]; - *polyu.offset(2_i32 as isize) = 1_i32 as u64; - *polyv.offset(0_i32 as isize) = (*src).v[0_i32 as usize]; - *polyv.offset(1_i32 as isize) = (*src).v[1_i32 as usize]; +fn u2poly(src: &TDivisor, polyu: &mut [u64], polyv: &mut [u64]) -> i32 { + if src.u[1_i32 as usize] != BAD { + polyu[0_i32 as usize] = src.u[0_i32 as usize]; + polyu[1_i32 as usize] = src.u[1_i32 as usize]; + polyu[2_i32 as usize] = 1_i32 as u64; + polyv[0_i32 as usize] = src.v[0_i32 as usize]; + polyv[1_i32 as usize] = src.v[1_i32 as usize]; return 2_i32; } - if (*src).u[0_i32 as usize] != BAD { - *polyu.offset(0_i32 as isize) = (*src).u[0_i32 as usize]; - *polyu.offset(1_i32 as isize) = 1_i32 as u64; - *polyv.offset(0_i32 as isize) = (*src).v[0_i32 as usize]; - *polyv.offset(1_i32 as isize) = 0_i32 as u64; + if src.u[0_i32 as usize] != BAD { + polyu[0_i32 as usize] = src.u[0_i32 as usize]; + polyu[1_i32 as usize] = 1_i32 as u64; + polyv[0_i32 as usize] = src.v[0_i32 as usize]; + polyv[1_i32 as usize] = 0_i32 as u64; return 1_i32; } - *polyu.offset(0_i32 as isize) = 1_i32 as u64; - *polyv.offset(0_i32 as isize) = 0_i32 as u64; - *polyv.offset(1_i32 as isize) = 0_i32 as u64; + polyu[0_i32 as usize] = 1_i32 as u64; + polyv[0_i32 as usize] = 0_i32 as u64; + polyv[1_i32 as usize] = 0_i32 as u64; 0_i32 } -unsafe fn divisor_add(src1: *const TDivisor, src2: *const TDivisor, dst: *mut TDivisor) { +unsafe fn divisor_add(src1: &TDivisor, src2: &TDivisor, dst: *mut TDivisor) { let mut u1: [u64; 3] = [0; 3]; let mut u2: [u64; 3] = [0; 3]; let mut v1: [u64; 2] = [0; 2]; let mut v2: [u64; 2] = [0; 2]; - let u1deg: i32 = u2poly(src1, u1.as_mut_ptr(), v1.as_mut_ptr()); - let u2deg: i32 = u2poly(src2, u2.as_mut_ptr(), v2.as_mut_ptr()); + let u1deg: i32 = u2poly(src1, &mut u1, &mut v1); + let u2deg: i32 = u2poly(src2, &mut u2, &mut v2); // extended gcd: d1 = gcd(u1, u2) = e1*u1 + e2*u2 let mut d1deg: i32 = 0; let mut e1deg: i32 = 0; @@ -634,22 +634,20 @@ unsafe fn divisor_add(src1: *const TDivisor, src2: *const TDivisor, dst: *mut TD }; } -unsafe fn divisor_mul128( - src: *const TDivisor, - mut mult_lo: u64, - mut mult_hi: u64, - dst: *mut TDivisor, -) { +unsafe fn divisor_mul128(src: &TDivisor, mut mult_lo: u64, mut mult_hi: u64, dst: &mut TDivisor) { if mult_lo == 0_i32 as u64 && mult_hi == 0_i32 as u64 { - (*dst).u[0_i32 as usize] = BAD; - (*dst).u[1_i32 as usize] = BAD; - (*dst).v[0_i32 as usize] = BAD; - (*dst).v[1_i32 as usize] = BAD; + dst.u[0_i32 as usize] = BAD; + dst.u[1_i32 as usize] = BAD; + dst.v[0_i32 as usize] = BAD; + dst.v[1_i32 as usize] = BAD; return; } let mut cur: TDivisor = *src; while mult_lo & 1_i32 as u64 == 0 { - divisor_add(&cur, &cur, &mut cur); + { + let tmp = cur; + divisor_add(&tmp, &tmp, &mut cur); + } mult_lo >>= 1_i32; if mult_hi & 1_i32 as u64 != 0 { mult_lo |= 1_u64 << 63_i32; @@ -666,9 +664,12 @@ unsafe fn divisor_mul128( if mult_lo == 0_i32 as u64 && mult_hi == 0_i32 as u64 { break; } - divisor_add(&cur, &cur, &mut cur); + { + let tmp = cur; + divisor_add(&tmp, &tmp, &mut cur); + } if mult_lo & 1_i32 as u64 != 0 { - divisor_add(dst, &cur, dst); + divisor_add(&(dst.clone()), &cur, dst); } } } @@ -1011,7 +1012,7 @@ pub unsafe fn generate(installation_id_str: *const i8, confirmation_id: *mut i8) return 6_i32; } divisor_mul128( - &d_0, + &(d_0.clone()), 0x4e21b9d10f127c1_i64 as u64, 0x40da7c36d44c_i64 as u64, &mut d_0,