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