增加一些用于relay的方法
This commit is contained in:
parent
ac2f7a17b5
commit
e593b64160
@ -7,7 +7,7 @@
|
|||||||
use rustwallet::{
|
use rustwallet::{
|
||||||
aes_decrypt, aes_encrypt, generate_sec_key, get_address, get_public_key, hash_pass_svr,
|
aes_decrypt, aes_encrypt, generate_sec_key, get_address, get_public_key, hash_pass_svr,
|
||||||
hex_deflate, hex_inflate, keccak256_hash, local_pass_hasher, rdecrypt, rencrypt, sign,
|
hex_deflate, hex_inflate, keccak256_hash, local_pass_hasher, rdecrypt, rencrypt, sign,
|
||||||
sign_for_tran, wallet_decrypt, wallet_encrypt,
|
sign_for_tran, wallet_decrypt, wallet_encrypt,simple_sign,
|
||||||
};
|
};
|
||||||
use std::ffi::{CStr, CString};
|
use std::ffi::{CStr, CString};
|
||||||
use std::os::raw::c_char;
|
use std::os::raw::c_char;
|
||||||
@ -139,5 +139,13 @@ fn main() {
|
|||||||
print_cchar!(msg_d);
|
print_cchar!(msg_d);
|
||||||
let msg_decrypted = rdecrypt(key_private, msg_encrypted);
|
let msg_decrypted = rdecrypt(key_private, msg_encrypted);
|
||||||
print_cchar!(msg_decrypted);
|
print_cchar!(msg_decrypted);
|
||||||
|
let msg = "hello world";
|
||||||
|
let sig = simple_sign(str_to_cchar!(msg), key_private);
|
||||||
|
print_cchar!(sig);
|
||||||
|
|
||||||
|
let str_1111 = "67181d63581e5506f137cfc66af17ffc8c0138238eb7fb9c2b4f424402d6c9d1";
|
||||||
|
let aes_key = "02aaaafbd375639879d6a694893dd14413662d90c59abaceb6cc4c791aa0834352";
|
||||||
|
let str_aes_plain = aes_decrypt(str_to_cchar!(str_1111), str_to_cchar!(aes_key));
|
||||||
|
print_cchar!(str_aes_plain);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,8 @@ char *sign_for_tran(const char *msg_key,
|
|||||||
|
|
||||||
char *rencrypt(const char *pk, const char *msg);
|
char *rencrypt(const char *pk, const char *msg);
|
||||||
|
|
||||||
|
char *rdecrypt(const char *sk, const char *msg);
|
||||||
|
|
||||||
char *wallet_encrypt(const char *msg_key,
|
char *wallet_encrypt(const char *msg_key,
|
||||||
const char *master_key,
|
const char *master_key,
|
||||||
const char *second_key,
|
const char *second_key,
|
||||||
@ -45,3 +47,7 @@ char *local_pass_hasher(const char *password);
|
|||||||
bool verify_local_pass(const char *password, const char *pass_hash);
|
bool verify_local_pass(const char *password, const char *pass_hash);
|
||||||
|
|
||||||
char *generate_client_key(const char *password, const char *openid, const char *salt);
|
char *generate_client_key(const char *password, const char *openid, const char *salt);
|
||||||
|
|
||||||
|
char *simple_sign(const char *content, const char *key);
|
||||||
|
|
||||||
|
char *ramdonKey(void);
|
||||||
|
18
src/lib.rs
18
src/lib.rs
@ -255,6 +255,24 @@ pub unsafe extern "C" fn generate_client_key(
|
|||||||
str_to_cchar!(result)
|
str_to_cchar!(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn simple_sign(content: *const c_char, key: *const c_char) -> *mut c_char {
|
||||||
|
let result = wallet_impl::simple_sign(cchar_to_str!(content), cchar_to_str!(key));
|
||||||
|
let r = match result {
|
||||||
|
Ok(v) => v,
|
||||||
|
Err(err) => panic!("Problem sign: {:?}", err),
|
||||||
|
};
|
||||||
|
str_to_cchar!(r)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub unsafe extern "C" fn ramdonKey() -> *mut c_char {
|
||||||
|
let (s_key, _p_key) = wallet_impl::generate_keypair();
|
||||||
|
let s_key = hex::encode(&s_key.secret_bytes());
|
||||||
|
let cs_key = CString::new(s_key).unwrap();
|
||||||
|
cs_key.into_raw()
|
||||||
|
}
|
||||||
|
|
||||||
unsafe fn generate_rwallet(
|
unsafe fn generate_rwallet(
|
||||||
msg_key: *const c_char,
|
msg_key: *const c_char,
|
||||||
master_key: *const c_char,
|
master_key: *const c_char,
|
||||||
|
@ -4,7 +4,7 @@ use crate::utils::{crypto_utils as crypro_utils, str_utils};
|
|||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use core::fmt::Write;
|
use core::fmt::Write;
|
||||||
use primitive_types::{H160, H256};
|
use primitive_types::{H160, H256};
|
||||||
// use secp256k1::rand::rngs::OsRng;
|
use secp256k1::rand::rngs::OsRng;
|
||||||
use secp256k1::{Message, PublicKey, Secp256k1, SecretKey};
|
use secp256k1::{Message, PublicKey, Secp256k1, SecretKey};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use shamir_secret_sharing::num_bigint::BigInt;
|
use shamir_secret_sharing::num_bigint::BigInt;
|
||||||
@ -33,10 +33,10 @@ pub fn local_pass_hasher(password: &str) -> String {
|
|||||||
pass_hash
|
pass_hash
|
||||||
}
|
}
|
||||||
|
|
||||||
// pub fn generate_keypair() -> (SecretKey, PublicKey) {
|
pub fn generate_keypair() -> (SecretKey, PublicKey) {
|
||||||
// let secp = Secp256k1::new();
|
let secp = Secp256k1::new();
|
||||||
// secp.generate_keypair(&mut OsRng)
|
secp.generate_keypair(&mut OsRng)
|
||||||
// }
|
}
|
||||||
|
|
||||||
pub fn public_key_address(public_key: &PublicKey) -> H160 {
|
pub fn public_key_address(public_key: &PublicKey) -> H160 {
|
||||||
let public_key = public_key.serialize_uncompressed();
|
let public_key = public_key.serialize_uncompressed();
|
||||||
@ -85,6 +85,33 @@ where
|
|||||||
keccak256(ð_message).into()
|
keccak256(ð_message).into()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn simple_sign<S>(msg:S, key_str: S) -> Result<String>
|
||||||
|
where
|
||||||
|
S: AsRef<[u8]>,
|
||||||
|
{
|
||||||
|
let key_str = key_str.as_ref();
|
||||||
|
let key_str = str::from_utf8(key_str).expect("key_str is utf8");
|
||||||
|
let secret_key = SecretKey::from_str(key_str).expect("32 bytes, within curve order");
|
||||||
|
let secp = Secp256k1::new();
|
||||||
|
let message = msg.as_ref();
|
||||||
|
let message_hash = hash_message(message.as_ref());
|
||||||
|
let message_to_hash = Message::from_slice(message_hash.as_ref()).expect("32 bytes");
|
||||||
|
let (recovery_id, signature) = secp
|
||||||
|
.sign_ecdsa_recoverable(&message_to_hash, &secret_key)
|
||||||
|
.serialize_compact();
|
||||||
|
|
||||||
|
let mut s = hex::encode(signature);
|
||||||
|
let standard_v = recovery_id.to_i32() as u64 + 27;
|
||||||
|
let rv: u8 = standard_v
|
||||||
|
.try_into()
|
||||||
|
.expect("signature recovery in electrum notation always fits in a u8");
|
||||||
|
write!(s, "{:02x}", rv).unwrap();
|
||||||
|
let pk = get_public_key(&secret_key);
|
||||||
|
let address = public_key_address(&pk);
|
||||||
|
let result_str = format!("{:?}|{}", address, s);
|
||||||
|
Ok(result_str)
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug)]
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
pub struct Wallet {
|
pub struct Wallet {
|
||||||
pub msg_key: String,
|
pub msg_key: String,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user