diff --git a/src/jose.rs b/src/jose.rs index 8f0cb6c..3ec7119 100644 --- a/src/jose.rs +++ b/src/jose.rs @@ -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")); +}