arnaucube
arnaucube/arkeddsaPublic Self-hosted repository
arkeddsa/src/signature.rs
src/signature.rsRaw
 1use ark_ec::twisted_edwards::Affine;
 2use ark_ec::twisted_edwards::TECurveConfig;
 3use ark_serialize::CanonicalDeserialize;
 4use ark_serialize::CanonicalSerialize;
 5
 6/// `SignatureComponents` contains the realized parts of a signature
 7#[derive(Copy, Clone, Debug, CanonicalSerialize, CanonicalDeserialize)]
 8pub struct Signature<TE: TECurveConfig + Clone> {
 9    r: Affine<TE>,
10    s: TE::ScalarField,
11}
12
13impl<TE: TECurveConfig + Clone> Signature<TE> {
14    /// Serializes the signature components to bytes as uncompressed.
15    /// Expect output size to be `size_of(TE::BaseField) * 2 + size_of(TE::ScalarField)`
16    pub fn to_bytes(&self) -> Vec<u8> {
17        let mut bytes = Vec::new();
18        self.r.serialize_uncompressed(&mut bytes).unwrap();
19        self.s.serialize_uncompressed(&mut bytes).unwrap();
20        bytes
21    }
22
23    /// Checked deserialization of the signature components from bytes.
24    /// Expects input size to be `size_of(TE::BaseField) * 2 + size_of(TE::ScalarField)`
25    pub fn from_bytes(bytes: &[u8]) -> Result<Self, Box<dyn ark_std::error::Error>> {
26        let point_size = TE::serialized_size(ark_serialize::Compress::No);
27        (bytes.len() == 32 + TE::serialized_size(ark_serialize::Compress::No))
28            .then_some(true)
29            .ok_or(ark_serialize::SerializationError::InvalidData)?;
30
31        let off1 = point_size;
32        let off2 = off1 + 32;
33
34        let r = Affine::<TE>::deserialize_uncompressed(&bytes[00..off1])?;
35        let s = TE::ScalarField::deserialize_uncompressed(&bytes[off1..off2])?;
36        Ok(Signature { r, s })
37    }
38
39    pub fn new(r: Affine<TE>, s: TE::ScalarField) -> Self {
40        Self { r, s }
41    }
42
43    pub fn r(&self) -> &Affine<TE> {
44        &self.r
45    }
46
47    pub fn s(&self) -> &TE::ScalarField {
48        &self.s
49    }
50}