diff --git a/umskt/src/confid/black_box.rs b/umskt/src/confid/black_box.rs index e10673b..cebcf90 100644 --- a/umskt/src/confid/black_box.rs +++ b/umskt/src/confid/black_box.rs @@ -1,4 +1,4 @@ -use std::{ffi::c_void, ptr}; +use std::{ffi::c_void, mem::swap, ptr}; #[derive(Copy, Clone)] #[repr(C)] @@ -352,40 +352,36 @@ fn polynomial_div_monic( } #[allow(clippy::too_many_arguments)] -unsafe fn polynomial_xgcd( +fn polynomial_xgcd( adeg: i32, - a: *const u64, + a: &[u64], bdeg: i32, - b: *const u64, - pgcddeg: *mut i32, - gcd: *mut u64, - pmult1deg: *mut i32, - mult1: *mut u64, - pmult2deg: *mut i32, - mult2: *mut u64, + b: &[u64], + pgcddeg: &mut i32, + gcd: &mut [u64], + pmult1deg: &mut i32, + mult1: &mut [u64], + pmult2deg: &mut i32, + mult2: &mut [u64], ) { let mut sdeg: i32 = -1_i32; let mut s: [u64; 3] = [0_i32 as u64, 0_i32 as u64, 0_i32 as u64]; let mut mult1deg: i32 = 0_i32; - *mult1.offset(0_i32 as isize) = 1_i32 as u64; - *mult1.offset(1_i32 as isize) = 0_i32 as u64; - *mult1.offset(2_i32 as isize) = 0_i32 as u64; + mult1[0] = 1_i32 as u64; + mult1[1] = 0_i32 as u64; + mult1[2] = 0_i32 as u64; let mut tdeg: i32 = 0_i32; let mut t: [u64; 3] = [1_i32 as u64, 0_i32 as u64, 0_i32 as u64]; let mut mult2deg: i32 = -1_i32; - *mult2.offset(0_i32 as isize) = 0_i32 as u64; - *mult2.offset(1_i32 as isize) = 0_i32 as u64; - *mult2.offset(2_i32 as isize) = 0_i32 as u64; + mult2[0] = 0_i32 as u64; + mult2[1] = 0_i32 as u64; + mult2[2] = 0_i32 as u64; let mut rdeg: i32 = bdeg; - let mut r: [u64; 3] = [ - *b.offset(0_i32 as isize), - *b.offset(1_i32 as isize), - *b.offset(2_i32 as isize), - ]; + let mut r: [u64; 3] = [b[0], b[1], b[2]]; let mut gcddeg: i32 = adeg; - *gcd.offset(0_i32 as isize) = *a.offset(0_i32 as isize); - *gcd.offset(1_i32 as isize) = *a.offset(1_i32 as isize); - *gcd.offset(2_i32 as isize) = *a.offset(2_i32 as isize); + gcd[0] = a[0]; + gcd[1] = a[1]; + gcd[2] = a[2]; // s*u1 + t*u2 = r // mult1*u1 + mult2*u2 = gcd while rdeg >= 0_i32 { @@ -393,55 +389,34 @@ unsafe fn polynomial_xgcd( let tmp = rdeg as u32; rdeg = gcddeg; gcddeg = tmp as i32; - std::mem::swap(&mut sdeg, &mut mult1deg); - std::mem::swap(&mut tdeg, &mut mult2deg); - let mut tmp2 = r[0_i32 as usize]; - r[0_i32 as usize] = *gcd.offset(0_i32 as isize); - *gcd.offset(0_i32 as isize) = tmp2; - tmp2 = r[1_i32 as usize]; - r[1_i32 as usize] = *gcd.offset(1_i32 as isize); - *gcd.offset(1_i32 as isize) = tmp2; - tmp2 = r[2_i32 as usize]; - r[2_i32 as usize] = *gcd.offset(2_i32 as isize); - *gcd.offset(2_i32 as isize) = tmp2; - tmp2 = s[0_i32 as usize]; - s[0_i32 as usize] = *mult1.offset(0_i32 as isize); - *mult1.offset(0_i32 as isize) = tmp2; - tmp2 = s[1_i32 as usize]; - s[1_i32 as usize] = *mult1.offset(1_i32 as isize); - *mult1.offset(1_i32 as isize) = tmp2; - tmp2 = s[2_i32 as usize]; - s[2_i32 as usize] = *mult1.offset(2_i32 as isize); - *mult1.offset(2_i32 as isize) = tmp2; - tmp2 = t[0_i32 as usize]; - t[0_i32 as usize] = *mult2.offset(0_i32 as isize); - *mult2.offset(0_i32 as isize) = tmp2; - tmp2 = t[1_i32 as usize]; - t[1_i32 as usize] = *mult2.offset(1_i32 as isize); - *mult2.offset(1_i32 as isize) = tmp2; - tmp2 = t[2_i32 as usize]; - t[2_i32 as usize] = *mult2.offset(2_i32 as isize); - *mult2.offset(2_i32 as isize) = tmp2; + swap(&mut sdeg, &mut mult1deg); + swap(&mut tdeg, &mut mult2deg); + swap(&mut r[0], &mut gcd[0]); + swap(&mut r[1], &mut gcd[1]); + swap(&mut r[2], &mut gcd[2]); + swap(&mut s[0], &mut mult1[0]); + swap(&mut s[1], &mut mult1[1]); + swap(&mut s[2], &mut mult1[2]); + swap(&mut t[0], &mut mult2[0]); + swap(&mut t[1], &mut mult2[1]); + swap(&mut t[2], &mut mult2[2]); } else { let delta: i32 = gcddeg - rdeg; - let mult: u64 = - residue_mul(*gcd.offset(gcddeg as isize), residue_inv(r[rdeg as usize])); + let mult: u64 = residue_mul(gcd[gcddeg as usize], residue_inv(r[rdeg as usize])); // quotient = mult * x**delta let mut i: i32 = 0_i32; while i <= rdeg { - *gcd.offset((i + delta) as isize) = residue_sub( - *gcd.offset((i + delta) as isize), - residue_mul(mult, r[i as usize]), - ); + gcd[(i + delta) as usize] = + residue_sub(gcd[(i + delta) as usize], residue_mul(mult, r[i as usize])); i += 1; } - while gcddeg >= 0_i32 && *gcd.offset(gcddeg as isize) == 0_i32 as u64 { + while gcddeg >= 0_i32 && gcd[gcddeg as usize] == 0_i32 as u64 { gcddeg -= 1; } let mut i_0: i32 = 0_i32; while i_0 <= sdeg { - *mult1.offset((i_0 + delta) as isize) = residue_sub( - *mult1.offset((i_0 + delta) as isize), + mult1[(i_0 + delta) as usize] = residue_sub( + mult1[(i_0 + delta) as usize], residue_mul(mult, s[i_0 as usize]), ); i_0 += 1; @@ -449,13 +424,13 @@ unsafe fn polynomial_xgcd( if mult1deg < sdeg + delta { mult1deg = sdeg + delta; } - while mult1deg >= 0_i32 && *mult1.offset(mult1deg as isize) == 0_i32 as u64 { + while mult1deg >= 0_i32 && mult1[mult1deg as usize] == 0_i32 as u64 { mult1deg -= 1; } let mut i_1: i32 = 0_i32; while i_1 <= tdeg { - *mult2.offset((i_1 + delta) as isize) = residue_sub( - *mult2.offset((i_1 + delta) as isize), + mult2[(i_1 + delta) as usize] = residue_sub( + mult2[(i_1 + delta) as usize], residue_mul(mult, t[i_1 as usize]), ); i_1 += 1; @@ -463,7 +438,7 @@ unsafe fn polynomial_xgcd( if mult2deg < tdeg + delta { mult2deg = tdeg + delta; } - while mult2deg >= 0_i32 && *mult2.offset(mult2deg as isize) == 0_i32 as u64 { + while mult2deg >= 0_i32 && mult2[mult2deg as usize] == 0_i32 as u64 { mult2deg -= 1; } } @@ -511,19 +486,10 @@ unsafe fn divisor_add(src1: *const TDivisor, src2: *const TDivisor, dst: *mut TD let mut e1: [u64; 3] = [0; 3]; let mut e2: [u64; 3] = [0; 3]; polynomial_xgcd( - u1deg, - u1.as_mut_ptr() as *const u64, - u2deg, - u2.as_mut_ptr() as *const u64, - &mut d1deg, - d1.as_mut_ptr(), - &mut e1deg, - e1.as_mut_ptr(), - &mut e2deg, - e2.as_mut_ptr(), + u1deg, &u1, u2deg, &u2, &mut d1deg, &mut d1, &mut e1deg, &mut e1, &mut e2deg, &mut e2, ); // extended gcd again: d = gcd(d1, v1+v2) = c1*d1 + c2*(v1+v2) - let mut b: [u64; 3] = [ + let b: [u64; 3] = [ residue_add(v1[0_i32 as usize], v2[0_i32 as usize]), residue_add(v1[1_i32 as usize], v2[1_i32 as usize]), 0_i32 as u64, @@ -544,16 +510,7 @@ unsafe fn divisor_add(src1: *const TDivisor, src2: *const TDivisor, dst: *mut TD let mut c1: [u64; 3] = [0; 3]; let mut c2: [u64; 3] = [0; 3]; polynomial_xgcd( - d1deg, - d1.as_mut_ptr() as *const u64, - bdeg, - b.as_mut_ptr() as *const u64, - &mut ddeg, - d.as_mut_ptr(), - &mut c1deg, - c1.as_mut_ptr(), - &mut c2deg, - c2.as_mut_ptr(), + d1deg, &d1, bdeg, &b, &mut ddeg, &mut d, &mut c1deg, &mut c1, &mut c2deg, &mut c2, ); let dmult: u64 = residue_inv(d[ddeg as usize]); let mut i = 0_i32; @@ -1117,10 +1074,10 @@ pub unsafe fn generate(installation_id_str: *const i8, confirmation_id: *mut i8) residue_mul(d_0.v[1_i32 as usize], x2a), ); if x1a > x2a { - std::mem::swap(&mut x1a, &mut x2a); + swap(&mut x1a, &mut x2a); } if (y1 ^ y2) & 1_i32 as u64 != 0 { - std::mem::swap(&mut x1a, &mut x2a); + swap(&mut x1a, &mut x2a); } e.c2rust_unnamed.encoded_lo = umul128( MOD.wrapping_add(1_i32 as u64),