1use crate::CoseKey;
6use coset::AsCborValue as _;
7use serde::{Deserializer, Serializer};
8
9impl serde::Serialize for CoseKey {
10 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
11 use serde::ser::Error as _;
12 let value = self.0.clone().to_cbor_value().map_err(S::Error::custom)?;
13 value.serialize(serializer)
14 }
15}
16
17impl<'de> serde::Deserialize<'de> for CoseKey {
18 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
19 use serde::de::Error as _;
20 let value = <ciborium::Value as serde::Deserialize>::deserialize(deserializer)?;
21 Ok(Self(
22 coset::CoseKey::from_cbor_value(value).map_err(D::Error::custom)?,
23 ))
24 }
25}
26
27#[cfg(test)]
28mod tests {
29 use super::*;
30
31 #[test]
32 fn ed25519_ser_de_should_roundtrip() {
33 let ed25519_sk = ed25519_dalek::SigningKey::generate(&mut rand::thread_rng());
34 let cose_key = CoseKey::from(ed25519_sk);
35 let ser_value = ciborium::Value::serialized(&cose_key).unwrap();
36 let de = ser_value.deserialized::<CoseKey>().unwrap();
37 assert_eq!(cose_key, de);
38
39 let mut ser_bytes = vec![];
40 ciborium::into_writer(&cose_key, &mut ser_bytes).unwrap();
41 let de = ciborium::from_reader::<CoseKey, _>(&ser_bytes[..]).unwrap();
42 assert_eq!(cose_key, de);
43 }
44
45 #[test]
46 fn p256_ser_de_should_roundtrip() {
47 let p256_sk = p256::ecdsa::SigningKey::random(&mut rand::thread_rng());
48 let cose_key = CoseKey::try_from(p256_sk).unwrap();
49 let ser_value = ciborium::Value::serialized(&cose_key).unwrap();
50 let de = ser_value.deserialized::<CoseKey>().unwrap();
51 assert_eq!(cose_key, de);
52
53 let mut ser_bytes = vec![];
54 ciborium::into_writer(&cose_key, &mut ser_bytes).unwrap();
55 let de = ciborium::from_reader::<CoseKey, _>(&ser_bytes[..]).unwrap();
56 assert_eq!(cose_key, de);
57 }
58
59 #[test]
60 fn p384_ser_de_should_roundtrip() {
61 let p384_sk = p384::ecdsa::SigningKey::random(&mut rand::thread_rng());
62 let cose_key = CoseKey::try_from(p384_sk).unwrap();
63 let ser_value = ciborium::Value::serialized(&cose_key).unwrap();
64 let de = ser_value.deserialized::<CoseKey>().unwrap();
65 assert_eq!(cose_key, de);
66
67 let mut ser_bytes = vec![];
68 ciborium::into_writer(&cose_key, &mut ser_bytes).unwrap();
69 let de = ciborium::from_reader::<CoseKey, _>(&ser_bytes[..]).unwrap();
70 assert_eq!(cose_key, de);
71 }
72
73 #[test]
74 fn bls12_381_ser_de_should_roundtrip() {
75 let bls12_381_sk = bls_signatures::PrivateKey::generate(&mut rand::thread_rng());
76 let cose_key = CoseKey::try_from(bls12_381_sk).unwrap();
77 let ser_value = ciborium::Value::serialized(&cose_key).unwrap();
78 let de = ser_value.deserialized::<CoseKey>().unwrap();
79 assert_eq!(cose_key, de);
80
81 let mut ser_bytes = vec![];
82 ciborium::into_writer(&cose_key, &mut ser_bytes).unwrap();
83 let de = ciborium::from_reader::<CoseKey, _>(&ser_bytes[..]).unwrap();
84 assert_eq!(cose_key, de);
85 }
86}