use smcrypto::sm2 as sm;
pub fn sign(private_key: &str, data: &[u8]) -> String {
let sign_ctx = sm::Sign::new(private_key);
let sign = sign_ctx.sign(data);
hex::encode(sign)
}
pub fn sign_rs(private_key: &str, data: &[u8]) -> String {
let sign_ctx = sm::Sign::new(private_key);
let sign = sign_ctx.sign(data);
hex::encode(sign)
}
pub fn verify(sign: &str, pubkey_key: &str, data: &[u8]) -> bool {
let verify_ctx = sm::Verify::new(pubkey_key);
let sign = hex::decode(sign).unwrap();
verify_ctx.verify(data, &sign)
}
pub fn create_key() -> (String, String) {
let (private_key, pubkey_key) = sm::gen_keypair();
(private_key, format!("04{pubkey_key}"))
}
#[test]
fn tests() {
let msg = "你好";
let (private_key, pubkey_key) = create_key();
assert_eq!(private_key.len(), 64);
assert_eq!(pubkey_key.len(), 130);
println!("私钥: {private_key}");
println!("公钥: {pubkey_key}");
println!("text: {msg}");
let sign = sign(private_key.as_str(), msg.as_bytes());
println!("签名: {sign}");
}