Merge pull request #10312 from SomberNight/202511_pr10230_1
lnonion: immutable OnionPacket and OnionHopsDataSingle
This commit is contained in:
@@ -5,6 +5,7 @@ import shutil
|
||||
import asyncio
|
||||
from typing import Optional
|
||||
from os import urandom
|
||||
from types import MappingProxyType
|
||||
|
||||
from electrum import util
|
||||
from electrum.channel_db import NodeInfo
|
||||
@@ -387,17 +388,22 @@ class Test_LNRouter(ElectrumTestCase):
|
||||
session_key = bfh('4141414141414141414141414141414141414141414141414141414141414141')
|
||||
associated_data = bfh('4242424242424242424242424242424242424242424242424242424242424242')
|
||||
hops_data = [
|
||||
OnionHopsDataSingle(),
|
||||
OnionHopsDataSingle(),
|
||||
OnionHopsDataSingle(),
|
||||
OnionHopsDataSingle(),
|
||||
OnionHopsDataSingle(),
|
||||
OnionHopsDataSingle(
|
||||
_raw_bytes_payload=bfh("1202023a98040205dc06080000000000000001"),
|
||||
),
|
||||
OnionHopsDataSingle(
|
||||
_raw_bytes_payload=bfh("52020236b00402057806080000000000000002fd02013c0102030405060708090a0b0c0d0e0f0102030405060708090a0b0c0d0e0f0102030405060708090a0b0c0d0e0f0102030405060708090a0b0c0d0e0f"),
|
||||
),
|
||||
OnionHopsDataSingle(
|
||||
_raw_bytes_payload=bfh("12020230d4040204e206080000000000000003"),
|
||||
),
|
||||
OnionHopsDataSingle(
|
||||
_raw_bytes_payload=bfh("1202022710040203e806080000000000000004"),
|
||||
),
|
||||
OnionHopsDataSingle(
|
||||
_raw_bytes_payload=bfh("fd011002022710040203e8082224a33562c54507a9334e79f0dc4f17d407e6d7c61f0e2f3d0d38599502f617042710fd012de02a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a"),
|
||||
),
|
||||
]
|
||||
hops_data[0]._raw_bytes_payload = bfh("1202023a98040205dc06080000000000000001")
|
||||
hops_data[1]._raw_bytes_payload = bfh("52020236b00402057806080000000000000002fd02013c0102030405060708090a0b0c0d0e0f0102030405060708090a0b0c0d0e0f0102030405060708090a0b0c0d0e0f0102030405060708090a0b0c0d0e0f")
|
||||
hops_data[2]._raw_bytes_payload = bfh("12020230d4040204e206080000000000000003")
|
||||
hops_data[3]._raw_bytes_payload = bfh("1202022710040203e806080000000000000004")
|
||||
hops_data[4]._raw_bytes_payload = bfh("fd011002022710040203e8082224a33562c54507a9334e79f0dc4f17d407e6d7c61f0e2f3d0d38599502f617042710fd012de02a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a")
|
||||
packet = new_onion_packet(payment_path_pubkeys, session_key, hops_data, associated_data=associated_data)
|
||||
self.assertEqual(bfh('0002eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f283686619f7f3416a5aa36dc7eeb3ec6d421e9615471ab870a33ac07fa5d5a51df0a8823aabe3fea3f90d387529d4f72837f9e687230371ccd8d263072206dbed0234f6505e21e282abd8c0e4f5b9ff8042800bbab065036eadd0149b37f27dde664725a49866e052e809d2b0198ab9610faa656bbf4ec516763a59f8f42c171b179166ba38958d4f51b39b3e98706e2d14a2dafd6a5df808093abfca5aeaaca16eded5db7d21fb0294dd1a163edf0fb445d5c8d7d688d6dd9c541762bf5a5123bf9939d957fe648416e88f1b0928bfa034982b22548e1a4d922690eecf546275afb233acf4323974680779f1a964cfe687456035cc0fba8a5428430b390f0057b6d1fe9a8875bfa89693eeb838ce59f09d207a503ee6f6299c92d6361bc335fcbf9b5cd44747aadce2ce6069cfdc3d671daef9f8ae590cf93d957c9e873e9a1bc62d9640dc8fc39c14902d49a1c80239b6c5b7fd91d05878cbf5ffc7db2569f47c43d6c0d27c438abff276e87364deb8858a37e5a62c446af95d8b786eaf0b5fcf78d98b41496794f8dcaac4eef34b2acfb94c7e8c32a9e9866a8fa0b6f2a06f00a1ccde569f97eec05c803ba7500acc96691d8898d73d8e6a47b8f43c3d5de74458d20eda61474c426359677001fbd75a74d7d5db6cb4feb83122f133206203e4e2d293f838bf8c8b3a29acb321315100b87e80e0edb272ee80fda944e3fb6084ed4d7f7c7d21c69d9da43d31a90b70693f9b0cc3eac74c11ab8ff655905688916cfa4ef0bd04135f2e50b7c689a21d04e8e981e74c6058188b9b1f9dfc3eec6838e9ffbcf22ce738d8a177c19318dffef090cee67e12de1a3e2a39f61247547ba5257489cbc11d7d91ed34617fcc42f7a9da2e3cf31a94a210a1018143173913c38f60e62b24bf0d7518f38b5bab3e6a1f8aeb35e31d6442c8abb5178efc892d2e787d79c6ad9e2fc271792983fa9955ac4d1d84a36c024071bc6e431b625519d556af38185601f70e29035ea6a09c8b676c9d88cf7e05e0f17098b584c4168735940263f940033a220f40be4c85344128b14beb9e75696db37014107801a59b13e89cd9d2258c169d523be6d31552c44c82ff4bb18ec9f099f3bf0e5b1bb2ba9a87d7e26f98d294927b600b5529c47e04d98956677cbcee8fa2b60f49776d8b8c367465b7c626da53700684fb6c918ead0eab8360e4f60edd25b4f43816a75ecf70f909301825b512469f8389d79402311d8aecb7b3ef8599e79485a4388d87744d899f7c47ee644361e17040a7958c8911be6f463ab6a9b2afacd688ec55ef517b38f1339efc54487232798bb25522ff4572ff68567fe830f92f7b8113efce3e98c3fffbaedce4fd8b50e41da97c0c08e423a72689cc68e68f752a5e3a9003e64e35c957ca2e1c48bb6f64b05f56b70b575ad2f278d57850a7ad568c24a4d32a3d74b29f03dc125488bc7c637da582357f40b0a52d16b3b40bb2c2315d03360bc24209e20972c200566bcf3bbe5c5b0aedd83132a8a4d5b4242ba370b6d67d9b67eb01052d132c7866b9cb502e44796d9d356e4e3cb47cc527322cd24976fe7c9257a2864151a38e568ef7a79f10d6ef27cc04ce382347a2488b1f404fdbf407fe1ca1c9d0d5649e34800e25e18951c98cae9f43555eef65fee1ea8f15828807366c3b612cd5753bf9fb8fced08855f742cddd6f765f74254f03186683d646e6f09ac2805586c7cf11998357cafc5df3f285329366f475130c928b2dceba4aa383758e7a9d20705c4bb9db619e2992f608a1ba65db254bb389468741d0502e2588aeb54390ac600c19af5c8e61383fc1bebe0029e4474051e4ef908828db9cca13277ef65db3fd47ccc2179126aaefb627719f421e20'),
|
||||
packet.to_bytes())
|
||||
|
||||
@@ -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
|
||||
@@ -75,21 +77,21 @@ class TestOnionMessage(ElectrumTestCase):
|
||||
blind_fields={
|
||||
'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={
|
||||
'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={
|
||||
'padding': {'padding': bfh(CAROL_TLVS['padding'])},
|
||||
'next_node_id': {'node_id': bfh(CAROL_TLVS['next_node_id'])},
|
||||
}
|
||||
},
|
||||
),
|
||||
OnionHopsDataSingle(
|
||||
tlv_stream_name='onionmsg_tlv',
|
||||
@@ -98,7 +100,7 @@ class TestOnionMessage(ElectrumTestCase):
|
||||
'padding': {'padding': bfh(DAVE_TLVS['padding'])},
|
||||
'path_id': {'data': bfh(DAVE_TLVS['path_id'])},
|
||||
'unknown_tag_65535': {'data': bfh(DAVE_TLVS['unknown_tag_65535'])},
|
||||
}
|
||||
},
|
||||
)
|
||||
]
|
||||
|
||||
@@ -120,8 +122,8 @@ class TestOnionMessage(ElectrumTestCase):
|
||||
payload={'message': {'text': message.encode('utf-8')}},
|
||||
blind_fields={
|
||||
'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)
|
||||
@@ -235,13 +237,15 @@ class TestOnionMessage(ElectrumTestCase):
|
||||
blind_fields={
|
||||
'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=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=payload),
|
||||
)
|
||||
payment_path_pubkeys = blinded_node_ids + blinded_path_blinded_ids
|
||||
hop_shared_secrets, _ = get_shared_secrets_along_route(payment_path_pubkeys, SESSION_KEY)
|
||||
|
||||
Reference in New Issue
Block a user