smcrypto/lib.rs
1//! A rust implementation of China's standards of encryption algorithms(SM2/SM3/SM4).
2//!
3//! ## Quick Start
4//!
5//! ### SM3
6//!
7//! ```
8//! use smcrypto::sm3;
9//! let hash = sm3::sm3_hash(b"abc");
10//! assert_eq!(hash, "66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0");
11//! ```
12//!
13//! ### SM2 Key Generate
14//!
15//! Note that the public key is in hexadecimal format and does not contain the "04" prefix.
16//!
17//! ```
18//! use smcrypto::sm2;
19//! let (sk, pk) = sm2::gen_keypair();
20//! ```
21//!
22//! ### SM2 Sign/Verify
23//!
24//! ```
25//! use smcrypto::sm2;
26//! let (sk, pk) = sm2::gen_keypair();
27//! let sign_ctx = sm2::Sign::new(&sk);
28//! let sign = sign_ctx.sign(b"abc");
29//! let verify_ctx = sm2::Verify::new(&pk);
30//! let verify = verify_ctx.verify(b"abc", &sign);
31//! assert_eq!(verify, true);
32//! ```
33//!
34//! ### SM2 Encrypt/Decrypt
35//!
36//! ```
37//! use smcrypto::sm2;
38//! let (sk, pk) = sm2::gen_keypair();
39//! let enc_ctx = sm2::Encrypt::new(&pk);
40//! let enc = enc_ctx.encrypt(b"abc");
41//! let dec_ctx = sm2::Decrypt::new(&sk);
42//! let dec = dec_ctx.decrypt(&enc);
43//! assert_eq!(String::from_utf8(dec).unwrap(), "abc");
44//! ```
45//!
46//! ### SM2 Key Exchange
47//!
48//! ```
49//! use smcrypto::sm2;
50//! // Step 1
51//! // a side
52//! let ida = b"id_a@company.com";
53//! let (ska, _) = sm2::gen_keypair();
54//! let keyexchange_a = sm2::KeyExchange::new(ida, &ska);
55//! let (a2b, rska) = keyexchange_a.keyexchange_1ab(16);
56//! // b side
57//! let idb = b"id_b@company.com";
58//! let (skb, _) = sm2::gen_keypair();
59//! let keyexchange_b = sm2::KeyExchange::new(idb, &skb);
60//! let (b2a, rskb) = keyexchange_b.keyexchange_1ab(16);
61//! // Step 2
62//! // a side
63//! let ka = keyexchange_a.keyexchange_2a(&rska, &b2a);
64//! // b side
65//! let kb = keyexchange_b.keyexchange_2b(&rskb, &a2b);
66//! // Step 3
67//! assert_eq!(ka.k, kb.k);
68//! assert_eq!(ka.s12, kb.s12);
69//! ```
70//!
71//! ### SM4 ECB Encrypt/Decrypt
72//!
73//! ```
74//! use smcrypto::sm4;
75//! let key = b"1234567812345678";
76//! let sm4_ecb = sm4::CryptSM4ECB::new(key);
77//! let enc_ecb = sm4_ecb.encrypt_ecb(b"abc");
78//! let dec_ecb = sm4_ecb.decrypt_ecb(&enc_ecb);
79//! assert_eq!(String::from_utf8(dec_ecb).unwrap(), "abc");
80//! ```
81//!
82//! ### SM4 CBC Encrypt/Decrypt
83//!
84//! ```
85//! use smcrypto::sm4;
86//! let key = b"1234567812345678";
87//! let iv = b"0000000000000000";
88//! let sm4_cbc = sm4::CryptSM4CBC::new(key, iv);
89//! let enc_cbc = sm4_cbc.encrypt_cbc(b"abc");
90//! let dec_cbc = sm4_cbc.decrypt_cbc(&enc_cbc);
91//! assert_eq!(String::from_utf8(dec_cbc).unwrap(), "abc");
92//! ```
93
94pub mod sm2;
95pub mod sm3;
96pub mod sm4;