xjp_oidc/
jwks.rs

1//! JSON Web Key Set (JWKS) types and utilities
2
3use serde::{Deserialize, Serialize};
4
5/// JSON Web Key (JWK) structure
6#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct Jwk {
8    /// Key type (e.g., "RSA", "EC")
9    pub kty: String,
10    /// Key ID
11    pub kid: String,
12    /// Key use (e.g., "sig", "enc")
13    #[serde(rename = "use")]
14    pub use_: String,
15    /// Algorithm (e.g., "RS256") - optional as per JWT spec
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub alg: Option<String>,
18    /// RSA modulus (for RSA keys)
19    #[serde(skip_serializing_if = "Option::is_none")]
20    pub n: Option<String>,
21    /// RSA public exponent (for RSA keys)
22    #[serde(skip_serializing_if = "Option::is_none")]
23    pub e: Option<String>,
24    /// X coordinate (for EC keys)
25    #[serde(skip_serializing_if = "Option::is_none")]
26    pub x: Option<String>,
27    /// Y coordinate (for EC keys)
28    #[serde(skip_serializing_if = "Option::is_none")]
29    pub y: Option<String>,
30    /// Curve (for EC keys)
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub crv: Option<String>,
33}
34
35/// JSON Web Key Set (JWKS)
36#[derive(Debug, Clone, Serialize, Deserialize)]
37pub struct Jwks {
38    /// Array of JSON Web Keys
39    pub keys: Vec<Jwk>,
40}
41
42impl Jwks {
43    /// Find a key by its ID
44    pub fn find_key(&self, kid: &str) -> Option<&Jwk> {
45        self.keys.iter().find(|k| k.kid == kid)
46    }
47
48    /// Find keys by algorithm
49    pub fn find_keys_by_alg(&self, alg: &str) -> Vec<&Jwk> {
50        self.keys.iter().filter(|k| k.alg.as_deref() == Some(alg)).collect()
51    }
52
53    /// Find keys by use
54    pub fn find_keys_by_use(&self, use_: &str) -> Vec<&Jwk> {
55        self.keys.iter().filter(|k| k.use_ == use_).collect()
56    }
57}