use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SignatureData {
#[serde(rename = "R", with = "crate::tss::b64::vec")]
pub r: Vec<u8>,
#[serde(rename = "S", with = "crate::tss::b64::vec")]
pub s: Vec<u8>,
#[serde(rename = "Signature", with = "crate::tss::b64::vec")]
pub signature: Vec<u8>,
#[serde(rename = "M", with = "crate::tss::b64::vec")]
pub m: Vec<u8>,
}
impl SignatureData {
pub fn new(r: Vec<u8>, s: Vec<u8>, m: Vec<u8>) -> Self {
let mut signature = Vec::with_capacity(r.len() + s.len());
signature.extend_from_slice(&r);
signature.extend_from_slice(&s);
SignatureData { r, s, signature, m }
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn signature_is_r_concat_s() {
let sig = SignatureData::new(vec![1u8; 32], vec![2u8; 32], b"msg".to_vec());
assert_eq!(sig.signature.len(), 64);
assert_eq!(&sig.signature[..32], &[1u8; 32]);
assert_eq!(&sig.signature[32..], &[2u8; 32]);
}
#[test]
fn json_uses_go_field_names_and_base64() {
let sig = SignatureData::new(vec![0u8; 32], vec![0u8; 32], b"hi".to_vec());
let v: serde_json::Value =
serde_json::from_str(&serde_json::to_string(&sig).unwrap()).unwrap();
let obj = v.as_object().unwrap();
for k in ["R", "S", "Signature", "M"] {
assert!(obj.contains_key(k));
}
assert!(v["R"].is_string()); assert_eq!(v["M"], "aGk="); }
}