コード例 #1
0
        private void HandleRetransmittedHandshakeRecord(int epoch, byte[] buf, int off, int len)
        {
            if (len < 12)
            {
                return;
            }
            int num = TlsUtilities.ReadUint24(buf, off + 9);

            if (len != num + 12)
            {
                return;
            }
            int num2 = TlsUtilities.ReadUint16(buf, off + 4);

            if (num2 >= this.mNextReceiveSeq)
            {
                return;
            }
            byte b    = TlsUtilities.ReadUint8(buf, off);
            int  num3 = (b == 20) ? 1 : 0;

            if (epoch != num3)
            {
                return;
            }
            int num4 = TlsUtilities.ReadUint24(buf, off + 1);
            int num5 = TlsUtilities.ReadUint24(buf, off + 6);

            if (num5 + num > num4)
            {
                return;
            }
            DtlsReassembler dtlsReassembler = (DtlsReassembler)this.mCurrentInboundFlight[num2];

            if (dtlsReassembler != null)
            {
                dtlsReassembler.ContributeFragment(b, num4, buf, off + 12, num5, num);
                if (DtlsReliableHandshake.CheckAll(this.mCurrentInboundFlight))
                {
                    this.ResendOutboundFlight();
                    DtlsReliableHandshake.ResetAll(this.mCurrentInboundFlight);
                }
            }
        }
コード例 #2
0
        internal DtlsReliableHandshake.Message ReceiveMessage()
        {
            if (this.mSending)
            {
                this.mSending = false;
                this.PrepareInboundFlight();
            }
            DtlsReassembler dtlsReassembler = (DtlsReassembler)this.mCurrentInboundFlight[this.mNextReceiveSeq];

            if (dtlsReassembler != null)
            {
                byte[] bodyIfComplete = dtlsReassembler.GetBodyIfComplete();
                if (bodyIfComplete != null)
                {
                    this.mPreviousInboundFlight = null;
                    return(this.UpdateHandshakeMessagesDigest(new DtlsReliableHandshake.Message(this.mNextReceiveSeq++, dtlsReassembler.MsgType, bodyIfComplete)));
                }
            }
            byte[] array = null;
            int    num   = 1000;

            DtlsReliableHandshake.Message result;
            while (true)
            {
                int receiveLimit = this.mRecordLayer.GetReceiveLimit();
                if (array != null && array.Length >= receiveLimit)
                {
                    goto IL_92;
                }
                array = new byte[receiveLimit];
                try
                {
                    DtlsReassembler dtlsReassembler3;
                    byte[]          bodyIfComplete2;
                    while (true)
                    {
IL_92:
                        int num2 = this.mRecordLayer.Receive(array, 0, receiveLimit, num);
                        if (num2 < 0)
                        {
                            goto IL_214;
                        }
                        if (num2 >= 12)
                        {
                            int num3 = TlsUtilities.ReadUint24(array, 9);
                            if (num2 == num3 + 12)
                            {
                                int num4 = TlsUtilities.ReadUint16(array, 4);
                                if (num4 <= this.mNextReceiveSeq + 10)
                                {
                                    byte msg_type = TlsUtilities.ReadUint8(array, 0);
                                    int  num5     = TlsUtilities.ReadUint24(array, 1);
                                    int  num6     = TlsUtilities.ReadUint24(array, 6);
                                    if (num6 + num3 <= num5)
                                    {
                                        if (num4 < this.mNextReceiveSeq)
                                        {
                                            if (this.mPreviousInboundFlight != null)
                                            {
                                                DtlsReassembler dtlsReassembler2 = (DtlsReassembler)this.mPreviousInboundFlight[num4];
                                                if (dtlsReassembler2 != null)
                                                {
                                                    dtlsReassembler2.ContributeFragment(msg_type, num5, array, 12, num6, num3);
                                                    if (DtlsReliableHandshake.CheckAll(this.mPreviousInboundFlight))
                                                    {
                                                        this.ResendOutboundFlight();
                                                        num = Math.Min(num * 2, 60000);
                                                        DtlsReliableHandshake.ResetAll(this.mPreviousInboundFlight);
                                                    }
                                                }
                                            }
                                        }
                                        else
                                        {
                                            dtlsReassembler3 = (DtlsReassembler)this.mCurrentInboundFlight[num4];
                                            if (dtlsReassembler3 == null)
                                            {
                                                dtlsReassembler3 = new DtlsReassembler(msg_type, num5);
                                                this.mCurrentInboundFlight[num4] = dtlsReassembler3;
                                            }
                                            dtlsReassembler3.ContributeFragment(msg_type, num5, array, 12, num6, num3);
                                            if (num4 == this.mNextReceiveSeq)
                                            {
                                                bodyIfComplete2 = dtlsReassembler3.GetBodyIfComplete();
                                                if (bodyIfComplete2 != null)
                                                {
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    this.mPreviousInboundFlight = null;
                    result = this.UpdateHandshakeMessagesDigest(new DtlsReliableHandshake.Message(this.mNextReceiveSeq++, dtlsReassembler3.MsgType, bodyIfComplete2));
                    break;
                    IL_214 :;
                }
                catch (IOException)
                {
                }
                this.ResendOutboundFlight();
                num = Math.Min(num * 2, 60000);
            }
            return(result);
        }