use crate::util;
use core::ops::Add;
use der::{asn1::Ia5StringRef, Decode, Encode, EncodeValue, FixedTag, Length, Reader, Writer};
#[derive(Copy, Clone, Eq, PartialEq, Debug)]
pub struct RestoreInfo {
pub nonce_seed: u64,
}
impl RestoreInfo {
pub fn decode_after_magic<'a, R: Reader<'a>>(decoder: &mut R) -> der::Result<Self> {
Ok(RestoreInfo {
nonce_seed: decoder.decode()?,
})
}
}
impl<'a> Decode<'a> for RestoreInfo {
fn decode<R: Reader<'a>>(decoder: &mut R) -> der::Result<Self> {
decoder.sequence(|nested_decoder| {
util::decode_and_check_magic(nested_decoder, b"IM4R")?;
RestoreInfo::decode_after_magic(nested_decoder)
})
}
}
impl EncodeValue for RestoreInfo {
fn value_len(&self) -> der::Result<Length> {
Ia5StringRef::new(&b"IM4R")?
.encoded_len()?
.add(self.nonce_seed.encoded_len()?)
}
fn encode_value(&self, encoder: &mut impl Writer) -> der::Result<()> {
Ia5StringRef::new(&b"IM4R")?.encode(encoder)?;
self.nonce_seed.encode(encoder)
}
}
impl FixedTag for RestoreInfo {
const TAG: der::Tag = der::Tag::Sequence;
}