From 3070732ab5f1e477ef7b8417bbf70d98f969345f Mon Sep 17 00:00:00 2001 From: Alex Page Date: Wed, 28 Jun 2023 19:58:49 -0400 Subject: [PATCH] confid: Partially remove unsafe from generate --- umskt/src/confid/black_box.rs | 51 ++++++++++++++++++----------------- umskt/src/confid/mod.rs | 15 +++-------- 2 files changed, 31 insertions(+), 35 deletions(-) diff --git a/umskt/src/confid/black_box.rs b/umskt/src/confid/black_box.rs index 3ef8aeb..6ec2c06 100644 --- a/umskt/src/confid/black_box.rs +++ b/umskt/src/confid/black_box.rs @@ -861,23 +861,20 @@ fn unmix(buffer: &mut [u8], buf_size: usize, key: &[u8], key_size: usize) { } } -pub unsafe fn generate(installation_id_str: *const i8, confirmation_id: *mut i8) -> i32 { +pub unsafe 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 p: *const i8 = installation_id_str; let mut count: usize = 0_i32 as usize; let mut total_count: usize = 0_i32 as usize; let mut check: u32 = 0_i32 as u32; - while *p != 0 { - if !(*p as i32 == ' ' as i32 || *p as i32 == '-' as i32) { - let d: i32 = *p as i32 - '0' as i32; + for p in installation_id_str.iter() { + let p_curr = *p as i8; + if !(p_curr as i32 == ' ' as i32 || p_curr as i32 == '-' as i32) { + let d: i32 = p_curr as i32 - '0' as i32; if !(0_i32..=9_i32).contains(&d) { return 3_i32; } - if count == 5 || *p.offset(1_i32 as isize) as i32 == 0_i32 { - if count == 0 { - return if total_count == 45 { 2_i32 } else { 1_i32 }; - } + if count == 5 { if d as u32 != check.wrapping_rem(7_i32 as u32) { return if count < 5 { 1_i32 } else { 4_i32 }; } @@ -911,7 +908,6 @@ pub unsafe fn generate(installation_id_str: *const i8, confirmation_id: *mut i8) } } } - p = p.offset(1); } if total_count != 41 && total_count < 45 { return 1_i32; @@ -941,11 +937,18 @@ pub unsafe fn generate(installation_id_str: *const i8, confirmation_id: *mut i8) product_id_high: 0, key_sha1: 0, }; - ptr::copy_nonoverlapping( - installation_id.as_mut_ptr() as *const c_void, - &mut parsed as *mut C2RustUnnamed4 as *mut c_void, - size_of::(), - ); + + let hardware_id_bytes: [u8; 8] = installation_id[0..8].try_into().unwrap(); + parsed.hardware_id = u64::from_le_bytes(hardware_id_bytes); + + let product_id_low_bytes: [u8; 8] = installation_id[8..16].try_into().unwrap(); + parsed.product_id_low = u64::from_le_bytes(product_id_low_bytes); + + parsed.product_id_high = installation_id[16]; + + let key_sha1_bytes: [u8; 2] = installation_id[17..19].try_into().unwrap(); + parsed.key_sha1 = u16::from_le_bytes(key_sha1_bytes); + let product_id_1: u32 = (parsed.product_id_low & ((1_i32 << 17_i32) - 1_i32) as u64) as u32; let product_id_2: u32 = (parsed.product_id_low >> 17_i32 & ((1_i32 << 10_i32) - 1_i32) as u64) as u32; @@ -1105,31 +1108,31 @@ pub unsafe fn generate(installation_id_str: *const i8, confirmation_id: *mut i8) decimal[34_usize.wrapping_sub(i)] = c4 as u8; i = i.wrapping_add(1); } - let mut q: *mut i8 = confirmation_id; + let mut q: *mut u8 = confirmation_id.as_mut_ptr(); i = 0_i32 as usize; while i < 7 { if i != 0 { let fresh2 = q; q = q.offset(1); - *fresh2 = '-' as i32 as i8; + *fresh2 = '-' as u8; } 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 i8; - *q.offset(1_i32 as isize) = (*p_0.offset(1_i32 as isize) as i32 + '0' as i32) as i8; - *q.offset(2_i32 as isize) = (*p_0.offset(2_i32 as isize) as i32 + '0' as i32) as i8; - *q.offset(3_i32 as isize) = (*p_0.offset(3_i32 as isize) as i32 + '0' as i32) as i8; - *q.offset(4_i32 as isize) = (*p_0.offset(4_i32 as isize) as i32 + '0' as i32) as i8; + *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) % 7_i32 - + '0' as i32) as i8; + + '0' as i32) as u8; q = q.offset(6_i32 as isize); i = i.wrapping_add(1); } let fresh3 = q.offset(1); - *fresh3 = 0_i32 as i8; + *fresh3 = 0_i32 as u8; 0_i32 } diff --git a/umskt/src/confid/mod.rs b/umskt/src/confid/mod.rs index 077c2f5..73c660d 100644 --- a/umskt/src/confid/mod.rs +++ b/umskt/src/confid/mod.rs @@ -1,5 +1,3 @@ -use std::ffi::{CStr, CString}; - use thiserror::Error; mod black_box; @@ -27,9 +25,9 @@ pub fn generate(installation_id: &str) -> Result { if installation_id.len() > 54 { return Err(ConfirmationIdError::TooLarge); } - let inst_id = CString::new(installation_id).unwrap(); - let conf_id = [0u8; 49]; - let result = unsafe { black_box::generate(inst_id.as_ptr(), conf_id.as_ptr() as *mut i8) }; + let inst_id = installation_id.as_bytes(); + let mut conf_id = [0u8; 49]; + let result = unsafe { black_box::generate(inst_id, &mut conf_id) }; match result { 0 => {} 1 => return Err(ConfirmationIdError::TooShort), @@ -40,12 +38,7 @@ pub fn generate(installation_id: &str) -> Result { 6 => return Err(ConfirmationIdError::Unlucky), _ => panic!("Unknown error code: {}", result), } - unsafe { - Ok(CStr::from_ptr(conf_id.as_ptr() as *const i8) - .to_str() - .unwrap() - .to_string()) - } + Ok(String::from_utf8_lossy(&conf_id[..48]).into()) } #[cfg(test)]