培训考核三期,新版培训,网页版培训登录器
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

267 lines
8.9 KiB

#if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
#pragma warning disable
using System;
using System.Collections;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Crmf;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.X509;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Operators;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Math;
using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Crmf
{
public class CertificateRequestMessageBuilder
{
private readonly BigInteger _certReqId;
private X509ExtensionsGenerator _extGenerator;
private CertTemplateBuilder _templateBuilder;
private IList _controls = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateArrayList();
private ISignatureFactory _popSigner;
private PKMacBuilder _pkMacBuilder;
private char[] _password;
private GeneralName _sender;
private int _popoType = ProofOfPossession.TYPE_KEY_ENCIPHERMENT;
private PopoPrivKey _popoPrivKey;
private Asn1Null _popRaVerified;
private PKMacValue _agreeMac;
public CertificateRequestMessageBuilder(BigInteger certReqId)
{
this._certReqId = certReqId;
this._extGenerator = new X509ExtensionsGenerator();
this._templateBuilder = new CertTemplateBuilder();
}
public CertificateRequestMessageBuilder SetPublicKey(SubjectPublicKeyInfo publicKeyInfo)
{
if (publicKeyInfo != null)
{
_templateBuilder.SetPublicKey(publicKeyInfo);
}
return this;
}
public CertificateRequestMessageBuilder SetIssuer(X509Name issuer)
{
if (issuer != null)
{
_templateBuilder.SetIssuer(issuer);
}
return this;
}
public CertificateRequestMessageBuilder SetSubject(X509Name subject)
{
if (subject != null)
{
_templateBuilder.SetSubject(subject);
}
return this;
}
public CertificateRequestMessageBuilder SetSerialNumber(BigInteger serialNumber)
{
if (serialNumber != null)
{
_templateBuilder.SetSerialNumber(new DerInteger(serialNumber));
}
return this;
}
public CertificateRequestMessageBuilder SetValidity(Time notBefore, Time notAfter)
{
_templateBuilder.SetValidity(new OptionalValidity(notBefore, notAfter));
return this;
}
public CertificateRequestMessageBuilder AddExtension(DerObjectIdentifier oid, bool critical,
Asn1Encodable value)
{
_extGenerator.AddExtension(oid, critical, value);
return this;
}
public CertificateRequestMessageBuilder AddExtension(DerObjectIdentifier oid, bool critical,
byte[] value)
{
_extGenerator.AddExtension(oid, critical, value);
return this;
}
public CertificateRequestMessageBuilder AddControl(IControl control)
{
_controls.Add(control);
return this;
}
public CertificateRequestMessageBuilder SetProofOfPossessionSignKeySigner(ISignatureFactory popoSignatureFactory)
{
if (_popoPrivKey != null || _popRaVerified != null || _agreeMac != null)
{
throw new InvalidOperationException("only one proof of possession is allowed.");
}
this._popSigner = popoSignatureFactory;
return this;
}
public CertificateRequestMessageBuilder SetProofOfPossessionSubsequentMessage(SubsequentMessage msg)
{
if (_popoPrivKey != null || _popRaVerified != null || _agreeMac != null)
{
throw new InvalidOperationException("only one proof of possession is allowed.");
}
this._popoType = ProofOfPossession.TYPE_KEY_ENCIPHERMENT;
this._popoPrivKey = new PopoPrivKey(msg);
return this;
}
public CertificateRequestMessageBuilder SetProofOfPossessionSubsequentMessage(int type, SubsequentMessage msg)
{
if (_popoPrivKey != null || _popRaVerified != null || _agreeMac != null)
{
throw new InvalidOperationException("only one proof of possession is allowed.");
}
if (type != ProofOfPossession.TYPE_KEY_ENCIPHERMENT && type != ProofOfPossession.TYPE_KEY_AGREEMENT)
{
throw new ArgumentException("type must be ProofOfPossession.TYPE_KEY_ENCIPHERMENT || ProofOfPossession.TYPE_KEY_AGREEMENT");
}
this._popoType = type;
this._popoPrivKey = new PopoPrivKey(msg);
return this;
}
public CertificateRequestMessageBuilder SetProofOfPossessionAgreeMac(PKMacValue macValue)
{
if (_popSigner != null || _popRaVerified != null || _popoPrivKey != null)
{
throw new InvalidOperationException("only one proof of possession allowed");
}
this._agreeMac = macValue;
return this;
}
public CertificateRequestMessageBuilder SetProofOfPossessionRaVerified()
{
if (_popSigner != null || _popoPrivKey != null)
{
throw new InvalidOperationException("only one proof of possession allowed");
}
this._popRaVerified = DerNull.Instance;
return this;
}
public CertificateRequestMessageBuilder SetAuthInfoPKMAC(PKMacBuilder pkmacFactory, char[] password)
{
this._pkMacBuilder = pkmacFactory;
this._password = password;
return this;
}
public CertificateRequestMessageBuilder SetAuthInfoSender(X509Name sender)
{
return SetAuthInfoSender(new GeneralName(sender));
}
public CertificateRequestMessageBuilder SetAuthInfoSender(GeneralName sender)
{
this._sender = sender;
return this;
}
public CertificateRequestMessage Build()
{
Asn1EncodableVector v = new Asn1EncodableVector(new DerInteger(this._certReqId));
if (!this._extGenerator.IsEmpty)
{
this._templateBuilder.SetExtensions(_extGenerator.Generate());
}
v.Add(_templateBuilder.Build());
if (_controls.Count > 0)
{
Asn1EncodableVector controlV = new Asn1EncodableVector();
foreach (object item in _controls)
{
IControl control = (IControl)item;
controlV.Add(new AttributeTypeAndValue(control.Type, control.Value));
}
v.Add(new DerSequence(controlV));
}
CertRequest request = CertRequest.GetInstance(new DerSequence(v));
v = new Asn1EncodableVector(request);
if (_popSigner != null)
{
CertTemplate template = request.CertTemplate;
if (template.Subject == null || template.PublicKey == null)
{
SubjectPublicKeyInfo pubKeyInfo = request.CertTemplate.PublicKey;
ProofOfPossessionSigningKeyBuilder builder = new ProofOfPossessionSigningKeyBuilder(pubKeyInfo);
if (_sender != null)
{
builder.SetSender(_sender);
}
else
{
//PKMACValueGenerator pkmacGenerator = new PKMACValueGenerator(_pkmacBuilder);
builder.SetPublicKeyMac(_pkMacBuilder, _password);
}
v.Add(new ProofOfPossession(builder.Build(_popSigner)));
}
else
{
ProofOfPossessionSigningKeyBuilder builder = new ProofOfPossessionSigningKeyBuilder(request);
v.Add(new ProofOfPossession(builder.Build(_popSigner)));
}
}
else if (_popoPrivKey != null)
{
v.Add(new ProofOfPossession(_popoType, _popoPrivKey));
}
else if (_agreeMac != null)
{
v.Add(new ProofOfPossession(ProofOfPossession.TYPE_KEY_AGREEMENT,
PopoPrivKey.GetInstance(new DerTaggedObject(false, PopoPrivKey.agreeMAC, _agreeMac), true)));
}
else if (_popRaVerified != null)
{
v.Add(new ProofOfPossession());
}
return new CertificateRequestMessage(CertReqMsg.GetInstance(new DerSequence(v)));
}
}
}
#pragma warning restore
#endif