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); } } }
private void PrepareInboundFlight() { DtlsReliableHandshake.ResetAll(this.mCurrentInboundFlight); this.mPreviousInboundFlight = this.mCurrentInboundFlight; this.mCurrentInboundFlight = Platform.CreateHashtable(); }
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); }