90 lines
2.7 KiB
C#
90 lines
2.7 KiB
C#
using System.Collections;
|
|
using System.IO;
|
|
using Org.BouncyCastle.Asn1;
|
|
using Org.BouncyCastle.Asn1.X509;
|
|
using Org.BouncyCastle.Utilities;
|
|
|
|
namespace Org.BouncyCastle.Crypto.Tls;
|
|
|
|
public class CertificateRequest
|
|
{
|
|
protected readonly byte[] mCertificateTypes;
|
|
|
|
protected readonly IList mSupportedSignatureAlgorithms;
|
|
|
|
protected readonly IList mCertificateAuthorities;
|
|
|
|
public virtual byte[] CertificateTypes => mCertificateTypes;
|
|
|
|
public virtual IList SupportedSignatureAlgorithms => mSupportedSignatureAlgorithms;
|
|
|
|
public virtual IList CertificateAuthorities => mCertificateAuthorities;
|
|
|
|
public CertificateRequest(byte[] certificateTypes, IList supportedSignatureAlgorithms, IList certificateAuthorities)
|
|
{
|
|
mCertificateTypes = certificateTypes;
|
|
mSupportedSignatureAlgorithms = supportedSignatureAlgorithms;
|
|
mCertificateAuthorities = certificateAuthorities;
|
|
}
|
|
|
|
public virtual void Encode(Stream output)
|
|
{
|
|
if (mCertificateTypes == null || mCertificateTypes.Length == 0)
|
|
{
|
|
TlsUtilities.WriteUint8(0, output);
|
|
}
|
|
else
|
|
{
|
|
TlsUtilities.WriteUint8ArrayWithUint8Length(mCertificateTypes, output);
|
|
}
|
|
if (mSupportedSignatureAlgorithms != null)
|
|
{
|
|
TlsUtilities.EncodeSupportedSignatureAlgorithms(mSupportedSignatureAlgorithms, allowAnonymous: false, output);
|
|
}
|
|
if (mCertificateAuthorities == null || mCertificateAuthorities.Count < 1)
|
|
{
|
|
TlsUtilities.WriteUint16(0, output);
|
|
return;
|
|
}
|
|
IList list = Platform.CreateArrayList(mCertificateAuthorities.Count);
|
|
int num = 0;
|
|
foreach (Asn1Encodable mCertificateAuthority in mCertificateAuthorities)
|
|
{
|
|
byte[] encoded = mCertificateAuthority.GetEncoded("DER");
|
|
list.Add(encoded);
|
|
num += encoded.Length + 2;
|
|
}
|
|
TlsUtilities.CheckUint16(num);
|
|
TlsUtilities.WriteUint16(num, output);
|
|
foreach (byte[] item in list)
|
|
{
|
|
TlsUtilities.WriteOpaque16(item, output);
|
|
}
|
|
}
|
|
|
|
public static CertificateRequest Parse(TlsContext context, Stream input)
|
|
{
|
|
int num = TlsUtilities.ReadUint8(input);
|
|
byte[] array = new byte[num];
|
|
for (int i = 0; i < num; i++)
|
|
{
|
|
array[i] = TlsUtilities.ReadUint8(input);
|
|
}
|
|
IList supportedSignatureAlgorithms = null;
|
|
if (TlsUtilities.IsTlsV12(context))
|
|
{
|
|
supportedSignatureAlgorithms = TlsUtilities.ParseSupportedSignatureAlgorithms(allowAnonymous: false, input);
|
|
}
|
|
IList list = Platform.CreateArrayList();
|
|
byte[] buffer = TlsUtilities.ReadOpaque16(input);
|
|
MemoryStream memoryStream = new MemoryStream(buffer, writable: false);
|
|
while (memoryStream.Position < memoryStream.Length)
|
|
{
|
|
byte[] encoding = TlsUtilities.ReadOpaque16(memoryStream);
|
|
Asn1Object obj = TlsUtilities.ReadDerObject(encoding);
|
|
list.Add(X509Name.GetInstance(obj));
|
|
}
|
|
return new CertificateRequest(array, supportedSignatureAlgorithms, list);
|
|
}
|
|
}
|