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}