use std::convert::Infallible;
use pallas_codec::minicbor;
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct DmqMsg {
pub msg_payload: DmqMsgPayload,
pub kes_signature: Vec<u8>,
pub operational_certificate: DmqMsgOperationalCertificate,
pub cold_verification_key: Vec<u8>,
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct DmqMsgPayload {
pub msg_id: Vec<u8>,
pub msg_body: Vec<u8>,
pub kes_period: u64,
pub expires_at: u32,
}
impl DmqMsgPayload {
pub fn bytes_to_sign(&self) -> Result<Vec<u8>, minicbor::encode::Error<Infallible>> {
minicbor::to_vec(self)
}
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct DmqMsgOperationalCertificate {
pub kes_vk: Vec<u8>,
pub issue_number: u64,
pub start_kes_period: u64,
pub cert_sig: Vec<u8>,
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum DmqMsgRejectReason {
Invalid(String),
AlreadyReceived,
Expired,
Other(String),
}
impl std::fmt::Display for DmqMsgRejectReason {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
DmqMsgRejectReason::Invalid(reason) => write!(f, "Invalid: {}", reason),
DmqMsgRejectReason::AlreadyReceived => write!(f, "Already received"),
DmqMsgRejectReason::Expired => write!(f, "Expired"),
DmqMsgRejectReason::Other(reason) => write!(f, "Other: {}", reason),
}
}
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct DmqMsgValidationError(pub DmqMsgRejectReason);
impl From<DmqMsgRejectReason> for DmqMsgValidationError {
fn from(reason: DmqMsgRejectReason) -> DmqMsgValidationError {
DmqMsgValidationError(reason)
}
}
impl From<String> for DmqMsgValidationError {
fn from(s: String) -> Self {
DmqMsgValidationError(DmqMsgRejectReason::Other(s))
}
}
impl std::fmt::Display for DmqMsgValidationError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn dmq_msg_payload_bytes_to_sign_golden() {
let payload = DmqMsgPayload {
msg_id: vec![1, 2, 3],
msg_body: vec![4, 5, 6],
kes_period: 7,
expires_at: 14,
};
let bytes = payload.bytes_to_sign().unwrap();
assert_eq!(vec![132, 67, 1, 2, 3, 67, 4, 5, 6, 7, 14], bytes);
}
}