public static AsyncCertificateRequest Parse(ProtocolVersion version, IByteBuffer data)
        {
            int numTypes = data.ReadByte() & 0x0FF;

            byte[] certificateTypes = new byte[numTypes];
            for (int i = 0; i < numTypes; ++i)
            {
                certificateTypes[i] = data.ReadByte();
            }

            IList supportedSignatureAlgorithms = null;

            if (ProtocolVersion.TLSv12.IsEqualOrEarlierVersionOf(version.GetEquivalentTLSVersion()))
            {
                supportedSignatureAlgorithms = DtlsHelper.ParseSupportedSignatureAlgorithms(false, data);
            }

            IList certificateAuthorities = new List <X509Name>();
            int   remainingBytes         = data.ReadUnsignedShort();

            while (remainingBytes > 0)
            {
                byte[] derEncoding = new byte[data.ReadUnsignedShort()];
                data.ReadBytes(derEncoding);
                Asn1InputStream asn1   = new Asn1InputStream(derEncoding);
                Asn1Object      result = asn1.ReadObject();
                asn1.Close();

                if (null == result)
                {
                    throw new TlsFatalAlert(AlertDescription.decode_error);
                }

                if (null != asn1.ReadObject())
                {
                    throw new TlsFatalAlert(AlertDescription.decode_error);
                }

                certificateAuthorities.Add(X509Name.GetInstance(result));
                remainingBytes -= 2 + derEncoding.Length;
            }

            return(new AsyncCertificateRequest(certificateTypes, supportedSignatureAlgorithms, certificateAuthorities));
        }