protected override void DecodeDataBytes(ProtocolVersion version, byte[] data) { CertificateTypes.Clear(); CertificateAuthorities.Clear(); MemoryStream memStream = new MemoryStream(data); HandshakeStream stream = new HandshakeStream(memStream); int typesLength = stream.ReadUInt8(); for (int i = 0; i < typesLength; i++) { CertificateTypes.Add(stream.ReadUInt8()); } if (version.HasSelectableSighash) { int sighashLength = stream.ReadUInt16(); if ((sighashLength % 2) != 0) { throw new AlertException(AlertDescription.IllegalParameter, "SianatureAndHashAlgorithms length invalid: " + sighashLength); } byte[] sighashData = stream.ReadBytes(sighashLength); for (int i = 0; i < sighashLength; i += 2) { SignatureAndHashAlgorithms.Add((UInt16)((sighashData[i] << 8) | sighashData[i + 1])); } } int authsLength = stream.ReadUInt16(); byte[] authData = stream.ReadBytes(authsLength); stream.ConfirmEndOfStream(); int position = 0; while (position < authData.Length) { int authLength = (authData[position] << 8) | authData[position + 1]; position += 2; if (position > authData.Length) { throw new AlertException(AlertDescription.IllegalParameter, "Authorities total length doesn't match contents"); } string name = Encoding.ASCII.GetString(authData, position, authLength); position += authLength; CertificateAuthorities.Add(name); } }
protected override void DecodeDataBytes(ProtocolVersion ver, byte[] data) { MemoryStream memStream = new MemoryStream(data); HandshakeStream stream = new HandshakeStream(memStream); byte major = stream.ReadUInt8(); byte minor = stream.ReadUInt8(); ServerVersion = new ProtocolVersion(major, minor); byte[] randomBytes = stream.ReadBytes(32); Random = new HandshakeRandom(randomBytes); int idLength = (int)stream.ReadUInt8(); SessionID = stream.ReadBytes(idLength); CipherSuite = stream.ReadUInt16(); CompressionMethod = stream.ReadUInt8(); byte[] extensionList = new byte[0]; if (!stream.EndOfStream && ServerVersion.HasExtensions) { UInt16 extensionListLength = stream.ReadUInt16(); extensionList = stream.ReadBytes(extensionListLength); } stream.ConfirmEndOfStream(); int pos = 0; while (pos + 4 <= extensionList.Length) { UInt16 extensionType = (UInt16)((extensionList[pos] << 8) | extensionList[pos + 1]); UInt16 extensionDataLength = (UInt16)((extensionList[pos + 2] << 8) | extensionList[pos + 3]); pos += 4; if (pos + extensionDataLength > extensionList.Length) { throw new AlertException(AlertDescription.IllegalParameter, "ServerHello extension data length too large: " + extensionDataLength); } byte[] extensionData = new byte[extensionDataLength]; Buffer.BlockCopy(extensionList, pos, extensionData, 0, extensionData.Length); pos += extensionData.Length; Extensions.Add(new HelloExtension(extensionType, extensionData)); } }
protected override void DecodeDataBytes(ProtocolVersion version, byte[] data) { CertificateTypes.Clear(); CertificateAuthorities.Clear(); MemoryStream memStream = new MemoryStream(data); HandshakeStream stream = new HandshakeStream(memStream); int typesLength = stream.ReadUInt8(); for (int i=0; i<typesLength; i++) { CertificateTypes.Add(stream.ReadUInt8()); } if (version.HasSelectableSighash) { int sighashLength = stream.ReadUInt16(); if ((sighashLength%2) != 0) { throw new AlertException(AlertDescription.IllegalParameter, "SianatureAndHashAlgorithms length invalid: " + sighashLength); } byte[] sighashData = stream.ReadBytes(sighashLength); for (int i=0; i<sighashLength; i+=2) { SignatureAndHashAlgorithms.Add((UInt16)((sighashData[i] << 8) | sighashData[i+1])); } } int authsLength = stream.ReadUInt16(); byte[] authData = stream.ReadBytes(authsLength); stream.ConfirmEndOfStream(); int position=0; while (position < authData.Length) { int authLength = (authData[position] << 8) | authData[position+1]; position += 2; if (position > authData.Length) { throw new AlertException(AlertDescription.IllegalParameter, "Authorities total length doesn't match contents"); } string name = Encoding.ASCII.GetString(authData, position, authLength); position += authLength; CertificateAuthorities.Add(name); } }
protected override void DecodeDataBytes(ProtocolVersion ver, byte[] data) { CipherSuites.Clear(); CompressionMethods.Clear(); MemoryStream memStream = new MemoryStream(data); HandshakeStream stream = new HandshakeStream(memStream); byte major = stream.ReadUInt8(); byte minor = stream.ReadUInt8(); ClientVersion = new ProtocolVersion(major, minor); byte[] randomBytes = stream.ReadBytes(32); Random = new HandshakeRandom(randomBytes); int idLength = (int) stream.ReadUInt8(); SessionID = stream.ReadBytes(idLength); if (ClientVersion.IsUsingDatagrams) { int cookieLength = (int) stream.ReadUInt8(); Cookie = stream.ReadBytes(cookieLength); } int cipherLength = (int) stream.ReadUInt16(); for (int i=0; i<cipherLength; i+=2) { CipherSuites.Add(stream.ReadUInt16()); } int compressionLength = (int) stream.ReadUInt8(); for (int i=0; i<compressionLength; i++) { CompressionMethods.Add(stream.ReadUInt8()); } byte[] extensionList = new byte[0]; if (!stream.EndOfStream && ClientVersion.HasExtensions) { UInt16 extensionListLength = stream.ReadUInt16(); extensionList = stream.ReadBytes(extensionListLength); } stream.ConfirmEndOfStream(); int pos = 0; while (pos+4 <= extensionList.Length) { UInt16 extensionType = (UInt16) ((extensionList[pos] << 8) | extensionList[pos+1]); UInt16 extensionDataLength = (UInt16) ((extensionList[pos+2] << 8) | extensionList[pos+3]); pos += 4; if (pos+extensionDataLength > extensionList.Length) { throw new AlertException(AlertDescription.IllegalParameter, "ClientHello extension data length too large: " + extensionDataLength); } byte[] extensionData = new byte[extensionDataLength]; Buffer.BlockCopy(extensionList, pos, extensionData, 0, extensionData.Length); pos += extensionData.Length; Extensions.Add(new HelloExtension(extensionType, extensionData)); } }