Skip to main content

uor_addr/composition/f4/
pipeline.rs

1//! CS-F4 composition entry points, one per σ-axis (wiki ADR-061 §(2)).
2
3#![cfg(feature = "alloc")]
4
5use crate::composition::canonicalize::{canonicalize_f4, check_axis, decode_operand};
6use crate::composition::f4::model::{
7    CompositionModelF4Blake3, CompositionModelF4Keccak256, CompositionModelF4Sha256,
8    CompositionModelF4Sha3_256, CompositionModelF4Sha512,
9};
10use crate::composition::f4::value::F4Carrier;
11use crate::composition::CompositionFailure;
12use crate::label::KappaLabel;
13use crate::outcome::AddressOutcome;
14use prism::pipeline::PrismModel;
15
16/// CS-F4 under σ-axis `Sha256Hasher`.
17///
18/// # Errors
19///
20/// - [`CompositionFailure::OperandSigmaAxisMismatch`] — an operand's σ-axis
21///   prefix is not `"sha256"`.
22/// - [`CompositionFailure::MalformedOperand`] — an operand is not a
23///   well-formed κ-label.
24/// - [`CompositionFailure::PipelineFailure`] — defensive.
25pub fn compose_f4_quotient(
26    operand: &KappaLabel<71>,
27) -> Result<AddressOutcome<71>, CompositionFailure> {
28    let (axis, _) = decode_operand(operand)?;
29    check_axis(axis, "sha256")?;
30    let canon = canonicalize_f4(operand)?;
31    let grounded = CompositionModelF4Sha256::forward(F4Carrier::new(&canon))
32        .map_err(|_| CompositionFailure::PipelineFailure)?;
33    AddressOutcome::<71>::from_grounded(&grounded).map_err(|_| CompositionFailure::PipelineFailure)
34}
35/// CS-F4 under σ-axis `Blake3Hasher`.
36///
37/// # Errors
38///
39/// - [`CompositionFailure::OperandSigmaAxisMismatch`] — an operand's σ-axis
40///   prefix is not `"blake3"`.
41/// - [`CompositionFailure::MalformedOperand`] — an operand is not a
42///   well-formed κ-label.
43/// - [`CompositionFailure::PipelineFailure`] — defensive.
44pub fn compose_f4_quotient_blake3(
45    operand: &KappaLabel<71>,
46) -> Result<AddressOutcome<71>, CompositionFailure> {
47    let (axis, _) = decode_operand(operand)?;
48    check_axis(axis, "blake3")?;
49    let canon = canonicalize_f4(operand)?;
50    let grounded = CompositionModelF4Blake3::forward(F4Carrier::new(&canon))
51        .map_err(|_| CompositionFailure::PipelineFailure)?;
52    AddressOutcome::<71>::from_grounded(&grounded).map_err(|_| CompositionFailure::PipelineFailure)
53}
54/// CS-F4 under σ-axis `Sha3_256Hasher`.
55///
56/// # Errors
57///
58/// - [`CompositionFailure::OperandSigmaAxisMismatch`] — an operand's σ-axis
59///   prefix is not `"sha3-256"`.
60/// - [`CompositionFailure::MalformedOperand`] — an operand is not a
61///   well-formed κ-label.
62/// - [`CompositionFailure::PipelineFailure`] — defensive.
63pub fn compose_f4_quotient_sha3_256(
64    operand: &KappaLabel<73>,
65) -> Result<AddressOutcome<73>, CompositionFailure> {
66    let (axis, _) = decode_operand(operand)?;
67    check_axis(axis, "sha3-256")?;
68    let canon = canonicalize_f4(operand)?;
69    let grounded = CompositionModelF4Sha3_256::forward(F4Carrier::new(&canon))
70        .map_err(|_| CompositionFailure::PipelineFailure)?;
71    AddressOutcome::<73>::from_grounded(&grounded).map_err(|_| CompositionFailure::PipelineFailure)
72}
73/// CS-F4 under σ-axis `Keccak256Hasher`.
74///
75/// # Errors
76///
77/// - [`CompositionFailure::OperandSigmaAxisMismatch`] — an operand's σ-axis
78///   prefix is not `"keccak256"`.
79/// - [`CompositionFailure::MalformedOperand`] — an operand is not a
80///   well-formed κ-label.
81/// - [`CompositionFailure::PipelineFailure`] — defensive.
82pub fn compose_f4_quotient_keccak256(
83    operand: &KappaLabel<74>,
84) -> Result<AddressOutcome<74>, CompositionFailure> {
85    let (axis, _) = decode_operand(operand)?;
86    check_axis(axis, "keccak256")?;
87    let canon = canonicalize_f4(operand)?;
88    let grounded = CompositionModelF4Keccak256::forward(F4Carrier::new(&canon))
89        .map_err(|_| CompositionFailure::PipelineFailure)?;
90    AddressOutcome::<74>::from_grounded(&grounded).map_err(|_| CompositionFailure::PipelineFailure)
91}
92/// CS-F4 under σ-axis `Sha512Hasher`.
93///
94/// # Errors
95///
96/// - [`CompositionFailure::OperandSigmaAxisMismatch`] — an operand's σ-axis
97///   prefix is not `"sha512"`.
98/// - [`CompositionFailure::MalformedOperand`] — an operand is not a
99///   well-formed κ-label.
100/// - [`CompositionFailure::PipelineFailure`] — defensive.
101pub fn compose_f4_quotient_sha512(
102    operand: &KappaLabel<135>,
103) -> Result<AddressOutcome<135, 64>, CompositionFailure> {
104    let (axis, _) = decode_operand(operand)?;
105    check_axis(axis, "sha512")?;
106    let canon = canonicalize_f4(operand)?;
107    let grounded = CompositionModelF4Sha512::forward(F4Carrier::new(&canon))
108        .map_err(|_| CompositionFailure::PipelineFailure)?;
109    AddressOutcome::<135, 64>::from_grounded(&grounded)
110        .map_err(|_| CompositionFailure::PipelineFailure)
111}