use crate::content_info::ContentInfo;
use alloc::{string::String, vec::Vec};
use const_oid::ObjectIdentifier;
use der::{
asn1::{Ia5String, OctetString, OctetStringRef},
Any, Choice, Enumerated, Sequence,
};
use spki::AlgorithmIdentifierOwned;
use x509_cert::{
attr::{Attribute, Attributes},
crl::CertificateList,
};
#[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord, Enumerated)]
#[asn1(type = "INTEGER")]
#[repr(u8)]
#[allow(missing_docs)]
pub enum TsdVersion {
V1 = 1,
}
#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
#[allow(missing_docs)]
pub struct TimeStampedData<'a> {
pub version: TsdVersion,
#[asn1(optional = "true")]
pub data_uri: Option<Ia5String>,
#[asn1(optional = "true")]
pub meta_data: Option<MetaData>,
#[asn1(optional = "true")]
pub content: Option<OctetStringRef<'a>>,
pub temporal_evidence: Evidence,
}
#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
#[allow(missing_docs)]
pub struct MetaData {
pub hash_protected: bool,
#[asn1(optional = "true")]
pub file_name: Option<String>,
#[asn1(optional = "true")]
pub media_type: Option<Ia5String>,
#[asn1(optional = "true")]
pub other_meta_data: Option<Attributes>,
}
#[derive(Clone, Debug, Eq, PartialEq, Choice)]
#[allow(missing_docs)]
pub enum Evidence {
#[asn1(context_specific = "0")]
TstEvidence(TimeStampTokenEvidence),
#[asn1(context_specific = "1")]
ErsEvidence(EvidenceRecord),
#[asn1(context_specific = "2")]
OtherEvidence(OtherEvidence),
}
pub type TimeStampTokenEvidence = Vec<TimeStampAndCrl>;
#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
#[allow(missing_docs)]
pub struct TimeStampAndCrl {
pub time_stamp: TimeStampToken,
#[asn1(optional = "true")]
pub crl: Option<CertificateList>,
}
pub type TimeStampToken = ContentInfo;
#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
#[allow(missing_docs)]
pub struct EvidenceRecord {
pub version: TsdVersion,
pub digest_algorithm: Vec<AlgorithmIdentifierOwned>,
#[asn1(context_specific = "0", optional = "true")]
pub crypto_infos: Option<CryptoInfos>,
#[asn1(context_specific = "1", optional = "true")]
pub encryption_info: Option<EncryptionInfo>,
pub archive_timestamp_sequence: ArchiveTimeStampSequence,
}
pub type CryptoInfos = Vec<Attribute>;
#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
#[allow(missing_docs)]
pub struct EncryptionInfo {
pub encryption_info_type: ObjectIdentifier,
pub encryption_info_value: Any,
}
#[allow(missing_docs)]
pub type ArchiveTimeStampSequence = Vec<ArchiveTimeStampChain>;
#[allow(missing_docs)]
pub type ArchiveTimeStampChain = Vec<ArchiveTimeStamp>;
#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
#[allow(missing_docs)]
pub struct ArchiveTimeStamp {
#[asn1(context_specific = "0", optional = "true")]
digest_algorithm: Option<AlgorithmIdentifierOwned>,
#[asn1(context_specific = "1", optional = "true")]
attributes: Option<Attributes>,
#[asn1(context_specific = "2", optional = "true")]
reduced_hashtree: Option<Vec<PartialHashtree>>,
time_stamp: ContentInfo,
}
#[allow(missing_docs)]
pub type PartialHashtree = Vec<OctetString>;
#[derive(Clone, Debug, Eq, PartialEq, Sequence)]
#[allow(missing_docs)]
pub struct OtherEvidence {
pub oe_type: ObjectIdentifier,
pub oe_value: Any,
}