Skip to main content

cose_key/
codec.rs

1//! Serialization.
2//! Given ciborium does not implement deterministic encoding as defined in https://datatracker.ietf.org/doc/html/rfc8949#section-4.2
3//!
4
5use 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}