using System; using System.Collections; using System.IO; using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities; using Cpp2IlInjected; using Hjg.Pngcs; namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Tls { // Token: 0x02001C09 RID: 7177 [Token(Token = "0x2001C09")] internal class DtlsReliableHandshake { // Token: 0x0600B0CF RID: 45263 RVA: 0x0026377C File Offset: 0x0026197C [Token(Token = "0x600B0CF")] [Address(RVA = "0x233EC90", Offset = "0x233DC90", VA = "0x18233EC90")] internal DtlsReliableHandshake(TlsContext context, DtlsRecordLayer transport) { /* An exception occurred when decompiling this method (0600B0CF) ICSharpCode.Decompiler.DecompilerException: Error decompiling System.Void BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Tls.DtlsReliableHandshake::.ctor(BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Tls.TlsContext,BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Tls.DtlsRecordLayer) ---> System.Exception: Basic block has to end with unconditional control flow. { Block_0: stloc:IDictionary(var_1_07, call:IDictionary(Platform::CreateHashtable)) stfld:IDictionary(DtlsReliableHandshake::mCurrentInboundFlight, ldloc:DtlsReliableHandshake(this), ldloc:IDictionary(var_1_07)) stloc:IList(var_3_16, call:IList(Platform::CreateArrayList)) stfld:IList(DtlsReliableHandshake::mOutboundFlight, ldloc:DtlsReliableHandshake(this), ldloc:IList(var_3_16)) stfld:bool(DtlsReliableHandshake::mSending, ldloc:DtlsReliableHandshake(this), ldc.i4:bool(1)) call:void(object::.ctor, ldloc:DtlsReliableHandshake[exp:object](this)) stfld:DtlsRecordLayer(DtlsReliableHandshake::mRecordLayer, ldloc:DtlsReliableHandshake(this), ldloc:DtlsRecordLayer(transport)) stloc:DeferredHash(var_4_37, newobj:DeferredHash(DeferredHash::.ctor)) stloc:DigestInputBuffer(var_5_3E, newobj:DigestInputBuffer(DigestInputBuffer::.ctor)) stfld:DigestInputBuffer(DeferredHash::mBuf, ldloc:DeferredHash(var_4_37), ldloc:DigestInputBuffer(var_5_3E)) stloc:IDictionary(var_7_51, call:IDictionary(Platform::CreateHashtable)) stfld:IDictionary(DeferredHash::mHashes, ldloc:DeferredHash(var_4_37), ldloc:IDictionary(var_7_51)) stfld:int32(DeferredHash::mPrfHashAlgorithm, ldloc:DeferredHash(var_4_37), conv.u8:uint64[exp:int32](ldc.i8:int64[exp:uint64](4294967295))) stfld:TlsHandshakeHash(DtlsReliableHandshake::mHandshakeHash, ldloc:DtlsReliableHandshake(this), ldloc:DeferredHash[exp:TlsHandshakeHash](var_4_37)) } at ICSharpCode.Decompiler.ILAst.ILAstOptimizer.FlattenBasicBlocks(ILNode node) in D:\a\dnSpy\dnSpy\Extensions\ILSpy.Decompiler\ICSharpCode.Decompiler\ICSharpCode.Decompiler\ILAst\ILAstOptimizer.cs:line 1852 at ICSharpCode.Decompiler.ILAst.ILAstOptimizer.Optimize(DecompilerContext context, ILBlock method, AutoPropertyProvider autoPropertyProvider, StateMachineKind& stateMachineKind, MethodDef& inlinedMethod, AsyncMethodDebugInfo& asyncInfo, ILAstOptimizationStep abortBeforeStep) in D:\a\dnSpy\dnSpy\Extensions\ILSpy.Decompiler\ICSharpCode.Decompiler\ICSharpCode.Decompiler\ILAst\ILAstOptimizer.cs:line 355 at ICSharpCode.Decompiler.Ast.AstMethodBodyBuilder.CreateMethodBody(IEnumerable`1 parameters, MethodDebugInfoBuilder& builder) in D:\a\dnSpy\dnSpy\Extensions\ILSpy.Decompiler\ICSharpCode.Decompiler\ICSharpCode.Decompiler\Ast\AstMethodBodyBuilder.cs:line 123 at ICSharpCode.Decompiler.Ast.AstMethodBodyBuilder.CreateMethodBody(MethodDef methodDef, DecompilerContext context, AutoPropertyProvider autoPropertyProvider, IEnumerable`1 parameters, Boolean valueParameterIsKeyword, StringBuilder sb, MethodDebugInfoBuilder& stmtsBuilder) in D:\a\dnSpy\dnSpy\Extensions\ILSpy.Decompiler\ICSharpCode.Decompiler\ICSharpCode.Decompiler\Ast\AstMethodBodyBuilder.cs:line 88 --- End of inner exception stack trace --- at ICSharpCode.Decompiler.Ast.AstMethodBodyBuilder.CreateMethodBody(MethodDef methodDef, DecompilerContext context, AutoPropertyProvider autoPropertyProvider, IEnumerable`1 parameters, Boolean valueParameterIsKeyword, StringBuilder sb, MethodDebugInfoBuilder& stmtsBuilder) in D:\a\dnSpy\dnSpy\Extensions\ILSpy.Decompiler\ICSharpCode.Decompiler\ICSharpCode.Decompiler\Ast\AstMethodBodyBuilder.cs:line 92 at ICSharpCode.Decompiler.Ast.AstBuilder.AddMethodBody(EntityDeclaration methodNode, EntityDeclaration& updatedNode, MethodDef method, IEnumerable`1 parameters, Boolean valueParameterIsKeyword, MethodKind methodKind) in D:\a\dnSpy\dnSpy\Extensions\ILSpy.Decompiler\ICSharpCode.Decompiler\ICSharpCode.Decompiler\Ast\AstBuilder.cs:line 1663 */; } // Token: 0x0600B0D0 RID: 45264 RVA: 0x00263800 File Offset: 0x00261A00 [Token(Token = "0x600B0D0")] [Address(RVA = "0x233D910", Offset = "0x233C910", VA = "0x18233D910")] internal void NotifyHelloComplete() { TlsHandshakeHash tlsHandshakeHash = this.mHandshakeHash; } // Token: 0x17001C06 RID: 7174 // (get) Token: 0x0600B0D1 RID: 45265 RVA: 0x0026381C File Offset: 0x00261A1C [Token(Token = "0x17001C06")] internal TlsHandshakeHash HandshakeHash { [Token(Token = "0x600B0D1")] [Address(RVA = "0x4157B0", Offset = "0x4147B0", VA = "0x1804157B0")] get { return this.mHandshakeHash; } } // Token: 0x0600B0D2 RID: 45266 RVA: 0x00263830 File Offset: 0x00261A30 [Token(Token = "0x600B0D2")] [Address(RVA = "0x233D9A0", Offset = "0x233C9A0", VA = "0x18233D9A0")] internal TlsHandshakeHash PrepareToFinish() { return this.mHandshakeHash; } // Token: 0x0600B0D3 RID: 45267 RVA: 0x0026384C File Offset: 0x00261A4C [Token(Token = "0x600B0D3")] [Address(RVA = "0x233E700", Offset = "0x233D700", VA = "0x18233E700")] internal void SendMessage(byte msg_type, byte[] body) { TlsUtilities.CheckUint24(body.Length); if (!this.mSending) { this.CheckInboundFlight(); IList list = this.mOutboundFlight; this.mSending = true; } int num = this.mMessageSeq; int num2 = num + 1; this.mMessageSeq = num2; DtlsReliableHandshake.Message message; message.mMessageSeq = num; message.mMsgType = msg_type; message.mBody = body; IList list2 = this.mOutboundFlight; this.WriteMessage(message); DtlsReliableHandshake.Message message2 = this.UpdateHandshakeMessagesDigest(message); } // Token: 0x0600B0D4 RID: 45268 RVA: 0x002638C8 File Offset: 0x00261AC8 [Token(Token = "0x600B0D4")] [Address(RVA = "0x233DDB0", Offset = "0x233CDB0", VA = "0x18233DDB0")] internal byte[] ReceiveMessageBody(byte msg_type) { DtlsReliableHandshake.Message message; do { message = this.ReceiveMessage(); } while (message.mMsgType != msg_type); return message.mBody; } // Token: 0x0600B0D5 RID: 45269 RVA: 0x002638F4 File Offset: 0x00261AF4 [Token(Token = "0x600B0D5")] [Address(RVA = "0x233DE30", Offset = "0x233CE30", VA = "0x18233DE30")] internal DtlsReliableHandshake.Message ReceiveMessage() { if (this.mSending) { this.mSending = false; IDictionary dictionary = Platform.CreateHashtable(); DtlsReliableHandshake.ResetAll(this.mCurrentInboundFlight); IDictionary dictionary2 = this.mCurrentInboundFlight; this.mPreviousInboundFlight = dictionary2; this.mCurrentInboundFlight = dictionary; } int num = 0; IDictionary dictionary3 = this.mCurrentInboundFlight; int num2 = this.mNextReceiveSeq; if (num2 != 0) { int num3 = 0; if (num2 == 0) { throw new NullReferenceException(); } if (num3 == 0) { this.mPreviousInboundFlight = num; int num4 = this.mNextReceiveSeq; int num5 = num4 + 1; this.mNextReceiveSeq = num5; DtlsReliableHandshake.Message message; message.mMessageSeq = num4; DtlsReliableHandshake.Message message2 = this.UpdateHandshakeMessagesDigest(message); if (message2 != 0) { return message2; } } } this.mRecordLayer.ResetWriteEpoch(); if (num != 0) { } byte[] array = new byte[0]; int sendLimit = this.mRecordLayer.GetSendLimit(); DtlsRecordLayer dtlsRecordLayer = this.mRecordLayer; bool flag; while (!flag) { } this.ResendOutboundFlight(); throw new NullReferenceException(); } // Token: 0x0600B0D6 RID: 45270 RVA: 0x002639F4 File Offset: 0x00261BF4 [Token(Token = "0x600B0D6")] [Address(RVA = "0x233D6F0", Offset = "0x233C6F0", VA = "0x18233D6F0")] internal void Finish() { int num = 0; if ((this.mSending ? 1 : 0) != num) { DtlsReliableHandshake.ResetAll(this.mCurrentInboundFlight); IDictionary dictionary = this.mCurrentInboundFlight; this.mPreviousInboundFlight = dictionary; this.mCurrentInboundFlight = num; if (dictionary == 0) { goto IL_3C; } DtlsReliableHandshake.Retransmit retransmit; retransmit.mOuter = this; } this.CheckInboundFlight(); IL_3C: int receiveLimit = ((DatagramTransport)this.mRecordLayer).GetReceiveLimit(); } // Token: 0x0600B0D7 RID: 45271 RVA: 0x00263A50 File Offset: 0x00261C50 [Token(Token = "0x600B0D7")] [Address(RVA = "0x233E6B0", Offset = "0x233D6B0", VA = "0x18233E6B0")] internal void ResetHandshakeMessagesDigest() { TlsHandshakeHash tlsHandshakeHash = this.mHandshakeHash; throw new NullReferenceException(); } // Token: 0x0600B0D8 RID: 45272 RVA: 0x00263A6C File Offset: 0x00261C6C [Token(Token = "0x600B0D8")] [Address(RVA = "0x233D2A0", Offset = "0x233C2A0", VA = "0x18233D2A0")] private int BackOff(int timeoutMillis) { int num; return num; } // Token: 0x0600B0D9 RID: 45273 RVA: 0x00263A7C File Offset: 0x00261C7C [Token(Token = "0x600B0D9")] [Address(RVA = "0x233D570", Offset = "0x233C570", VA = "0x18233D570")] private void CheckInboundFlight() { int num; do { num = 0; IDictionary dictionary = this.mCurrentInboundFlight; num += num; num++; num++; num += 19; if (num != 0) { } } while (num != 0); } // Token: 0x0600B0DA RID: 45274 RVA: 0x00263AB4 File Offset: 0x00261CB4 [Token(Token = "0x600B0DA")] [Address(RVA = "0x233D790", Offset = "0x233C790", VA = "0x18233D790")] private DtlsReliableHandshake.Message GetPendingMessage() { int num; do { num = this.mNextReceiveSeq; IDictionary dictionary = this.mCurrentInboundFlight; if (num == 0) { goto IL_49; } } while (num == 0); if (num == 0) { int num2 = this.mNextReceiveSeq; int num3 = num2 + 1; this.mNextReceiveSeq = num3; DtlsReliableHandshake.Message message; message.mMessageSeq = num2; message.mMsgType = (byte)num; return this.UpdateHandshakeMessagesDigest(message); } IL_49: throw new NullReferenceException(); } // Token: 0x0600B0DB RID: 45275 RVA: 0x00263B14 File Offset: 0x00261D14 [Token(Token = "0x600B0DB")] [Address(RVA = "0x233D960", Offset = "0x233C960", VA = "0x18233D960")] private void PrepareInboundFlight(IDictionary nextFlight) { DtlsReliableHandshake.ResetAll(this.mCurrentInboundFlight); IDictionary dictionary = this.mCurrentInboundFlight; this.mPreviousInboundFlight = dictionary; this.mCurrentInboundFlight = nextFlight; } // Token: 0x0600B0DC RID: 45276 RVA: 0x00263B44 File Offset: 0x00261D44 [Token(Token = "0x600B0DC")] [Address(RVA = "0x233DA00", Offset = "0x233CA00", VA = "0x18233DA00")] private bool ProcessRecord(int windowSize, int epoch, byte[] buf, int off, int len) { int num = TlsUtilities.ReadUint24(buf, windowSize); int num2 = TlsUtilities.ReadUint24(buf, windowSize); int num3 = TlsUtilities.ReadUint24(buf, windowSize); int num4 = this.mNextReceiveSeq; byte b; if ((int)b >= num4 || (this.mPreviousInboundFlight != 0 && num4 != 0)) { IDictionary dictionary = this.mCurrentInboundFlight; if (num4 == 0) { DtlsReassembler dtlsReassembler = new DtlsReassembler(b, num2); } } if (DtlsReliableHandshake.CheckAll(this.mPreviousInboundFlight)) { this.ResendOutboundFlight(); DtlsReliableHandshake.ResetAll(this.mPreviousInboundFlight); } throw new NullReferenceException(); } // Token: 0x0600B0DD RID: 45277 RVA: 0x00263BC8 File Offset: 0x00261DC8 [Token(Token = "0x600B0DD")] [Address(RVA = "0x233E1E0", Offset = "0x233D1E0", VA = "0x18233E1E0")] private void ResendOutboundFlight() { int num; do { DtlsRecordLayer dtlsRecordLayer = this.mRecordLayer; IList list = this.mOutboundFlight; num = 0; num += num; num++; IList list2 = this.mOutboundFlight; uint num2; if (num < (int)num2) { num += num; num++; } if (num == 0) { num += num; num++; num += 19; num += num; num += 19; } } while (num == 0); this.WriteMessage(num); IList list3 = this.mOutboundFlight; num++; } // Token: 0x0600B0DE RID: 45278 RVA: 0x00263C3C File Offset: 0x00261E3C [Token(Token = "0x600B0DE")] [Address(RVA = "0x233E830", Offset = "0x233D830", VA = "0x18233E830")] private DtlsReliableHandshake.Message UpdateHandshakeMessagesDigest(DtlsReliableHandshake.Message message) { byte[] mBody = message.mBody; byte[] array = new byte[12]; byte mMsgType = message.mMsgType; int num = 0; TlsUtilities.WriteUint8(mMsgType, array, num); TlsUtilities.WriteUint24(mBody.Length, array, 1); PngHelperInternal.WriteInt2tobytes(message.mMessageSeq, array, 4); TlsUtilities.WriteUint24(0, array, 6); TlsUtilities.WriteUint24(mBody.Length, array, 9); TlsHandshakeHash tlsHandshakeHash = this.mHandshakeHash; int length = array.Length; TlsHandshakeHash tlsHandshakeHash2 = this.mHandshakeHash; int length2 = mBody.Length; return message; } // Token: 0x0600B0DF RID: 45279 RVA: 0x00263CC4 File Offset: 0x00261EC4 [Token(Token = "0x600B0DF")] [Address(RVA = "0x233EB60", Offset = "0x233DB60", VA = "0x18233EB60")] private void WriteMessage(DtlsReliableHandshake.Message message) { int receiveLimit = this.mRecordLayer.GetReceiveLimit(); byte[] mBody = message.mBody; int num = 0; int num2 = mBody.Length; num2 -= num; int num3; this.WriteHandshakeFragment(message, num, num3); num += num3; } // Token: 0x0600B0E0 RID: 45280 RVA: 0x00263D08 File Offset: 0x00261F08 [Token(Token = "0x600B0E0")] [Address(RVA = "0x233E9A0", Offset = "0x233D9A0", VA = "0x18233E9A0")] private void WriteHandshakeFragment(DtlsReliableHandshake.Message message, int fragment_offset, int fragment_length) { DtlsReliableHandshake.RecordLayerBuffer recordLayerBuffer; TlsUtilities.WriteUint8(message.mMsgType, recordLayerBuffer); TlsUtilities.WriteUint24(message.mBody.Length, recordLayerBuffer); int num = message.mMessageSeq; TlsUtilities.WriteUint16(num, recordLayerBuffer); TlsUtilities.WriteUint24(fragment_offset, recordLayerBuffer); TlsUtilities.WriteUint24(fragment_length, recordLayerBuffer); int num2 = recordLayerBuffer.ReadByte(); DtlsRecordLayer dtlsRecordLayer = this.mRecordLayer; bool canWrite = recordLayerBuffer.CanWrite; } // Token: 0x0600B0E1 RID: 45281 RVA: 0x00263D70 File Offset: 0x00261F70 [Token(Token = "0x600B0E1")] [Address(RVA = "0x233D300", Offset = "0x233C300", VA = "0x18233D300")] private static bool CheckAll(IDictionary inboundFlight) { int num; do { num = 0; int num2 = 0; if (num2 == 0) { } if (num2 != 0) { } } while (num != 0); if (num != -1) { } return true; } // Token: 0x0600B0E2 RID: 45282 RVA: 0x00263DB0 File Offset: 0x00261FB0 [Token(Token = "0x600B0E2")] [Address(RVA = "0x233E3E0", Offset = "0x233D3E0", VA = "0x18233E3E0")] private static void ResetAll(IDictionary inboundFlight) { int num; do { num = 0; num += num; num++; num++; num += 19; ulong num2; num = (int)((ulong)num + num2); if (num == 0 || num == 0) { goto IL_47; } DtlsReassembler.Range range; range.mStart = num; if (range != 0) { } } while (num != 0); return; IL_47: throw new NullReferenceException(); } // Token: 0x0400704D RID: 28749 [Token(Token = "0x400704D")] private const int MaxReceiveAhead = 16; // Token: 0x0400704E RID: 28750 [Token(Token = "0x400704E")] private const int MessageHeaderLength = 12; // Token: 0x0400704F RID: 28751 [FieldOffset(Offset = "0x10")] [Token(Token = "0x400704F")] private readonly DtlsRecordLayer mRecordLayer; // Token: 0x04007050 RID: 28752 [FieldOffset(Offset = "0x18")] [Token(Token = "0x4007050")] private TlsHandshakeHash mHandshakeHash; // Token: 0x04007051 RID: 28753 [FieldOffset(Offset = "0x20")] [Token(Token = "0x4007051")] private IDictionary mCurrentInboundFlight; // Token: 0x04007052 RID: 28754 [FieldOffset(Offset = "0x28")] [Token(Token = "0x4007052")] private IDictionary mPreviousInboundFlight; // Token: 0x04007053 RID: 28755 [FieldOffset(Offset = "0x30")] [Token(Token = "0x4007053")] private IList mOutboundFlight; // Token: 0x04007054 RID: 28756 [FieldOffset(Offset = "0x38")] [Token(Token = "0x4007054")] private bool mSending; // Token: 0x04007055 RID: 28757 [FieldOffset(Offset = "0x3C")] [Token(Token = "0x4007055")] private int mMessageSeq; // Token: 0x04007056 RID: 28758 [FieldOffset(Offset = "0x40")] [Token(Token = "0x4007056")] private int mNextReceiveSeq; // Token: 0x02001C0A RID: 7178 [Token(Token = "0x2001C0A")] internal class Message { // Token: 0x0600B0E3 RID: 45283 RVA: 0x00263E10 File Offset: 0x00262010 [Token(Token = "0x600B0E3")] [Address(RVA = "0xF71950", Offset = "0xF70950", VA = "0x180F71950")] internal Message(int message_seq, byte msg_type, byte[] body) { this.mMessageSeq = message_seq; this.mMsgType = msg_type; this.mBody = body; } // Token: 0x17001C07 RID: 7175 // (get) Token: 0x0600B0E4 RID: 45284 RVA: 0x00263E38 File Offset: 0x00262038 [Token(Token = "0x17001C07")] public int Seq { [Token(Token = "0x600B0E4")] [Address(RVA = "0x40F000", Offset = "0x40E000", VA = "0x18040F000")] get { return this.mMessageSeq; } } // Token: 0x17001C08 RID: 7176 // (get) Token: 0x0600B0E5 RID: 45285 RVA: 0x00263E4C File Offset: 0x0026204C [Token(Token = "0x17001C08")] public byte Type { [Token(Token = "0x600B0E5")] [Address(RVA = "0x4987D0", Offset = "0x4977D0", VA = "0x1804987D0")] get { return this.mMsgType; } } // Token: 0x17001C09 RID: 7177 // (get) Token: 0x0600B0E6 RID: 45286 RVA: 0x00263E60 File Offset: 0x00262060 [Token(Token = "0x17001C09")] public byte[] Body { [Token(Token = "0x600B0E6")] [Address(RVA = "0x4157B0", Offset = "0x4147B0", VA = "0x1804157B0")] get { return this.mBody; } } // Token: 0x04007057 RID: 28759 [FieldOffset(Offset = "0x10")] [Token(Token = "0x4007057")] private readonly int mMessageSeq; // Token: 0x04007058 RID: 28760 [FieldOffset(Offset = "0x14")] [Token(Token = "0x4007058")] private readonly byte mMsgType; // Token: 0x04007059 RID: 28761 [FieldOffset(Offset = "0x18")] [Token(Token = "0x4007059")] private readonly byte[] mBody; } // Token: 0x02001C0B RID: 7179 [Token(Token = "0x2001C0B")] internal class RecordLayerBuffer : MemoryStream { // Token: 0x0600B0E7 RID: 45287 RVA: 0x00263E74 File Offset: 0x00262074 [Token(Token = "0x600B0E7")] [Address(RVA = "0x23415E0", Offset = "0x23405E0", VA = "0x1823415E0")] internal RecordLayerBuffer(int size) : base(size) { } // Token: 0x0600B0E8 RID: 45288 RVA: 0x00263E88 File Offset: 0x00262088 [Token(Token = "0x600B0E8")] [Address(RVA = "0x2341520", Offset = "0x2340520", VA = "0x182341520")] internal void SendToRecordLayer(DtlsRecordLayer recordLayer) { bool canWrite = this.CanWrite; } } // Token: 0x02001C0C RID: 7180 [Token(Token = "0x2001C0C")] internal class Retransmit : DtlsHandshakeRetransmit { // Token: 0x0600B0E9 RID: 45289 RVA: 0x00263EA4 File Offset: 0x002620A4 [Token(Token = "0x600B0E9")] [Address(RVA = "0x493D90", Offset = "0x492D90", VA = "0x180493D90")] internal Retransmit(DtlsReliableHandshake outer) { this.mOuter = outer; } // Token: 0x0600B0EA RID: 45290 RVA: 0x00263EC0 File Offset: 0x002620C0 [Token(Token = "0x600B0EA")] [Address(RVA = "0x23415F0", Offset = "0x23405F0", VA = "0x1823415F0", Slot = "4")] public void ReceivedHandshakeRecord(int epoch, byte[] buf, int off, int len) { DtlsReliableHandshake dtlsReliableHandshake = this.mOuter; } // Token: 0x0400705A RID: 28762 [FieldOffset(Offset = "0x10")] [Token(Token = "0x400705A")] private readonly DtlsReliableHandshake mOuter; } } }