/// <summary> /// Parse TS_SECURITY_PACKET /// (parser index is updated according to parsed length) /// </summary> /// <param name="serverSessionContext">the server session context</param> /// <param name="data">data to be parsed</param> /// <param name="currentIndex">current parser index</param> /// <returns>TS_SECURITY_PACKET</returns> private TS_SECURITY_PACKET ParseSecurityExchange( RdpbcgrServerSessionContext serverSessionContext, byte[] data, ref int currentIndex) { TS_SECURITY_PACKET secExchangeData = new TS_SECURITY_PACKET(); secExchangeData.length = ParseUInt32(data, ref currentIndex, false); byte[] encryptedRandom = GetBytes(data, ref currentIndex, (int)secExchangeData.length); byte[] decryptedRandom = RdpbcgrUtility.DecryptClientRandom( encryptedRandom, serverSessionContext.ServerPrivateExponent, serverSessionContext.ServerModulus); if (decryptedRandom.Length != ConstValue.CLIENT_RANDOM_NUMBER_SIZE) { Array.Resize<byte>(ref decryptedRandom, ConstValue.CLIENT_RANDOM_NUMBER_SIZE); } int startIndex = 0; //secExchangeData.clientRandom = // GetBytes(decryptedRandom, ref startIndex, (int)secExchangeData.length - 40); secExchangeData.clientRandom = GetBytes(decryptedRandom, ref startIndex, decryptedRandom.Length); return secExchangeData; }