The TS_SECURITY_PACKET structure contains the encrypted client random value which is used together with the server random (see section ) to derive session keys to secure the connection (see sections and ).
file:///C:/ts_dev/TestSuites/MS-RDPBCGR/TestSuite/Src/TD/latest_XMLS_16may/RDPBCGR/ _rfc_ms-rdpbcgr2_1_1_10_1.xml
        /// <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;
        }