修改c的接口, 改为传string

This commit is contained in:
cebgcontract 2022-11-15 18:02:09 +08:00
parent 0236a70461
commit 739621df6a
7 changed files with 135 additions and 58 deletions

0
build_ios.log Normal file
View File

View File

@ -6,7 +6,7 @@
use std::ffi::{CStr, CString};
use std::os::raw::c_char;
use rustwallet::{new_wallet, get_address, restore_wallet, reset_wallet, free_cwallet, sign, sign_for_tran, CWallet, generate_sec_key};
use rustwallet::{new_wallet, get_address, free_cwallet, sign, sign_for_tran, CWallet, generate_sec_key};
macro_rules! print_cchar{
($p1:expr) => (
@ -47,42 +47,49 @@ macro_rules! str_to_cchar {
fn main() {
unsafe {
let msg = "099c9c3da391df6e7e82141888db5cca";
let wallet: CWallet = new_wallet(str_to_cchar!(msg));
println!("---- generated a wallet to be used on C-side ----");
print_wallet(&wallet);
let address = get_address(&wallet);
print_cchar!(address);
let address_str = cchar_to_str!(address);
println!("address: {}", address_str);
let sign_str = sign_for_tran(&wallet,str_to_cchar!("cc0dac9a2bd7125bbe9130b83053494860f7a444868a45a9c00a865631ba8894"));
print_cchar!(sign_str);
let s_key = generate_sec_key(&wallet);
print_cchar!(s_key);
let msg = "a0f2022d15fd8072f12c76cc1596c4f1";
// let wallet: CWallet = new_wallet(str_to_cchar!(msg));
// println!("---- generated a wallet to be used on C-side ----");
// print_wallet(&wallet);
// let address = get_address(&wallet);
// print_cchar!(address);
// let address_str = cchar_to_str!(address);
// println!("address: {}", address_str);
// let sign_str = sign_for_tran(&wallet,str_to_cchar!("cc0dac9a2bd7125bbe9130b83053494860f7a444868a45a9c00a865631ba8894"));
// print_cchar!(sign_str);
// let s_key = generate_sec_key(&wallet);
// print_cchar!(s_key);
let key0 = "aadcabedb89a41db4c815bd149d3e7a1ff04247947efd5768666ba5f5e2df2e2";
let key1 = "5b5d60194aa6588db9c52182a50d4657d918af3a9ff681207243957bac94791a";
let key2 = "";
let key0 = "3f26e586111b5c4cab6a5dd5e0d13c3b13184ba74410ba064a3b485be4f9a2cd";
let key1 = "";
let key2 = "cd00eb0126aeed39762579ce94c90a04695ad17fbd5e79aa4e9fc4a34ba32a5";
let tmp_cwallet = CWallet{
msg_key: str_to_cchar!(msg),
master_key: str_to_cchar!(key0),
second_key: str_to_cchar!(key1),
backup_key: str_to_cchar!("")
backup_key: str_to_cchar!(key2)
};
let address2 = get_address(&tmp_cwallet);
let address2 = get_address(
str_to_cchar!(msg),
str_to_cchar!(key0),
str_to_cchar!(key1),
str_to_cchar!(key2)
);
print_cchar!(address2);
let tmp_cwallet2 = restore_wallet(&tmp_cwallet);
let address3 = get_address(&tmp_cwallet2);
print_cchar!(address3);
// let s_key2 = generate_sec_key(&tmp_cwallet);
// print_cchar!(s_key2);
// let tmp_cwallet2 = restore_wallet(&tmp_cwallet);
// let address3 = get_address(&tmp_cwallet2);
// print_cchar!(address3);
let sign_str = sign(&tmp_cwallet2,str_to_cchar!("111"));
print_cchar!(sign_str);
// let sign_str = sign(&tmp_cwallet2,str_to_cchar!("111"));
// print_cchar!(sign_str);
let cwallet3 = reset_wallet(&tmp_cwallet2);
print_wallet(&cwallet3);
let sign_str2 = sign(&cwallet3, str_to_cchar!("111"));
print_cchar!(sign_str2);
// let cwallet3 = reset_wallet(&tmp_cwallet2);
// print_wallet(&cwallet3);
// let sign_str2 = sign(&cwallet3, str_to_cchar!("111"));
// print_cchar!(sign_str2);
// print_wallet(&tmp_cwallet2);
// println!("---- saving the wallet to wallet.json ----");
// save_wallet(&wallet);

View File

@ -12,16 +12,31 @@ typedef struct CWallet {
struct CWallet new_wallet(const char *msg);
struct CWallet restore_wallet(const struct CWallet *cw);
struct CWallet reset_wallet(const struct CWallet *cw);
struct CWallet reset_wallet(const char *msg_key,
const char *master_key,
const char *second_key,
const char *backup_key);
void free_cwallet(struct CWallet cw);
char *get_address(const struct CWallet *cw);
char *get_address(const char *msg_key,
const char *master_key,
const char *second_key,
const char *backup_key);
char *generate_sec_key(const struct CWallet *cw);
char *generate_sec_key(const char *msg_key,
const char *master_key,
const char *second_key,
const char *backup_key);
char *sign(const struct CWallet *cw, const char *msg);
char *sign(const char *msg_key,
const char *master_key,
const char *second_key,
const char *backup_key,
const char *msg);
char *sign_for_tran(const struct CWallet *cw, const char *msg);
char *sign_for_tran(const char *msg_key,
const char *master_key,
const char *second_key,
const char *backup_key,
const char *msg);

View File

@ -16,7 +16,18 @@ mkdir ${jniLibs}/armeabi-v7a
mkdir ${jniLibs}/x86_64
mkdir ${jniLibs}/x86
targetBase=~/Documents/workspace/cocos/cocos2d-x/external/android
cp target/aarch64-linux-android/release/${libName} ${jniLibs}/arm64-v8a/${libName}
cp target/armv7-linux-androideabi/release/${libName} ${jniLibs}/armeabi-v7a/${libName}
cp target/x86_64-linux-android/release/${libName} ${jniLibs}/x86_64/${libName}
cp target/i686-linux-android/release/${libName} ${jniLibs}/x86/${libName}
cp target/aarch64-linux-android/release/${libName} ${targetBase}/arm64-v8a/${libName}
cp target/armv7-linux-androideabi/release/${libName} ${targetBase}/armeabi-v7a/${libName}
cp target/x86_64-linux-android/release/${libName} ${targetBase}/x86_64/${libName}
cp target/i686-linux-android/release/${libName} ${targetBase}/x86/${libName}
cbindgen src/lib.rs -l c > rustwallet.h
cp rustwallet.h ${targetBase}/arm64-v8a/include/rustwallet/rustwallet.h
cp rustwallet.h ${targetBase}/armeabi-v7a/include/rustwallet/rustwallet.h
cp rustwallet.h ${targetBase}/x86_64/include/rustwallet/rustwallet.h
cp rustwallet.h ${targetBase}/x86/include/rustwallet/rustwallet.h

View File

@ -1,6 +1,6 @@
#!/usr/bin/env bash
# building
cbindgen src/lib.rs -l c > rustwallet.h
# cbindgen src/lib.rs -l c > rustwallet.h
cargo lipo --release
# moving files to the ios project
@ -13,5 +13,5 @@ rm -rf ${inc} ${libs}
mkdir ${inc}
mkdir ${libs}
cp rustywallet.h ${inc}
cp target/universal/release/librustywallet.a ${libs}
cp rustwallet.h ${inc}
cp target/universal/release/librustwallet.a ${libs}

View File

@ -90,15 +90,15 @@ pub unsafe extern "C" fn new_wallet(msg: *const c_char) -> CWallet {
convert_to_cwallet(rust_wallet)
}
#[no_mangle]
pub unsafe extern "C" fn restore_wallet(cw: &CWallet) -> CWallet {
let rust_wallet = convert_to_rwallet(cw);
convert_to_cwallet(rust_wallet)
}
#[no_mangle]
pub unsafe extern "C" fn reset_wallet(cw: &CWallet) -> CWallet {
let rust_wallet = convert_to_rwallet(cw);
pub unsafe extern "C" fn reset_wallet(
msg_key: *const c_char,
master_key: *const c_char,
second_key: *const c_char,
backup_key: *const c_char,
) -> CWallet {
let rust_wallet = generate_rwallet(msg_key, master_key, second_key, backup_key);
let rust_wallet2 = rust_wallet.reset_wallet();
convert_to_cwallet(rust_wallet2)
}
@ -112,8 +112,13 @@ pub unsafe extern "C" fn free_cwallet(cw: CWallet) {
}
#[no_mangle]
pub unsafe extern "C" fn get_address(cw: &CWallet) -> *mut c_char{
let rwallet = convert_to_rwallet(cw);
pub unsafe extern "C" fn get_address(
msg_key: *const c_char,
master_key: *const c_char,
second_key: *const c_char,
backup_key: *const c_char,
) -> *mut c_char{
let rwallet = generate_rwallet(msg_key, master_key, second_key, backup_key);
let address = rwallet.get_address();
let address_str = format!("{:?}", address);
let c_address = CString::new(address_str).unwrap();
@ -121,16 +126,27 @@ pub unsafe extern "C" fn get_address(cw: &CWallet) -> *mut c_char{
}
#[no_mangle]
pub unsafe extern "C" fn generate_sec_key(cw: &CWallet) -> *mut c_char {
let rwallet = convert_to_rwallet(cw);
pub unsafe extern "C" fn generate_sec_key(
msg_key: *const c_char,
master_key: *const c_char,
second_key: *const c_char,
backup_key: *const c_char,
) -> *mut c_char {
let rwallet = generate_rwallet(msg_key, master_key, second_key, backup_key);
let s_key = rwallet.generate_sec_key();
let cs_key = CString::new(s_key).unwrap();
cs_key.into_raw()
}
#[no_mangle]
pub unsafe extern "C" fn sign(cw: &CWallet, msg: *const c_char) -> *mut c_char{
let rwallet = convert_to_rwallet(cw);
pub unsafe extern "C" fn sign(
msg_key: *const c_char,
master_key: *const c_char,
second_key: *const c_char,
backup_key: *const c_char,
msg: *const c_char
) -> *mut c_char{
let rwallet = generate_rwallet(msg_key, master_key, second_key, backup_key);
let msg_str = cchar_to_str!(msg);
let signature = rwallet.sign(msg_str);
let r = match signature {
@ -141,8 +157,14 @@ pub unsafe extern "C" fn sign(cw: &CWallet, msg: *const c_char) -> *mut c_char{
}
#[no_mangle]
pub unsafe extern "C" fn sign_for_tran(cw: &CWallet, msg: *const c_char) -> *mut c_char{
let rwallet = convert_to_rwallet(cw);
pub unsafe extern "C" fn sign_for_tran(
msg_key: *const c_char,
master_key: *const c_char,
second_key: *const c_char,
backup_key: *const c_char,
msg: *const c_char
) -> *mut c_char{
let rwallet = generate_rwallet(msg_key, master_key, second_key, backup_key);
let msg_str = cchar_to_str!(msg);
let signature = rwallet.sign_for_tran(msg_str);
let (r, recid) = match signature {
@ -169,11 +191,29 @@ unsafe fn convert_to_cwallet(rwallet: Wallet) -> CWallet {
cw
}
unsafe fn convert_to_rwallet(cwallet: &CWallet) -> Wallet {
let pmsg = cchar_to_string!(cwallet.msg_key);
let pm = cchar_to_string!(cwallet.master_key);
let second_key = cchar_to_ostring!(cwallet.second_key);
let backup_key = cchar_to_ostring!(cwallet.backup_key);
// unsafe fn convert_to_rwallet(cwallet: &CWallet) -> Wallet {
// let pmsg = cchar_to_string!(cwallet.msg_key);
// let pm = cchar_to_string!(cwallet.master_key);
// let second_key = cchar_to_ostring!(cwallet.second_key);
// let backup_key = cchar_to_ostring!(cwallet.backup_key);
// Wallet {
// msg_key: pmsg,
// master_key: pm,
// second_key: second_key,
// backup_key: backup_key
// }
// }
unsafe fn generate_rwallet(
msg_key: *const c_char,
master_key: *const c_char,
second_key: *const c_char,
backup_key: *const c_char,
) ->Wallet {
let pmsg = cchar_to_string!(msg_key);
let pm = cchar_to_string!(master_key);
let second_key = cchar_to_ostring!(second_key);
let backup_key = cchar_to_ostring!(backup_key);
Wallet {
msg_key: pmsg,
master_key: pm,

View File

@ -139,7 +139,11 @@ impl Wallet {
let _tmp = vec![kp0, kp1];
let sss = get_sss(&self.msg_key);
let secret_b = sss.recover(&_tmp);
let s_key_str = secret_b.to_str_radix(16);
let mut s_key_str = secret_b.to_str_radix(16);
if s_key_str.len() < 64 {
s_key_str += "0";
}
println!("{}", &s_key_str);
SecretKey::from_str(&s_key_str).expect("32 bytes, within curve order")
}