Example #1
0
    public static bool TryGetFrameHeader(ReadOnlySpan <byte> frame, ref TlsFrameHeader header)
    {
        bool result = frame.Length > 4;

        if (frame.Length >= 1)
        {
            header.Type = (TlsContentType)frame[0];

            if (frame.Length >= 3)
            {
                // SSLv3, TLS or later
                if (frame[1] == 3)
                {
                    if (frame.Length > 4)
                    {
                        header.Length = ((frame[3] << 8) | frame[4]);
                    }

                    header.Version = TlsMinorVersionToProtocol(frame[2]);
                }
                else
                {
                    header.Length  = -1;
                    header.Version = SslProtocols.None;
                }
            }
        }

        return(result);
    }
Example #2
0
    public static bool TryGetFrameHeader(ReadOnlySpan <byte> frame, ref TlsFrameHeader header)
    {
        bool result = frame.Length > 4;

        if (frame.Length >= 1)
        {
            header.Type = (TlsContentType)frame[0];

            if (frame.Length > 4)
            {
                // SSLv3, TLS or later
                if (frame[1] == 3)
                {
                    header.Length  = ((frame[3] << 8) | frame[4]);
                    header.Version = TlsMinorVersionToProtocol(frame[2]);
                    return(true);
                }
                // May be SSL3/TLS frame wrapped in unified header.
                else if (frame[2] == (byte)TlsHandshakeType.ClientHello &&
                         frame[3] == 3) // SSL3 or above
                {
                    int length;
                    if ((frame[0] & 0x80) != 0)
                    {
                        // Two bytes
                        length = (((frame[0] & 0x7f) << 8) | frame[1]) + 2;
                    }
                    else
                    {
                        // Three bytes
                        length = (((frame[0] & 0x3f) << 8) | frame[1]) + 3;
                    }

                    // max frame for SSLv2 is 32767.
                    // However, we expect something reasonable for initial HELLO
                    // We don't have enough logic to verify full validity,
                    // the limits bellow are queses.
                    if (length > 20 && length < 1000)
                    {
#pragma warning disable CS0618 // Ssl2 and Ssl3 are obsolete
                        header.Version = SslProtocols.Ssl2;
#pragma warning restore CS0618
                        header.Length = length;
                        header.Type   = TlsContentType.Handshake;
                        return(true);
                    }
                }
            }
        }

        header.Length  = -1;
        header.Version = SslProtocols.None;

        return(result);
    }