cncs_sm2_php/
lib.rs

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}