Skip to main content

json_web_key/
rsa.rs

1use serde::{Deserialize, Serialize};
2use std::hash::Hash;
3
4use crate::cert::Certificate;
5use crate::encoded_bytes_field::EncodedBytesField;
6use crate::key_operation::KeyOperation;
7use crate::use_case::UseCase;
8
9#[derive(Clone, Debug, Default, Deserialize, Serialize)]
10pub struct RsaWebKey {
11    /// The X.509 Certificate
12    #[serde(default, flatten)]
13    pub cert: Certificate,
14    #[serde(rename = "kid")]
15    pub key_id: Box<str>,
16    /// Valid operations the key can perform.
17    #[serde(default)]
18    pub key_ops: Box<[KeyOperation]>,
19    #[serde(default, flatten)]
20    pub key_type: KeyType,
21    /// Public Key Use Case (signature or encryption)
22    #[serde(rename = "use", default)]
23    pub use_case: UseCase,
24    /// A public exponent (Usually 65537) used for
25    /// encryption and signature verification.
26    #[serde(rename = "e", with = "EncodedBytesField")]
27    pub exponent: Box<[u8]>,
28    /// The product of two large prime numbers, forms the main
29    /// body of the public key.
30    #[serde(rename = "n", with = "EncodedBytesField")]
31    pub modulus: Box<[u8]>,
32}
33
34#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)]
35#[serde(tag = "kty")]
36pub enum KeyType {
37    #[default]
38    RSA,
39}
40
41// Derive equality based off key_id, not accurate but --
42// just like database records, we can save a lot of
43// performance by just assuming the key_id is accurate.
44impl Eq for RsaWebKey {}
45
46impl Hash for RsaWebKey {
47    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
48        self.key_id.hash(state)
49    }
50}
51
52impl PartialEq for RsaWebKey {
53    fn eq(&self, other: &Self) -> bool {
54        self.key_id.eq(&other.key_id)
55    }
56}