confid: Remove some unsafe

This commit is contained in:
Alex Page 2023-06-28 17:04:18 -04:00
parent 8c17e3a11a
commit 280e1c7d5f

View file

@ -6,6 +6,7 @@ struct TDivisor {
u: [u64; 2],
v: [u64; 2],
}
#[derive(Copy, Clone)]
#[repr(C)]
struct C2RustUnnamed {
@ -43,7 +44,7 @@ struct C2RustUnnamed4 {
product_id_high: u8,
key_sha1: u16,
}
static mut F: [u64; 6] = [
static F: [u64; 6] = [
0,
0x21840136c85381,
0x44197b83892ad0,
@ -201,7 +202,7 @@ fn residue_sqrt(what: u64) -> u64 {
x
}
unsafe fn find_divisor_v(d: *mut TDivisor) -> i32 {
fn find_divisor_v(d: &mut TDivisor) -> i32 {
// u | v^2 - f
// u = u0 + u1*x + x^2
// f%u = f0 + f1*x
@ -212,8 +213,8 @@ unsafe fn find_divisor_v(d: *mut TDivisor) -> i32 {
f2[i as usize] = F[i as usize];
i += 1;
}
let u0: u64 = (*d).u[0_i32 as usize];
let u1: u64 = (*d).u[1_i32 as usize];
let u0: u64 = d.u[0_i32 as usize];
let u1: u64 = d.u[1_i32 as usize];
let mut j: i32 = 4_i32;
loop {
let fresh0 = j;
@ -281,18 +282,18 @@ unsafe fn find_divisor_v(d: *mut TDivisor) -> i32 {
residue_add(f1, residue_mul(u1, residue_mul(v1, v1))),
residue_inv(residue_add(v1, v1)),
);
(*d).v[0_i32 as usize] = v0;
(*d).v[1_i32 as usize] = v1;
d.v[0_i32 as usize] = v0;
d.v[1_i32 as usize] = v1;
1_i32
}
unsafe fn polynomial_mul(
fn polynomial_mul(
adeg: i32,
a: *const u64,
a: &[u64],
bdeg: i32,
b: *const u64,
b: &[u64],
mut resultprevdeg: i32,
result: *mut u64,
result: &mut [u64],
) -> i32 {
// generic short slow code
if adeg < 0_i32 || bdeg < 0_i32 {
@ -300,7 +301,7 @@ unsafe fn polynomial_mul(
}
let mut i = resultprevdeg + 1_i32;
while i <= adeg + bdeg {
*result.offset(i as isize) = 0_i32 as u64;
result[i as usize] = 0_i32 as u64;
i += 1;
}
resultprevdeg = i - 1_i32;
@ -308,15 +309,15 @@ unsafe fn polynomial_mul(
while i <= adeg {
let mut j = 0_i32;
while j <= bdeg {
*result.offset((i + j) as isize) = residue_add(
*result.offset((i + j) as isize),
residue_mul(*a.offset(i as isize), *b.offset(j as isize)),
result[(i + j) as usize] = residue_add(
result[(i + j) as usize],
residue_mul(a[i as usize], b[j as usize]),
);
j += 1;
}
i += 1;
}
while resultprevdeg >= 0_i32 && *result.offset(resultprevdeg as isize) == 0_i32 as u64 {
while resultprevdeg >= 0_i32 && result[resultprevdeg as usize] == 0_i32 as u64 {
resultprevdeg -= 1;
}
resultprevdeg
@ -575,14 +576,7 @@ unsafe fn divisor_add(src1: *const TDivisor, src2: *const TDivisor, dst: *mut TD
i += 1;
}
let mut u: [u64; 5] = [0; 5];
let mut udeg: i32 = polynomial_mul(
u1deg,
u1.as_mut_ptr() as *const u64,
u2deg,
u2.as_mut_ptr() as *const u64,
-1_i32,
u.as_mut_ptr(),
);
let mut udeg: i32 = polynomial_mul(u1deg, &u1, u2deg, &u2, -1_i32, &mut u);
// u is monic
let mut v: [u64; 7] = [0; 7];
let mut tmp: [u64; 7] = [0; 7];
@ -590,30 +584,9 @@ unsafe fn divisor_add(src1: *const TDivisor, src2: *const TDivisor, dst: *mut TD
// c1*(e1*u1*(v2-v1) + d1*v1) + c2*(v1*v2 + f)
v[0_i32 as usize] = residue_sub(v2[0_i32 as usize], v1[0_i32 as usize]);
v[1_i32 as usize] = residue_sub(v2[1_i32 as usize], v1[1_i32 as usize]);
let mut tmpdeg = polynomial_mul(
e1deg,
e1.as_mut_ptr() as *const u64,
1_i32,
v.as_mut_ptr() as *const u64,
-1_i32,
tmp.as_mut_ptr(),
);
let mut vdeg = polynomial_mul(
u1deg,
u1.as_mut_ptr() as *const u64,
tmpdeg,
tmp.as_mut_ptr() as *const u64,
-1_i32,
v.as_mut_ptr(),
);
vdeg = polynomial_mul(
d1deg,
d1.as_mut_ptr() as *const u64,
1_i32,
v1.as_mut_ptr() as *const u64,
vdeg,
v.as_mut_ptr(),
);
let mut tmpdeg = polynomial_mul(e1deg, &e1, 1_i32, &v, -1_i32, &mut tmp);
let mut vdeg = polynomial_mul(u1deg, &u1, tmpdeg, &tmp, -1_i32, &mut v);
vdeg = polynomial_mul(d1deg, &d1, 1_i32, &v1, vdeg, &mut v);
i = 0_i32;
while i <= vdeg {
v[i as usize] = residue_mul(v[i as usize], c1[0_i32 as usize]);
@ -626,22 +599,8 @@ unsafe fn divisor_add(src1: *const TDivisor, src2: *const TDivisor, dst: *mut TD
tmp[4] = F[4];
tmp[5] = F[5];
tmpdeg = 5_i32;
tmpdeg = polynomial_mul(
1_i32,
v1.as_mut_ptr() as *const u64,
1_i32,
v2.as_mut_ptr() as *const u64,
tmpdeg,
tmp.as_mut_ptr(),
);
vdeg = polynomial_mul(
c2deg,
c2.as_mut_ptr() as *const u64,
tmpdeg,
tmp.as_mut_ptr() as *const u64,
vdeg,
v.as_mut_ptr(),
);
tmpdeg = polynomial_mul(1_i32, &v1, 1_i32, &v2, tmpdeg, &mut tmp);
vdeg = polynomial_mul(c2deg, &c2, tmpdeg, &tmp, vdeg, &mut v);
if ddeg > 0_i32 {
let mut udiv: [u64; 5] = [0; 5];
polynomial_div_monic(
@ -683,14 +642,7 @@ unsafe fn divisor_add(src1: *const TDivisor, src2: *const TDivisor, dst: *mut TD
);
while udeg > 2_i32 {
// u' = monic((f-v^2)/u), v'=-v mod u'
tmpdeg = polynomial_mul(
vdeg,
v.as_mut_ptr() as *const u64,
vdeg,
v.as_mut_ptr() as *const u64,
-1_i32,
tmp.as_mut_ptr(),
);
tmpdeg = polynomial_mul(vdeg, &v, vdeg, &v, -1_i32, &mut tmp);
i = 0_i32;
while i <= tmpdeg && i <= 5_i32 {
tmp[i as usize] = residue_sub(F[i as usize], tmp[i as usize]);