feat: add tests

This commit is contained in:
2025-06-29 22:59:26 +08:00
parent 7c760d26df
commit 120526f6af

View File

@@ -207,3 +207,137 @@ fn get_jwe(jwe: &str) -> String {
jwe.to_string()
}
}
#[test]
fn test_jwe_rsa_01() {
let rsa_private_key = RsaPrivateKey::new(&mut thread_rng(), 2048).unwrap();
let jwe = serialize_jwe_rsa(b"hello world", &rsa_private_key.to_public_key()).unwrap();
let plaintext = deserialize_jwe_rsa(&jwe, &rsa_private_key).unwrap();
assert_eq!("hello world", String::from_utf8(plaintext.0).unwrap());
assert_eq!("A256GCM", plaintext.1.enc);
assert_eq!("RSA-OAEP", plaintext.1.alg);
assert_eq!("local-mini-kms", plaintext.1.vendor);
assert!(plaintext.1.version.is_none());
assert!(plaintext.1.data_type.is_none());
assert!(plaintext.1.exportable.is_none());
}
#[test]
fn test_jwe_rsa_02() {
let test_private_key_pem = "-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCxytLReN50hqYH
a5Db87E9QEIg52Q+H0PGSC7ZLmBSeITLUX3fm5QOtUNzGR2cNYiS9XM4G0vjvE6u
d3k4xd/YU43fuD+bLGIxXItm0uXF7hDkdgX/bGrbuuyf1aD6I8RI/vb+n3pB0TL6
q1aUlxj7lHeUdYYgAl7qsbPvfXkSEWZ712/D6oQzvEZHq7sEtPiHcqckkqlwyP5X
0Uu7INm5c9BzYNF7Ni0+xHLMGmoKh3cWrM5FI90fXpY5A/3ylVGaW6DYBh8/Fc5e
1gGpUW+LSHufAuIn6YBiPcayGIlcjYkJ6lskNvt94G2ArZq0E5ZiPM8oLSnXJTKs
kjHWJxZVAgMBAAECggEAO6cmxvu7//LxoAm6R+Ji9H8r8OhSXPmWft/XQC1sSh9/
xswn5K/JpImzANpLcg8QLObH6upVsyqKZ8VUWfUiXu3h609hoAnrRE6dwzk9uQRg
jJcA+iuBSwpTvGksIuF/SVKqwtH1bkHnze1RFnf//OFaoegwwWqqOCq5icBar/Gx
PJ6rMvPhnwpHcJENUIBOUJ22GyOBm++NeAT/Ad1eWJUJATO+wv/cp/WAV6sER32r
HXoep0GLEqD3fE9Gg1+af3u+klli6fffd0p6Whd5f4qRIUDMSn1Pid2Rm+iZMrfa
sZ2d341WRuauyT+fltIWOMdORQnoIEVkWkSOwVZo3QKBgQDJIh0wjuBikZj6yvr3
xUV7LVXtttdyll5y+HWcfWZkIHdHM1YdgmSs43Xt3H2x3TIthoGd5+lQyBCT7HAD
noHnQasdOr3XgKrU8aWRZfmJoqZud2JaGcgSoIJYYm4Dg/cJZZs1khYpAfAy2m2G
90A4dPS2m7yR9qIKU0Qzfi0jvwKBgQDiSrjLMn0vNYR3cyNepyMJnjIFaEOVBYxx
FuRLKqF8A1VY955icdffqWOWj26SCAg+dG8tgekzT626zR9HVXuyKoOHL/xqrYoH
1m9qTqlc/BwQuCpnTWkWB+X6QZ+LAvEI+q3NvX4u0MaEz5k8HoHh/FokBhZCd8Xx
CnEJRuI66wKBgQC5iJRwhHuLsU7ymWbkQ78SHwHS5ATdmMPLPlIPZsWauzAMJ9ja
I7wGl1PjdK8l8SsmP5s1NAZPFB3mtgWl8QNXdYYI0nToY7Ix+C6Ibw6+3aC06b95
6apbNGDIcxOUfpjUvDtuMTHr5fPSlRbPlyhQa+KIyCQsaNuUtraE4XF2NQKBgAjr
NwNTNxngOxtWH2PApKHhaUlLRbae5F0ksNTBlmHD495AzC5HHGIFVBaACrSYunJz
tloNz7ok/szo/r2aAekQweRXINS3iEQs0HFZLlWq3hROneU6aNTkdMz7PyWEdSmM
b8M3H70Kn3hmkjyLW0Uj5A2da80s2VFZvwDFmW8HAoGAQWxSgNONrWfhgiACpE4P
SdpE/AHD77rMkahIxb5m1KcRk4Zsk31+XZ2QtmkoYsYuH+D0z09KCia0vNUk/Pkd
8OLAbOHe+WdXxdtVq+xWUyNGmiV4ChFTmSUgYB16dLHS771pgtr97DvbZx0QC+4o
Ay9yo20HQ4fizpfOIkoW96Q=
-----END PRIVATE KEY-----";
let jwe = "LKMS:eyJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiUlNBLU9BRVAiLCJ2ZW5kb3IiOiJsb2NhbC1taW5p\
LWttcyJ9.rei0aIWvri7nsy-UHJ163r1REqK897DHNVev6OCdQK7h0mH3dmHzaXJZ_CXiF3muylv8WU7nmhHLZsMD_z63rLrmH\
_pqH7grS2jTHEfHWgzkjSevFCOQxzSDtFiWJAlXQ_lA2N7y7FvJPM_W_OMZe9dFC2xDlgqXobgDHtrXrUVcjpd2wr2jCqP7RbE\
P8fnpIHRbBasC6kZggKRuyfd-YAbCNEjjaMgsZt-v2ridJVEccKFH37fu26m-5zWUbLHnl6afLf105Tkc47BbsLZXuz9gKomBa\
8cj6g6XjuZx8p8cOmlr5wnQElvFr_9prNFGFhB9c5mEsnGYbDrkM8ghCg.QmDRJCCzghCQlM7s.UF9RqEH9ULMb2is.wPGBxLP\
WkEcrkjsepiZPDA";
use rsa::pkcs8::DecodePrivateKey;
use serde_json::Value;
let rsa_private_key = RsaPrivateKey::from_pkcs8_pem(test_private_key_pem).unwrap();
let plaintext = deserialize_jwe_rsa(&jwe, &rsa_private_key).unwrap();
assert_eq!("hello world", String::from_utf8(plaintext.0).unwrap());
assert_eq!("A256GCM", plaintext.1.enc);
assert_eq!("RSA-OAEP", plaintext.1.alg);
assert_eq!("local-mini-kms", plaintext.1.vendor);
assert!(plaintext.1.version.is_none());
assert!(plaintext.1.data_type.is_none());
assert!(plaintext.1.exportable.is_none());
let public_key_pem = rsa_key_to_pem(&rsa_private_key).unwrap();
assert_eq!("-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAscrS0XjedIamB2uQ2/Ox
PUBCIOdkPh9Dxkgu2S5gUniEy1F935uUDrVDcxkdnDWIkvVzOBtL47xOrnd5OMXf
2FON37g/myxiMVyLZtLlxe4Q5HYF/2xq27rsn9Wg+iPESP72/p96QdEy+qtWlJcY
+5R3lHWGIAJe6rGz7315EhFme9dvw+qEM7xGR6u7BLT4h3KnJJKpcMj+V9FLuyDZ
uXPQc2DRezYtPsRyzBpqCod3FqzORSPdH16WOQP98pVRmlug2AYfPxXOXtYBqVFv
i0h7nwLiJ+mAYj3GshiJXI2JCepbJDb7feBtgK2atBOWYjzPKC0p1yUyrJIx1icW
VQIDAQAB
-----END PUBLIC KEY-----
", public_key_pem);
let jwk = rsa_key_to_jwk(&rsa_private_key).unwrap();
let jwk_value: Value = serde_json::from_str(&serde_json::to_string(&jwk.key).unwrap()).unwrap();
assert_eq!("AQAB", jwk_value.get("e").unwrap().as_str().unwrap());
assert_eq!("RSA", jwk_value.get("kty").unwrap().as_str().unwrap());
assert_eq!("scrS0XjedIamB2uQ2_OxPUBCIOdkPh9Dxkgu2S5gUniEy1F935uUDrVDcxkdnDWIkvVzOBtL47xOrnd5O\
MXf2FON37g_myxiMVyLZtLlxe4Q5HYF_2xq27rsn9Wg-iPESP72_p96QdEy-qtWlJcY-5R3lHWGIAJe6rGz7315EhFme9dvw-\
qEM7xGR6u7BLT4h3KnJJKpcMj-V9FLuyDZuXPQc2DRezYtPsRyzBpqCod3FqzORSPdH16WOQP98pVRmlug2AYfPxXOXtYBqVF\
vi0h7nwLiJ-mAYj3GshiJXI2JCepbJDb7feBtgK2atBOWYjzPKC0p1yUyrJIx1icWVQ",
jwk_value.get("n").unwrap().as_str().unwrap());
let rsa_public_key_2 = jwk_to_rsa_pubic_key(&serde_json::to_string(&jwk.key).unwrap()).unwrap();
let jwe = serialize_jwe_rsa(b"hello world 2", &rsa_public_key_2).unwrap();
let plaintext = deserialize_jwe_rsa(&jwe, &rsa_private_key).unwrap();
assert_eq!("hello world 2", String::from_utf8(plaintext.0).unwrap());
assert_eq!("A256GCM", plaintext.1.enc);
assert_eq!("RSA-OAEP", plaintext.1.alg);
assert_eq!("local-mini-kms", plaintext.1.vendor);
assert!(plaintext.1.version.is_none());
assert!(plaintext.1.data_type.is_none());
assert!(plaintext.1.exportable.is_none());
}
#[test]
fn test_jwe_aes() {
let jwe = serialize_jwe_aes(b"hello world", b"01234567890123456789012345678901").unwrap();
let plaintext = deserialize_jwe_aes(&jwe, b"01234567890123456789012345678901").unwrap();
assert_eq!("hello world", String::from_utf8(plaintext.0).unwrap());
assert_eq!("A256GCM", plaintext.1.enc);
assert_eq!("A256KW", plaintext.1.alg);
assert_eq!("local-mini-kms", plaintext.1.vendor);
assert_eq!("a15a8f066b1af95d", plaintext.1.version.unwrap());
assert!(plaintext.1.data_type.is_none());
assert!(plaintext.1.exportable.is_none());
}
#[test]
fn test_decode_url_safe_no_pad() {
assert_eq!("68656c6c6f20776f726c64",
hex::encode(decode_url_safe_no_pad(&URL_SAFE_NO_PAD.encode("hello world")).unwrap()));
}
#[test]
fn test_to_bytes32() {
assert!(to_bytes32(b"").is_err());
assert!(to_bytes32(b"01234567890123456789012345678901").is_ok());
assert_eq!("3031323334353637383930313233343536373839303132333435363738393031",
hex::encode(to_bytes32(b"01234567890123456789012345678901").unwrap()));
}
#[test]
fn test_get_master_key_checksum() {
assert_eq!("685fb69d15d5efe9", get_master_key_checksum(b"test"));
assert_eq!("80c5603e00ca3e80", get_master_key_checksum(b"hello_world"));
}
#[test]
fn test_get_jwe() {
assert_eq!("test", get_jwe("test"));
assert_eq!("test", get_jwe("LKMS:test"));
}