From: Matthew Endsley Date: Wed, 3 Feb 2021 22:14:14 +0000 (-0800) Subject: Include hash+signature algorithms in ServerKeyExchange X-Git-Tag: 1.0.0~20^2~2 X-Git-Url: https://git.deb.at/?a=commitdiff_plain;h=637a3b660a794e77ce18b2a4c0f4d7a3354756fd;p=rhonda%2Fimpostor.hazel.git Include hash+signature algorithms in ServerKeyExchange --- diff --git a/Hazel/Dtls/Handshake.cs b/Hazel/Dtls/Handshake.cs index 6cf39fb..649e716 100644 --- a/Hazel/Dtls/Handshake.cs +++ b/Hazel/Dtls/Handshake.cs @@ -68,6 +68,25 @@ namespace Hazel.Dtls NamedCurve = 3, } + /// + /// Hash algorithms + /// + public enum HashAlgorithm : byte + { + None = 0, + Sha256 = 4, + } + + /// + /// Signature algorithms + /// + public enum SignatureAlgorithm : byte + { + Anonymous = 0, + RSA = 1, + ECDSA = 3, + } + /// /// Random state for entropy /// diff --git a/Hazel/Dtls/X25519EcdheRsaSha256.cs b/Hazel/Dtls/X25519EcdheRsaSha256.cs index 3e4fb59..f567252 100644 --- a/Hazel/Dtls/X25519EcdheRsaSha256.cs +++ b/Hazel/Dtls/X25519EcdheRsaSha256.cs @@ -54,7 +54,10 @@ namespace Hazel.Dtls + 1 // ECCurveType ServerKeyExchange.params.curve_params.curve_type + 2 // NamedCurve ServerKeyExchange.params.curve_params.namedcurve + 1 + X25519.KeySize // ECPoint ServerKeyExchange.params.public - + signatureSize // ServerKeyExchange.signed_params + + 1 // HashAlgorithm ServerKeyExchange.algorithm.hash + + 1 // SignatureAlgorithm ServerKeyExchange.signed_params.algorithm.signature + + 2 // ServerKeyExchange.signed_params.size + + signatureSize // ServerKeyExchange.signed_params.opaque ; } @@ -93,7 +96,10 @@ namespace Hazel.Dtls ByteSpan signature = signer.CreateSignature(paramterDigest); Debug.Assert(signature.Length == rsaPrivateKey.KeySize/8); - signature.CopyTo(output.Slice(4+X25519.KeySize)); + output[4 + X25519.KeySize] = (byte)HashAlgorithm.Sha256; + output[5 + X25519.KeySize] = (byte)SignatureAlgorithm.RSA; + output.Slice(6+X25519.KeySize).WriteBigEndian16((ushort)signature.Length); + signature.CopyTo(output.Slice(8+X25519.KeySize)); } /// @@ -126,10 +132,24 @@ namespace Hazel.Dtls { return false; } + else if (serverKeyExchangeMessage[4 + X25519.KeySize] != (byte)HashAlgorithm.Sha256) + { + return false; + } + else if (serverKeyExchangeMessage[5 + X25519.KeySize] != (byte)SignatureAlgorithm.RSA) + { + return false; + } ByteSpan keyParameters = serverKeyExchangeMessage.Slice(0, 4+X25519.KeySize); ByteSpan othersPublicKey = keyParameters.Slice(4); - ByteSpan signature = serverKeyExchangeMessage.Slice(keyParameters.Length); + ushort signatureSize = serverKeyExchangeMessage.ReadBigEndian16(6 + X25519.KeySize); + ByteSpan signature = serverKeyExchangeMessage.Slice(4+keyParameters.Length); + + if (signatureSize != signature.Length) + { + return false; + } // Hash the key parameters byte[] parameterDigest = this.sha256.ComputeHash(keyParameters.GetUnderlyingArray(), keyParameters.Offset, keyParameters.Length);