]> git.deb.at Git - rhonda/impostor.hazel.git/commitdiff
Include hash+signature algorithms in ServerKeyExchange
authorMatthew Endsley <mendsley@gmail.com>
Wed, 3 Feb 2021 22:14:14 +0000 (14:14 -0800)
committerMatthew Endsley <mendsley@gmail.com>
Wed, 3 Feb 2021 22:41:01 +0000 (14:41 -0800)
Hazel/Dtls/Handshake.cs
Hazel/Dtls/X25519EcdheRsaSha256.cs

index 6cf39fb962569fd641f2ec040e9d5ade58cbcab0..649e716a428a18c2711021d07743088cdc695fce 100644 (file)
@@ -68,6 +68,25 @@ namespace Hazel.Dtls
         NamedCurve = 3,
     }
 
+    /// <summary>
+    /// Hash algorithms
+    /// </summary>
+    public enum HashAlgorithm : byte
+    {
+        None = 0,
+        Sha256 = 4,
+    }
+
+    /// <summary>
+    /// Signature algorithms
+    /// </summary>
+    public enum SignatureAlgorithm : byte
+    {
+        Anonymous = 0,
+        RSA = 1,
+        ECDSA = 3,
+    }
+
     /// <summary>
     /// Random state for entropy
     /// </summary>
index 3e4fb594cee411eea0f11dd91d7a4efdf33e7846..f567252c42d567ebe018f4114001ccf42d5ef043 100644 (file)
@@ -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));
         }
 
         /// <inheritdoc />
@@ -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);