SignerInfoGenerator.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
  2. #pragma warning disable
  3. using System;
  4. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1;
  5. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Cms;
  6. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.X509;
  7. using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto;
  8. using BestHTTP.SecureProtocol.Org.BouncyCastle.X509;
  9. namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Cms
  10. {
  11. internal interface ISignerInfoGenerator
  12. {
  13. SignerInfo Generate(DerObjectIdentifier contentType, AlgorithmIdentifier digestAlgorithm,
  14. byte[] calculatedDigest);
  15. }
  16. public class SignerInfoGenerator
  17. {
  18. internal X509Certificate certificate;
  19. internal ISignatureFactory contentSigner;
  20. internal SignerIdentifier sigId;
  21. internal CmsAttributeTableGenerator signedGen;
  22. internal CmsAttributeTableGenerator unsignedGen;
  23. private bool isDirectSignature;
  24. internal SignerInfoGenerator(SignerIdentifier sigId, ISignatureFactory signerFactory): this(sigId, signerFactory, false)
  25. {
  26. }
  27. internal SignerInfoGenerator(SignerIdentifier sigId, ISignatureFactory signerFactory, bool isDirectSignature)
  28. {
  29. this.sigId = sigId;
  30. this.contentSigner = signerFactory;
  31. this.isDirectSignature = isDirectSignature;
  32. if (this.isDirectSignature)
  33. {
  34. this.signedGen = null;
  35. this.unsignedGen = null;
  36. }
  37. else
  38. {
  39. this.signedGen = new DefaultSignedAttributeTableGenerator();
  40. this.unsignedGen = null;
  41. }
  42. }
  43. internal SignerInfoGenerator(SignerIdentifier sigId, ISignatureFactory contentSigner, CmsAttributeTableGenerator signedGen, CmsAttributeTableGenerator unsignedGen)
  44. {
  45. this.sigId = sigId;
  46. this.contentSigner = contentSigner;
  47. this.signedGen = signedGen;
  48. this.unsignedGen = unsignedGen;
  49. this.isDirectSignature = false;
  50. }
  51. internal void setAssociatedCertificate(X509Certificate certificate)
  52. {
  53. this.certificate = certificate;
  54. }
  55. public SignerInfoGeneratorBuilder NewBuilder()
  56. {
  57. SignerInfoGeneratorBuilder builder = new SignerInfoGeneratorBuilder();
  58. builder.WithSignedAttributeGenerator(signedGen);
  59. builder.WithUnsignedAttributeGenerator(unsignedGen);
  60. builder.SetDirectSignature(isDirectSignature);
  61. return builder;
  62. }
  63. }
  64. public class SignerInfoGeneratorBuilder
  65. {
  66. private bool directSignature;
  67. private CmsAttributeTableGenerator signedGen;
  68. private CmsAttributeTableGenerator unsignedGen;
  69. public SignerInfoGeneratorBuilder()
  70. {
  71. }
  72. /**
  73. * If the passed in flag is true, the signer signature will be based on the data, not
  74. * a collection of signed attributes, and no signed attributes will be included.
  75. *
  76. * @return the builder object
  77. */
  78. public SignerInfoGeneratorBuilder SetDirectSignature(bool hasNoSignedAttributes)
  79. {
  80. this.directSignature = hasNoSignedAttributes;
  81. return this;
  82. }
  83. /**
  84. * Provide a custom signed attribute generator.
  85. *
  86. * @param signedGen a generator of signed attributes.
  87. * @return the builder object
  88. */
  89. public SignerInfoGeneratorBuilder WithSignedAttributeGenerator(CmsAttributeTableGenerator signedGen)
  90. {
  91. this.signedGen = signedGen;
  92. return this;
  93. }
  94. /**
  95. * Provide a generator of unsigned attributes.
  96. *
  97. * @param unsignedGen a generator for signed attributes.
  98. * @return the builder object
  99. */
  100. public SignerInfoGeneratorBuilder WithUnsignedAttributeGenerator(CmsAttributeTableGenerator unsignedGen)
  101. {
  102. this.unsignedGen = unsignedGen;
  103. return this;
  104. }
  105. /**
  106. * Build a generator with the passed in X.509 certificate issuer and serial number as the signerIdentifier.
  107. *
  108. * @param contentSigner operator for generating the final signature in the SignerInfo with.
  109. * @param certificate X.509 certificate related to the contentSigner.
  110. * @return a SignerInfoGenerator
  111. * @throws OperatorCreationException if the generator cannot be built.
  112. */
  113. public SignerInfoGenerator Build(ISignatureFactory contentSigner, X509Certificate certificate)
  114. {
  115. SignerIdentifier sigId = new SignerIdentifier(new IssuerAndSerialNumber(certificate.IssuerDN, new DerInteger(certificate.SerialNumber)));
  116. SignerInfoGenerator sigInfoGen = CreateGenerator(contentSigner, sigId);
  117. sigInfoGen.setAssociatedCertificate(certificate);
  118. return sigInfoGen;
  119. }
  120. /**
  121. * Build a generator with the passed in subjectKeyIdentifier as the signerIdentifier. If used you should
  122. * try to follow the calculation described in RFC 5280 section 4.2.1.2.
  123. *
  124. * @param signerFactory operator factory for generating the final signature in the SignerInfo with.
  125. * @param subjectKeyIdentifier key identifier to identify the public key for verifying the signature.
  126. * @return a SignerInfoGenerator
  127. */
  128. public SignerInfoGenerator Build(ISignatureFactory signerFactory, byte[] subjectKeyIdentifier)
  129. {
  130. SignerIdentifier sigId = new SignerIdentifier(new DerOctetString(subjectKeyIdentifier));
  131. return CreateGenerator(signerFactory, sigId);
  132. }
  133. private SignerInfoGenerator CreateGenerator(ISignatureFactory contentSigner, SignerIdentifier sigId)
  134. {
  135. if (directSignature)
  136. {
  137. return new SignerInfoGenerator(sigId, contentSigner, true);
  138. }
  139. if (signedGen != null || unsignedGen != null)
  140. {
  141. if (signedGen == null)
  142. {
  143. signedGen = new DefaultSignedAttributeTableGenerator();
  144. }
  145. return new SignerInfoGenerator(sigId, contentSigner, signedGen, unsignedGen);
  146. }
  147. return new SignerInfoGenerator(sigId, contentSigner);
  148. }
  149. }
  150. }
  151. #pragma warning restore
  152. #endif