confid: Remove unsafe from polynomial_xgcd
This commit is contained in:
parent
171e913138
commit
6f4cd8ecf5
1 changed files with 46 additions and 89 deletions
|
@ -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),
|
||||
|
|
Loading…
Add table
Reference in a new issue