#![forbid(unsafe_code)]
#![deny(missing_docs)]
#[cfg(feature = "verify")]
mod ca;
mod caext;
#[cfg(feature = "verify")]
mod cosign;
mod der;
mod entry;
mod id;
mod landmark;
mod proof;
mod properties;
mod reader;
#[cfg(feature = "verify")]
mod time;
mod tree;
#[cfg(feature = "verify")]
mod trust;
#[cfg(feature = "verify")]
mod verify;
pub use caext::{MtcCaParameters, parse_mtc_ca_parameters};
#[cfg(feature = "verify")]
pub use cosign::SignatureAlgorithm;
pub use entry::entry_hash_from_certificate;
pub use id::TrustAnchorId;
pub use landmark::{Landmark, parse_landmarks};
pub use proof::{Cosignature, EntryReference, MtcProof, split_serial};
pub use properties::{CertificatePropertyList, Property};
pub use tree::{
HASH_SIZE, Subtree, covering_subtrees, evaluate_inclusion_proof, is_valid_subtree, leaf_hash,
node_hash, verify_consistency_proof,
};
#[cfg(feature = "verify")]
pub use trust::{CaTrust, CosignerGroup, CosignerInfo, TrustStore, TrustedSubtree};
#[cfg(feature = "verify")]
pub use verify::{
Verification, VerificationKind, verify_certificate, verify_certificate_ignoring_validity,
};
#[derive(Clone, Debug, PartialEq, Eq, thiserror::Error)]
#[non_exhaustive]
pub enum Error {
#[error("malformed input: {0}")]
Malformed(&'static str),
#[error("not a Merkle Tree certificate")]
NotMtc,
#[error("unknown Merkle Tree CA")]
UnknownCa,
#[error("invalid MTC serial number")]
InvalidSerial,
#[error("certificate serial number is revoked")]
Revoked,
#[error("certificate expired or not yet valid")]
TimeInvalid,
#[error("inclusion proof evaluation failed")]
ProofEvaluation,
#[error("cosigner policy not satisfied (missing: {missing:?}, invalid: {invalid:?})")]
PolicyUnsatisfied {
missing: Vec<TrustAnchorId>,
invalid: Vec<TrustAnchorId>,
},
#[error("invalid cosignature from cosigner {0}")]
InvalidCosignature(TrustAnchorId),
#[error("unsupported or malformed cosigner key: {0}")]
UnsupportedKey(&'static str),
}
pub type Result<T> = core::result::Result<T, Error>;