1use libsm::sm2::signature::{SigCtx, Signature};
2use num_bigint::BigUint;
3
4pub struct Sm {}
5
6impl Sm {
7 pub fn new_master_key() -> (String, String) {
9 let ctx = SigCtx::new();
10 let (pk, sk) = ctx.new_keypair();
11 let pk_v = ctx.serialize_pubkey(&pk, true);
12 return (hex::encode(pk_v), sk.to_str_radix(16));
13 }
14
15 pub fn pri_to_pub(pri_key: &[u8]) -> String {
17 let big_uint = BigUint::parse_bytes(pri_key, 16);
18 let pri = big_uint.unwrap();
19 let ctx = SigCtx::new();
20 let pk_point = ctx.pk_from_sk(&pri);
21 let pk_v = ctx.serialize_pubkey(&pk_point, true);
22 hex::encode(pk_v)
23 }
24
25 pub fn sign(pri_key: &[u8], msg: &[u8]) -> String {
27 let big_uint = BigUint::parse_bytes(pri_key, 16);
28 let sk = big_uint.unwrap();
29
30 let ctx = SigCtx::new();
31 let pk = ctx.pk_from_sk(&sk);
32
33 let signature = ctx.sign(msg, &sk, &pk);
34 let signature_der = signature.der_encode();
35 return hex::encode(signature_der);
36 }
37
38 pub fn verify(msg: &[u8], pub_key: &[u8], sig_der: &[u8]) -> bool {
40 let ctx = SigCtx::new();
41 let signature = Signature::der_decode(sig_der).unwrap();
42 let pk = ctx.load_pubkey(pub_key).unwrap();
43
44 let signature_der = signature.der_encode();
45 println!("{}", hex::encode(signature_der));
46
47 return ctx.verify(msg, &pk, &signature);
48 }
49}