From 9e7a95447aff8dd65285ac6ba6f5cbcd799be0f6 Mon Sep 17 00:00:00 2001 From: Matthew Endsley Date: Wed, 3 Feb 2021 13:44:02 -0800 Subject: [PATCH] Update ClientHello to encode extensions size --- Hazel/Dtls/Handshake.cs | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/Hazel/Dtls/Handshake.cs b/Hazel/Dtls/Handshake.cs index 880311b..6cf39fb 100644 --- a/Hazel/Dtls/Handshake.cs +++ b/Hazel/Dtls/Handshake.cs @@ -146,6 +146,8 @@ namespace Hazel.Dtls + 1 // compression_methods (size) + 1 // compression_method[0] (NULL) + + 2 // extensions size + + 0 // NamedCurveList extensions[0] + 2 // extensions[0].extension_type + 2 // extensions[0].extension_data (length) @@ -233,24 +235,34 @@ namespace Hazel.Dtls } // Parse extensions - while (span.Length > 0) + if (span.Length > 0) { - // Parse extension header - if (span.Length < 4) + ushort extensionsSize = span.ReadBigEndian16(); + span = span.Slice(2); + if (span.Length != extensionsSize) { return false; } - ExtensionType extensionType = (ExtensionType)span.ReadBigEndian16(0); - ushort extensionLength = span.ReadBigEndian16(2); - ByteSpan extensionData = span.Slice(4, extensionLength); - if (extensionData.Length < extensionLength) + while (span.Length > 0) { - return false; - } + // Parse extension header + if (span.Length < 4) + { + return false; + } - span = span.Slice(4 + extensionLength); - result.ParseExtension(extensionType, extensionData); + ExtensionType extensionType = (ExtensionType)span.ReadBigEndian16(0); + ushort extensionLength = span.ReadBigEndian16(2); + ByteSpan extensionData = span.Slice(4, extensionLength); + if (extensionData.Length < extensionLength) + { + return false; + } + + span = span.Slice(4 + extensionLength); + result.ParseExtension(extensionType, extensionData); + } } return true; @@ -354,6 +366,10 @@ namespace Hazel.Dtls span[1] = (byte)CompressionMethod.Null; span = span.Slice(2); + // Extensions size + span.WriteBigEndian16((ushort)(6 + this.SupportedCurves.Length)); + span = span.Slice(2); + // Supported curves extension span.WriteBigEndian16((ushort)ExtensionType.EllipticCurves); span.WriteBigEndian16((ushort)(2 + this.SupportedCurves.Length), 2); -- 2.39.5