From cacb3c8aca3d760ea11dc5ebe3469929f0bd9d6d Mon Sep 17 00:00:00 2001 From: varun-r-mallya Date: Tue, 26 Aug 2025 12:48:57 +0530 Subject: [PATCH] feat: add webtransport certhashes field to NoiseExtensions and implement serialization test Signed-off-by: varun-r-mallya --- examples/doc-examples/example_encryption_noise.py | 3 --- libp2p/security/noise/pb/noise.proto | 1 + libp2p/security/noise/pb/noise_pb2.py | 8 ++++---- libp2p/security/noise/pb/noise_pb2.pyi | 6 +++++- .../security/noise/test_noise_extension_protobuf.py | 13 +++++++++++++ 5 files changed, 23 insertions(+), 8 deletions(-) create mode 100644 tests/core/security/noise/test_noise_extension_protobuf.py diff --git a/examples/doc-examples/example_encryption_noise.py b/examples/doc-examples/example_encryption_noise.py index 31d80580..f78a5ec4 100644 --- a/examples/doc-examples/example_encryption_noise.py +++ b/examples/doc-examples/example_encryption_noise.py @@ -24,10 +24,7 @@ async def main(): noise_transport = NoiseTransport( # local_key_pair: The key pair used for libp2p identity and authentication libp2p_keypair=key_pair, - # noise_privkey: The private key used for Noise protocol encryption noise_privkey=key_pair.private_key, - # early_data: Optional data to send during the handshake - # (None means no early data) # TODO: add early data ) diff --git a/libp2p/security/noise/pb/noise.proto b/libp2p/security/noise/pb/noise.proto index f818fe2e..bd6b67a6 100644 --- a/libp2p/security/noise/pb/noise.proto +++ b/libp2p/security/noise/pb/noise.proto @@ -2,6 +2,7 @@ syntax = "proto2"; package pb; message NoiseExtensions { + repeated bytes webtransport_certhashes = 1; repeated string stream_muxers = 2; } diff --git a/libp2p/security/noise/pb/noise_pb2.py b/libp2p/security/noise/pb/noise_pb2.py index d602719a..48a3ef61 100644 --- a/libp2p/security/noise/pb/noise_pb2.py +++ b/libp2p/security/noise/pb/noise_pb2.py @@ -13,7 +13,7 @@ _sym_db = _symbol_database.Default() -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$libp2p/security/noise/pb/noise.proto\x12\x02pb\"(\n\x0fNoiseExtensions\x12\x15\n\rstream_muxers\x18\x02 \x03(\t\"Q\n\x15NoiseHandshakePayload\x12\x14\n\x0cidentity_key\x18\x01 \x01(\x0c\x12\x14\n\x0cidentity_sig\x18\x02 \x01(\x0c\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$libp2p/security/noise/pb/noise.proto\x12\x02pb\"I\n\x0fNoiseExtensions\x12\x1f\n\x17webtransport_certhashes\x18\x01 \x03(\x0c\x12\x15\n\rstream_muxers\x18\x02 \x03(\t\"Q\n\x15NoiseHandshakePayload\x12\x14\n\x0cidentity_key\x18\x01 \x01(\x0c\x12\x14\n\x0cidentity_sig\x18\x02 \x01(\x0c\x12\x0c\n\x04\x64\x61ta\x18\x03 \x01(\x0c') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'libp2p.security.noise.pb.noise_pb2', globals()) @@ -21,7 +21,7 @@ if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None _NOISEEXTENSIONS._serialized_start=44 - _NOISEEXTENSIONS._serialized_end=84 - _NOISEHANDSHAKEPAYLOAD._serialized_start=86 - _NOISEHANDSHAKEPAYLOAD._serialized_end=167 + _NOISEEXTENSIONS._serialized_end=117 + _NOISEHANDSHAKEPAYLOAD._serialized_start=119 + _NOISEHANDSHAKEPAYLOAD._serialized_end=200 # @@protoc_insertion_point(module_scope) diff --git a/libp2p/security/noise/pb/noise_pb2.pyi b/libp2p/security/noise/pb/noise_pb2.pyi index cc1e1c34..0265e983 100644 --- a/libp2p/security/noise/pb/noise_pb2.pyi +++ b/libp2p/security/noise/pb/noise_pb2.pyi @@ -16,15 +16,19 @@ DESCRIPTOR: google.protobuf.descriptor.FileDescriptor class NoiseExtensions(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor + WEBTRANSPORT_CERTHASHES_FIELD_NUMBER: builtins.int STREAM_MUXERS_FIELD_NUMBER: builtins.int @property + def webtransport_certhashes(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.bytes]: ... + @property def stream_muxers(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ... def __init__( self, *, + webtransport_certhashes: collections.abc.Iterable[builtins.bytes] | None = ..., stream_muxers: collections.abc.Iterable[builtins.str] | None = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["stream_muxers", b"stream_muxers"]) -> None: ... + def ClearField(self, field_name: typing.Literal["stream_muxers", b"stream_muxers", "webtransport_certhashes", b"webtransport_certhashes"]) -> None: ... global___NoiseExtensions = NoiseExtensions diff --git a/tests/core/security/noise/test_noise_extension_protobuf.py b/tests/core/security/noise/test_noise_extension_protobuf.py new file mode 100644 index 00000000..a7e64e81 --- /dev/null +++ b/tests/core/security/noise/test_noise_extension_protobuf.py @@ -0,0 +1,13 @@ +from libp2p.security.noise.pb import noise_pb2 as noise_pb + + +def test_noise_extensions_serialization(): + # Test NoiseExtensions + ext = noise_pb.NoiseExtensions() + ext.stream_muxers.append("/mplex/6.7.0") + ext.stream_muxers.append("/yamux/1.0.0") + + # Serialize and deserialize + data = ext.SerializeToString() + ext2 = noise_pb.NoiseExtensions.FromString(data) + assert list(ext2.stream_muxers) == ["/mplex/6.7.0", "/yamux/1.0.0"]