hopr_crypto_packet/
lib.rs1pub mod sphinx;
20use hopr_types::{internal::prelude::*, primitive::prelude::*};
21use sphinx::prelude::*;
22
23pub mod errors;
25mod packet;
27mod por;
29mod types;
31mod validation;
33
34#[doc(hidden)]
35pub mod prelude {
36 pub use hopr_types::internal::routing::{HoprSenderId, HoprSurbId};
37
38 pub use super::*;
39 pub use crate::{
40 packet::{
41 HoprForwardedPacket, HoprIncomingPacket, HoprOutgoingPacket, HoprPacket, PacketRouting, PartialHoprPacket,
42 },
43 types::{PacketSignal, PacketSignals},
44 validation::validate_unacknowledged_ticket,
45 };
46}
47
48use hopr_types::internal::routing;
49pub use sphinx::prelude::{ProtocolKeyIdMapper, ReplyOpener};
50
51pub type HoprSphinxSuite = Ed25519Suite;
55
56#[derive(Clone, Copy, Debug, PartialEq, Eq)]
58#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
59pub struct HoprSphinxHeaderSpec;
60
61impl SphinxHeaderSpec for HoprSphinxHeaderSpec {
62 type KeyId = HoprKeyIdent;
63 type PRG = hopr_types::crypto::primitives::ChaCha20;
64 type PacketReceiverData = routing::HoprSenderId;
65 type Pseudonym = HoprPseudonym;
66 type RelayerData = por::ProofOfRelayString;
67 type SurbReceiverData = por::SurbReceiverInfo;
68 type UH = hopr_types::crypto::primitives::Poly1305;
69
70 const MAX_HOPS: std::num::NonZeroUsize = std::num::NonZeroUsize::new(INTERMEDIATE_HOPS + 1).unwrap();
71}
72
73pub type HoprKeyIdent = KeyIdent<4>;
75
76pub type HoprSurb = SURB<HoprSphinxSuite, HoprSphinxHeaderSpec>;
78
79pub type HoprReplyOpener = (routing::HoprSurbId, ReplyOpener);
81
82pub(crate) const PAYLOAD_SIZE_INT: usize = DefaultSphinxPacketSize::USIZE - 1; #[cfg(test)]
92mod tests {
93 use sphinx::prelude::MetaPacket;
94
95 use super::*;
96 use crate::packet::HoprPacket;
97
98 #[test]
99 fn header_and_packet_lengths() {
100 let hopr_packet_len = HoprPacket::SIZE;
101 assert_eq!(
102 MetaPacket::<HoprSphinxSuite, HoprSphinxHeaderSpec, PAYLOAD_SIZE_INT>::PACKET_LEN + Ticket::SIZE,
103 hopr_packet_len
104 );
105
106 assert!(
107 hopr_packet_len <= 1492 - 32, "HOPR packet of {hopr_packet_len} bytes must fit within a layer 4 packet with libp2p overhead"
109 );
110 }
111
112 #[test]
113 fn packet_length() {
114 let packet_len = HoprPacket::SIZE;
115 assert_eq!(packet_len, 422 + PAYLOAD_SIZE_INT);
116 }
117
118 #[test]
119 fn header_length() {
120 let header_len = HoprSphinxHeaderSpec::HEADER_LEN;
121 assert_eq!(header_len, 241);
122 }
123
124 #[test]
125 fn surb_length() {
126 let surb_len = HoprSurb::SIZE;
127 assert_eq!(surb_len, 395);
128 assert!(HoprPacket::PAYLOAD_SIZE > surb_len * 2);
129 }
130
131 #[test]
132 fn max_surbs_per_packet_must_be_at_least_2() {
133 const _: () = {
134 assert!(HoprPacket::MAX_SURBS_IN_PACKET >= 2);
135 };
136 }
137}