From 11cd3e137d0e26d3e2e253fc60699fe623a435ff Mon Sep 17 00:00:00 2001 From: Alex Page Date: Wed, 28 Jun 2023 20:44:33 -0400 Subject: [PATCH] confid: Completely remove all unsafe --- umskt/src/confid/black_box.rs | 132 +++++++++++++++------------------- umskt/src/confid/mod.rs | 2 +- 2 files changed, 57 insertions(+), 77 deletions(-) diff --git a/umskt/src/confid/black_box.rs b/umskt/src/confid/black_box.rs index 32880d9..c4116f0 100644 --- a/umskt/src/confid/black_box.rs +++ b/umskt/src/confid/black_box.rs @@ -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::>()[..] + .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); } diff --git a/umskt/src/confid/mod.rs b/umskt/src/confid/mod.rs index 6754e3c..710668d 100644 --- a/umskt/src/confid/mod.rs +++ b/umskt/src/confid/mod.rs @@ -27,7 +27,7 @@ pub fn generate(installation_id: &str) -> Result { } 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),