1use cncs_sm2_kit::{
2 decrypt, encrypt, sign,
3 types::{EncryptMode, PrivateKey, PublicKey, Signature},
4 verify,
5};
6use ext_php_rs::prelude::{php_function, php_module, ModuleBuilder, PhpResult};
7
8#[php_function]
9pub fn sm2_sign(private_key_hex: &str, msg: &str, user_id: Option<&str>) -> PhpResult<String> {
10 let private_key = PrivateKey::from_hex_str(private_key_hex)
11 .map_err(|err| format!("Parse private_key_hex failed, err: {}", err))?;
12
13 let signature = sign(&private_key, msg, user_id);
14
15 Ok(signature.to_concated_hex_str())
16}
17
18#[php_function]
19pub fn sm2_verify(
20 public_key_hex: &str,
21 msg: &str,
22 user_id: Option<&str>,
23 signature_hex: &str,
24) -> PhpResult<bool> {
25 let public_key = PublicKey::from_concated_hex_str(public_key_hex)
26 .map_err(|err| format!("Parse public_key_hex failed, err: {}", err))?;
27
28 let signature = Signature::from_concated_hex_str(signature_hex)
29 .map_err(|err| format!("Parse signature_hex failed, err: {}", err))?;
30
31 let ret = verify(&public_key, msg, user_id, &signature)
32 .map_err(|err| format!("Verify failed, err: {}", err))?;
33
34 Ok(ret)
35}
36
37#[php_function]
38pub fn sm2_encrypt(public_key_hex: &str, msg: &str, mode: Option<u8>) -> PhpResult<String> {
39 let public_key = PublicKey::from_concated_hex_str(public_key_hex)
40 .map_err(|err| format!("Parse public_key_hex failed, err: {}", err))?;
41
42 let mode = if let Some(mode) = mode {
43 Some(prase_encrypt_mode(mode)?)
44 } else {
45 None
46 };
47
48 let msg_encrypted = encrypt(&public_key, msg, mode);
49 let msg_encrypted_base64 = base64::encode(&msg_encrypted);
50
51 Ok(msg_encrypted_base64)
52}
53
54#[php_function]
55pub fn sm2_decrypt(
56 private_key_hex: &str,
57 msg_encrypted_base64: &str,
58 mode: Option<u8>,
59) -> PhpResult<String> {
60 let private_key = PrivateKey::from_hex_str(private_key_hex)
61 .map_err(|err| format!("Parse private_key_hex failed, err: {}", err))?;
62
63 let mode = if let Some(mode) = mode {
64 Some(prase_encrypt_mode(mode)?)
65 } else {
66 None
67 };
68
69 let msg_encrypted = base64::decode(msg_encrypted_base64)
70 .map_err(|err| format!("Parse msg_encrypted_base64 failed, err: {}", err))?;
71
72 let msg = decrypt(&private_key, msg_encrypted, mode);
73
74 let msg_string = String::from_utf8(msg)
75 .map_err(|err| format!("Convert msg to string failed, err: {}", err))?;
76
77 Ok(msg_string)
78}
79
80fn prase_encrypt_mode(mode: u8) -> Result<EncryptMode, String> {
81 match mode {
82 0 => Ok(EncryptMode::C1C3C2),
83 1 => Ok(EncryptMode::C1C2C3),
84 _ => Err("Invalid mode".into()),
85 }
86}
87
88#[php_module]
89pub fn get_module(module: ModuleBuilder) -> ModuleBuilder {
90 module
91}