KeyInfoX509Data.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. //
  2. // KeyInfoX509Data.cs - KeyInfoX509Data implementation for XML Signature
  3. //
  4. // Author:
  5. // Sebastien Pouliot ([email protected])
  6. //
  7. // (C) 2002 Motus Technologies Inc. (http://www.motus.com)
  8. //
  9. using System.Collections;
  10. using System.Security.Cryptography.X509Certificates;
  11. using System.Text;
  12. using System.Xml;
  13. namespace System.Security.Cryptography.Xml {
  14. // FIXME: framework class isn't documented so compatibility isn't assured!
  15. internal class IssuerSerial {
  16. public string Issuer;
  17. public string Serial;
  18. public IssuerSerial (string issuer, string serial)
  19. {
  20. Issuer = issuer;
  21. Serial = serial;
  22. }
  23. }
  24. public class KeyInfoX509Data : KeyInfoClause {
  25. protected byte[] x509crl;
  26. protected ArrayList IssuerSerialList;
  27. protected ArrayList SubjectKeyIdList;
  28. protected ArrayList SubjectNameList;
  29. protected ArrayList X509CertificateList;
  30. public KeyInfoX509Data ()
  31. {
  32. IssuerSerialList = new ArrayList ();
  33. SubjectKeyIdList = new ArrayList ();
  34. SubjectNameList = new ArrayList ();
  35. X509CertificateList = new ArrayList ();
  36. }
  37. public KeyInfoX509Data (byte[] rgbCert) : this ()
  38. {
  39. AddCertificate (new X509Certificate (rgbCert));
  40. }
  41. public KeyInfoX509Data (X509Certificate cert) : this ()
  42. {
  43. AddCertificate (cert);
  44. }
  45. public ArrayList Certificates {
  46. get { return X509CertificateList; }
  47. }
  48. public byte[] CRL {
  49. get { return x509crl; }
  50. set { x509crl = value; }
  51. }
  52. public ArrayList IssuerSerials {
  53. get { return IssuerSerialList; }
  54. }
  55. public ArrayList SubjectKeyIds {
  56. get { return SubjectKeyIdList; }
  57. }
  58. public ArrayList SubjectNames {
  59. get { return SubjectNameList; }
  60. }
  61. public void AddCertificate (X509Certificate certificate)
  62. {
  63. X509CertificateList.Add (certificate);
  64. }
  65. public void AddIssuerSerial (string issuerName, string serialNumber)
  66. {
  67. IssuerSerial isser = new IssuerSerial (issuerName, serialNumber);
  68. IssuerSerialList.Add (isser);
  69. }
  70. public void AddSubjectKeyId (byte[] subjectKeyId)
  71. {
  72. SubjectKeyIdList.Add (subjectKeyId);
  73. }
  74. public void AddSubjectName (string subjectName)
  75. {
  76. SubjectNameList.Add (subjectName);
  77. }
  78. public override XmlElement GetXml ()
  79. {
  80. // sanity check
  81. int count = IssuerSerialList.Count + SubjectKeyIdList.Count + SubjectNameList.Count + X509CertificateList.Count;
  82. if ((x509crl == null) && (count == 0))
  83. throw new CryptographicException ("value");
  84. StringBuilder sb = new StringBuilder ();
  85. sb.Append ("<X509Data xmlns=\"http://www.w3.org/2000/09/xmldsig#\">");
  86. // <X509IssuerSerial>
  87. if (IssuerSerialList.Count > 0) {
  88. sb.Append ("<X509IssuerSerial>");
  89. foreach (IssuerSerial iser in IssuerSerialList) {
  90. sb.Append ("<X509IssuerName>");
  91. sb.Append (iser.Issuer);
  92. sb.Append ("</X509IssuerName>");
  93. sb.Append ("<X509SerialNumber>");
  94. sb.Append (iser.Serial);
  95. sb.Append ("</X509SerialNumber>");
  96. }
  97. sb.Append ("</X509IssuerSerial>");
  98. }
  99. // <X509SKI>
  100. if (SubjectKeyIdList.Count > 0) {
  101. foreach (byte[] skid in SubjectKeyIdList) {
  102. sb.Append ("<X509SKI>");
  103. sb.Append (Convert.ToBase64String (skid));
  104. sb.Append ("</X509SKI>");
  105. }
  106. }
  107. // <X509SubjectName>
  108. if (SubjectNameList.Count > 0) {
  109. foreach (string subject in SubjectNameList) {
  110. sb.Append ("<X509SubjectName>");
  111. sb.Append (subject);
  112. sb.Append ("</X509SubjectName>");
  113. }
  114. }
  115. // <X509Certificate>
  116. if (X509CertificateList.Count > 0) {
  117. foreach (X509Certificate x509 in X509CertificateList) {
  118. sb.Append ("<X509Certificate>");
  119. sb.Append (Convert.ToBase64String (x509.GetRawCertData ()));
  120. sb.Append ("</X509Certificate>");
  121. }
  122. }
  123. // only one <X509CRL>
  124. if (x509crl != null) {
  125. sb.Append ("<X509CRL>");
  126. sb.Append (Convert.ToBase64String (x509crl));
  127. sb.Append ("</X509CRL>");
  128. }
  129. sb.Append ("</X509Data>");
  130. XmlDocument doc = new XmlDocument ();
  131. doc.LoadXml(sb.ToString ());
  132. return doc.DocumentElement;
  133. }
  134. public override void LoadXml (XmlElement value)
  135. {
  136. if (value == null)
  137. throw new ArgumentNullException ();
  138. IssuerSerialList.Clear ();
  139. SubjectKeyIdList.Clear ();
  140. SubjectNameList.Clear ();
  141. X509CertificateList.Clear ();
  142. x509crl = null;
  143. string ns = "http://www.w3.org/2000/09/xmldsig#";
  144. if ((value.LocalName == "X509Data") && (value.NamespaceURI == ns)) {
  145. XmlNodeList xnl = null;
  146. // <X509IssuerSerial>
  147. xnl = value.GetElementsByTagName ("X509IssuerSerial", ns);
  148. if (xnl != null) {
  149. for (int i=0; i < xnl.Count; i++) {
  150. XmlElement xel = (XmlElement) xnl[i];
  151. XmlNodeList issuer = xel.GetElementsByTagName ("X509IssuerName", ns);
  152. XmlNodeList serial = xel.GetElementsByTagName ("X509SerialNumber", ns);
  153. AddIssuerSerial (issuer[0].InnerText, serial[0].InnerText);
  154. }
  155. }
  156. // <X509SKI>
  157. xnl = value.GetElementsByTagName ("X509SKI", ns);
  158. if (xnl != null) {
  159. for (int i=0; i < xnl.Count; i++) {
  160. byte[] skid = Convert.FromBase64String (xnl[i].InnerXml);
  161. AddSubjectKeyId (skid);
  162. }
  163. }
  164. // <X509SubjectName>
  165. xnl = value.GetElementsByTagName ("X509SubjectName", ns);
  166. if (xnl != null) {
  167. for (int i=0; i < xnl.Count; i++) {
  168. AddSubjectName (xnl[i].InnerXml);
  169. }
  170. }
  171. // <X509Certificate>
  172. xnl = value.GetElementsByTagName ("X509Certificate", ns);
  173. if (xnl != null) {
  174. for (int i=0; i < xnl.Count; i++) {
  175. byte[] cert = Convert.FromBase64String (xnl[i].InnerXml);
  176. AddCertificate (new X509Certificate (cert));
  177. }
  178. }
  179. // only one <X509CRL>
  180. xnl = value.GetElementsByTagName ("X509CRL", ns);
  181. if ((xnl != null) && (xnl.Count > 0)) {
  182. x509crl = Convert.FromBase64String (xnl[0].InnerXml);
  183. }
  184. }
  185. else
  186. throw new CryptographicException ("value");
  187. }
  188. }
  189. }