From c69680370245a9217682e1a5521e7da78fc0358f Mon Sep 17 00:00:00 2001 From: Alex Page Date: Wed, 28 Jun 2023 20:18:20 -0400 Subject: [PATCH] confid: Remove more unsafe from generate --- umskt/src/confid/black_box.rs | 57 +++++++++++++---------------------- umskt/src/confid/mod.rs | 4 +-- 2 files changed, 23 insertions(+), 38 deletions(-) diff --git a/umskt/src/confid/black_box.rs b/umskt/src/confid/black_box.rs index 6ec2c06..32880d9 100644 --- a/umskt/src/confid/black_box.rs +++ b/umskt/src/confid/black_box.rs @@ -1,8 +1,4 @@ -use std::{ - ffi::c_void, - mem::{size_of, swap}, - ptr, -}; +use std::mem::{size_of, swap}; #[derive(Copy, Clone)] #[repr(C)] @@ -961,21 +957,12 @@ pub unsafe fn generate(installation_id_str: &[u8], confirmation_id: &mut [u8]) - return 5_i32; } let mut keybuf: [u8; 16] = [0; 16]; - let mut hardware_id = parsed.hardware_id; - ptr::copy_nonoverlapping( - &mut hardware_id as *mut u64 as *const c_void, - keybuf.as_mut_ptr() as *mut c_void, - 8, - ); - let mut product_id_mixed: u64 = (product_id_1 as u64) << 41_i32 + keybuf[..8].copy_from_slice(&parsed.hardware_id.to_le_bytes()[..8]); + let product_id_mixed: u64 = (product_id_1 as u64) << 41_i32 | (product_id_2 as u64) << 58_i32 | (product_id_3 as u64) << 17_i32 | product_id_4 as u64; - ptr::copy_nonoverlapping( - &mut product_id_mixed as *mut u64 as *const c_void, - keybuf.as_mut_ptr().offset(8) as *mut c_void, - 8, - ); + keybuf[8..16].copy_from_slice(&product_id_mixed.to_le_bytes()[..8]); let mut d_0: TDivisor = TDivisor { u: [0; 2], v: [0; 2], @@ -1108,31 +1095,29 @@ pub unsafe fn generate(installation_id_str: &[u8], confirmation_id: &mut [u8]) - decimal[34_usize.wrapping_sub(i)] = c4 as u8; i = i.wrapping_add(1); } - let mut q: *mut u8 = confirmation_id.as_mut_ptr(); - i = 0_i32 as usize; + let q = confirmation_id; + let mut i: usize = 0; + let mut q_i = 0; while i < 7 { if i != 0 { - let fresh2 = q; - q = q.offset(1); - *fresh2 = '-' as u8; + q[q_i] = b'-'; + q_i += 1; } - let p_0: *mut u8 = decimal.as_mut_ptr().add(i.wrapping_mul(5)); - *q.offset(0_i32 as isize) = (*p_0.offset(0_i32 as isize) as i32 + '0' as i32) as u8; - *q.offset(1_i32 as isize) = (*p_0.offset(1_i32 as isize) as i32 + '0' as i32) as u8; - *q.offset(2_i32 as isize) = (*p_0.offset(2_i32 as isize) as i32 + '0' as i32) as u8; - *q.offset(3_i32 as isize) = (*p_0.offset(3_i32 as isize) as i32 + '0' as i32) as u8; - *q.offset(4_i32 as isize) = (*p_0.offset(4_i32 as isize) as i32 + '0' as i32) as u8; - *q.offset(5_i32 as isize) = ((*p_0.offset(0_i32 as isize) as i32 - + *p_0.offset(1_i32 as isize) as i32 * 2_i32 - + *p_0.offset(2_i32 as isize) as i32 - + *p_0.offset(3_i32 as isize) as i32 * 2_i32 - + *p_0.offset(4_i32 as isize) as i32) + let p_0: &mut [u8] = &mut decimal[i.wrapping_mul(5)..]; + q[q_i] = (p_0[0] as i32 + '0' as i32) as u8; + q[q_i + 1] = (p_0[1] as i32 + '0' as i32) as u8; + q[q_i + 2] = (p_0[2] as i32 + '0' as i32) as u8; + q[q_i + 3] = (p_0[3] as i32 + '0' as i32) as u8; + q[q_i + 4] = (p_0[4] as i32 + '0' as i32) as u8; + q[q_i + 5] = ((p_0[0] as i32 + + p_0[1] as i32 * 2_i32 + + p_0[2] as i32 + + p_0[3] as i32 * 2_i32 + + p_0[4] as i32) % 7_i32 + '0' as i32) as u8; - q = q.offset(6_i32 as isize); + q_i = q_i.wrapping_add(6); i = i.wrapping_add(1); } - let fresh3 = q.offset(1); - *fresh3 = 0_i32 as u8; 0_i32 } diff --git a/umskt/src/confid/mod.rs b/umskt/src/confid/mod.rs index 73c660d..6754e3c 100644 --- a/umskt/src/confid/mod.rs +++ b/umskt/src/confid/mod.rs @@ -26,7 +26,7 @@ pub fn generate(installation_id: &str) -> Result { return Err(ConfirmationIdError::TooLarge); } let inst_id = installation_id.as_bytes(); - let mut conf_id = [0u8; 49]; + let mut conf_id = [0u8; 48]; let result = unsafe { black_box::generate(inst_id, &mut conf_id) }; match result { 0 => {} @@ -38,7 +38,7 @@ pub fn generate(installation_id: &str) -> Result { 6 => return Err(ConfirmationIdError::Unlucky), _ => panic!("Unknown error code: {}", result), } - Ok(String::from_utf8_lossy(&conf_id[..48]).into()) + Ok(String::from_utf8_lossy(&conf_id).into()) } #[cfg(test)]