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