#![forbid(unsafe_code)]
#![deny(missing_docs)]
mod base;
#[cfg(feature = "verify")]
mod verify;
pub use base::caext::{MtcCaParameters, parse_mtc_ca_parameters};
pub use base::entry::entry_hash_from_certificate;
pub use base::id::TrustAnchorId;
pub use base::landmark::{Landmark, parse_landmarks};
pub use base::proof::{Cosignature, EntryReference, MtcProof, split_serial};
pub use base::properties::{CertificatePropertyList, Property};
pub use base::tree::{
HASH_SIZE, Subtree, covering_subtrees, evaluate_inclusion_proof, is_valid_subtree, leaf_hash,
node_hash, verify_consistency_proof,
};
#[cfg(feature = "verify")]
pub use verify::cosign::SignatureAlgorithm;
#[cfg(feature = "verify")]
pub use verify::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("invalid trust configuration: {0}")]
Configuration(&'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>;