confid: Remove unsafe from polynomial_xgcd

This commit is contained in:
Alex Page 2023-06-28 18:14:46 -04:00
parent 171e913138
commit 6f4cd8ecf5

View file

@ -1,4 +1,4 @@
use std::{ffi::c_void, ptr}; use std::{ffi::c_void, mem::swap, ptr};
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
#[repr(C)] #[repr(C)]
@ -352,40 +352,36 @@ fn polynomial_div_monic(
} }
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
unsafe fn polynomial_xgcd( fn polynomial_xgcd(
adeg: i32, adeg: i32,
a: *const u64, a: &[u64],
bdeg: i32, bdeg: i32,
b: *const u64, b: &[u64],
pgcddeg: *mut i32, pgcddeg: &mut i32,
gcd: *mut u64, gcd: &mut [u64],
pmult1deg: *mut i32, pmult1deg: &mut i32,
mult1: *mut u64, mult1: &mut [u64],
pmult2deg: *mut i32, pmult2deg: &mut i32,
mult2: *mut u64, mult2: &mut [u64],
) { ) {
let mut sdeg: i32 = -1_i32; 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 s: [u64; 3] = [0_i32 as u64, 0_i32 as u64, 0_i32 as u64];
let mut mult1deg: i32 = 0_i32; let mut mult1deg: i32 = 0_i32;
*mult1.offset(0_i32 as isize) = 1_i32 as u64; mult1[0] = 1_i32 as u64;
*mult1.offset(1_i32 as isize) = 0_i32 as u64; mult1[1] = 0_i32 as u64;
*mult1.offset(2_i32 as isize) = 0_i32 as u64; mult1[2] = 0_i32 as u64;
let mut tdeg: i32 = 0_i32; 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 t: [u64; 3] = [1_i32 as u64, 0_i32 as u64, 0_i32 as u64];
let mut mult2deg: i32 = -1_i32; let mut mult2deg: i32 = -1_i32;
*mult2.offset(0_i32 as isize) = 0_i32 as u64; mult2[0] = 0_i32 as u64;
*mult2.offset(1_i32 as isize) = 0_i32 as u64; mult2[1] = 0_i32 as u64;
*mult2.offset(2_i32 as isize) = 0_i32 as u64; mult2[2] = 0_i32 as u64;
let mut rdeg: i32 = bdeg; let mut rdeg: i32 = bdeg;
let mut r: [u64; 3] = [ let mut r: [u64; 3] = [b[0], b[1], b[2]];
*b.offset(0_i32 as isize),
*b.offset(1_i32 as isize),
*b.offset(2_i32 as isize),
];
let mut gcddeg: i32 = adeg; let mut gcddeg: i32 = adeg;
*gcd.offset(0_i32 as isize) = *a.offset(0_i32 as isize); gcd[0] = a[0];
*gcd.offset(1_i32 as isize) = *a.offset(1_i32 as isize); gcd[1] = a[1];
*gcd.offset(2_i32 as isize) = *a.offset(2_i32 as isize); gcd[2] = a[2];
// s*u1 + t*u2 = r // s*u1 + t*u2 = r
// mult1*u1 + mult2*u2 = gcd // mult1*u1 + mult2*u2 = gcd
while rdeg >= 0_i32 { while rdeg >= 0_i32 {
@ -393,55 +389,34 @@ unsafe fn polynomial_xgcd(
let tmp = rdeg as u32; let tmp = rdeg as u32;
rdeg = gcddeg; rdeg = gcddeg;
gcddeg = tmp as i32; gcddeg = tmp as i32;
std::mem::swap(&mut sdeg, &mut mult1deg); swap(&mut sdeg, &mut mult1deg);
std::mem::swap(&mut tdeg, &mut mult2deg); swap(&mut tdeg, &mut mult2deg);
let mut tmp2 = r[0_i32 as usize]; swap(&mut r[0], &mut gcd[0]);
r[0_i32 as usize] = *gcd.offset(0_i32 as isize); swap(&mut r[1], &mut gcd[1]);
*gcd.offset(0_i32 as isize) = tmp2; swap(&mut r[2], &mut gcd[2]);
tmp2 = r[1_i32 as usize]; swap(&mut s[0], &mut mult1[0]);
r[1_i32 as usize] = *gcd.offset(1_i32 as isize); swap(&mut s[1], &mut mult1[1]);
*gcd.offset(1_i32 as isize) = tmp2; swap(&mut s[2], &mut mult1[2]);
tmp2 = r[2_i32 as usize]; swap(&mut t[0], &mut mult2[0]);
r[2_i32 as usize] = *gcd.offset(2_i32 as isize); swap(&mut t[1], &mut mult2[1]);
*gcd.offset(2_i32 as isize) = tmp2; swap(&mut t[2], &mut mult2[2]);
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;
} else { } else {
let delta: i32 = gcddeg - rdeg; let delta: i32 = gcddeg - rdeg;
let mult: u64 = let mult: u64 = residue_mul(gcd[gcddeg as usize], residue_inv(r[rdeg as usize]));
residue_mul(*gcd.offset(gcddeg as isize), residue_inv(r[rdeg as usize]));
// quotient = mult * x**delta // quotient = mult * x**delta
let mut i: i32 = 0_i32; let mut i: i32 = 0_i32;
while i <= rdeg { while i <= rdeg {
*gcd.offset((i + delta) as isize) = residue_sub( gcd[(i + delta) as usize] =
*gcd.offset((i + delta) as isize), residue_sub(gcd[(i + delta) as usize], residue_mul(mult, r[i as usize]));
residue_mul(mult, r[i as usize]),
);
i += 1; 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; gcddeg -= 1;
} }
let mut i_0: i32 = 0_i32; let mut i_0: i32 = 0_i32;
while i_0 <= sdeg { while i_0 <= sdeg {
*mult1.offset((i_0 + delta) as isize) = residue_sub( mult1[(i_0 + delta) as usize] = residue_sub(
*mult1.offset((i_0 + delta) as isize), mult1[(i_0 + delta) as usize],
residue_mul(mult, s[i_0 as usize]), residue_mul(mult, s[i_0 as usize]),
); );
i_0 += 1; i_0 += 1;
@ -449,13 +424,13 @@ unsafe fn polynomial_xgcd(
if mult1deg < sdeg + delta { if mult1deg < sdeg + delta {
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; mult1deg -= 1;
} }
let mut i_1: i32 = 0_i32; let mut i_1: i32 = 0_i32;
while i_1 <= tdeg { while i_1 <= tdeg {
*mult2.offset((i_1 + delta) as isize) = residue_sub( mult2[(i_1 + delta) as usize] = residue_sub(
*mult2.offset((i_1 + delta) as isize), mult2[(i_1 + delta) as usize],
residue_mul(mult, t[i_1 as usize]), residue_mul(mult, t[i_1 as usize]),
); );
i_1 += 1; i_1 += 1;
@ -463,7 +438,7 @@ unsafe fn polynomial_xgcd(
if mult2deg < tdeg + delta { if mult2deg < tdeg + delta {
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; 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 e1: [u64; 3] = [0; 3];
let mut e2: [u64; 3] = [0; 3]; let mut e2: [u64; 3] = [0; 3];
polynomial_xgcd( polynomial_xgcd(
u1deg, u1deg, &u1, u2deg, &u2, &mut d1deg, &mut d1, &mut e1deg, &mut e1, &mut e2deg, &mut e2,
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(),
); );
// extended gcd again: d = gcd(d1, v1+v2) = c1*d1 + c2*(v1+v2) // 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[0_i32 as usize], v2[0_i32 as usize]),
residue_add(v1[1_i32 as usize], v2[1_i32 as usize]), residue_add(v1[1_i32 as usize], v2[1_i32 as usize]),
0_i32 as u64, 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 c1: [u64; 3] = [0; 3];
let mut c2: [u64; 3] = [0; 3]; let mut c2: [u64; 3] = [0; 3];
polynomial_xgcd( polynomial_xgcd(
d1deg, d1deg, &d1, bdeg, &b, &mut ddeg, &mut d, &mut c1deg, &mut c1, &mut c2deg, &mut c2,
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(),
); );
let dmult: u64 = residue_inv(d[ddeg as usize]); let dmult: u64 = residue_inv(d[ddeg as usize]);
let mut i = 0_i32; 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), residue_mul(d_0.v[1_i32 as usize], x2a),
); );
if x1a > x2a { if x1a > x2a {
std::mem::swap(&mut x1a, &mut x2a); swap(&mut x1a, &mut x2a);
} }
if (y1 ^ y2) & 1_i32 as u64 != 0 { 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( e.c2rust_unnamed.encoded_lo = umul128(
MOD.wrapping_add(1_i32 as u64), MOD.wrapping_add(1_i32 as u64),