prns-core 0.3.4

Pure Reticulum engine and wire contract for Personal Reticulum
use super::delivery::DeliveryIo;
use crate::crypto::X25519SharedSecret;
use crate::engine::{DecryptOwed, EngineReaction, EngineState, RatchetDecryptOwed};
use crate::identity::{decrypt_finish_in_place, OpenedBy, OpenedToken};
use crate::interfaces::AttachedInterfaces;
use crate::routing::delivery::{Delivery, SingleDelivery};
use crate::routing::proof::{DeferredProofSign, ProofObligation, ProofOwed, ProofRequest};
use crate::storage::StorageLayout;

impl<S: StorageLayout> EngineState<S> {
    pub fn resume_decrypt(
        &mut self,
        owed: DecryptOwed,
        shared: X25519SharedSecret,
        interfaces: AttachedInterfaces<'_>,
        should_prove: &mut impl FnMut(&ProofRequest) -> bool,
        deferred_sign: &mut Option<DeferredProofSign>,
        sink: &mut impl FnMut(EngineReaction<'_>),
    ) {
        let DecryptOwed {
            destination,
            context,
            arrived_at,
            source_interface,
            identity,
            proof_strategy,
            packet_hash,
            mut token,
            ..
        } = owed;
        let Ok(plaintext) = decrypt_finish_in_place(&shared, &identity, &mut token) else {
            return;
        };
        let proof = ProofObligation::for_delivery(
            proof_strategy,
            ProofOwed {
                packet_hash,
                identity,
            },
        );
        let delivery = Delivery::Single(SingleDelivery {
            destination,
            context,
            plaintext,
            opened_by: OpenedBy::IdentityKey,
            arrived_at,
            source_interface,
        });
        self.process_delivery(
            delivery,
            proof,
            source_interface,
            arrived_at,
            &mut DeliveryIo {
                interfaces,
                should_prove: &mut *should_prove,
                deferred_sign: &mut *deferred_sign,
                sink: &mut *sink,
            },
        );
    }

    pub fn resume_ratchet_decrypt(
        &mut self,
        owed: RatchetDecryptOwed,
        opened: OpenedToken<'_>,
        interfaces: AttachedInterfaces<'_>,
        should_prove: &mut impl FnMut(&ProofRequest) -> bool,
        deferred_sign: &mut Option<DeferredProofSign>,
        sink: &mut impl FnMut(EngineReaction<'_>),
    ) {
        let proof = ProofObligation::for_delivery(
            owed.proof_strategy,
            ProofOwed {
                packet_hash: owed.packet_hash,
                identity: owed.identity,
            },
        );
        let delivery = Delivery::Single(SingleDelivery {
            destination: owed.destination,
            context: owed.context,
            plaintext: opened.plaintext,
            opened_by: opened.opened_by,
            arrived_at: owed.arrived_at,
            source_interface: owed.source_interface,
        });
        self.process_delivery(
            delivery,
            proof,
            owed.source_interface,
            owed.arrived_at,
            &mut DeliveryIo {
                interfaces,
                should_prove: &mut *should_prove,
                deferred_sign: &mut *deferred_sign,
                sink: &mut *sink,
            },
        );
    }
}