From 7d35fe36fedae801809ce85f26bd8e559c1e91e8 Mon Sep 17 00:00:00 2001 From: Alex Page Date: Wed, 21 Jun 2023 21:45:34 -0400 Subject: [PATCH] Remove libc dependency --- Cargo.lock | 1 - Cargo.toml | 1 - src/confid.rs | 200 +++++++++++++++++++++++--------------------------- 3 files changed, 91 insertions(+), 111 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2ce4bbf..253065e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -367,7 +367,6 @@ dependencies = [ "anyhow", "bitreader", "clap", - "libc", "openssl", "serde_json", "thiserror", diff --git a/Cargo.toml b/Cargo.toml index 0a9af1d..f622acf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,6 @@ edition = "2021" anyhow = "1.0.71" bitreader = "0.3.7" clap = { version = "4.3.4", features = ["derive"] } -libc = "0.2.146" openssl = { git = "https://github.com/anpage/rust-openssl.git" } serde_json = "1.0" thiserror = "1.0.40" diff --git a/src/confid.rs b/src/confid.rs index abed899..69990e4 100644 --- a/src/confid.rs +++ b/src/confid.rs @@ -6,7 +6,7 @@ )] use std::{ - ffi::{CStr, CString}, + ffi::{c_void, CStr, CString}, ptr, }; @@ -49,7 +49,7 @@ struct C2RustUnnamed_2 { #[derive(Copy, Clone)] #[repr(C)] union C2RustUnnamed_3 { - buffer: [libc::c_uchar; 14], + buffer: [u8; 14], c2rust_unnamed: C2RustUnnamed_2, } #[derive(Copy, Clone)] @@ -57,8 +57,8 @@ union C2RustUnnamed_3 { struct C2RustUnnamed_4 { HardwareID: uint64_t, ProductIDLow: uint64_t, - ProductIDHigh: libc::c_uchar, - KeySHA1: libc::c_ushort, + ProductIDHigh: u8, + KeySHA1: u16, } static mut f: [uint64_t; 6] = [ 0_i32 as uint64_t, @@ -813,7 +813,7 @@ unsafe fn rol(x: u32, shift: i32) -> u32 { x << shift | x >> (32_i32 - shift) } -unsafe fn sha1_single_block(input: *mut libc::c_uchar, output: *mut libc::c_uchar) { +unsafe fn sha1_single_block(input: *mut u8, output: *mut u8) { let mut a = 0x67452301_i32 as u32; let mut b = 0xefcdab89_u32; let mut c = 0x98badcfe_u32; @@ -905,36 +905,31 @@ unsafe fn sha1_single_block(input: *mut libc::c_uchar, output: *mut libc::c_ucha c = c.wrapping_add(0x98badcfe_u32); d = d.wrapping_add(0x10325476_i32 as u32); e = e.wrapping_add(0xc3d2e1f0_u32); - *output.offset(0_i32 as isize) = (a >> 24_i32) as libc::c_uchar; - *output.offset(1_i32 as isize) = (a >> 16_i32) as libc::c_uchar; - *output.offset(2_i32 as isize) = (a >> 8_i32) as libc::c_uchar; - *output.offset(3_i32 as isize) = a as libc::c_uchar; - *output.offset(4_i32 as isize) = (b >> 24_i32) as libc::c_uchar; - *output.offset(5_i32 as isize) = (b >> 16_i32) as libc::c_uchar; - *output.offset(6_i32 as isize) = (b >> 8_i32) as libc::c_uchar; - *output.offset(7_i32 as isize) = b as libc::c_uchar; - *output.offset(8_i32 as isize) = (c >> 24_i32) as libc::c_uchar; - *output.offset(9_i32 as isize) = (c >> 16_i32) as libc::c_uchar; - *output.offset(10_i32 as isize) = (c >> 8_i32) as libc::c_uchar; - *output.offset(11_i32 as isize) = c as libc::c_uchar; - *output.offset(12_i32 as isize) = (d >> 24_i32) as libc::c_uchar; - *output.offset(13_i32 as isize) = (d >> 16_i32) as libc::c_uchar; - *output.offset(14_i32 as isize) = (d >> 8_i32) as libc::c_uchar; - *output.offset(15_i32 as isize) = d as libc::c_uchar; - *output.offset(16_i32 as isize) = (e >> 24_i32) as libc::c_uchar; - *output.offset(17_i32 as isize) = (e >> 16_i32) as libc::c_uchar; - *output.offset(18_i32 as isize) = (e >> 8_i32) as libc::c_uchar; - *output.offset(19_i32 as isize) = e as libc::c_uchar; + *output.offset(0_i32 as isize) = (a >> 24_i32) as u8; + *output.offset(1_i32 as isize) = (a >> 16_i32) as u8; + *output.offset(2_i32 as isize) = (a >> 8_i32) as u8; + *output.offset(3_i32 as isize) = a as u8; + *output.offset(4_i32 as isize) = (b >> 24_i32) as u8; + *output.offset(5_i32 as isize) = (b >> 16_i32) as u8; + *output.offset(6_i32 as isize) = (b >> 8_i32) as u8; + *output.offset(7_i32 as isize) = b as u8; + *output.offset(8_i32 as isize) = (c >> 24_i32) as u8; + *output.offset(9_i32 as isize) = (c >> 16_i32) as u8; + *output.offset(10_i32 as isize) = (c >> 8_i32) as u8; + *output.offset(11_i32 as isize) = c as u8; + *output.offset(12_i32 as isize) = (d >> 24_i32) as u8; + *output.offset(13_i32 as isize) = (d >> 16_i32) as u8; + *output.offset(14_i32 as isize) = (d >> 8_i32) as u8; + *output.offset(15_i32 as isize) = d as u8; + *output.offset(16_i32 as isize) = (e >> 24_i32) as u8; + *output.offset(17_i32 as isize) = (e >> 16_i32) as u8; + *output.offset(18_i32 as isize) = (e >> 8_i32) as u8; + *output.offset(19_i32 as isize) = e as u8; } -unsafe fn Mix( - buffer: *mut libc::c_uchar, - bufSize: size_t, - key: *const libc::c_uchar, - keySize: size_t, -) { - let mut sha1_input: [libc::c_uchar; 64] = [0; 64]; - let mut sha1_result: [libc::c_uchar; 20] = [0; 20]; +unsafe fn Mix(buffer: *mut u8, bufSize: size_t, key: *const u8, keySize: size_t) { + let mut sha1_input: [u8; 64] = [0; 64]; + let mut sha1_result: [u8; 20] = [0; 20]; let half: size_t = bufSize.wrapping_div(2_i32 as u64); let mut external_counter = 0_i32; while external_counter < 4_i32 { @@ -947,18 +942,19 @@ unsafe fn Mix( half as usize, ); ptr::copy_nonoverlapping( - key as *const libc::c_void, - sha1_input.as_mut_ptr().offset(half as isize) as *mut libc::c_void, + key as *const c_void, + sha1_input.as_mut_ptr().offset(half as isize) as *mut c_void, keySize as usize, ); - sha1_input[half.wrapping_add(keySize) as usize] = 0x80_i32 as libc::c_uchar; - sha1_input[(::std::mem::size_of::<[libc::c_uchar; 64]>() as u64).wrapping_sub(1_i32 as u64) - as usize] = half.wrapping_add(keySize).wrapping_mul(8_i32 as u64) as libc::c_uchar; - sha1_input[(::std::mem::size_of::<[libc::c_uchar; 64]>() as u64).wrapping_sub(2_i32 as u64) - as usize] = half - .wrapping_add(keySize) - .wrapping_mul(8_i32 as u64) - .wrapping_div(0x100_i32 as u64) as libc::c_uchar; + sha1_input[half.wrapping_add(keySize) as usize] = 0x80_i32 as u8; + sha1_input + [(::std::mem::size_of::<[u8; 64]>() as u64).wrapping_sub(1_i32 as u64) as usize] = + half.wrapping_add(keySize).wrapping_mul(8_i32 as u64) as u8; + sha1_input + [(::std::mem::size_of::<[u8; 64]>() as u64).wrapping_sub(2_i32 as u64) as usize] = + half.wrapping_add(keySize) + .wrapping_mul(8_i32 as u64) + .wrapping_div(0x100_i32 as u64) as u8; sha1_single_block(sha1_input.as_mut_ptr(), sha1_result.as_mut_ptr()); let mut i = half & !3_i32 as u64; while i < half { @@ -970,10 +966,9 @@ unsafe fn Mix( } i = 0_i32 as size_t; while i < half { - let tmp: libc::c_uchar = *buffer.offset(i.wrapping_add(half) as isize); - *buffer.offset(i.wrapping_add(half) as isize) = (*buffer.offset(i as isize) as i32 - ^ sha1_result[i as usize] as i32) - as libc::c_uchar; + let tmp: u8 = *buffer.offset(i.wrapping_add(half) as isize); + *buffer.offset(i.wrapping_add(half) as isize) = + (*buffer.offset(i as isize) as i32 ^ sha1_result[i as usize] as i32) as u8; *buffer.offset(i as isize) = tmp; i = i.wrapping_add(1); } @@ -981,14 +976,9 @@ unsafe fn Mix( } } -unsafe fn Unmix( - buffer: *mut libc::c_uchar, - bufSize: size_t, - key: *const libc::c_uchar, - keySize: size_t, -) { - let mut sha1_input: [libc::c_uchar; 64] = [0; 64]; - let mut sha1_result: [libc::c_uchar; 20] = [0; 20]; +unsafe fn Unmix(buffer: *mut u8, bufSize: size_t, key: *const u8, keySize: size_t) { + let mut sha1_input: [u8; 64] = [0; 64]; + let mut sha1_result: [u8; 20] = [0; 20]; let half: size_t = bufSize.wrapping_div(2_i32 as u64); let mut external_counter = 0_i32; while external_counter < 4_i32 { @@ -1001,14 +991,15 @@ unsafe fn Unmix( sha1_input.as_mut_ptr().offset(half as isize), keySize as usize, ); - sha1_input[half.wrapping_add(keySize) as usize] = 0x80_i32 as libc::c_uchar; - sha1_input[(::std::mem::size_of::<[libc::c_uchar; 64]>() as u64).wrapping_sub(1_i32 as u64) - as usize] = half.wrapping_add(keySize).wrapping_mul(8_i32 as u64) as libc::c_uchar; - sha1_input[(::std::mem::size_of::<[libc::c_uchar; 64]>() as u64).wrapping_sub(2_i32 as u64) - as usize] = half - .wrapping_add(keySize) - .wrapping_mul(8_i32 as u64) - .wrapping_div(0x100_i32 as u64) as libc::c_uchar; + sha1_input[half.wrapping_add(keySize) as usize] = 0x80_i32 as u8; + sha1_input + [(::std::mem::size_of::<[u8; 64]>() as u64).wrapping_sub(1_i32 as u64) as usize] = + half.wrapping_add(keySize).wrapping_mul(8_i32 as u64) as u8; + sha1_input + [(::std::mem::size_of::<[u8; 64]>() as u64).wrapping_sub(2_i32 as u64) as usize] = + half.wrapping_add(keySize) + .wrapping_mul(8_i32 as u64) + .wrapping_div(0x100_i32 as u64) as u8; sha1_single_block(sha1_input.as_mut_ptr(), sha1_result.as_mut_ptr()); let mut i = half & !3_i32 as u64; while i < half { @@ -1020,10 +1011,9 @@ unsafe fn Unmix( } i = 0_i32 as size_t; while i < half { - let tmp: libc::c_uchar = *buffer.offset(i as isize); + let tmp: u8 = *buffer.offset(i as isize); *buffer.offset(i as isize) = (*buffer.offset(i.wrapping_add(half) as isize) as i32 - ^ sha1_result[i as usize] as i32) - as libc::c_uchar; + ^ sha1_result[i as usize] as i32) as u8; *buffer.offset(i.wrapping_add(half) as isize) = tmp; i = i.wrapping_add(1); } @@ -1031,13 +1021,10 @@ unsafe fn Unmix( } } -unsafe fn Generate( - installation_id_str: *const libc::c_char, - confirmation_id: *mut libc::c_char, -) -> i32 { - let mut installation_id: [libc::c_uchar; 19] = [0; 19]; +unsafe fn Generate(installation_id_str: *const i8, confirmation_id: *mut i8) -> i32 { + let mut installation_id: [u8; 19] = [0; 19]; let mut installation_id_len: size_t = 0_i32 as size_t; - let mut p: *const libc::c_char = installation_id_str; + let mut p: *const i8 = installation_id_str; let mut count: size_t = 0_i32 as size_t; let mut totalCount: size_t = 0_i32 as size_t; let mut check: u32 = 0_i32 as u32; @@ -1073,13 +1060,13 @@ unsafe fn Generate( if totalCount > 45_i32 as u64 { return 2_i32; } - let mut carry: libc::c_uchar = d as libc::c_uchar; + let mut carry: u8 = d as u8; let mut i = 0_i32 as size_t; while i < installation_id_len { let x: u32 = (installation_id[i as usize] as i32 * 10_i32 + carry as i32) as u32; - installation_id[i as usize] = (x & 0xff_i32 as u32) as libc::c_uchar; - carry = (x >> 8_i32) as libc::c_uchar; + installation_id[i as usize] = (x & 0xff_i32 as u32) as u8; + carry = (x >> 8_i32) as u8; i = i.wrapping_add(1); } if carry != 0 { @@ -1094,15 +1081,15 @@ unsafe fn Generate( if totalCount != 41_i32 as u64 && totalCount < 45_i32 as u64 { return 1_i32; } - while installation_id_len < ::std::mem::size_of::<[libc::c_uchar; 19]>() as u64 { - installation_id[installation_id_len as usize] = 0_i32 as libc::c_uchar; + while installation_id_len < ::std::mem::size_of::<[u8; 19]>() as u64 { + installation_id[installation_id_len as usize] = 0_i32 as u8; installation_id_len = installation_id_len.wrapping_add(1); } - static mut iid_key: [libc::c_uchar; 4] = [ - 0x6a_i32 as libc::c_uchar, - 0xc8_i32 as libc::c_uchar, - 0x5e_i32 as libc::c_uchar, - 0xd4_i32 as libc::c_uchar, + static mut iid_key: [u8; 4] = [ + 0x6a_i32 as u8, + 0xc8_i32 as u8, + 0x5e_i32 as u8, + 0xd4_i32 as u8, ]; Unmix( installation_id.as_mut_ptr(), @@ -1124,8 +1111,8 @@ unsafe fn Generate( KeySHA1: 0, }; ptr::copy_nonoverlapping( - installation_id.as_mut_ptr() as *const libc::c_void, - &mut parsed as *mut C2RustUnnamed_4 as *mut libc::c_void, + installation_id.as_mut_ptr() as *const c_void, + &mut parsed as *mut C2RustUnnamed_4 as *mut c_void, std::mem::size_of::(), ); let productId1: u32 = (parsed.ProductIDLow & ((1_i32 << 17_i32) - 1_i32) as u64) as u32; @@ -1145,11 +1132,11 @@ unsafe fn Generate( { return 5_i32; } - let mut keybuf: [libc::c_uchar; 16] = [0; 16]; + let mut keybuf: [u8; 16] = [0; 16]; let mut hardware_id = parsed.HardwareID; ptr::copy_nonoverlapping( - &mut hardware_id as *mut u64 as *const libc::c_void, - keybuf.as_mut_ptr() as *mut libc::c_void, + &mut hardware_id as *mut u64 as *const c_void, + keybuf.as_mut_ptr() as *mut c_void, 8, ); let mut productIdMixed: uint64_t = (productId1 as uint64_t) << 41_i32 @@ -1157,15 +1144,15 @@ unsafe fn Generate( | (productId3 as uint64_t) << 17_i32 | productId4 as u64; ptr::copy_nonoverlapping( - &mut productIdMixed as *mut u64 as *const libc::c_void, - keybuf.as_mut_ptr().offset(8) as *mut libc::c_void, + &mut productIdMixed as *mut u64 as *const c_void, + keybuf.as_mut_ptr().offset(8) as *mut c_void, 8, ); let mut d_0: TDivisor = TDivisor { u: [0; 2], v: [0; 2], }; - let mut attempt = 0_i32 as libc::c_uchar; + let mut attempt = 0_i32 as u8; while attempt as i32 <= 0x80_i32 { let mut u: C2RustUnnamed_3 = C2RustUnnamed_3 { buffer: [0; 14] }; u.c2rust_unnamed.lo = 0_i32 as uint64_t; @@ -1284,7 +1271,7 @@ unsafe fn Generate( as uint64_t as uint64_t; } } - let mut decimal: [libc::c_uchar; 35] = [0; 35]; + let mut decimal: [u8; 35] = [0; 35]; let mut i = 0_i32 as size_t; while i < 35_i32 as u64 { let c: u32 = (e.c2rust_unnamed_0.encoded[3_i32 as usize]).wrapping_rem(10_i32 as u32); @@ -1309,42 +1296,37 @@ unsafe fn Generate( e.c2rust_unnamed_0.encoded[0_i32 as usize] = ((c3 as uint64_t) << 32_i32 | e.c2rust_unnamed_0.encoded[0_i32 as usize] as u64) .wrapping_div(10_i32 as u64) as uint32_t; - decimal[(34_i32 as u64).wrapping_sub(i) as usize] = c4 as libc::c_uchar; + decimal[(34_i32 as u64).wrapping_sub(i) as usize] = c4 as u8; i = i.wrapping_add(1); } - let mut q: *mut libc::c_char = confirmation_id; + let mut q: *mut i8 = confirmation_id; i = 0_i32 as size_t; while i < 7_i32 as u64 { if i != 0 { let fresh2 = q; q = q.offset(1); - *fresh2 = '-' as i32 as libc::c_char; + *fresh2 = '-' as i32 as i8; } - let p_0: *mut libc::c_uchar = decimal + let p_0: *mut u8 = decimal .as_mut_ptr() .offset(i.wrapping_mul(5_i32 as u64) as isize); - *q.offset(0_i32 as isize) = - (*p_0.offset(0_i32 as isize) as i32 + '0' as i32) as libc::c_char; - *q.offset(1_i32 as isize) = - (*p_0.offset(1_i32 as isize) as i32 + '0' as i32) as libc::c_char; - *q.offset(2_i32 as isize) = - (*p_0.offset(2_i32 as isize) as i32 + '0' as i32) as libc::c_char; - *q.offset(3_i32 as isize) = - (*p_0.offset(3_i32 as isize) as i32 + '0' as i32) as libc::c_char; - *q.offset(4_i32 as isize) = - (*p_0.offset(4_i32 as isize) as i32 + '0' as i32) as libc::c_char; + *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(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 libc::c_char; + + '0' as i32) as i8; q = q.offset(6_i32 as isize); i = i.wrapping_add(1); } let fresh3 = q.offset(1); - *fresh3 = 0_i32 as libc::c_char; + *fresh3 = 0_i32 as i8; 0_i32 } @@ -1368,7 +1350,7 @@ pub fn generate(installation_id: &str) -> Result { unsafe { let inst_id = CString::new(installation_id).unwrap(); let conf_id = [0u8; 49]; - let result = Generate(inst_id.as_ptr(), conf_id.as_ptr() as *mut libc::c_char); + let result = Generate(inst_id.as_ptr(), conf_id.as_ptr() as *mut i8); match result { 0 => {} 1 => return Err(ConfirmationIdError::TooShort), @@ -1379,7 +1361,7 @@ pub fn generate(installation_id: &str) -> Result { 6 => return Err(ConfirmationIdError::Unlucky), _ => panic!("Unknown error code: {}", result), } - Ok(CStr::from_ptr(conf_id.as_ptr() as *const libc::c_char) + Ok(CStr::from_ptr(conf_id.as_ptr() as *const i8) .to_str() .unwrap() .to_string())