confid: Partially remove unsafe from generate
This commit is contained in:
parent
7684957ada
commit
3070732ab5
2 changed files with 31 additions and 35 deletions
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)]
|
||||
|
|
Loading…
Add table
Reference in a new issue