confid: Remove more unsafe from generate

This commit is contained in:
Alex Page 2023-06-28 20:18:20 -04:00
parent 3070732ab5
commit c696803702
2 changed files with 23 additions and 38 deletions

View file

@ -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
}

View file

@ -26,7 +26,7 @@ pub fn generate(installation_id: &str) -> Result<String, ConfirmationIdError> {
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<String, ConfirmationIdError> {
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)]