Skip to main content

json_web_key/
ec.rs

1use serde::{Deserialize, Serialize};
2use std::hash;
3
4use crate::{cert::Certificate, encoded_bytes_field::EncodedBytesField};
5
6#[derive(Clone, Debug, Deserialize, Serialize)]
7pub struct EcWebKey {
8    #[serde(flatten)]
9    pub cert: Certificate,
10    #[serde(rename = "kid")]
11    pub key_id: Box<str>,
12    pub key_ops: Box<[Box<str>]>,
13    #[serde(default, flatten)]
14    pub key_type: KeyType,
15    #[serde(rename = "use")]
16    pub use_case: Box<str>,
17    #[serde(rename = "crv")]
18    pub curve: Box<str>,
19    #[serde(with = "EncodedBytesField")]
20    pub x: Box<[u8]>,
21    #[serde(with = "EncodedBytesField")]
22    pub y: Box<[u8]>,
23}
24
25#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)]
26#[serde(tag = "kty")]
27pub enum KeyType {
28    #[default]
29    EC,
30}
31
32impl Default for EcWebKey {
33    fn default() -> Self {
34        Self {
35            cert: Certificate::default(),
36            curve: "".into(),
37            key_id: "".into(),
38            key_ops: [].into(),
39            key_type: KeyType::default(),
40            x: [].into(),
41            y: [].into(),
42            use_case: "".into(),
43        }
44    }
45}
46// Derive equality based off key_id, not accurate but --
47// just like database records, we can save a lot of
48// performance by just assuming the key_id is accurate.
49impl Eq for EcWebKey {}
50
51impl hash::Hash for EcWebKey {
52    fn hash<H: hash::Hasher>(&self, state: &mut H) {
53        self.key_id.hash(state)
54    }
55}
56
57impl PartialEq for EcWebKey {
58    fn eq(&self, other: &Self) -> bool {
59        self.key_id.eq(&other.key_id)
60    }
61}