internal /*virtual*/ bool ReadRecord()
        {
            byte[] recordHeader = TlsUtilities.ReadAllOrNothing(TLS_HEADER_SIZE, mInput);
            if (recordHeader == null)
            {
                return(false);
            }

            byte type = TlsUtilities.ReadUint8(recordHeader, TLS_HEADER_TYPE_OFFSET);

            /*
             * RFC 5246 6. If a TLS implementation receives an unexpected record type, it MUST send an
             * unexpected_message alert.
             */
            CheckType(type, AlertDescription.unexpected_message);

            if (!mRestrictReadVersion)
            {
                int version = TlsUtilities.ReadVersionRaw(recordHeader, TLS_HEADER_VERSION_OFFSET);
                if ((version & 0xffffff00) != 0x0300)
                {
                    throw new TlsFatalAlert(AlertDescription.illegal_parameter);
                }
            }
            else
            {
                ProtocolVersion version = TlsUtilities.ReadVersion(recordHeader, TLS_HEADER_VERSION_OFFSET);
                if (mReadVersion == null)
                {
                    mReadVersion = version;
                }
                else if (!version.Equals(mReadVersion))
                {
                    throw new TlsFatalAlert(AlertDescription.illegal_parameter);
                }
            }

            int length = TlsUtilities.ReadUint16(recordHeader, TLS_HEADER_LENGTH_OFFSET);

            CheckLength(length, mCiphertextLimit, AlertDescription.record_overflow);

            byte[] plaintext = DecodeAndVerify(type, mInput, length);
            mHandler.ProcessRecord(type, plaintext, 0, plaintext.Length);
            return(true);
        }
Beispiel #2
0
    internal virtual bool ReadRecord()
    {
        byte[] array = TlsUtilities.ReadAllOrNothing(5, mInput);
        if (array == null)
        {
            return(false);
        }
        byte b = TlsUtilities.ReadUint8(array, 0);

        CheckType(b, 10);
        if (!mRestrictReadVersion)
        {
            int num = TlsUtilities.ReadVersionRaw(array, 1);
            if ((num & 4294967040u) != 768)
            {
                throw new TlsFatalAlert(47);
            }
        }
        else
        {
            ProtocolVersion protocolVersion = TlsUtilities.ReadVersion(array, 1);
            if (mReadVersion == null)
            {
                mReadVersion = protocolVersion;
            }
            else if (!protocolVersion.Equals(mReadVersion))
            {
                throw new TlsFatalAlert(47);
            }
        }
        int len = TlsUtilities.ReadUint16(array, 3);

        byte[] array2 = DecodeAndVerify(b, mInput, len);
        mHandler.ProcessRecord(b, array2, 0, array2.Length);
        return(true);
    }