confid: Partially remove unsafe from generate

This commit is contained in:
Alex Page 2023-06-28 19:58:49 -04:00
parent 7684957ada
commit 3070732ab5
2 changed files with 31 additions and 35 deletions

View file

@ -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::<C2RustUnnamed4>(),
);
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
}

View file

@ -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<String, ConfirmationIdError> {
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<String, ConfirmationIdError> {
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)]