Files
SuperVPN/output/Libraries/BouncyCastle.Crypto/Org/BouncyCastle/Crypto/Tls/CertificateRequest.cs
2025-10-09 09:57:24 +09:00

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