1
0

lnonion: immutable OnionPacket and OnionHopsDataSingle

Make OnionHopsDataSingle and OnionPacket immutable for safer caching and
handling.

# Conflicts:
#	electrum/onion_message.py
This commit is contained in:
f321x
2025-10-13 14:24:42 +02:00
parent 1ad6607405
commit 936e7fd1c2
8 changed files with 148 additions and 92 deletions

View File

@@ -2,8 +2,10 @@ import asyncio
import io
import os
import time
from functools import partial
import dataclasses
import logging
from functools import partial
from types import MappingProxyType
import electrum_ecc as ecc
from electrum_ecc import ECPrivkey
@@ -72,34 +74,34 @@ class TestOnionMessage(ElectrumTestCase):
hops_data = [
OnionHopsDataSingle(
tlv_stream_name='onionmsg_tlv',
blind_fields={
blind_fields=MappingProxyType({
'next_node_id': {'node_id': bfh(ALICE_TLVS['next_node_id'])},
'next_path_key_override': {'path_key': bfh(ALICE_TLVS['next_path_key_override'])},
}
),
)),
OnionHopsDataSingle(
tlv_stream_name='onionmsg_tlv',
blind_fields={
blind_fields=MappingProxyType({
'next_node_id': {'node_id': bfh(BOB_TLVS['next_node_id'])},
'unknown_tag_561': {'data': bfh(BOB_TLVS['unknown_tag_561'])},
}
),
)),
OnionHopsDataSingle(
tlv_stream_name='onionmsg_tlv',
blind_fields={
blind_fields=MappingProxyType({
'padding': {'padding': bfh(CAROL_TLVS['padding'])},
'next_node_id': {'node_id': bfh(CAROL_TLVS['next_node_id'])},
}
),
)),
OnionHopsDataSingle(
tlv_stream_name='onionmsg_tlv',
payload={'message': {'text': bfh(test_vectors['onionmessage']['unknown_tag_1'])}},
blind_fields={
payload=MappingProxyType({'message': {'text': bfh(test_vectors['onionmessage']['unknown_tag_1'])}}),
blind_fields=MappingProxyType({
'padding': {'padding': bfh(DAVE_TLVS['padding'])},
'path_id': {'data': bfh(DAVE_TLVS['path_id'])},
'unknown_tag_65535': {'data': bfh(DAVE_TLVS['unknown_tag_65535'])},
}
)
))
]
encrypt_onionmsg_tlv_hops_data(hops_data, hop_shared_secrets)
@@ -117,11 +119,11 @@ class TestOnionMessage(ElectrumTestCase):
return [
OnionHopsDataSingle(
tlv_stream_name='onionmsg_tlv',
payload={'message': {'text': message.encode('utf-8')}},
blind_fields={
payload=MappingProxyType({'message': {'text': message.encode('utf-8')}}),
blind_fields=MappingProxyType({
'path_id': {'data': bfh('deadbeefbadc0ffeedeadbeefbadc0ffeedeadbeefbadc0ffeedeadbeefbadc0')},
}
)
))
]
hops_data = hops_data_for_message('short_message') # fit in HOPS_DATA_SIZE
encrypt_onionmsg_tlv_hops_data(hops_data, hop_shared_secrets)
@@ -232,16 +234,18 @@ class TestOnionMessage(ElectrumTestCase):
hops_data = [
OnionHopsDataSingle(
tlv_stream_name='onionmsg_tlv',
blind_fields={
blind_fields=MappingProxyType({
'next_node_id': {'node_id': BOB_PUBKEY},
'next_path_key_override': {'path_key': bfh(ALICE_TLVS['next_path_key_override'])},
}
),
)),
]
# encrypt encrypted_data_tlv here
for i in range(len(hops_data)):
encrypted_recipient_data = encrypt_onionmsg_data_tlv(shared_secret=hop_shared_secrets[i], **hops_data[i].blind_fields)
hops_data[i].payload['encrypted_recipient_data'] = {'encrypted_recipient_data': encrypted_recipient_data}
new_payload = dict(hops_data[i].payload)
new_payload['encrypted_recipient_data'] = {'encrypted_recipient_data': encrypted_recipient_data}
hops_data[i] = dataclasses.replace(hops_data[i], payload=MappingProxyType(new_payload))
blinded_path_blinded_ids = []
for i, x in enumerate(blinded_path_to_dave.get('path')):
@@ -253,7 +257,7 @@ class TestOnionMessage(ElectrumTestCase):
hops_data.append(
OnionHopsDataSingle(
tlv_stream_name='onionmsg_tlv',
payload=payload)
payload=MappingProxyType(payload))
)
payment_path_pubkeys = blinded_node_ids + blinded_path_blinded_ids
hop_shared_secrets, _ = get_shared_secrets_along_route(payment_path_pubkeys, SESSION_KEY)