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); }
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); }