修改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::ffi::{CStr, CString};
|
||||||
use std::os::raw::c_char;
|
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{
|
macro_rules! print_cchar{
|
||||||
($p1:expr) => (
|
($p1:expr) => (
|
||||||
@ -47,42 +47,49 @@ macro_rules! str_to_cchar {
|
|||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
unsafe {
|
unsafe {
|
||||||
let msg = "099c9c3da391df6e7e82141888db5cca";
|
let msg = "a0f2022d15fd8072f12c76cc1596c4f1";
|
||||||
let wallet: CWallet = new_wallet(str_to_cchar!(msg));
|
// let wallet: CWallet = new_wallet(str_to_cchar!(msg));
|
||||||
println!("---- generated a wallet to be used on C-side ----");
|
// println!("---- generated a wallet to be used on C-side ----");
|
||||||
print_wallet(&wallet);
|
// print_wallet(&wallet);
|
||||||
let address = get_address(&wallet);
|
// let address = get_address(&wallet);
|
||||||
print_cchar!(address);
|
// print_cchar!(address);
|
||||||
let address_str = cchar_to_str!(address);
|
// let address_str = cchar_to_str!(address);
|
||||||
println!("address: {}", address_str);
|
// println!("address: {}", address_str);
|
||||||
let sign_str = sign_for_tran(&wallet,str_to_cchar!("cc0dac9a2bd7125bbe9130b83053494860f7a444868a45a9c00a865631ba8894"));
|
// let sign_str = sign_for_tran(&wallet,str_to_cchar!("cc0dac9a2bd7125bbe9130b83053494860f7a444868a45a9c00a865631ba8894"));
|
||||||
print_cchar!(sign_str);
|
// print_cchar!(sign_str);
|
||||||
let s_key = generate_sec_key(&wallet);
|
// let s_key = generate_sec_key(&wallet);
|
||||||
print_cchar!(s_key);
|
// print_cchar!(s_key);
|
||||||
|
|
||||||
|
|
||||||
let key0 = "aadcabedb89a41db4c815bd149d3e7a1ff04247947efd5768666ba5f5e2df2e2";
|
let key0 = "3f26e586111b5c4cab6a5dd5e0d13c3b13184ba74410ba064a3b485be4f9a2cd";
|
||||||
let key1 = "5b5d60194aa6588db9c52182a50d4657d918af3a9ff681207243957bac94791a";
|
let key1 = "";
|
||||||
let key2 = "";
|
let key2 = "cd00eb0126aeed39762579ce94c90a04695ad17fbd5e79aa4e9fc4a34ba32a5";
|
||||||
let tmp_cwallet = CWallet{
|
let tmp_cwallet = CWallet{
|
||||||
msg_key: str_to_cchar!(msg),
|
msg_key: str_to_cchar!(msg),
|
||||||
master_key: str_to_cchar!(key0),
|
master_key: str_to_cchar!(key0),
|
||||||
second_key: str_to_cchar!(key1),
|
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);
|
print_cchar!(address2);
|
||||||
let tmp_cwallet2 = restore_wallet(&tmp_cwallet);
|
// let s_key2 = generate_sec_key(&tmp_cwallet);
|
||||||
let address3 = get_address(&tmp_cwallet2);
|
// print_cchar!(s_key2);
|
||||||
print_cchar!(address3);
|
// 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"));
|
// let sign_str = sign(&tmp_cwallet2,str_to_cchar!("111"));
|
||||||
print_cchar!(sign_str);
|
// print_cchar!(sign_str);
|
||||||
|
|
||||||
let cwallet3 = reset_wallet(&tmp_cwallet2);
|
// let cwallet3 = reset_wallet(&tmp_cwallet2);
|
||||||
print_wallet(&cwallet3);
|
// print_wallet(&cwallet3);
|
||||||
let sign_str2 = sign(&cwallet3, str_to_cchar!("111"));
|
// let sign_str2 = sign(&cwallet3, str_to_cchar!("111"));
|
||||||
print_cchar!(sign_str2);
|
// print_cchar!(sign_str2);
|
||||||
// print_wallet(&tmp_cwallet2);
|
// print_wallet(&tmp_cwallet2);
|
||||||
// println!("---- saving the wallet to wallet.json ----");
|
// println!("---- saving the wallet to wallet.json ----");
|
||||||
// save_wallet(&wallet);
|
// 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 new_wallet(const char *msg);
|
||||||
|
|
||||||
struct CWallet restore_wallet(const struct CWallet *cw);
|
struct CWallet reset_wallet(const char *msg_key,
|
||||||
|
const char *master_key,
|
||||||
struct CWallet reset_wallet(const struct CWallet *cw);
|
const char *second_key,
|
||||||
|
const char *backup_key);
|
||||||
|
|
||||||
void free_cwallet(struct CWallet cw);
|
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_64
|
||||||
mkdir ${jniLibs}/x86
|
mkdir ${jniLibs}/x86
|
||||||
|
|
||||||
|
targetBase=~/Documents/workspace/cocos/cocos2d-x/external/android
|
||||||
cp target/aarch64-linux-android/release/${libName} ${jniLibs}/arm64-v8a/${libName}
|
cp target/aarch64-linux-android/release/${libName} ${jniLibs}/arm64-v8a/${libName}
|
||||||
cp target/armv7-linux-androideabi/release/${libName} ${jniLibs}/armeabi-v7a/${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/x86_64-linux-android/release/${libName} ${jniLibs}/x86_64/${libName}
|
||||||
cp target/i686-linux-android/release/${libName} ${jniLibs}/x86/${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
|
#!/usr/bin/env bash
|
||||||
# building
|
# building
|
||||||
cbindgen src/lib.rs -l c > rustwallet.h
|
# cbindgen src/lib.rs -l c > rustwallet.h
|
||||||
cargo lipo --release
|
cargo lipo --release
|
||||||
|
|
||||||
# moving files to the ios project
|
# moving files to the ios project
|
||||||
@ -13,5 +13,5 @@ rm -rf ${inc} ${libs}
|
|||||||
mkdir ${inc}
|
mkdir ${inc}
|
||||||
mkdir ${libs}
|
mkdir ${libs}
|
||||||
|
|
||||||
cp rustywallet.h ${inc}
|
cp rustwallet.h ${inc}
|
||||||
cp target/universal/release/librustywallet.a ${libs}
|
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)
|
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]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn reset_wallet(cw: &CWallet) -> CWallet {
|
pub unsafe extern "C" fn reset_wallet(
|
||||||
let rust_wallet = convert_to_rwallet(cw);
|
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();
|
let rust_wallet2 = rust_wallet.reset_wallet();
|
||||||
convert_to_cwallet(rust_wallet2)
|
convert_to_cwallet(rust_wallet2)
|
||||||
}
|
}
|
||||||
@ -112,8 +112,13 @@ pub unsafe extern "C" fn free_cwallet(cw: CWallet) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn get_address(cw: &CWallet) -> *mut c_char{
|
pub unsafe extern "C" fn get_address(
|
||||||
let rwallet = convert_to_rwallet(cw);
|
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 = rwallet.get_address();
|
||||||
let address_str = format!("{:?}", address);
|
let address_str = format!("{:?}", address);
|
||||||
let c_address = CString::new(address_str).unwrap();
|
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]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn generate_sec_key(cw: &CWallet) -> *mut c_char {
|
pub unsafe extern "C" fn generate_sec_key(
|
||||||
let rwallet = convert_to_rwallet(cw);
|
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 s_key = rwallet.generate_sec_key();
|
||||||
let cs_key = CString::new(s_key).unwrap();
|
let cs_key = CString::new(s_key).unwrap();
|
||||||
cs_key.into_raw()
|
cs_key.into_raw()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sign(cw: &CWallet, msg: *const c_char) -> *mut c_char{
|
pub unsafe extern "C" fn sign(
|
||||||
let rwallet = convert_to_rwallet(cw);
|
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 msg_str = cchar_to_str!(msg);
|
||||||
let signature = rwallet.sign(msg_str);
|
let signature = rwallet.sign(msg_str);
|
||||||
let r = match signature {
|
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]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn sign_for_tran(cw: &CWallet, msg: *const c_char) -> *mut c_char{
|
pub unsafe extern "C" fn sign_for_tran(
|
||||||
let rwallet = convert_to_rwallet(cw);
|
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 msg_str = cchar_to_str!(msg);
|
||||||
let signature = rwallet.sign_for_tran(msg_str);
|
let signature = rwallet.sign_for_tran(msg_str);
|
||||||
let (r, recid) = match signature {
|
let (r, recid) = match signature {
|
||||||
@ -169,11 +191,29 @@ unsafe fn convert_to_cwallet(rwallet: Wallet) -> CWallet {
|
|||||||
cw
|
cw
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe fn convert_to_rwallet(cwallet: &CWallet) -> Wallet {
|
// unsafe fn convert_to_rwallet(cwallet: &CWallet) -> Wallet {
|
||||||
let pmsg = cchar_to_string!(cwallet.msg_key);
|
// let pmsg = cchar_to_string!(cwallet.msg_key);
|
||||||
let pm = cchar_to_string!(cwallet.master_key);
|
// let pm = cchar_to_string!(cwallet.master_key);
|
||||||
let second_key = cchar_to_ostring!(cwallet.second_key);
|
// let second_key = cchar_to_ostring!(cwallet.second_key);
|
||||||
let backup_key = cchar_to_ostring!(cwallet.backup_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 {
|
Wallet {
|
||||||
msg_key: pmsg,
|
msg_key: pmsg,
|
||||||
master_key: pm,
|
master_key: pm,
|
||||||
|
@ -139,7 +139,11 @@ impl Wallet {
|
|||||||
let _tmp = vec![kp0, kp1];
|
let _tmp = vec![kp0, kp1];
|
||||||
let sss = get_sss(&self.msg_key);
|
let sss = get_sss(&self.msg_key);
|
||||||
let secret_b = sss.recover(&_tmp);
|
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")
|
SecretKey::from_str(&s_key_str).expect("32 bytes, within curve order")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user