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}; use std::mem::{size_of, swap};
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
#[repr(C)]
struct TDivisor { struct TDivisor {
u: [u64; 2], u: [u64; 2],
v: [u64; 2], v: [u64; 2],
} }
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
#[repr(C)]
struct C2RustUnnamed { struct C2RustUnnamed {
encoded: [u32; 4], encoded: [u32; 4],
} }
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
#[repr(C)]
union C2RustUnnamed0 {
c2rust_unnamed: C2RustUnnamed1,
c2rust_unnamed_0: C2RustUnnamed,
}
#[derive(Copy, Clone)]
#[repr(C)]
struct C2RustUnnamed1 { struct C2RustUnnamed1 {
encoded_lo: u64, encoded_lo: u64,
encoded_hi: u64, encoded_hi: u64,
} }
#[derive(Copy, Clone)] #[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 { struct C2RustUnnamed4 {
hardware_id: u64, hardware_id: u64,
product_id_low: u64, product_id_low: u64,
product_id_high: u8, product_id_high: u8,
key_sha1: u16, key_sha1: u16,
} }
static F: [u64; 6] = [ static F: [u64; 6] = [
0, 0,
0x21840136c85381, 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: [u8; 19] = [0; 19]; // 10**45 < 256**19
let mut installation_id_len: usize = 0_i32 as usize; let mut installation_id_len: usize = 0_i32 as usize;
let mut count: 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; let mut attempt = 0_i32 as u8;
while attempt as i32 <= 0x80_i32 { while attempt as i32 <= 0x80_i32 {
let mut u: C2RustUnnamed3 = C2RustUnnamed3 { buffer: [0; 14] }; let mut u: [u8; 14] = [0; 14];
u.c2rust_unnamed.lo = 0_i32 as u64; u[7_i32 as usize] = attempt;
u.c2rust_unnamed.hi = 0_i32 as u64; mix(&mut u, 14_i32 as usize, &keybuf, 16_i32 as usize);
u.buffer[7_i32 as usize] = attempt; let u_lo = u64::from_le_bytes(u[0..8].try_into().unwrap());
mix(&mut u.buffer, 14_i32 as usize, &keybuf, 16_i32 as usize); let u_hi = u64::from_le_bytes(
let mut x2: u64 = ui128_quotient_mod(u.c2rust_unnamed.lo, u.c2rust_unnamed.hi); u[8..14]
let x1: u64 = u.c2rust_unnamed.lo.wrapping_sub(x2.wrapping_mul(MOD)); .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); x2 = x2.wrapping_add(1);
d_0.u[0_i32 as usize] = residue_sub( d_0.u[0_i32 as usize] = residue_sub(
residue_mul(x1, x1), residue_mul(x1, x1),
@ -996,30 +985,23 @@ pub unsafe fn generate(installation_id_str: &[u8], confirmation_id: &mut [u8]) -
0x40da7c36d44c_i64 as u64, 0x40da7c36d44c_i64 as u64,
&mut d_0, &mut d_0,
); );
let mut e: C2RustUnnamed0 = C2RustUnnamed0 { let mut e: C2RustUnnamed1 = C2RustUnnamed1 {
c2rust_unnamed: C2RustUnnamed1 { encoded_lo: 0,
encoded_lo: 0, encoded_hi: 0,
encoded_hi: 0,
},
}; };
if d_0.u[0_i32 as usize] == BAD { if d_0.u[0_i32 as usize] == BAD {
// we can not get the zero divisor, actually... // we can not get the zero divisor, actually...
e.c2rust_unnamed.encoded_lo = umul128( e.encoded_lo = umul128(MOD.wrapping_add(2_i32 as u64), MOD, &mut e.encoded_hi);
MOD.wrapping_add(2_i32 as u64),
MOD,
&mut e.c2rust_unnamed.encoded_hi,
);
} else if d_0.u[1_i32 as usize] == BAD { } 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), MOD.wrapping_add(1_i32 as u64),
d_0.u[0_i32 as usize], 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.encoded_lo = e.encoded_lo.wrapping_add(MOD);
e.c2rust_unnamed.encoded_hi = e e.encoded_hi = e
.c2rust_unnamed
.encoded_hi .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 { } else {
let x1_0: u64 = (if d_0.u[1_i32 as usize] as i32 % 2_i32 != 0 { 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) 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); let mut x2_0: u64 = residue_sqrt(x2sqr);
if x2_0 == BAD { if x2_0 == BAD {
x2_0 = residue_sqrt(residue_mul(x2sqr, residue_inv(43_i32 as u64))); 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(1_i32 as u64),
MOD.wrapping_add(x2_0), 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.encoded_lo = e.encoded_lo.wrapping_add(x1_0);
e.c2rust_unnamed.encoded_hi = e e.encoded_hi = e
.c2rust_unnamed
.encoded_hi .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 { } else {
// points (-x1+x2, v(-x1+x2)) and (-x1-x2, v(-x1-x2)) // points (-x1+x2, v(-x1+x2)) and (-x1-x2, v(-x1-x2))
let mut x1a: u64 = residue_sub(x1_0, x2_0); 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 { if (y1 ^ y2) & 1_i32 as u64 != 0 {
swap(&mut x1a, &mut x2a); swap(&mut x1a, &mut x2a);
} }
e.c2rust_unnamed.encoded_lo = umul128( e.encoded_lo = umul128(MOD.wrapping_add(1_i32 as u64), x1a, &mut e.encoded_hi);
MOD.wrapping_add(1_i32 as u64), e.encoded_lo = e.encoded_lo.wrapping_add(x2a);
x1a, e.encoded_hi = e
&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
.encoded_hi .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 decimal: [u8; 35] = [0; 35];
let mut i = 0_i32 as usize; let mut i = 0_i32 as usize;
while i < 35 { while i < 35 {
let c: u32 = (e.c2rust_unnamed_0.encoded[3_i32 as usize]).wrapping_rem(10_i32 as u32); let c: u32 = (e_2.encoded[3_i32 as usize]).wrapping_rem(10_i32 as u32);
e.c2rust_unnamed_0.encoded[3_i32 as usize] = e_2.encoded[3_i32 as usize] = e_2.encoded[3_i32 as usize].wrapping_div(10_i32 as u32);
e.c2rust_unnamed_0.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)
let c2: u32 = ((c as u64) << 32_i32 | e.c2rust_unnamed_0.encoded[2_i32 as usize] as u64)
.wrapping_rem(10_i32 as u64) as u32; .wrapping_rem(10_i32 as u64) as u32;
e.c2rust_unnamed_0.encoded[2_i32 as usize] = e_2.encoded[2_i32 as usize] = ((c as u64) << 32_i32 | e_2.encoded[2_i32 as usize] as u64)
((c as u64) << 32_i32 | e.c2rust_unnamed_0.encoded[2_i32 as usize] as u64) .wrapping_div(10_i32 as u64) as u32;
.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)
let c3: u32 = ((c2 as u64) << 32_i32 | e.c2rust_unnamed_0.encoded[1_i32 as usize] as u64)
.wrapping_rem(10_i32 as u64) as u32; .wrapping_rem(10_i32 as u64) as u32;
e.c2rust_unnamed_0.encoded[1_i32 as usize] = e_2.encoded[1_i32 as usize] = ((c2 as u64) << 32_i32 | e_2.encoded[1_i32 as usize] as u64)
((c2 as u64) << 32_i32 | e.c2rust_unnamed_0.encoded[1_i32 as usize] as u64) .wrapping_div(10_i32 as u64) as u32;
.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)
let c4: u32 = ((c3 as u64) << 32_i32 | e.c2rust_unnamed_0.encoded[0_i32 as usize] as u64)
.wrapping_rem(10_i32 as u64) as u32; .wrapping_rem(10_i32 as u64) as u32;
e.c2rust_unnamed_0.encoded[0_i32 as usize] = e_2.encoded[0_i32 as usize] = ((c3 as u64) << 32_i32 | e_2.encoded[0_i32 as usize] as u64)
((c3 as u64) << 32_i32 | e.c2rust_unnamed_0.encoded[0_i32 as usize] as u64) .wrapping_div(10_i32 as u64) as u32;
.wrapping_div(10_i32 as u64) as u32;
decimal[34_usize.wrapping_sub(i)] = c4 as u8; decimal[34_usize.wrapping_sub(i)] = c4 as u8;
i = i.wrapping_add(1); 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 inst_id = installation_id.as_bytes();
let mut conf_id = [0u8; 48]; 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 { match result {
0 => {} 0 => {}
1 => return Err(ConfirmationIdError::TooShort), 1 => return Err(ConfirmationIdError::TooShort),