ProtectedPkiMessageBuilder.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
  2. #pragma warning disable
  3. using System;
  4. using System.Collections;
  5. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1;
  6. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Cmp;
  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. using BestHTTP.SecureProtocol.Org.BouncyCastle.X509;
  12. namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Cmp
  13. {
  14. public class ProtectedPkiMessageBuilder
  15. {
  16. private PkiHeaderBuilder hdrBuilBuilder;
  17. private PkiBody body;
  18. private IList generalInfos = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateArrayList();
  19. private IList extraCerts = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateArrayList();
  20. public ProtectedPkiMessageBuilder(GeneralName sender, GeneralName recipient)
  21. : this(PkiHeader.CMP_2000, sender, recipient)
  22. {
  23. }
  24. public ProtectedPkiMessageBuilder(int pvno, GeneralName sender, GeneralName recipient)
  25. {
  26. hdrBuilBuilder = new PkiHeaderBuilder(pvno, sender, recipient);
  27. }
  28. public ProtectedPkiMessageBuilder SetTransactionId(byte[] tid)
  29. {
  30. hdrBuilBuilder.SetTransactionID(tid);
  31. return this;
  32. }
  33. public ProtectedPkiMessageBuilder SetFreeText(PkiFreeText freeText)
  34. {
  35. hdrBuilBuilder.SetFreeText(freeText);
  36. return this;
  37. }
  38. public ProtectedPkiMessageBuilder AddGeneralInfo(InfoTypeAndValue genInfo)
  39. {
  40. generalInfos.Add(genInfo);
  41. return this;
  42. }
  43. public ProtectedPkiMessageBuilder SetMessageTime(DerGeneralizedTime generalizedTime)
  44. {
  45. hdrBuilBuilder.SetMessageTime(generalizedTime);
  46. return this;
  47. }
  48. public ProtectedPkiMessageBuilder SetRecipKID(byte[] id)
  49. {
  50. hdrBuilBuilder.SetRecipKID(id);
  51. return this;
  52. }
  53. public ProtectedPkiMessageBuilder SetRecipNonce(byte[] nonce)
  54. {
  55. hdrBuilBuilder.SetRecipNonce(nonce);
  56. return this;
  57. }
  58. public ProtectedPkiMessageBuilder SetSenderKID(byte[] id)
  59. {
  60. hdrBuilBuilder.SetSenderKID(id);
  61. return this;
  62. }
  63. public ProtectedPkiMessageBuilder SetSenderNonce(byte[] nonce)
  64. {
  65. hdrBuilBuilder.SetSenderNonce(nonce);
  66. return this;
  67. }
  68. public ProtectedPkiMessageBuilder SetBody(PkiBody body)
  69. {
  70. this.body = body;
  71. return this;
  72. }
  73. public ProtectedPkiMessageBuilder AddCmpCertificate(X509Certificate certificate)
  74. {
  75. extraCerts.Add(certificate);
  76. return this;
  77. }
  78. public ProtectedPkiMessage Build(ISignatureFactory signatureFactory)
  79. {
  80. if (null == body)
  81. throw new InvalidOperationException("body must be set before building");
  82. IStreamCalculator calculator = signatureFactory.CreateCalculator();
  83. if (!(signatureFactory.AlgorithmDetails is AlgorithmIdentifier))
  84. {
  85. throw new ArgumentException("AlgorithmDetails is not AlgorithmIdentifier");
  86. }
  87. FinalizeHeader((AlgorithmIdentifier)signatureFactory.AlgorithmDetails);
  88. PkiHeader header = hdrBuilBuilder.Build();
  89. DerBitString protection = new DerBitString(CalculateSignature(calculator, header, body));
  90. return FinalizeMessage(header, protection);
  91. }
  92. public ProtectedPkiMessage Build(IMacFactory factory)
  93. {
  94. if (null == body)
  95. throw new InvalidOperationException("body must be set before building");
  96. IStreamCalculator calculator = factory.CreateCalculator();
  97. FinalizeHeader((AlgorithmIdentifier)factory.AlgorithmDetails);
  98. PkiHeader header = hdrBuilBuilder.Build();
  99. DerBitString protection = new DerBitString(CalculateSignature(calculator, header, body));
  100. return FinalizeMessage(header, protection);
  101. }
  102. private void FinalizeHeader(AlgorithmIdentifier algorithmIdentifier)
  103. {
  104. hdrBuilBuilder.SetProtectionAlg(algorithmIdentifier);
  105. if (generalInfos.Count > 0)
  106. {
  107. InfoTypeAndValue[] genInfos = new InfoTypeAndValue[generalInfos.Count];
  108. for (int t = 0; t < genInfos.Length; t++)
  109. {
  110. genInfos[t] = (InfoTypeAndValue)generalInfos[t];
  111. }
  112. hdrBuilBuilder.SetGeneralInfo(genInfos);
  113. }
  114. }
  115. private ProtectedPkiMessage FinalizeMessage(PkiHeader header, DerBitString protection)
  116. {
  117. if (extraCerts.Count > 0)
  118. {
  119. CmpCertificate[] cmpCertificates = new CmpCertificate[extraCerts.Count];
  120. for (int i = 0; i < cmpCertificates.Length; i++)
  121. {
  122. byte[] cert = ((X509Certificate)extraCerts[i]).GetEncoded();
  123. cmpCertificates[i] = CmpCertificate.GetInstance((Asn1Sequence.FromByteArray(cert)));
  124. }
  125. return new ProtectedPkiMessage(new PkiMessage(header, body, protection, cmpCertificates));
  126. }
  127. return new ProtectedPkiMessage(new PkiMessage(header, body, protection));
  128. }
  129. private byte[] CalculateSignature(IStreamCalculator signer, PkiHeader header, PkiBody body)
  130. {
  131. Asn1EncodableVector avec = new Asn1EncodableVector();
  132. avec.Add(header);
  133. avec.Add(body);
  134. byte[] encoded = new DerSequence(avec).GetEncoded();
  135. signer.Stream.Write(encoded, 0, encoded.Length);
  136. object result = signer.GetResult();
  137. if (result is DefaultSignatureResult)
  138. {
  139. return ((DefaultSignatureResult)result).Collect();
  140. }
  141. else if (result is IBlockResult)
  142. {
  143. return ((IBlockResult)result).Collect();
  144. }
  145. else if (result is byte[])
  146. {
  147. return (byte[])result;
  148. }
  149. throw new InvalidOperationException("result is not byte[] or DefaultSignatureResult");
  150. }
  151. }
  152. }
  153. #pragma warning restore
  154. #endif