Skip to main content

schnorr_rs/identification/
issue_params.rs

1use serde::{Deserialize, Serialize};
2
3use crate::Group;
4
5/// Issue parameters for identification protocol.
6#[derive(Clone)]
7pub struct IssueParams<G: Group> {
8    pub(in crate::identification) i: G::P,
9    pub(in crate::identification) v: G::P,
10}
11
12impl<G: Group> IssueParams<G> {
13    /// The identity specified in the parameters.
14    #[inline]
15    pub fn identity(&self) -> G::P {
16        self.i.clone()
17    }
18}
19
20impl<G: Group> Serialize for IssueParams<G> {
21    fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
22        let i = G::serialize_point(&self.i);
23        let v = G::serialize_point(&self.v);
24        (i, v).serialize(serializer)
25    }
26}
27
28impl<'de, G: Group> Deserialize<'de> for IssueParams<G> {
29    fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
30        let (i, v): (Vec<u8>, Vec<u8>) = Deserialize::deserialize(deserializer)?;
31        let i = G::deserialize_point(&i)
32            .map_err(|_| serde::de::Error::custom("Invalid point for i"))?;
33        let v = G::deserialize_point(&v)
34            .map_err(|_| serde::de::Error::custom("Invalid point for v"))?;
35        Ok(IssueParams { i, v })
36    }
37}
38
39#[test]
40fn test_issue_params_serialization() {
41    let rng = &mut rand::thread_rng();
42    let group = crate::group::p256::SchnorrP256Group;
43    let params = IssueParams::<crate::group::p256::SchnorrP256Group> {
44        i: group.random_element(rng),
45        v: group.random_element(rng),
46    };
47
48    let serialized = bincode::serde::encode_to_vec(&params, bincode::config::legacy()).unwrap();
49    let (deserialized, _): (IssueParams<crate::group::p256::SchnorrP256Group>, _) =
50        bincode::serde::decode_from_slice(&serialized, bincode::config::legacy()).unwrap();
51
52    assert_eq!(params.i, deserialized.i);
53    assert_eq!(params.v, deserialized.v);
54}