confid: Remove unsafe from u2poly

This commit is contained in:
Alex Page 2023-06-28 18:30:08 -04:00
parent 6f4cd8ecf5
commit 4e25f1080e

View file

@ -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,