confid: Completely remove all unsafe
This commit is contained in:
parent
c696803702
commit
11cd3e137d
2 changed files with 57 additions and 77 deletions
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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),
|
||||
|
|
Loading…
Add table
Reference in a new issue