/// <summary>
        /// Reads this object in from an array, returning how many bytes were read, or 0 if there is an error or not enough data
        /// </summary>
        /// <param name="bData"></param>
        /// <param name="nStartAt"></param>
        /// <returns></returns>
        public uint ReadFromArray(byte[] bData, int nStartAt)
        {
            Certificates.Clear();
            uint nReadSoFar = 0;

            if (bData.Length < (nStartAt + 3))
            {
                return(0);
            }

            CertificatesLength = ByteHelper.ReadUintBigEndian(bData, (int)(nStartAt + nReadSoFar), 3); nReadSoFar += 3;

            if (bData.Length < (nStartAt + nReadSoFar + CertificatesLength))
            {
                return(0);  //not enough data
            }
            int nDataRemaining = (int)CertificatesLength;

            while (nDataRemaining > 0)
            {
                int             nNextByteArrayLength = (int)ByteHelper.ReadUintBigEndian(bData, (int)(nStartAt + nReadSoFar), 3); nReadSoFar += 3;
                byte []         bNextCert            = ByteHelper.ReadByteArray(bData, (int)(nStartAt + nReadSoFar), nNextByteArrayLength); nReadSoFar += (uint)nNextByteArrayLength;
                X509Certificate cert = new X509Certificate(bNextCert);

                Certificates.Add(cert);
                nDataRemaining -= (3 + nNextByteArrayLength);
            }

            return(nReadSoFar);
        }
示例#2
0
        public uint ReadFromArray(byte[] bData, int nStartAt, bool bRawContentOnly)
        {
            if (bData.Length < (nStartAt + 5))
            {
                return(0);
            }
            ContentType  = (TLSContentType)bData[nStartAt + 0];
            MajorVersion = bData[nStartAt + 1];
            MinorVersion = bData[nStartAt + 2];
            int nLength = (ushort)((bData[nStartAt + 3] << 8) | (bData[nStartAt + 4]));

            if (bData.Length < (nStartAt + 5 + nLength))
            {
                return(0); /// not enough data yet
            }
            if (bRawContentOnly == true)
            {
                RawSetContent = ByteHelper.ReadByteArray(bData, 5 + nStartAt, nLength);
            }
            else
            {
                Content = ByteHelper.ReadByteArray(bData, 5 + nStartAt, nLength);
            }
            return((uint)(5 + nLength));
        }
        /// <summary>
        /// Parses the raw data in the record into the appropriate structures using the keyexhange and signature algorithms
        /// provided.
        /// </summary>
        /// <param name="algo"></param>
        /// <param name="sig"></param>
        public void ParseRawData(KeyExchangeAlgorithm algo, SignatureAlgorithm sig)
        {
            KeyExchangeAlgorithm = algo;
            SignatureAlgorithm   = sig;
            int nAt = 0;

            // Parse our RawData block into the structures below
            if (KeyExchangeAlgorithm == TLS.KeyExchangeAlgorithm.rsa)
            {
                RSAModulusLength = ByteHelper.ReadUshortBigEndian(RawData, nAt); nAt += 2;
                rsa_modulus      = ByteHelper.ReadByteArray(RawData, nAt, RSAModulusLength); nAt += RSAModulusLength;

                RSAExponentLength = ByteHelper.ReadUshortBigEndian(RawData, nAt); nAt += 2;
                rsa_exponent      = ByteHelper.ReadByteArray(RawData, nAt, RSAExponentLength); nAt += RSAExponentLength;
            }
            else if (KeyExchangeAlgorithm == TLS.KeyExchangeAlgorithm.rsa)
            {
                dh_p_length = ByteHelper.ReadUshortBigEndian(RawData, nAt); nAt += 2;
                dh_p        = ByteHelper.ReadByteArray(RawData, nAt, dh_p_length); nAt += dh_p_length;

                dh_g_length = ByteHelper.ReadUshortBigEndian(RawData, nAt); nAt += 2;
                dh_g        = ByteHelper.ReadByteArray(RawData, nAt, dh_g_length); nAt += dh_g_length;

                dh_Ys_length = ByteHelper.ReadUshortBigEndian(RawData, nAt); nAt += 2;
                dh_Ys        = ByteHelper.ReadByteArray(RawData, nAt, dh_Ys_length); nAt += dh_Ys_length;
            }
            if ((SignatureAlgorithm == TLS.SignatureAlgorithm.dsa) || (SignatureAlgorithm == TLS.SignatureAlgorithm.rsa))
            {
                HashDigitalSignatureLength = ByteHelper.ReadUshortBigEndian(RawData, nAt); nAt += 2;
                DigitalSignatureOfHash     = ByteHelper.ReadByteArray(RawData, nAt, HashDigitalSignatureLength); nAt += HashDigitalSignatureLength;
            }
        }
        /// <summary>
        /// Reads this object in from an array, returning how many bytes were read, or 0 if there is an error or not enough data
        /// </summary>
        /// <param name="bData"></param>
        /// <param name="nStartAt"></param>
        /// <returns></returns>
        public uint ReadFromArray(byte[] bData, int nStartAt)
        {
            ushort uLength = ByteHelper.ReadUshortBigEndian(bData, nStartAt);

            Signature = ByteHelper.ReadByteArray(bData, nStartAt + 2, uLength);
            return((uint)(Signature.Length + 2));
        }
        /// <summary>
        /// Reads this object in from an array, returning how many bytes were read, or 0 if there is an error or not enough data
        /// </summary>
        /// <param name="bData"></param>
        /// <param name="nStartAt"></param>
        /// <returns></returns>
        public uint ReadFromArray(byte[] bData, int nStartAt)
        {
            uint nReadSoFar = 0;

            if (bData.Length < (nStartAt + 35))
            {
                return(0);
            }

            Version = ByteHelper.ReadUshortBigEndian(bData, (int)(nStartAt + nReadSoFar)); nReadSoFar += 2;

            nReadSoFar += RandomStruct.ReadFromArray(bData, (int)(nStartAt + nReadSoFar));

            SessionIDLength = bData[nStartAt + nReadSoFar]; nReadSoFar += 1;
            if (SessionIDLength > 0)
            {
                if (bData.Length < (nStartAt + nReadSoFar + SessionIDLength))
                {
                    return(0);
                }
                this.SessionID = ByteHelper.ReadByteArray(bData, (int)(nStartAt + nReadSoFar), (int)SessionIDLength); nReadSoFar += SessionIDLength;
            }

            CipherSuite       = (CipherSuite)ByteHelper.ReadUshortBigEndian(bData, (int)(nStartAt + nReadSoFar)); nReadSoFar += 2;
            CompressionMethod = (CompressionMethod)ByteHelper.ReadByte(bData, (int)(nStartAt + nReadSoFar)); nReadSoFar += 1;

            return(nReadSoFar);
        }
        /// <summary>
        /// Reads this object in from an array, returning how many bytes were read, or 0 if there is an error or not enough data
        /// </summary>
        /// <param name="bData"></param>
        /// <param name="nStartAt"></param>
        /// <returns></returns>
        public uint ReadFromArray(byte[] bData, int nStartAt)
        {
            int nRead = 0;

            CertificateTypes.Clear();
            CertificateAuthorities.Clear();

            int nCertificateTypes = ByteHelper.ReadByte(bData, nStartAt + nRead); nRead += 1;

            for (int i = 0; i < nCertificateTypes; i++)
            {
                CertificateType type = (CertificateType)ByteHelper.ReadByte(bData, nStartAt + nRead); nRead += 1;
                CertificateTypes.Add(type);
            }
            DistinguishedNamesLength = ByteHelper.ReadUshortBigEndian(bData, nStartAt + nRead); nRead += 2;

            if (DistinguishedNamesLength > 0)
            {
                int nLeft = DistinguishedNamesLength;
                while (nLeft > 0)
                {
                    int    nNextDNLen = ByteHelper.ReadUshortBigEndian(bData, (nStartAt + nRead)); nRead += 2;
                    byte[] bNextDN    = ByteHelper.ReadByteArray(bData, nStartAt + nRead, nNextDNLen); nRead += nNextDNLen;
                    CertificateAuthorities.Add(bNextDN);
                    nLeft -= (nNextDNLen + 2);
                }
            }

            return((uint)nRead);
        }
        /// <summary>
        /// Reads this object in from an array, returning how many bytes were read, or 0 if there is an error or not enough data
        /// </summary>
        /// <param name="bData"></param>
        /// <param name="nStartAt"></param>
        /// <returns></returns>
        public uint ReadFromArray(byte[] bData, int nStartAt)
        {
            if (bData.Length < (nStartAt + 32))
            {
                return(0);
            }

            gmt_unix_time = ByteHelper.ReadUintBigEndian(bData, nStartAt);
            random_bytes  = ByteHelper.ReadByteArray(bData, nStartAt + 4, 28);
            return(32);
        }
        /// <summary>
        /// Reads this object in from an array, returning how many bytes were read, or 0 if there is an error or not enough data
        /// </summary>
        /// <param name="bData"></param>
        /// <param name="nStartAt"></param>
        /// <returns></returns>
        public uint ReadFromArray(byte[] bData, int nStartAt)
        {
            int nRead = 0;


            ushort nLength = ByteHelper.ReadUshortBigEndian(bData, (nStartAt + nRead)); nRead += 2;

            EncryptedPreMasterSecret  = ByteHelper.ReadByteArray(bData, nStartAt + nRead, (int)nLength); nRead += nLength;
            DiffeHellmanPublicValueYc = EncryptedPreMasterSecret;
            return((uint)nRead);
        }
        /// <summary>
        /// Reads this object in from an array, returning how many bytes were read, or 0 if there is an error or not enough data
        /// </summary>
        /// <param name="bData"></param>
        /// <param name="nStartAt"></param>
        /// <returns></returns>
        public override uint ReadFromArray(byte[] bData, int nStartAt)
        {
            if (bData.Length < (nStartAt + 4))
            {
                return(0);
            }

            HandShakeMessageType = (HandShakeMessageType)bData[nStartAt + 0];
            MessageLength        = ByteHelper.ReadUintBigEndian(bData, nStartAt + 1, 3); // 24 bits only

            /// See if we have enough data for our message length
            ///
            if (bData.Length < (nStartAt + 4 + MessageLength))
            {
                return(0);
            }

            m_bRawBytes   = ByteHelper.ReadByteArray(bData, nStartAt + 4, (int)MessageLength);
            HandShakeData = m_bRawBytes;// Parse out our sub-message

            return(4 + MessageLength);
        }
        /// <summary>
        /// Reads this object in from an array, returning how many bytes were read, or 0 if there is an error or not enough data
        /// </summary>
        /// <param name="bData"></param>
        /// <param name="nStartAt"></param>
        /// <returns></returns>
        public uint ReadFromArray(byte[] bData, int nStartAt)
        {
            CipherSuites.Clear();
            CompressionMethods.Clear();

            uint nReadSoFar = 0;

            if (bData.Length < (nStartAt + 35))
            {
                return(0);
            }

            Version = ByteHelper.ReadUshortBigEndian(bData, (int)(nStartAt + nReadSoFar)); nReadSoFar += 2;

            nReadSoFar += RandomStruct.ReadFromArray(bData, (int)(nStartAt + nReadSoFar));

            SessionIDLength = bData[nStartAt + nReadSoFar]; nReadSoFar += 1;
            if (SessionIDLength > 0)
            {
                if (bData.Length < (nStartAt + nReadSoFar + SessionIDLength))
                {
                    return(0);
                }
                this.SessionID = ByteHelper.ReadByteArray(bData, (int)(nStartAt + nReadSoFar), (int)SessionIDLength); nReadSoFar += SessionIDLength;
            }

            if (bData.Length < (nStartAt + nReadSoFar + 2))
            {
                return(0);
            }
            CipherSuitesLength = ByteHelper.ReadUshortBigEndian(bData, (int)(nStartAt + nReadSoFar)); nReadSoFar += 2;

            if (CipherSuitesLength > 0)
            {
                if (bData.Length < (nStartAt + nReadSoFar + CipherSuitesLength))
                {
                    return(0);
                }
                for (int i = 0; i < CipherSuitesLength / 2; i++)
                {
                    CipherSuite nNextCipherSuite = (CipherSuite)ByteHelper.ReadUshortBigEndian(bData, (int)(nStartAt + nReadSoFar)); nReadSoFar += 2;
                    CipherSuites.Add(nNextCipherSuite);
                }
            }

            if (bData.Length < (nStartAt + nReadSoFar + 2))
            {
                return(0);
            }
            CompressionMethodsLength = ByteHelper.ReadByte(bData, (int)(nStartAt + nReadSoFar)); nReadSoFar += 1;
            if (CompressionMethodsLength > 0)
            {
                if (bData.Length < (nStartAt + nReadSoFar + CompressionMethodsLength))
                {
                    return(0);
                }
                for (int i = 0; i < CipherSuitesLength / 2; i++)
                {
                    CompressionMethod bNextCompressionMethod = (CompressionMethod)ByteHelper.ReadByte(bData, (int)(nStartAt + nReadSoFar)); nReadSoFar += 1;
                    CompressionMethods.Add(bNextCompressionMethod);
                }
            }


            return(nReadSoFar);
        }
 /// <summary>
 /// Reads this object in from an array, returning how many bytes were read, or 0 if there is an error or not enough data
 /// </summary>
 /// <param name="bData"></param>
 /// <param name="nStartAt"></param>
 /// <returns></returns>
 public uint ReadFromArray(byte[] bData, int nStartAt)
 {
     verify_data = ByteHelper.ReadByteArray(bData, nStartAt, 12);
     return(12);
 }