use mix_path_length to make Sphinx packets

This commit is contained in:
Youngjoon Lee 2024-07-10 09:28:50 +09:00
parent 0772bf1563
commit adfed3a622
No known key found for this signature in database
GPG Key ID: B4253AFBA618BF4D
4 changed files with 16 additions and 11 deletions

View File

@ -22,7 +22,7 @@ class GlobalConfig:
@dataclass
class NodeConfig:
private_key: X25519PrivateKey
mix_path_length: int # TODO: use this when creating Sphinx packets
mix_path_length: int
gossip: GossipConfig

View File

@ -35,7 +35,7 @@ class Node:
self.broadcast_channel = asyncio.Queue()
sample_packet, _ = PacketBuilder.build_real_packets(
bytes(1), global_config.membership
bytes(1), global_config.membership, self.global_config.max_mix_path_length
)[0]
self.packet_size = len(sample_packet.bytes())
@ -102,7 +102,9 @@ class Node:
async def send_message(self, msg: bytes):
for packet, _ in PacketBuilder.build_real_packets(
msg, self.global_config.membership
msg,
self.global_config.membership,
self.config.mix_path_length,
):
await self.mixgossip_channel.gossip(
Node.__build_msg(MsgType.REAL, packet.bytes())

View File

@ -23,24 +23,27 @@ class MessageFlag(Enum):
class PacketBuilder:
@staticmethod
def build_real_packets(
message: bytes, membership: MixMembership
message: bytes, membership: MixMembership, path_len: int
) -> List[Tuple[SphinxPacket, List[NodeInfo]]]:
return PacketBuilder.__build_packets(
MessageFlag.MESSAGE_FLAG_REAL, message, membership
MessageFlag.MESSAGE_FLAG_REAL, message, membership, path_len
)
@staticmethod
def build_drop_cover_packets(
message: bytes, membership: MixMembership
message: bytes, membership: MixMembership, path_len: int
) -> List[Tuple[SphinxPacket, List[NodeInfo]]]:
return PacketBuilder.__build_packets(
MessageFlag.MESSAGE_FLAG_DROP_COVER, message, membership
MessageFlag.MESSAGE_FLAG_DROP_COVER, message, membership, path_len
)
@staticmethod
def __build_packets(
flag: MessageFlag, message: bytes, membership: MixMembership
flag: MessageFlag, message: bytes, membership: MixMembership, path_len: int
) -> List[Tuple[SphinxPacket, List[NodeInfo]]]:
if path_len <= 0:
raise ValueError("path_len must be greater than 0")
last_mix = membership.choose()
msg_with_flag = flag.bytes() + message
@ -50,7 +53,7 @@ class PacketBuilder:
out = []
for fragment in fragment_set.fragments:
route = membership.generate_route(3, last_mix)
route = membership.generate_route(path_len, last_mix)
packet = SphinxPacket.build(
fragment.bytes(),
[mixnode.sphinx_node() for mixnode in route],

View File

@ -19,7 +19,7 @@ class TestPacket(TestCase):
global_config, _, key_map = init_mixnet_config(10)
msg = self.random_bytes(3500)
packets_and_routes = PacketBuilder.build_real_packets(
msg, global_config.membership
msg, global_config.membership, 3
)
self.assertEqual(4, len(packets_and_routes))
@ -60,7 +60,7 @@ class TestPacket(TestCase):
global_config, _, key_map = init_mixnet_config(10)
msg = b"cover"
packets_and_routes = PacketBuilder.build_drop_cover_packets(
msg, global_config.membership
msg, global_config.membership, 3
)
self.assertEqual(1, len(packets_and_routes))