Skip to main content

uor_addr/asn1/
pipeline.rs

1//! `asn1::address` — the ASN.1 realization's public entry point.
2//!
3//! 1. [`validate_der`] checks the input is a single well-formed DER value
4//!    (X.690 §§ 8 / 10 / 11) at the host boundary — no buffer, no caps.
5//! 2. [`AddressModel::forward`] runs the shared ψ-tower: DER is canonical,
6//!    so the input bytes flow in directly as an ADR-060 `Borrowed`
7//!    carrier and ψ₉ folds them through `H = Sha256Hasher` to mint the
8//!    κ-label.
9//! 3. [`AddressOutcome::from_grounded`] extracts the owned κ-label +
10//!    replayable TC-05 witness.
11//!
12//! The entry point is `no_alloc`: no transformation buffer is needed
13//! because DER is its own canonical form.
14
15pub use crate::outcome::{AddressOutcome, AddressWitness, VerifyError};
16
17/// Failure modes from [`address`].
18#[derive(Debug, Clone, Copy, PartialEq, Eq)]
19pub enum AddressFailure {
20    /// The input bytes were not a single well-formed DER value.
21    InvalidDer,
22    /// Defensive: foundation's catamorphism or a resolver returned a
23    /// shape violation. Unreachable for well-formed inputs.
24    PipelineFailure,
25}
26
27use crate::asn1::model::{
28    AddressModel, AddressModelBlake3, AddressModelKeccak256, AddressModelSha3_256,
29    AddressModelSha512,
30};
31use crate::asn1::value::{validate_der, Asn1Carrier};
32use prism::pipeline::PrismModel;
33
34/// **uor-addr's asn1 entry point** (σ-axis `Sha256Hasher`) — one
35/// ψ-pipeline content-address inference, yielding a `sha256:<64hex>`
36/// κ-label.
37///
38/// # Errors
39///
40/// - [`AddressFailure::InvalidDer`] — the input is not well-formed.
41/// - [`AddressFailure::PipelineFailure`] — defensive; unreachable.
42pub fn address(input_bytes: &[u8]) -> Result<AddressOutcome<71>, AddressFailure> {
43    validate_der(input_bytes).map_err(|_| AddressFailure::InvalidDer)?;
44    let grounded = AddressModel::forward(Asn1Carrier::new(input_bytes))
45        .map_err(|_| AddressFailure::PipelineFailure)?;
46    AddressOutcome::<71>::from_grounded(&grounded).map_err(|_| AddressFailure::PipelineFailure)
47}
48
49/// The asn1 entry point under σ-axis `Blake3Hasher` — yields a
50/// `blake3:<64hex>` κ-label. See [`address`] for the error contract.
51///
52/// # Errors
53///
54/// As [`address`].
55pub fn address_blake3(input_bytes: &[u8]) -> Result<AddressOutcome<71>, AddressFailure> {
56    validate_der(input_bytes).map_err(|_| AddressFailure::InvalidDer)?;
57    let grounded = AddressModelBlake3::forward(Asn1Carrier::new(input_bytes))
58        .map_err(|_| AddressFailure::PipelineFailure)?;
59    AddressOutcome::<71>::from_grounded(&grounded).map_err(|_| AddressFailure::PipelineFailure)
60}
61
62/// The asn1 entry point under σ-axis `Sha3_256Hasher` — yields a
63/// `sha3-256:<64hex>` κ-label. See [`address`] for the error contract.
64///
65/// # Errors
66///
67/// As [`address`].
68pub fn address_sha3_256(input_bytes: &[u8]) -> Result<AddressOutcome<73>, AddressFailure> {
69    validate_der(input_bytes).map_err(|_| AddressFailure::InvalidDer)?;
70    let grounded = AddressModelSha3_256::forward(Asn1Carrier::new(input_bytes))
71        .map_err(|_| AddressFailure::PipelineFailure)?;
72    AddressOutcome::<73>::from_grounded(&grounded).map_err(|_| AddressFailure::PipelineFailure)
73}
74
75/// The asn1 entry point under σ-axis `Keccak256Hasher` — yields a
76/// `keccak256:<64hex>` κ-label. See [`address`] for the error contract.
77///
78/// # Errors
79///
80/// As [`address`].
81pub fn address_keccak256(input_bytes: &[u8]) -> Result<AddressOutcome<74>, AddressFailure> {
82    validate_der(input_bytes).map_err(|_| AddressFailure::InvalidDer)?;
83    let grounded = AddressModelKeccak256::forward(Asn1Carrier::new(input_bytes))
84        .map_err(|_| AddressFailure::PipelineFailure)?;
85    AddressOutcome::<74>::from_grounded(&grounded).map_err(|_| AddressFailure::PipelineFailure)
86}
87
88/// The asn1 entry point under σ-axis `Sha512Hasher` — yields a
89/// `sha512:<128hex>` κ-label (135 bytes, 64-byte fingerprint). See
90/// [`address`] for the error contract.
91///
92/// # Errors
93///
94/// As [`address`].
95pub fn address_sha512(input_bytes: &[u8]) -> Result<AddressOutcome<135, 64>, AddressFailure> {
96    validate_der(input_bytes).map_err(|_| AddressFailure::InvalidDer)?;
97    let grounded = AddressModelSha512::forward(Asn1Carrier::new(input_bytes))
98        .map_err(|_| AddressFailure::PipelineFailure)?;
99    AddressOutcome::<135, 64>::from_grounded(&grounded).map_err(|_| AddressFailure::PipelineFailure)
100}