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