lib_did/sm/
mod.rs

1use libsm::sm2::signature::{SigCtx, Signature};
2use num_bigint::BigUint;
3
4pub struct Sm {}
5
6impl Sm {
7    /// 生成公私钥
8    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    /// 私钥转公钥
16    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    /// 私钥签名
26    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    /// 私钥签名
39    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}