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},
42 validation::validate_unacknowledged_ticket,
43 };
44}
45
46pub use hopr_crypto_sphinx::prelude::{KeyIdMapper, ReplyOpener};
47
48pub type HoprSphinxSuite = X25519Suite;
50
51#[derive(Clone, Copy, Debug, PartialEq, Eq)]
53#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
54pub struct HoprSphinxHeaderSpec;
55
56impl SphinxHeaderSpec for HoprSphinxHeaderSpec {
57 type KeyId = KeyIdent<4>;
58 type PRG = hopr_crypto_types::primitives::ChaCha20;
59 type PacketReceiverData = types::HoprSenderId;
60 type Pseudonym = HoprPseudonym;
61 type RelayerData = por::ProofOfRelayString;
62 type SurbReceiverData = por::SurbReceiverInfo;
63 type UH = hopr_crypto_types::primitives::Poly1305;
64
65 const MAX_HOPS: std::num::NonZeroUsize = std::num::NonZeroUsize::new(INTERMEDIATE_HOPS + 1).unwrap();
66}
67
68pub type HoprSurb = SURB<HoprSphinxSuite, HoprSphinxHeaderSpec>;
70
71pub type HoprReplyOpener = (types::HoprSurbId, ReplyOpener);
73
74pub(crate) const PAYLOAD_SIZE_INT: usize = 1021;
82
83#[cfg(test)]
84mod tests {
85 use hopr_crypto_sphinx::prelude::MetaPacket;
86
87 use super::*;
88 use crate::packet::HoprPacket;
89
90 #[test]
91 fn header_and_packet_lengths() {
92 let hopr_packet_len = HoprPacket::SIZE;
93 assert_eq!(
94 MetaPacket::<HoprSphinxSuite, HoprSphinxHeaderSpec, PAYLOAD_SIZE_INT>::PACKET_LEN + Ticket::SIZE,
95 hopr_packet_len
96 );
97
98 assert!(
99 hopr_packet_len <= 1492 - 32, "HOPR packet of {hopr_packet_len} bytes must fit within a layer 4 packet with libp2p overhead"
101 );
102 }
103
104 #[test]
105 fn packet_length() {
106 let packet_len = HoprPacket::SIZE;
107 assert_eq!(packet_len, 438 + PAYLOAD_SIZE_INT);
108 }
109
110 #[test]
111 fn header_length() {
112 let header_len = HoprSphinxHeaderSpec::HEADER_LEN;
113 assert_eq!(header_len, 241);
114 }
115
116 #[test]
117 fn surb_length() {
118 let surb_len = HoprSurb::SIZE;
119 assert_eq!(surb_len, 395);
120 assert!(HoprPacket::PAYLOAD_SIZE > surb_len * 2);
121 }
122
123 #[test]
124 fn max_surbs_per_packet_must_be_at_least_2() {
125 const _: () = {
126 assert!(HoprPacket::MAX_SURBS_IN_PACKET >= 2);
127 };
128 }
129}