Skip to main content

json_web_key/
ec.rs

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