Remove libc dependency

This commit is contained in:
Alex Page 2023-06-21 21:45:34 -04:00
parent 69faa5626e
commit 7d35fe36fe
3 changed files with 91 additions and 111 deletions

1
Cargo.lock generated
View file

@ -367,7 +367,6 @@ dependencies = [
"anyhow",
"bitreader",
"clap",
"libc",
"openssl",
"serde_json",
"thiserror",

View file

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

View file

@ -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::<C2RustUnnamed_4>(),
);
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<String, ConfirmationIdError> {
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<String, ConfirmationIdError> {
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())