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