ProofOfPossessionSigningKeyBuilder.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
  2. #pragma warning disable
  3. using System;
  4. using System.IO;
  5. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1;
  6. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Crmf;
  7. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.X509;
  8. using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto;
  9. using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Operators;
  10. using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
  11. namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Crmf
  12. {
  13. public class ProofOfPossessionSigningKeyBuilder
  14. {
  15. private CertRequest _certRequest;
  16. private SubjectPublicKeyInfo _pubKeyInfo;
  17. private GeneralName _name;
  18. private PKMacValue _publicKeyMAC;
  19. public ProofOfPossessionSigningKeyBuilder(CertRequest certRequest)
  20. {
  21. this._certRequest = certRequest;
  22. }
  23. public ProofOfPossessionSigningKeyBuilder(SubjectPublicKeyInfo pubKeyInfo)
  24. {
  25. this._pubKeyInfo = pubKeyInfo;
  26. }
  27. public ProofOfPossessionSigningKeyBuilder SetSender(GeneralName name)
  28. {
  29. this._name = name;
  30. return this;
  31. }
  32. public ProofOfPossessionSigningKeyBuilder SetPublicKeyMac(PKMacBuilder generator, char[] password)
  33. {
  34. IMacFactory fact = generator.Build(password);
  35. byte[] d = _pubKeyInfo.GetDerEncoded();
  36. IStreamCalculator<IBlockResult> calc = fact.CreateCalculator();
  37. using (var stream = calc.Stream)
  38. {
  39. stream.Write(d, 0, d.Length);
  40. }
  41. this._publicKeyMAC = new PKMacValue(
  42. (AlgorithmIdentifier)fact.AlgorithmDetails,
  43. new DerBitString(calc.GetResult().Collect()));
  44. return this;
  45. }
  46. public PopoSigningKey Build(ISignatureFactory signer)
  47. {
  48. if (_name != null && _publicKeyMAC != null)
  49. {
  50. throw new InvalidOperationException("name and publicKeyMAC cannot both be set.");
  51. }
  52. PopoSigningKeyInput popo;
  53. IStreamCalculator<IBlockResult> calc = signer.CreateCalculator();
  54. using (Stream sigStream = calc.Stream)
  55. {
  56. if (_certRequest != null)
  57. {
  58. popo = null;
  59. _certRequest.EncodeTo(sigStream, Asn1Encodable.Der);
  60. }
  61. else if (_name != null)
  62. {
  63. popo = new PopoSigningKeyInput(_name, _pubKeyInfo);
  64. popo.EncodeTo(sigStream, Asn1Encodable.Der);
  65. }
  66. else
  67. {
  68. popo = new PopoSigningKeyInput(_publicKeyMAC, _pubKeyInfo);
  69. popo.EncodeTo(sigStream, Asn1Encodable.Der);
  70. }
  71. }
  72. var signature = calc.GetResult().Collect();
  73. return new PopoSigningKey(popo, (AlgorithmIdentifier)signer.AlgorithmDetails, new DerBitString(signature));
  74. }
  75. }
  76. }
  77. #pragma warning restore
  78. #endif