extern crate libc;
extern crate libloading;
use std::ptr::null;
use libc::*;
use libloading::{Library, Symbol};
//use std::env;
type PEA256Init = unsafe extern "C" fn() -> bool;
type PEA256Open = unsafe extern "C" fn() -> *const c_void;
type PEA256Close = unsafe extern "C" fn(handle: *const c_void);
type PEA256UserKey = unsafe extern "C" fn(handle: *const c_void, keystr: *const c_uchar, keybuff: *const c_uchar, keyfile: *const c_uchar) -> u32;
type PEA256UserKeyStr = unsafe extern "C" fn(handle: *const c_void, keystr: *const c_uchar) -> u32;
type PEA256UserKeyBuff = unsafe extern "C" fn(handle: *const c_void, keybuff: *const c_uchar) -> u32;
type PEA256UserKeyFile = unsafe extern "C" fn(handle: *const c_void, keyfile: *const c_uchar) -> u32;
type PEA256EncryptUserKey = unsafe extern "C" fn(handle: *const c_void, keystr: *const c_uchar, keybuff: *const c_uchar, keyfile: *const c_uchar) -> u32;
type PEA256DecryptUserKey = unsafe extern "C" fn(handle: *const c_void, keystr: *const c_uchar, keybuff: *const c_uchar, keyfile: *const c_uchar) -> u32;
type PEA256EncryptBytes = unsafe extern "C" fn(handle: *const c_void, bytes: *mut c_uchar, len: u32, subkey: u32) -> u32;
type PEA256DecryptBytes = unsafe extern "C" fn(handle: *const c_void, bytes: *mut c_uchar, len: u32, subkey: u32) -> u32;
type PEA256EncryptBytesEx = unsafe extern "C" fn(handle: *const c_void, inbytes: *const c_uchar, outbytes: *mut c_uchar, len: u32, subkey: u32) -> u32;
type PEA256DecryptBytesEx = unsafe extern "C" fn(handle: *const c_void, inbytes: *const c_uchar, outbytes: *mut c_uchar, len: u32, subkey: u32) -> u32;
type PEA256EncryptArrayEx = unsafe extern "C" fn(handle: *const c_void, inbytes: *const c_uchar, outbytes: *mut c_uchar, index: u32, len: u32, subkey: u32) -> u32;
type PEA256DecryptArrayEx = unsafe extern "C" fn(handle: *const c_void, inbytes: *const c_uchar, outbytes: *mut c_uchar, index: u32, len: u32, subkey: u32) -> u32;
type PEA256Test = unsafe fn() -> bool;
type PEA256Error = unsafe fn() -> i32;
type PEA256Version = unsafe fn() -> u32;
fn main() {
//let lib = Library::new("D:\\libpea256x64\\libpea256x64.dll").expect("Library失败!!!");
let lib = Library::new("D:\\PEA256COM\\x64\\Release\\libpea256x64.dll").unwrap();
unsafe {
let pea256Init: Symbol<PEA256Init> = lib.get(b"PEA256Init").unwrap();
let pea256Open: Symbol<PEA256Open> = lib.get(b"PEA256Open").unwrap();
let pea256Close: Symbol<PEA256Close> = lib.get(b"PEA256Close").unwrap();
let pea256UserKey: Symbol<PEA256UserKey> = lib.get(b"PEA256UserKey").unwrap();
let pea256UserKeyStr: Symbol<PEA256UserKeyStr> = lib.get(b"PEA256UserKeyStr").unwrap();
let pea256UserKeyBuff: Symbol<PEA256UserKeyBuff> = lib.get(b"PEA256UserKeyBuff").unwrap();
let pea256UserKeyFile: Symbol<PEA256UserKeyFile> = lib.get(b"PEA256UserKeyFile").unwrap();
let pea256EncryptUserKey: Symbol<PEA256EncryptUserKey> = lib.get(b"PEA256EncryptUserKey").unwrap();
let pea256DecryptUserKey: Symbol<PEA256DecryptUserKey> = lib.get(b"PEA256DecryptUserKey").unwrap();
let fSP256EncryptBytes: Symbol<PEA256EncryptBytes> = lib.get(b"PEA256EncryptBytes").unwrap();
let fSP256DecryptBytes: Symbol<PEA256DecryptBytes> = lib.get(b"PEA256DecryptBytes").unwrap();
let fSP256EncryptBytesEx: Symbol<PEA256EncryptBytesEx> = lib.get(b"PEA256EncryptBytesEx").unwrap();
let fSP256DecryptBytesEx: Symbol<PEA256DecryptBytesEx> = lib.get(b"PEA256DecryptBytesEx").unwrap();
let fSP256EncryptArrayEx: Symbol<PEA256EncryptArrayEx> = lib.get(b"PEA256EncryptArrayEx").unwrap();
let fSP256DecryptArrayEx: Symbol<PEA256DecryptArrayEx> = lib.get(b"PEA256DecryptArrayEx").unwrap();
let pea256Test: Symbol<PEA256Test> = lib.get(b"PEA256Test").unwrap();
let fSP256Error: Symbol<PEA256Error> = lib.get(b"PEA256Error").unwrap();
let fSP256Version: Symbol<PEA256Version> = lib.get(b"PEA256Version").unwrap();
if pea256Init() {
pea256Test();
let handle: *const c_void = pea256Open();
if handle != null() {
let mut Array: [u8; 4] = [0, 1, 2, 3];
let mut ArrayEncrypt: [u8; 4] = [0, 1, 2, 3];
let mut ArrayDecrypt: [u8; 4] = [0, 0, 0, 0];
let subkey:u32 = pea256UserKey(handle, "123\0".as_ptr(), "\0".as_ptr(), "".as_ptr());
println!("subkey1=0x{:08X}", subkey);
fSP256EncryptBytes(handle, Array.as_mut_ptr(), 4, subkey);
for data in &Array {
print!(" {:02X}", data);
}
println!("");
fSP256DecryptBytes(handle, Array.as_mut_ptr(), 4, subkey);
for data in &Array {
print!(" {:02X}", data);
}
println!("");
let mut sum = 0;
for i in 0..4 {
sum ^= i ^ (Array[i] as usize);//简单的异或和校验
}
if sum != 0 {
println!("加解密1错误!!!");
}
else {
println!("加解密1正确!!!");
}
let subkey:u32 = pea256UserKey(handle, "\0".as_ptr(), "0123456789ABCDEF0123456789ABCDEF\0".as_ptr(), "".as_ptr());
println!("subkey2=0x{:08X}", subkey);
fSP256EncryptBytesEx(handle, ArrayEncrypt.as_ptr(), ArrayDecrypt.as_mut_ptr(), 4, subkey);
for data in &ArrayDecrypt {
print!(" {:02X}", data);
}
println!("");
fSP256DecryptBytesEx(handle, ArrayDecrypt.as_ptr(), ArrayEncrypt.as_mut_ptr(), 4, subkey);
for data in &ArrayEncrypt {
print!(" {:02X}", data);
}
println!("");
let mut sum = 0;
for i in 0..4 {
sum ^= i ^ (ArrayEncrypt[i] as usize);//简单的异或和校验
}
if sum != 0 {
println!("加解密2错误!!!");
}
else {
println!("加解密2正确!!!");
}
//let subkey:u32 = pea256UserKeyFile(handle, b"D:\\libpea256x64\\123.PEA.KEY\0".as_ptr());
let subkey:u32 = pea256UserKeyFile(handle, b"D:\\libpea256x64\\libpea256x64.dll\0".as_ptr());
//let subkey:u32 = pea256UserKey(handle, "\0".as_ptr(), "\0".as_ptr(), "D:\\libpea256x64\\libpea256x64.dll\0".as_ptr());
//let subkey:u32 = pea256UserKey(handle, "123\0".as_ptr(), "\0".as_ptr(), "".as_ptr());
println!("subkey3=0x{:08X}", subkey);
fSP256EncryptArrayEx(handle, ArrayEncrypt.as_ptr(), ArrayDecrypt.as_mut_ptr(), 0, 4, subkey);
for data in &ArrayDecrypt {
print!(" {:02X}", data);
}
println!("");
fSP256DecryptArrayEx(handle, ArrayDecrypt.as_ptr(), ArrayEncrypt.as_mut_ptr(), 0, 4, subkey);
for data in &ArrayEncrypt {
print!(" {:02X}", data);
}
println!("");
let mut sum = 0;
for i in 0..4 {
sum ^= i ^ (ArrayEncrypt[i] as usize);//简单的异或和校验
}
if sum != 0 {
println!("加解密3错误!!!");
}
else {
println!("加解密3正确!!!");
}
pea256Close(handle);
fSP256Error();
println!("PEA256COM!!!");
} else {
println!("调用PEA256Open()失败!");
}
} else {
println!("调用PEA256Init()失败!");
}
println!("Hello, world!");
}
}