1pub mod cert;
2pub mod ec;
3pub mod error;
4pub mod jwk;
5pub mod rsa;
6
7pub type Result<T> = std::result::Result<T, error::Error>;
8
9pub mod prelude {
10 pub use crate::cert::Certificate;
11 pub use crate::ec::EcWebKey;
12 pub use crate::jwk::JsonWebKey;
13 pub use crate::jwk::JsonWebKeySet;
14 pub use crate::rsa::RsaWebKey;
15}
16
17mod encoded_bytes_field;
18
19pub fn from_str(s: &str) -> Result<jwk::JsonWebKey> {
20 let value: jwk::JsonWebKey = serde_json::from_str(s)?;
21
22 Ok(value)
23}
24
25pub fn to_string(value: &jwk::JsonWebKey) -> Result<String> {
26 let value = serde_json::to_string(value)?;
27
28 Ok(value)
29}
30
31#[cfg(test)]
32mod tests {
33 use super::prelude::*;
34 use super::*;
35 use base64ct::{Base64UrlUnpadded, Encoding};
36 use serde_json::json;
37
38 #[test]
39 fn test_rsa_jwk() {
40 let webkey = json!({
41 "alg": "RS256",
42 "e": "MzYzNTM1MzMzNzBhCg",
43 "kid": "test",
44 "key_ops": [],
45 "kty": "RSA",
46 "n": "NDIzNzMzMzQzMTQyMzQ0NDMxMzUzMTM1Mzc0NDM2Mzg0NDM3NDMzOTQ2NDI0NDM4MzMzMTQyMzY0MzQ1CjQzMzc0MjM0NDMzOTQxMzAzMjMxMzkzNDMxNDQzMTM2NDQzODQ0NDI0NjQ2NDIzMjM1MzMzNjM3NDUzNQo0MjQyMzgzNDM4Mzg0MjM2NDUzNjM5NDQ0NDQ2NDI0NDMyMzgzOTMyNDU0NDQ1Mzk0MzQyMzAzNTQ0NDUKMzkzODMyMzczOTMzNDYzNzMzMzkzNjQxMzMzMzQ1NDI0NDMwMzczMjM2NDIzMzM2Mzk0NDQyNDM0NDM0CjM0MzI0NTQxMzIzMjQzNDE0MTM2NDUzNzMyNDI0MjQxMzIzNjMyNDYzMjQ2MzE0NTQxNDQ0NTMxMzMzMwozMjM0Mzg0NDMxMzY0NTQyMzUzMDQzNDUzOTM2NDY0NDQ1MzMzNjMyNDQzMzM5NDEzMzM2NDYzMjM0MzgKMzIzNzMyNDEzNTQxMzE0MzM2Mzg0NTMzNDU0NTM3MzYzMzQyNDE0MjM2MzA0MjM4MzgzMTM4MzMzMTQ1CjQyNDU0NTM1MzM0NDQ0Mzg0MTQ0NDE0NDMzNDIzNTQxMzEzMjM4NDQ0NTQ0MzYzNjMzMzMzNjQ0MzgzNAozODM5NDI0MzMyMzkzODQxNDUzNDQzNDY0MjM1MzYzNDMyMzk0MzM3NDEzNDMwMzIzOTM3MzMzOTMwNDQKNDMzMjMxMzEzOTMxNDE0MTQyNDQzOTM0NDYzODMwMzc0MzMxNDI0NjM3NDIzNjQxMzA0NjMwMzAzNjQ2CjM5MzE0MTMxNDIzOTQ1MzgzMDMyNDQ0MzQ0NDY0MjMzNDE0NTM5MzgzMDQ2MzI0MTQyNDMzOTM3MzUzNgo0MjQxNDIzNTQzMzgzMDMwNDMzNDQzMzIzNzQxMzE0MjM5NDQzNzQ0MzIzMTM0NDY0MzQ2MzEzMTQ0MzAKMzIzMDQyMzAzNDQ0MzQzMTM3MzQzMTMyMzU0NDM5NDIzNDMwMzAzODQxMzY0MjMwNDYzMDM0MzYzNTM5CjMwNDY0NDQ2NDMzMjM2NDMzMDM4NDQzNzQ2NDM0NDQxNDYzMzQ1MzAzNzQzMzYzOTQzMzAzNTM4MzQzMwo0NDQ2NDYzMzQyMzEzNzMxNDEzNzMxMzQzMTM5MzM0NjQ1MzY0MzMxMzM0MTQxMzk0NjMzMzYzMTMyMzIKMzEzODM4MzIzODQ1Mzc0MjMwNDQ0MjM1MzQzNTM4MzMzODMwMzMzMDMwMzA0MTM4NDI0MjQ1NDI0MTM4CjM1NDQzNTQxMzYzNzM3MzUzOTM2MzUzNTM3MzUzODMzMzM0NTMzNDQzMDMyMzUzNTQzMzE0MjMyNDMzNwozMzM5MGEK",
47 });
48
49 let empty_cert = Certificate {
50 chain: None,
51 sha256_thumbprint: None,
52 thumbprint: None,
53 url: None,
54 };
55
56 let wk_string = webkey.to_string();
57
58 let jwk: JsonWebKey = from_str(wk_string.as_str()).unwrap();
59
60 let JsonWebKey::RS256(key) = &jwk else {
61 panic!("Incorrect algorithm.")
62 };
63
64 let enc_mod = Base64UrlUnpadded::encode_string(&key.modulus);
65 let enc_exp = Base64UrlUnpadded::encode_string(&key.exponent);
66
67 assert_eq!(key.key_id, "test".into());
68 assert_eq!(enc_mod, webkey["n"]);
69 assert_eq!(enc_exp, webkey["e"]);
70 assert_eq!(key.cert, empty_cert);
71 assert_eq!(key.key_type, rsa::KeyType::RSA);
72 assert_eq!(key.key_ops.len(), 0);
73 assert_eq!(key.use_case, "".into());
74 }
75}