#![allow(
clippy::unreadable_literal,
clippy::upper_case_acronyms,
dead_code,
non_camel_case_types,
non_snake_case,
non_upper_case_globals,
overflowing_literals,
unused_variables,
unused_assignments
)]
use std::convert::From;
use lazy_static::lazy_static;
use wedpr_l_crypto_signature_secp256k1::WedprSecp256k1Recover;
use wedpr_l_crypto_signature_sm2::WedprSm2p256v1;
use wedpr_l_libsm::sm2::signature::Signature as WEDPRSM2Signature;
use wedpr_l_utils::traits::Signature;
use crate::bcossdk::accountutil::GMAccountUtil;
use crate::bcossdk::accountutil::{BcosAccount, EcdsaAccountUtil, IBcosAccountUtil};
use crate::bcossdk::kisserror::{KissErrKind, KissError};
#[derive(Default, Debug, Clone, PartialEq, Eq)]
pub struct CommonSignature {
pub v: Vec<u8>,
pub r: Vec<u8>,
pub s: Vec<u8>,
}
impl CommonSignature {
pub fn detail(&self) -> String {
format!(
"r:{:?},s:{:?},v:{:?}",
hex::encode(&self.r),
hex::encode(&self.s),
hex::encode(&self.v)
)
}
pub fn from_vec(data: &Vec<u8>) -> Self {
let r_ = data[0..32].to_vec();
let s_ = data[32..64].to_vec();
let v_ = data[64..].to_vec();
CommonSignature {
r: r_,
s: s_,
v: v_,
}
}
pub fn from_rsv(r: &[u8], s: &[u8], v: &[u8]) -> Self {
CommonSignature {
r: r.to_vec(),
s: s.to_vec(),
v: v.to_vec(),
}
}
pub fn to_vec(&self) -> Vec<u8> {
let mut buffer: Vec<u8> = vec![];
buffer.append(&mut self.r.clone());
buffer.append(&mut self.s.clone());
buffer.append(&mut self.v.clone());
buffer
}
}
pub struct Secp256Signature {}
impl Secp256Signature {
pub fn make_stand_v(v: u64) -> u64 {
match v {
v if v >= 27 && v <= 28 => (v - 27),
v if v >= 35 => ((v - 1) % 2),
_ => 4,
}
}
pub fn adjust_v_value(v: u64) -> u64 {
if v != 4 {
v as u64 + 27
} else {
v as u64
}
}
pub fn adjust_v(v: u8) -> u64 {
if v <= 1 || v == 4 {
v as u64 + 27
} else {
v as u64
}
}
pub fn to_electrum(data: &Vec<u8>) -> Vec<u8> {
let mut vout = data.clone();
if vout[64] <= 1 {
vout[64] += 27;
}
vout
}
}
pub trait ICommonSigner {
fn sign(&self, data: Vec<u8>) -> Result<CommonSignature, KissError>;
}
#[derive(Default, Debug, Clone)]
pub struct CommonSignerWeDPR_Secp256 {
pub account: BcosAccount,
pub signer: WedprSecp256k1Recover,
}
impl ICommonSigner for CommonSignerWeDPR_Secp256 {
fn sign(&self, data: Vec<u8>) -> Result<CommonSignature, KissError> {
printlnex!("current signer is :{:?}", self);
let msg_signature = self.signer.sign(&self.account.privkey, &data);
match msg_signature {
Ok(signature) => {
let mut commonsig = CommonSignature::from_vec(&signature);
let v_u64 = Secp256Signature::adjust_v_value(commonsig.v[0] as u64);
commonsig.v = v_u64.to_be_bytes().to_vec();
printlnex!("after adjust value v is {:?}", commonsig.v);
Ok(commonsig)
}
Err(e) => {
kisserr!(KissErrKind::ESign, "wedpr failt {:?}", e)
}
}
}
}
impl CommonSignerWeDPR_Secp256 {
fn new(key: &Vec<u8>) -> CommonSignerWeDPR_Secp256 {
let mut signer = CommonSignerWeDPR_Secp256::default();
signer.key_from_bytes(&key.as_slice());
signer
}
pub fn key_from_bytes(&mut self, keybytes: &[u8]) {
let acc = EcdsaAccountUtil::default().from_privkey_bytes(&keybytes.to_vec());
self.account = acc.unwrap();
}
pub fn key_from_hexstr(&mut self, hextext: &str) {
let prikey_fix = hex::decode(hextext);
self.key_from_bytes(prikey_fix.unwrap().as_slice())
}
}
#[derive(Default, Debug, Clone)]
pub struct CommonSignerWeDPR_SM2 {
pub account: BcosAccount,
pub signer: WedprSm2p256v1,
}
lazy_static! {
static ref SM2SIGHER: WedprSm2p256v1 = WedprSm2p256v1::default();
}
impl ICommonSigner for CommonSignerWeDPR_SM2 {
fn sign(&self, data: Vec<u8>) -> Result<CommonSignature, KissError> {
let start = time::now();
let result = SM2SIGHER.sign(&self.account.privkey, &data);
let end = time::now();
printlnex!("sign data use time {:?}", (end - start));
match result {
Ok(s) => {
let mut commonsig = CommonSignature::from_vec(&s);
commonsig.v = self.account.pubkey.clone(); Ok(commonsig)
}
Err(e) => {
kisserr!(KissErrKind::ESign, "gm sign error {:?}", e)
}
}
}
}
impl CommonSignerWeDPR_SM2 {
pub fn new(key: Vec<u8>) -> CommonSignerWeDPR_SM2 {
let mut signer = CommonSignerWeDPR_SM2::default();
signer.key_from_bytes(key.as_slice());
signer
}
pub fn key_from_bytes(&mut self, keybytes: &[u8]) {
self.account = GMAccountUtil::default()
.from_privkey_bytes(&keybytes.to_vec())
.unwrap();
}
pub fn key_from_hexstr(&mut self, hextext: &str) {
let prikey_fix = hex::decode(hextext).unwrap();
self.key_from_bytes(&prikey_fix)
}
}
static demokeyhex: &str = "82dcd33c98a23d5d06f9331554e14ab4044a1d71b169b7a38b61c214f0690f80";
pub fn test_common_sign() {
let mut wedprsigner: CommonSignerWeDPR_Secp256 = CommonSignerWeDPR_Secp256::default();
let data = keccak_hash::keccak(Vec::from("abcdefg"));
wedprsigner.key_from_hexstr(demokeyhex);
let signer = &wedprsigner;
let s2 = signer.sign(Vec::from(data.as_bytes())).unwrap();
let recover = wedprsigner
.signer
.recover_public_key(data.as_bytes(), s2.to_vec().as_slice())
.unwrap();
println!(
"recover by wedpr ,pubkey len{},{:?}",
&recover.len(),
&recover
);
let sp = Secp256Signature::to_electrum(&s2.to_vec());
let s = CommonSignature::from_vec(&s2.to_vec());
println!("r={:?},s={:?},v={:?}", s.r, s.s, s.v);
}
pub fn test_gm_sign() {
let mut sm2signer = CommonSignerWeDPR_SM2::default();
sm2signer.key_from_hexstr(demokeyhex);
let signer: &dyn ICommonSigner = &sm2signer;
let data = "1234567890";
let signresult = signer.sign(data.as_bytes().to_vec());
println!("GM Sign result = {:?}", &signresult);
let signresult1 = signer.sign(data.as_bytes().to_vec());
let sig = signresult.unwrap();
println!("account detail: {:?}", sm2signer.account.to_hexdetail());
println!("GM Sign Hex = {:?}", hex::encode(&sig.to_vec().as_slice()));
let sigsm2 = WEDPRSM2Signature::bytes_decode(&sig.to_vec().as_slice()).unwrap();
println!("sm2 sig {:?}", sigsm2);
println!(
"sm sig is r:{:?},s{:?},v:{:?}({})",
hex::encode(&sig.r),
hex::encode(&sig.s),
hex::encode(&sig.v),
&sig.v.len()
);
}