修改c的接口, 改为传string
This commit is contained in:
parent
0236a70461
commit
739621df6a
0
build_ios.log
Normal file
0
build_ios.log
Normal 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);
|
||||
|
29
rustwallet.h
29
rustwallet.h
@ -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);
|
||||
|
@ -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
|
@ -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}
|
||||
|
80
src/lib.rs
80
src/lib.rs
@ -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,
|
||||
|
@ -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")
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user