/// <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); }
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); }