use alloc::vec::Vec;
use anyhow::{Context, Result};
use crate::config::EcdsaSigEncoder;
pub struct DerSigEncoder;
impl EcdsaSigEncoder for DerSigEncoder {
fn encode_ecdsa_sig(r: &[u8], s: &[u8]) -> Result<Vec<u8>> {
let mut sequence = der::asn1::SequenceOf::<der::asn1::UintRef, 2>::new();
let r_int = der::asn1::UintRef::new(r).context("Failed to create r INTEGER")?;
sequence.add(r_int).context("Failed to add r INTEGER")?;
let s_int = der::asn1::UintRef::new(s).context("Failed to create s INTEGER")?;
sequence.add(s_int).context("Failed to add s INTEGER")?;
let cap = 8usize
.checked_add(r.len())
.and_then(|n| n.checked_add(s.len()))
.and_then(|n| n.checked_add(2))
.context("encode_ecdsa_sig capacity overflow")?;
let mut buf = alloc::vec![0u8; cap];
let mut writer = der::SliceWriter::new(&mut buf);
writer
.encode(&sequence)
.context("Failed to encode ECDSA signature sequence")?;
Ok(writer
.finish()
.context("Failed to finalize ECDSA signature sequence")?
.to_vec())
}
}