confid: Completely remove all unsafe

This commit is contained in:
Alex Page 2023-06-28 20:44:33 -04:00
parent c696803702
commit 11cd3e137d
2 changed files with 57 additions and 77 deletions

View file

@ -1,49 +1,30 @@
use std::mem::{size_of, swap};
#[derive(Copy, Clone)]
#[repr(C)]
struct TDivisor {
u: [u64; 2],
v: [u64; 2],
}
#[derive(Copy, Clone)]
#[repr(C)]
struct C2RustUnnamed {
encoded: [u32; 4],
}
#[derive(Copy, Clone)]
#[repr(C)]
union C2RustUnnamed0 {
c2rust_unnamed: C2RustUnnamed1,
c2rust_unnamed_0: C2RustUnnamed,
}
#[derive(Copy, Clone)]
#[repr(C)]
struct C2RustUnnamed1 {
encoded_lo: u64,
encoded_hi: u64,
}
#[derive(Copy, Clone)]
#[repr(C)]
struct C2RustUnnamed2 {
lo: u64,
hi: u64,
}
#[derive(Copy, Clone)]
#[repr(C)]
union C2RustUnnamed3 {
buffer: [u8; 14],
c2rust_unnamed: C2RustUnnamed2,
}
#[derive(Copy, Clone)]
#[repr(C, packed)]
struct C2RustUnnamed4 {
hardware_id: u64,
product_id_low: u64,
product_id_high: u8,
key_sha1: u16,
}
static F: [u64; 6] = [
0,
0x21840136c85381,
@ -857,7 +838,7 @@ fn unmix(buffer: &mut [u8], buf_size: usize, key: &[u8], key_size: usize) {
}
}
pub unsafe fn generate(installation_id_str: &[u8], confirmation_id: &mut [u8]) -> i32 {
pub fn generate(installation_id_str: &[u8], confirmation_id: &mut [u8]) -> i32 {
let mut installation_id: [u8; 19] = [0; 19]; // 10**45 < 256**19
let mut installation_id_len: usize = 0_i32 as usize;
let mut count: usize = 0_i32 as usize;
@ -969,13 +950,21 @@ pub unsafe fn generate(installation_id_str: &[u8], confirmation_id: &mut [u8]) -
};
let mut attempt = 0_i32 as u8;
while attempt as i32 <= 0x80_i32 {
let mut u: C2RustUnnamed3 = C2RustUnnamed3 { buffer: [0; 14] };
u.c2rust_unnamed.lo = 0_i32 as u64;
u.c2rust_unnamed.hi = 0_i32 as u64;
u.buffer[7_i32 as usize] = attempt;
mix(&mut u.buffer, 14_i32 as usize, &keybuf, 16_i32 as usize);
let mut x2: u64 = ui128_quotient_mod(u.c2rust_unnamed.lo, u.c2rust_unnamed.hi);
let x1: u64 = u.c2rust_unnamed.lo.wrapping_sub(x2.wrapping_mul(MOD));
let mut u: [u8; 14] = [0; 14];
u[7_i32 as usize] = attempt;
mix(&mut u, 14_i32 as usize, &keybuf, 16_i32 as usize);
let u_lo = u64::from_le_bytes(u[0..8].try_into().unwrap());
let u_hi = u64::from_le_bytes(
u[8..14]
.iter()
.chain([0, 0].iter())
.cloned()
.collect::<Vec<u8>>()[..]
.try_into()
.unwrap(),
);
let mut x2: u64 = ui128_quotient_mod(u_lo, u_hi);
let x1: u64 = u_lo.wrapping_sub(x2.wrapping_mul(MOD));
x2 = x2.wrapping_add(1);
d_0.u[0_i32 as usize] = residue_sub(
residue_mul(x1, x1),
@ -996,30 +985,23 @@ pub unsafe fn generate(installation_id_str: &[u8], confirmation_id: &mut [u8]) -
0x40da7c36d44c_i64 as u64,
&mut d_0,
);
let mut e: C2RustUnnamed0 = C2RustUnnamed0 {
c2rust_unnamed: C2RustUnnamed1 {
encoded_lo: 0,
encoded_hi: 0,
},
let mut e: C2RustUnnamed1 = C2RustUnnamed1 {
encoded_lo: 0,
encoded_hi: 0,
};
if d_0.u[0_i32 as usize] == BAD {
// we can not get the zero divisor, actually...
e.c2rust_unnamed.encoded_lo = umul128(
MOD.wrapping_add(2_i32 as u64),
MOD,
&mut e.c2rust_unnamed.encoded_hi,
);
e.encoded_lo = umul128(MOD.wrapping_add(2_i32 as u64), MOD, &mut e.encoded_hi);
} else if d_0.u[1_i32 as usize] == BAD {
e.c2rust_unnamed.encoded_lo = umul128(
e.encoded_lo = umul128(
MOD.wrapping_add(1_i32 as u64),
d_0.u[0_i32 as usize],
&mut e.c2rust_unnamed.encoded_hi,
&mut e.encoded_hi,
);
e.c2rust_unnamed.encoded_lo = e.c2rust_unnamed.encoded_lo.wrapping_add(MOD);
e.c2rust_unnamed.encoded_hi = e
.c2rust_unnamed
e.encoded_lo = e.encoded_lo.wrapping_add(MOD);
e.encoded_hi = e
.encoded_hi
.wrapping_add((e.c2rust_unnamed.encoded_lo < MOD) as i32 as u64);
.wrapping_add((e.encoded_lo < MOD) as i32 as u64);
} else {
let x1_0: u64 = (if d_0.u[1_i32 as usize] as i32 % 2_i32 != 0 {
d_0.u[1_i32 as usize].wrapping_add(MOD)
@ -1031,16 +1013,15 @@ pub unsafe fn generate(installation_id_str: &[u8], confirmation_id: &mut [u8]) -
let mut x2_0: u64 = residue_sqrt(x2sqr);
if x2_0 == BAD {
x2_0 = residue_sqrt(residue_mul(x2sqr, residue_inv(43_i32 as u64)));
e.c2rust_unnamed.encoded_lo = umul128(
e.encoded_lo = umul128(
MOD.wrapping_add(1_i32 as u64),
MOD.wrapping_add(x2_0),
&mut e.c2rust_unnamed.encoded_hi,
&mut e.encoded_hi,
);
e.c2rust_unnamed.encoded_lo = e.c2rust_unnamed.encoded_lo.wrapping_add(x1_0);
e.c2rust_unnamed.encoded_hi = e
.c2rust_unnamed
e.encoded_lo = e.encoded_lo.wrapping_add(x1_0);
e.encoded_hi = e
.encoded_hi
.wrapping_add((e.c2rust_unnamed.encoded_lo < x1_0) as i32 as u64);
.wrapping_add((e.encoded_lo < x1_0) as i32 as u64);
} else {
// points (-x1+x2, v(-x1+x2)) and (-x1-x2, v(-x1-x2))
let mut x1a: u64 = residue_sub(x1_0, x2_0);
@ -1059,39 +1040,38 @@ pub unsafe fn generate(installation_id_str: &[u8], confirmation_id: &mut [u8]) -
if (y1 ^ y2) & 1_i32 as u64 != 0 {
swap(&mut x1a, &mut x2a);
}
e.c2rust_unnamed.encoded_lo = umul128(
MOD.wrapping_add(1_i32 as u64),
x1a,
&mut e.c2rust_unnamed.encoded_hi,
);
e.c2rust_unnamed.encoded_lo = e.c2rust_unnamed.encoded_lo.wrapping_add(x2a);
e.c2rust_unnamed.encoded_hi = e
.c2rust_unnamed
e.encoded_lo = umul128(MOD.wrapping_add(1_i32 as u64), x1a, &mut e.encoded_hi);
e.encoded_lo = e.encoded_lo.wrapping_add(x2a);
e.encoded_hi = e
.encoded_hi
.wrapping_add((e.c2rust_unnamed.encoded_lo < x2a) as i32 as u64);
.wrapping_add((e.encoded_lo < x2a) as i32 as u64);
}
}
let mut e_2 = C2RustUnnamed {
encoded: [
u32::from_le_bytes(e.encoded_lo.to_le_bytes()[0..4].try_into().unwrap()),
u32::from_le_bytes(e.encoded_lo.to_le_bytes()[4..].try_into().unwrap()),
u32::from_le_bytes(e.encoded_hi.to_le_bytes()[0..4].try_into().unwrap()),
u32::from_le_bytes(e.encoded_hi.to_le_bytes()[4..].try_into().unwrap()),
],
};
let mut decimal: [u8; 35] = [0; 35];
let mut i = 0_i32 as usize;
while i < 35 {
let c: u32 = (e.c2rust_unnamed_0.encoded[3_i32 as usize]).wrapping_rem(10_i32 as u32);
e.c2rust_unnamed_0.encoded[3_i32 as usize] =
e.c2rust_unnamed_0.encoded[3_i32 as usize].wrapping_div(10_i32 as u32);
let c2: u32 = ((c as u64) << 32_i32 | e.c2rust_unnamed_0.encoded[2_i32 as usize] as u64)
let c: u32 = (e_2.encoded[3_i32 as usize]).wrapping_rem(10_i32 as u32);
e_2.encoded[3_i32 as usize] = e_2.encoded[3_i32 as usize].wrapping_div(10_i32 as u32);
let c2: u32 = ((c as u64) << 32_i32 | e_2.encoded[2_i32 as usize] as u64)
.wrapping_rem(10_i32 as u64) as u32;
e.c2rust_unnamed_0.encoded[2_i32 as usize] =
((c as u64) << 32_i32 | e.c2rust_unnamed_0.encoded[2_i32 as usize] as u64)
.wrapping_div(10_i32 as u64) as u32;
let c3: u32 = ((c2 as u64) << 32_i32 | e.c2rust_unnamed_0.encoded[1_i32 as usize] as u64)
e_2.encoded[2_i32 as usize] = ((c as u64) << 32_i32 | e_2.encoded[2_i32 as usize] as u64)
.wrapping_div(10_i32 as u64) as u32;
let c3: u32 = ((c2 as u64) << 32_i32 | e_2.encoded[1_i32 as usize] as u64)
.wrapping_rem(10_i32 as u64) as u32;
e.c2rust_unnamed_0.encoded[1_i32 as usize] =
((c2 as u64) << 32_i32 | e.c2rust_unnamed_0.encoded[1_i32 as usize] as u64)
.wrapping_div(10_i32 as u64) as u32;
let c4: u32 = ((c3 as u64) << 32_i32 | e.c2rust_unnamed_0.encoded[0_i32 as usize] as u64)
e_2.encoded[1_i32 as usize] = ((c2 as u64) << 32_i32 | e_2.encoded[1_i32 as usize] as u64)
.wrapping_div(10_i32 as u64) as u32;
let c4: u32 = ((c3 as u64) << 32_i32 | e_2.encoded[0_i32 as usize] as u64)
.wrapping_rem(10_i32 as u64) as u32;
e.c2rust_unnamed_0.encoded[0_i32 as usize] =
((c3 as u64) << 32_i32 | e.c2rust_unnamed_0.encoded[0_i32 as usize] as u64)
.wrapping_div(10_i32 as u64) as u32;
e_2.encoded[0_i32 as usize] = ((c3 as u64) << 32_i32 | e_2.encoded[0_i32 as usize] as u64)
.wrapping_div(10_i32 as u64) as u32;
decimal[34_usize.wrapping_sub(i)] = c4 as u8;
i = i.wrapping_add(1);
}

View file

@ -27,7 +27,7 @@ pub fn generate(installation_id: &str) -> Result<String, ConfirmationIdError> {
}
let inst_id = installation_id.as_bytes();
let mut conf_id = [0u8; 48];
let result = unsafe { black_box::generate(inst_id, &mut conf_id) };
let result = black_box::generate(inst_id, &mut conf_id);
match result {
0 => {}
1 => return Err(ConfirmationIdError::TooShort),