use crate::crossing::CrossingRecord;
pub trait CrossingSigner: Send + Sync + std::fmt::Debug {
fn sign(&self, record: &CrossingRecord) -> Result<[u8; 64], SigningProviderError>;
fn verifying_key_bytes(&self) -> [u8; 32];
}
#[derive(Debug, Clone, thiserror::Error)]
#[non_exhaustive]
pub enum SigningProviderError {
#[error("CBOR encoding failed: {reason}")]
CborEncoding {
reason: String,
},
#[error("Signing failed: {reason}")]
SigningFailed {
reason: String,
},
}
#[derive(Debug, Default, Clone)]
pub struct NoopSigner;
impl CrossingSigner for NoopSigner {
fn sign(&self, _record: &CrossingRecord) -> Result<[u8; 64], SigningProviderError> {
Ok([0u8; 64])
}
fn verifying_key_bytes(&self) -> [u8; 32] {
[0u8; 32]
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::types::{CrossingType, UnitId};
fn dummy_record() -> CrossingRecord {
let chain_hash = CrossingRecord::compute_chain_hash(
UnitId::FU,
UnitId::MU,
1,
1,
CrossingType::Vertical,
1_000_000,
&[0u8; 32],
);
CrossingRecord {
source: UnitId::FU,
destination: UnitId::MU,
cycle_index: 1,
sequence_number: 1,
crossing_type: CrossingType::Vertical,
timestamp_ns: 1_000_000,
prev_hash: [0u8; 32],
chain_hash,
signature: [0u8; 64],
}
}
#[test]
fn noop_signer_returns_zeroes() {
let signer = NoopSigner;
let rec = dummy_record();
let sig = signer.sign(&rec).unwrap();
assert_eq!(sig, [0u8; 64]);
assert_eq!(signer.verifying_key_bytes(), [0u8; 32]);
}
}