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::{ use std::mem::{size_of, swap};
ffi::c_void,
mem::{size_of, swap},
ptr,
};
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
#[repr(C)] #[repr(C)]
@ -961,21 +957,12 @@ pub unsafe fn generate(installation_id_str: &[u8], confirmation_id: &mut [u8]) -
return 5_i32; return 5_i32;
} }
let mut keybuf: [u8; 16] = [0; 16]; let mut keybuf: [u8; 16] = [0; 16];
let mut hardware_id = parsed.hardware_id; keybuf[..8].copy_from_slice(&parsed.hardware_id.to_le_bytes()[..8]);
ptr::copy_nonoverlapping( let product_id_mixed: u64 = (product_id_1 as u64) << 41_i32
&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
| (product_id_2 as u64) << 58_i32 | (product_id_2 as u64) << 58_i32
| (product_id_3 as u64) << 17_i32 | (product_id_3 as u64) << 17_i32
| product_id_4 as u64; | product_id_4 as u64;
ptr::copy_nonoverlapping( keybuf[8..16].copy_from_slice(&product_id_mixed.to_le_bytes()[..8]);
&mut product_id_mixed as *mut u64 as *const c_void,
keybuf.as_mut_ptr().offset(8) as *mut c_void,
8,
);
let mut d_0: TDivisor = TDivisor { let mut d_0: TDivisor = TDivisor {
u: [0; 2], u: [0; 2],
v: [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; decimal[34_usize.wrapping_sub(i)] = c4 as u8;
i = i.wrapping_add(1); i = i.wrapping_add(1);
} }
let mut q: *mut u8 = confirmation_id.as_mut_ptr(); let q = confirmation_id;
i = 0_i32 as usize; let mut i: usize = 0;
let mut q_i = 0;
while i < 7 { while i < 7 {
if i != 0 { if i != 0 {
let fresh2 = q; q[q_i] = b'-';
q = q.offset(1); q_i += 1;
*fresh2 = '-' as u8;
} }
let p_0: *mut u8 = decimal.as_mut_ptr().add(i.wrapping_mul(5)); let p_0: &mut [u8] = &mut decimal[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[q_i] = (p_0[0] 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[q_i + 1] = (p_0[1] 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[q_i + 2] = (p_0[2] 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[q_i + 3] = (p_0[3] 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[q_i + 4] = (p_0[4] as i32 + '0' as i32) as u8;
*q.offset(5_i32 as isize) = ((*p_0.offset(0_i32 as isize) as i32 q[q_i + 5] = ((p_0[0] as i32
+ *p_0.offset(1_i32 as isize) as i32 * 2_i32 + p_0[1] as i32 * 2_i32
+ *p_0.offset(2_i32 as isize) as i32 + p_0[2] as i32
+ *p_0.offset(3_i32 as isize) as i32 * 2_i32 + p_0[3] as i32 * 2_i32
+ *p_0.offset(4_i32 as isize) as i32) + p_0[4] as i32)
% 7_i32 % 7_i32
+ '0' as i32) as u8; + '0' as i32) as u8;
q = q.offset(6_i32 as isize); q_i = q_i.wrapping_add(6);
i = i.wrapping_add(1); i = i.wrapping_add(1);
} }
let fresh3 = q.offset(1);
*fresh3 = 0_i32 as u8;
0_i32 0_i32
} }

View file

@ -26,7 +26,7 @@ pub fn generate(installation_id: &str) -> Result<String, ConfirmationIdError> {
return Err(ConfirmationIdError::TooLarge); return Err(ConfirmationIdError::TooLarge);
} }
let inst_id = installation_id.as_bytes(); 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) }; let result = unsafe { black_box::generate(inst_id, &mut conf_id) };
match result { match result {
0 => {} 0 => {}
@ -38,7 +38,7 @@ pub fn generate(installation_id: &str) -> Result<String, ConfirmationIdError> {
6 => return Err(ConfirmationIdError::Unlucky), 6 => return Err(ConfirmationIdError::Unlucky),
_ => panic!("Unknown error code: {}", result), _ => panic!("Unknown error code: {}", result),
} }
Ok(String::from_utf8_lossy(&conf_id[..48]).into()) Ok(String::from_utf8_lossy(&conf_id).into())
} }
#[cfg(test)] #[cfg(test)]