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#[derive(Clone, Copy, Debug)]
7/// `SignatureComponents` contains the realized parts of a signature
8pub struct Signature<TE: TECurveConfig> {
9 r: Affine<TE>,
10 s: TE::ScalarField,
11}
12
13impl<TE: TECurveConfig> 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}