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", "anyhow",
"bitreader", "bitreader",
"clap", "clap",
"libc",
"openssl", "openssl",
"serde_json", "serde_json",
"thiserror", "thiserror",

View file

@ -9,7 +9,6 @@ edition = "2021"
anyhow = "1.0.71" anyhow = "1.0.71"
bitreader = "0.3.7" bitreader = "0.3.7"
clap = { version = "4.3.4", features = ["derive"] } clap = { version = "4.3.4", features = ["derive"] }
libc = "0.2.146"
openssl = { git = "https://github.com/anpage/rust-openssl.git" } openssl = { git = "https://github.com/anpage/rust-openssl.git" }
serde_json = "1.0" serde_json = "1.0"
thiserror = "1.0.40" thiserror = "1.0.40"

View file

@ -6,7 +6,7 @@
)] )]
use std::{ use std::{
ffi::{CStr, CString}, ffi::{c_void, CStr, CString},
ptr, ptr,
}; };
@ -49,7 +49,7 @@ struct C2RustUnnamed_2 {
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
#[repr(C)] #[repr(C)]
union C2RustUnnamed_3 { union C2RustUnnamed_3 {
buffer: [libc::c_uchar; 14], buffer: [u8; 14],
c2rust_unnamed: C2RustUnnamed_2, c2rust_unnamed: C2RustUnnamed_2,
} }
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
@ -57,8 +57,8 @@ union C2RustUnnamed_3 {
struct C2RustUnnamed_4 { struct C2RustUnnamed_4 {
HardwareID: uint64_t, HardwareID: uint64_t,
ProductIDLow: uint64_t, ProductIDLow: uint64_t,
ProductIDHigh: libc::c_uchar, ProductIDHigh: u8,
KeySHA1: libc::c_ushort, KeySHA1: u16,
} }
static mut f: [uint64_t; 6] = [ static mut f: [uint64_t; 6] = [
0_i32 as uint64_t, 0_i32 as uint64_t,
@ -813,7 +813,7 @@ unsafe fn rol(x: u32, shift: i32) -> u32 {
x << shift | x >> (32_i32 - shift) 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 a = 0x67452301_i32 as u32;
let mut b = 0xefcdab89_u32; let mut b = 0xefcdab89_u32;
let mut c = 0x98badcfe_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); c = c.wrapping_add(0x98badcfe_u32);
d = d.wrapping_add(0x10325476_i32 as u32); d = d.wrapping_add(0x10325476_i32 as u32);
e = e.wrapping_add(0xc3d2e1f0_u32); e = e.wrapping_add(0xc3d2e1f0_u32);
*output.offset(0_i32 as isize) = (a >> 24_i32) 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 libc::c_uchar; *output.offset(1_i32 as isize) = (a >> 16_i32) as u8;
*output.offset(2_i32 as isize) = (a >> 8_i32) as libc::c_uchar; *output.offset(2_i32 as isize) = (a >> 8_i32) as u8;
*output.offset(3_i32 as isize) = a as libc::c_uchar; *output.offset(3_i32 as isize) = a as u8;
*output.offset(4_i32 as isize) = (b >> 24_i32) as libc::c_uchar; *output.offset(4_i32 as isize) = (b >> 24_i32) as u8;
*output.offset(5_i32 as isize) = (b >> 16_i32) as libc::c_uchar; *output.offset(5_i32 as isize) = (b >> 16_i32) as u8;
*output.offset(6_i32 as isize) = (b >> 8_i32) as libc::c_uchar; *output.offset(6_i32 as isize) = (b >> 8_i32) as u8;
*output.offset(7_i32 as isize) = b as libc::c_uchar; *output.offset(7_i32 as isize) = b as u8;
*output.offset(8_i32 as isize) = (c >> 24_i32) as libc::c_uchar; *output.offset(8_i32 as isize) = (c >> 24_i32) as u8;
*output.offset(9_i32 as isize) = (c >> 16_i32) as libc::c_uchar; *output.offset(9_i32 as isize) = (c >> 16_i32) as u8;
*output.offset(10_i32 as isize) = (c >> 8_i32) as libc::c_uchar; *output.offset(10_i32 as isize) = (c >> 8_i32) as u8;
*output.offset(11_i32 as isize) = c as libc::c_uchar; *output.offset(11_i32 as isize) = c as u8;
*output.offset(12_i32 as isize) = (d >> 24_i32) as libc::c_uchar; *output.offset(12_i32 as isize) = (d >> 24_i32) as u8;
*output.offset(13_i32 as isize) = (d >> 16_i32) as libc::c_uchar; *output.offset(13_i32 as isize) = (d >> 16_i32) as u8;
*output.offset(14_i32 as isize) = (d >> 8_i32) as libc::c_uchar; *output.offset(14_i32 as isize) = (d >> 8_i32) as u8;
*output.offset(15_i32 as isize) = d as libc::c_uchar; *output.offset(15_i32 as isize) = d as u8;
*output.offset(16_i32 as isize) = (e >> 24_i32) as libc::c_uchar; *output.offset(16_i32 as isize) = (e >> 24_i32) as u8;
*output.offset(17_i32 as isize) = (e >> 16_i32) as libc::c_uchar; *output.offset(17_i32 as isize) = (e >> 16_i32) as u8;
*output.offset(18_i32 as isize) = (e >> 8_i32) as libc::c_uchar; *output.offset(18_i32 as isize) = (e >> 8_i32) as u8;
*output.offset(19_i32 as isize) = e as libc::c_uchar; *output.offset(19_i32 as isize) = e as u8;
} }
unsafe fn Mix( unsafe fn Mix(buffer: *mut u8, bufSize: size_t, key: *const u8, keySize: size_t) {
buffer: *mut libc::c_uchar, let mut sha1_input: [u8; 64] = [0; 64];
bufSize: size_t, let mut sha1_result: [u8; 20] = [0; 20];
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];
let half: size_t = bufSize.wrapping_div(2_i32 as u64); let half: size_t = bufSize.wrapping_div(2_i32 as u64);
let mut external_counter = 0_i32; let mut external_counter = 0_i32;
while external_counter < 4_i32 { while external_counter < 4_i32 {
@ -947,18 +942,19 @@ unsafe fn Mix(
half as usize, half as usize,
); );
ptr::copy_nonoverlapping( ptr::copy_nonoverlapping(
key as *const libc::c_void, key as *const c_void,
sha1_input.as_mut_ptr().offset(half as isize) as *mut libc::c_void, sha1_input.as_mut_ptr().offset(half as isize) as *mut c_void,
keySize as usize, keySize as usize,
); );
sha1_input[half.wrapping_add(keySize) as usize] = 0x80_i32 as libc::c_uchar; sha1_input[half.wrapping_add(keySize) as usize] = 0x80_i32 as u8;
sha1_input[(::std::mem::size_of::<[libc::c_uchar; 64]>() as u64).wrapping_sub(1_i32 as u64) sha1_input
as usize] = half.wrapping_add(keySize).wrapping_mul(8_i32 as u64) as libc::c_uchar; [(::std::mem::size_of::<[u8; 64]>() as u64).wrapping_sub(1_i32 as u64) as usize] =
sha1_input[(::std::mem::size_of::<[libc::c_uchar; 64]>() as u64).wrapping_sub(2_i32 as u64) half.wrapping_add(keySize).wrapping_mul(8_i32 as u64) as u8;
as usize] = half sha1_input
.wrapping_add(keySize) [(::std::mem::size_of::<[u8; 64]>() as u64).wrapping_sub(2_i32 as u64) as usize] =
.wrapping_mul(8_i32 as u64) half.wrapping_add(keySize)
.wrapping_div(0x100_i32 as u64) as libc::c_uchar; .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()); sha1_single_block(sha1_input.as_mut_ptr(), sha1_result.as_mut_ptr());
let mut i = half & !3_i32 as u64; let mut i = half & !3_i32 as u64;
while i < half { while i < half {
@ -970,10 +966,9 @@ unsafe fn Mix(
} }
i = 0_i32 as size_t; i = 0_i32 as size_t;
while i < half { while i < half {
let tmp: libc::c_uchar = *buffer.offset(i.wrapping_add(half) as isize); 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 *buffer.offset(i.wrapping_add(half) as isize) =
^ sha1_result[i as usize] as i32) (*buffer.offset(i as isize) as i32 ^ sha1_result[i as usize] as i32) as u8;
as libc::c_uchar;
*buffer.offset(i as isize) = tmp; *buffer.offset(i as isize) = tmp;
i = i.wrapping_add(1); i = i.wrapping_add(1);
} }
@ -981,14 +976,9 @@ unsafe fn Mix(
} }
} }
unsafe fn Unmix( unsafe fn Unmix(buffer: *mut u8, bufSize: size_t, key: *const u8, keySize: size_t) {
buffer: *mut libc::c_uchar, let mut sha1_input: [u8; 64] = [0; 64];
bufSize: size_t, let mut sha1_result: [u8; 20] = [0; 20];
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];
let half: size_t = bufSize.wrapping_div(2_i32 as u64); let half: size_t = bufSize.wrapping_div(2_i32 as u64);
let mut external_counter = 0_i32; let mut external_counter = 0_i32;
while external_counter < 4_i32 { while external_counter < 4_i32 {
@ -1001,14 +991,15 @@ unsafe fn Unmix(
sha1_input.as_mut_ptr().offset(half as isize), sha1_input.as_mut_ptr().offset(half as isize),
keySize as usize, keySize as usize,
); );
sha1_input[half.wrapping_add(keySize) as usize] = 0x80_i32 as libc::c_uchar; sha1_input[half.wrapping_add(keySize) as usize] = 0x80_i32 as u8;
sha1_input[(::std::mem::size_of::<[libc::c_uchar; 64]>() as u64).wrapping_sub(1_i32 as u64) sha1_input
as usize] = half.wrapping_add(keySize).wrapping_mul(8_i32 as u64) as libc::c_uchar; [(::std::mem::size_of::<[u8; 64]>() as u64).wrapping_sub(1_i32 as u64) as usize] =
sha1_input[(::std::mem::size_of::<[libc::c_uchar; 64]>() as u64).wrapping_sub(2_i32 as u64) half.wrapping_add(keySize).wrapping_mul(8_i32 as u64) as u8;
as usize] = half sha1_input
.wrapping_add(keySize) [(::std::mem::size_of::<[u8; 64]>() as u64).wrapping_sub(2_i32 as u64) as usize] =
.wrapping_mul(8_i32 as u64) half.wrapping_add(keySize)
.wrapping_div(0x100_i32 as u64) as libc::c_uchar; .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()); sha1_single_block(sha1_input.as_mut_ptr(), sha1_result.as_mut_ptr());
let mut i = half & !3_i32 as u64; let mut i = half & !3_i32 as u64;
while i < half { while i < half {
@ -1020,10 +1011,9 @@ unsafe fn Unmix(
} }
i = 0_i32 as size_t; i = 0_i32 as size_t;
while i < half { 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 *buffer.offset(i as isize) = (*buffer.offset(i.wrapping_add(half) as isize) as i32
^ sha1_result[i as usize] as i32) ^ sha1_result[i as usize] as i32) as u8;
as libc::c_uchar;
*buffer.offset(i.wrapping_add(half) as isize) = tmp; *buffer.offset(i.wrapping_add(half) as isize) = tmp;
i = i.wrapping_add(1); i = i.wrapping_add(1);
} }
@ -1031,13 +1021,10 @@ unsafe fn Unmix(
} }
} }
unsafe fn Generate( unsafe fn Generate(installation_id_str: *const i8, confirmation_id: *mut i8) -> i32 {
installation_id_str: *const libc::c_char, let mut installation_id: [u8; 19] = [0; 19];
confirmation_id: *mut libc::c_char,
) -> i32 {
let mut installation_id: [libc::c_uchar; 19] = [0; 19];
let mut installation_id_len: size_t = 0_i32 as size_t; 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 count: size_t = 0_i32 as size_t;
let mut totalCount: 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; let mut check: u32 = 0_i32 as u32;
@ -1073,13 +1060,13 @@ unsafe fn Generate(
if totalCount > 45_i32 as u64 { if totalCount > 45_i32 as u64 {
return 2_i32; 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; let mut i = 0_i32 as size_t;
while i < installation_id_len { while i < installation_id_len {
let x: u32 = let x: u32 =
(installation_id[i as usize] as i32 * 10_i32 + carry as i32) as 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; installation_id[i as usize] = (x & 0xff_i32 as u32) as u8;
carry = (x >> 8_i32) as libc::c_uchar; carry = (x >> 8_i32) as u8;
i = i.wrapping_add(1); i = i.wrapping_add(1);
} }
if carry != 0 { if carry != 0 {
@ -1094,15 +1081,15 @@ unsafe fn Generate(
if totalCount != 41_i32 as u64 && totalCount < 45_i32 as u64 { if totalCount != 41_i32 as u64 && totalCount < 45_i32 as u64 {
return 1_i32; return 1_i32;
} }
while installation_id_len < ::std::mem::size_of::<[libc::c_uchar; 19]>() as u64 { while installation_id_len < ::std::mem::size_of::<[u8; 19]>() as u64 {
installation_id[installation_id_len as usize] = 0_i32 as libc::c_uchar; installation_id[installation_id_len as usize] = 0_i32 as u8;
installation_id_len = installation_id_len.wrapping_add(1); installation_id_len = installation_id_len.wrapping_add(1);
} }
static mut iid_key: [libc::c_uchar; 4] = [ static mut iid_key: [u8; 4] = [
0x6a_i32 as libc::c_uchar, 0x6a_i32 as u8,
0xc8_i32 as libc::c_uchar, 0xc8_i32 as u8,
0x5e_i32 as libc::c_uchar, 0x5e_i32 as u8,
0xd4_i32 as libc::c_uchar, 0xd4_i32 as u8,
]; ];
Unmix( Unmix(
installation_id.as_mut_ptr(), installation_id.as_mut_ptr(),
@ -1124,8 +1111,8 @@ unsafe fn Generate(
KeySHA1: 0, KeySHA1: 0,
}; };
ptr::copy_nonoverlapping( ptr::copy_nonoverlapping(
installation_id.as_mut_ptr() as *const libc::c_void, installation_id.as_mut_ptr() as *const c_void,
&mut parsed as *mut C2RustUnnamed_4 as *mut libc::c_void, &mut parsed as *mut C2RustUnnamed_4 as *mut c_void,
std::mem::size_of::<C2RustUnnamed_4>(), std::mem::size_of::<C2RustUnnamed_4>(),
); );
let productId1: u32 = (parsed.ProductIDLow & ((1_i32 << 17_i32) - 1_i32) as u64) as u32; 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; 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; let mut hardware_id = parsed.HardwareID;
ptr::copy_nonoverlapping( ptr::copy_nonoverlapping(
&mut hardware_id as *mut u64 as *const libc::c_void, &mut hardware_id as *mut u64 as *const c_void,
keybuf.as_mut_ptr() as *mut libc::c_void, keybuf.as_mut_ptr() as *mut c_void,
8, 8,
); );
let mut productIdMixed: uint64_t = (productId1 as uint64_t) << 41_i32 let mut productIdMixed: uint64_t = (productId1 as uint64_t) << 41_i32
@ -1157,15 +1144,15 @@ unsafe fn Generate(
| (productId3 as uint64_t) << 17_i32 | (productId3 as uint64_t) << 17_i32
| productId4 as u64; | productId4 as u64;
ptr::copy_nonoverlapping( ptr::copy_nonoverlapping(
&mut productIdMixed as *mut u64 as *const libc::c_void, &mut productIdMixed as *mut u64 as *const c_void,
keybuf.as_mut_ptr().offset(8) as *mut libc::c_void, keybuf.as_mut_ptr().offset(8) as *mut c_void,
8, 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],
}; };
let mut attempt = 0_i32 as libc::c_uchar; let mut attempt = 0_i32 as u8;
while attempt as i32 <= 0x80_i32 { while attempt as i32 <= 0x80_i32 {
let mut u: C2RustUnnamed_3 = C2RustUnnamed_3 { buffer: [0; 14] }; let mut u: C2RustUnnamed_3 = C2RustUnnamed_3 { buffer: [0; 14] };
u.c2rust_unnamed.lo = 0_i32 as uint64_t; u.c2rust_unnamed.lo = 0_i32 as uint64_t;
@ -1284,7 +1271,7 @@ unsafe fn Generate(
as uint64_t as uint64_t; 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; let mut i = 0_i32 as size_t;
while i < 35_i32 as u64 { while i < 35_i32 as u64 {
let c: u32 = (e.c2rust_unnamed_0.encoded[3_i32 as usize]).wrapping_rem(10_i32 as u32); 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] = 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) ((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; .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); 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; i = 0_i32 as size_t;
while i < 7_i32 as u64 { while i < 7_i32 as u64 {
if i != 0 { if i != 0 {
let fresh2 = q; let fresh2 = q;
q = q.offset(1); 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() .as_mut_ptr()
.offset(i.wrapping_mul(5_i32 as u64) as isize); .offset(i.wrapping_mul(5_i32 as u64) as isize);
*q.offset(0_i32 as isize) = *q.offset(0_i32 as isize) = (*p_0.offset(0_i32 as isize) as i32 + '0' as i32) as i8;
(*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 i8;
*q.offset(1_i32 as isize) = *q.offset(2_i32 as isize) = (*p_0.offset(2_i32 as isize) as i32 + '0' as i32) as i8;
(*p_0.offset(1_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 i8;
*q.offset(2_i32 as isize) = *q.offset(4_i32 as isize) = (*p_0.offset(4_i32 as isize) as i32 + '0' as i32) as i8;
(*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(5_i32 as isize) = ((*p_0.offset(0_i32 as isize) as i32 *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(1_i32 as isize) as i32 * 2_i32
+ *p_0.offset(2_i32 as isize) as i32 + *p_0.offset(2_i32 as isize) as i32
+ *p_0.offset(3_i32 as isize) as i32 * 2_i32 + *p_0.offset(3_i32 as isize) as i32 * 2_i32
+ *p_0.offset(4_i32 as isize) as i32) + *p_0.offset(4_i32 as isize) as i32)
% 7_i32 % 7_i32
+ '0' as i32) as libc::c_char; + '0' as i32) as i8;
q = q.offset(6_i32 as isize); q = q.offset(6_i32 as isize);
i = i.wrapping_add(1); i = i.wrapping_add(1);
} }
let fresh3 = q.offset(1); let fresh3 = q.offset(1);
*fresh3 = 0_i32 as libc::c_char; *fresh3 = 0_i32 as i8;
0_i32 0_i32
} }
@ -1368,7 +1350,7 @@ pub fn generate(installation_id: &str) -> Result<String, ConfirmationIdError> {
unsafe { unsafe {
let inst_id = CString::new(installation_id).unwrap(); let inst_id = CString::new(installation_id).unwrap();
let conf_id = [0u8; 49]; 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 { match result {
0 => {} 0 => {}
1 => return Err(ConfirmationIdError::TooShort), 1 => return Err(ConfirmationIdError::TooShort),
@ -1379,7 +1361,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(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() .to_str()
.unwrap() .unwrap()
.to_string()) .to_string())