From 69faa5626e3232829ca59adec2302b61b5396498 Mon Sep 17 00:00:00 2001 From: Alex Page Date: Wed, 21 Jun 2023 21:40:58 -0400 Subject: [PATCH] Remove usage of libc functions --- src/confid.rs | 93 +++++++++++++++++++++++---------------------------- 1 file changed, 42 insertions(+), 51 deletions(-) diff --git a/src/confid.rs b/src/confid.rs index cb3a1b9..abed899 100644 --- a/src/confid.rs +++ b/src/confid.rs @@ -5,13 +5,13 @@ clippy::too_many_arguments )] -use std::ffi::{CStr, CString}; +use std::{ + ffi::{CStr, CString}, + ptr, +}; use thiserror::Error; -extern "C" { - fn memcpy(_: *mut libc::c_void, _: *const libc::c_void, _: u64) -> *mut libc::c_void; - fn memset(_: *mut libc::c_void, _: i32, _: u64) -> *mut libc::c_void; -} + type size_t = u64; type int64_t = i64; type uint16_t = u16; @@ -626,11 +626,12 @@ unsafe fn divisor_add(src1: *const TDivisor, src2: *const TDivisor, mut dst: *mu v[i as usize] = residue_mul(v[i as usize], c1[0_i32 as usize]); i += 1; } - memcpy( - tmp.as_mut_ptr() as *mut libc::c_void, - f.as_ptr() as *const libc::c_void, - (6_i32 as u64).wrapping_mul(::std::mem::size_of::() as u64), - ); + tmp[0] = f[0]; + tmp[1] = f[1]; + tmp[2] = f[2]; + tmp[3] = f[3]; + tmp[4] = f[4]; + tmp[5] = f[5]; tmpdeg = 5_i32; tmpdeg = polynomial_mul( 1_i32, @@ -675,11 +676,9 @@ unsafe fn divisor_add(src1: *const TDivisor, src2: *const TDivisor, mut dst: *mu udiv.as_mut_ptr(), ); vdeg -= ddeg; - memcpy( - v.as_mut_ptr() as *mut libc::c_void, - udiv.as_mut_ptr() as *const libc::c_void, - ((vdeg + 1_i32) as u64).wrapping_mul(::std::mem::size_of::() as u64), - ); + for i in 0..=vdeg { + v[i as usize] = udiv[i as usize]; + } } } vdeg = polynomial_div_monic( @@ -939,20 +938,18 @@ unsafe fn Mix( let half: size_t = bufSize.wrapping_div(2_i32 as u64); let mut external_counter = 0_i32; while external_counter < 4_i32 { - memset( - sha1_input.as_mut_ptr() as *mut libc::c_void, - 0_i32, - ::std::mem::size_of::<[libc::c_uchar; 64]>() as u64, + for n in &mut sha1_input { + *n = 0; + } + ptr::copy_nonoverlapping( + buffer.offset(half as isize), + sha1_input.as_mut_ptr(), + half as usize, ); - memcpy( - sha1_input.as_mut_ptr() as *mut libc::c_void, - buffer.offset(half as isize) as *const libc::c_void, - half, - ); - memcpy( - sha1_input.as_mut_ptr().offset(half as isize) as *mut libc::c_void, + ptr::copy_nonoverlapping( key as *const libc::c_void, - keySize, + sha1_input.as_mut_ptr().offset(half as isize) as *mut libc::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) @@ -995,20 +992,14 @@ unsafe fn Unmix( let half: size_t = bufSize.wrapping_div(2_i32 as u64); let mut external_counter = 0_i32; while external_counter < 4_i32 { - memset( - sha1_input.as_mut_ptr() as *mut libc::c_void, - 0_i32, - ::std::mem::size_of::<[libc::c_uchar; 64]>() as u64, - ); - memcpy( - sha1_input.as_mut_ptr() as *mut libc::c_void, - buffer as *const libc::c_void, - half, - ); - memcpy( - sha1_input.as_mut_ptr().offset(half as isize) as *mut libc::c_void, - key as *const libc::c_void, - keySize, + for n in &mut sha1_input { + *n = 0; + } + ptr::copy_nonoverlapping(buffer, sha1_input.as_mut_ptr(), half as usize); + ptr::copy_nonoverlapping( + key, + 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) @@ -1132,10 +1123,10 @@ unsafe fn Generate( ProductIDHigh: 0, KeySHA1: 0, }; - memcpy( - &mut parsed as *mut C2RustUnnamed_4 as *mut libc::c_void, + ptr::copy_nonoverlapping( installation_id.as_mut_ptr() as *const libc::c_void, - ::std::mem::size_of::() as u64, + &mut parsed as *mut C2RustUnnamed_4 as *mut libc::c_void, + std::mem::size_of::(), ); let productId1: u32 = (parsed.ProductIDLow & ((1_i32 << 17_i32) - 1_i32) as u64) as u32; let productId2: u32 = @@ -1156,19 +1147,19 @@ unsafe fn Generate( } let mut keybuf: [libc::c_uchar; 16] = [0; 16]; let mut hardware_id = parsed.HardwareID; - memcpy( + 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 uint64_t as *const libc::c_void, - 8_i32 as u64, + 8, ); let mut productIdMixed: uint64_t = (productId1 as uint64_t) << 41_i32 | (productId2 as uint64_t) << 58_i32 | (productId3 as uint64_t) << 17_i32 | productId4 as u64; - memcpy( - keybuf.as_mut_ptr().offset(8_i32 as isize) as *mut libc::c_void, - &mut productIdMixed as *mut uint64_t as *const libc::c_void, - 8_i32 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, + 8, ); let mut d_0: TDivisor = TDivisor { u: [0; 2],