Pkits_4_01_SignatureVerification.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. //
  2. // Pkits_4_01_SignatureVerification.cs -
  3. // NUnit tests for Pkits 4.1 : Signature Verification
  4. //
  5. // Author:
  6. // Sebastien Pouliot <[email protected]>
  7. //
  8. // Copyright (C) 2006 Novell, Inc (http://www.novell.com)
  9. //
  10. // Permission is hereby granted, free of charge, to any person obtaining
  11. // a copy of this software and associated documentation files (the
  12. // "Software"), to deal in the Software without restriction, including
  13. // without limitation the rights to use, copy, modify, merge, publish,
  14. // distribute, sublicense, and/or sell copies of the Software, and to
  15. // permit persons to whom the Software is furnished to do so, subject to
  16. // the following conditions:
  17. //
  18. // The above copyright notice and this permission notice shall be
  19. // included in all copies or substantial portions of the Software.
  20. //
  21. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  22. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  23. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  24. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  25. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  26. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  27. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  28. //
  29. #if NET_2_0
  30. using NUnit.Framework;
  31. using System;
  32. using System.Security.Cryptography.Pkcs;
  33. using System.Security.Cryptography.X509Certificates;
  34. using System.Security.Cryptography.Xml;
  35. namespace MonoTests.System.Security.Cryptography.Pkcs {
  36. [TestFixture]
  37. [Category ("PKITS")]
  38. [Category ("NotWorking")]
  39. public class Pkits_4_01_SignatureVerification: PkitsTest {
  40. public X509Certificate2 BadSignedCACert {
  41. get { return GetCertificate ("BadSignedCACert.crt"); }
  42. }
  43. public X509Certificate2 DSACACert {
  44. get { return GetCertificate ("DSACACert.crt"); }
  45. }
  46. public X509Certificate2 DSAParametersInheritedCACert {
  47. get { return GetCertificate ("DSAParametersInheritedCACert.crt"); }
  48. }
  49. [Test]
  50. public void T1_ValidSignature ()
  51. {
  52. byte[] data = GetData ("SignedValidSignaturesTest1.eml");
  53. SignedCms cms = new SignedCms ();
  54. cms.Decode (data);
  55. Assert.IsTrue (CheckHash (cms), "CheckHash");
  56. Assert.IsTrue (CheckSignature (cms), "CheckSignature");
  57. X509Certificate2 ee = GetCertificate ("ValidCertificatePathTest1EE.crt");
  58. // certificates aren't in any particuliar order
  59. Assert.IsTrue (cms.Certificates.Contains (ee), "EE");
  60. Assert.IsTrue (cms.Certificates.Contains (GoodCACert), "GoodCACert");
  61. Assert.IsFalse (cms.Detached, "Detached");
  62. Assert.AreEqual (1, cms.Version, "Version");
  63. Assert.AreEqual ("1.2.840.113549.1.7.1", cms.ContentInfo.ContentType.Value, "ContentInfo.Oid");
  64. Assert.AreEqual ("43-6F-6E-74-65-6E-74-2D-54-79-70-65-3A-20-74-65-78-74-2F-70-6C-61-69-6E-3B-20-63-68-61-72-73-65-74-3D-69-73-6F-2D-38-38-35-39-2D-31-0D-0A-43-6F-6E-74-65-6E-74-2D-54-72-61-6E-73-66-65-72-2D-45-6E-63-6F-64-69-6E-67-3A-20-37-62-69-74-0D-0A-0D-0A-54-68-69-73-20-69-73-20-61-20-73-61-6D-70-6C-65-20-73-69-67-6E-65-64-20-6D-65-73-73-61-67-65-2E", BitConverter.ToString (cms.ContentInfo.Content), "ContentInfo.Content");
  65. Assert.AreEqual (1, cms.SignerInfos.Count, "SignerInfos.Count");
  66. Assert.AreEqual (ee, cms.SignerInfos[0].Certificate, "SignerInfos[0].Certificate");
  67. Assert.AreEqual (0, cms.SignerInfos[0].CounterSignerInfos.Count, "SignerInfos[0].CounterSignerInfos.Count");
  68. Assert.AreEqual ("1.3.14.3.2.26", cms.SignerInfos[0].DigestAlgorithm.Value, "cms.SignerInfos[0].DigestAlgorithm");
  69. Assert.AreEqual (0, cms.SignerInfos[0].SignedAttributes.Count, "SignerInfos[0].SignedAttributes.Count");
  70. Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, cms.SignerInfos[0].SignerIdentifier.Type, "SignerInfos[0].SignerIdentifier.Type");
  71. X509IssuerSerial xis = (X509IssuerSerial) cms.SignerInfos[0].SignerIdentifier.Value;
  72. Assert.AreEqual ("CN=Good CA, O=Test Certificates, C=US", xis.IssuerName, "SignerInfos[0].SignerIdentifier.Value.IssuerName");
  73. Assert.AreEqual ("01", xis.SerialNumber, "SignerInfos[0].SignerIdentifier.Value.SerialNumber");
  74. Assert.AreEqual (0, cms.SignerInfos[0].UnsignedAttributes.Count, "SignerInfos[0].UnsignedAttributes.Count");
  75. Assert.AreEqual (1, cms.SignerInfos[0].Version, "SignerInfos[0].Version");
  76. }
  77. [Test]
  78. public void T2_InvalidCASignature ()
  79. {
  80. byte[] data = GetData ("SignedInvalidCASignatureTest2.eml");
  81. SignedCms cms = new SignedCms ();
  82. cms.Decode (data);
  83. Assert.IsTrue (CheckHash (cms), "CheckHash");
  84. Assert.IsFalse (CheckSignature (cms), "CheckSignature");
  85. X509Certificate2 ee = GetCertificate ("InvalidCASignatureTest2EE.crt");
  86. // certificates aren't in any particuliar order
  87. Assert.IsTrue (cms.Certificates.Contains (ee), "EE");
  88. Assert.IsTrue (cms.Certificates.Contains (BadSignedCACert), "BadSignedCACert");
  89. Assert.IsFalse (cms.Detached, "Detached");
  90. Assert.AreEqual (1, cms.Version, "Version");
  91. Assert.AreEqual ("1.2.840.113549.1.7.1", cms.ContentInfo.ContentType.Value, "ContentInfo.Oid");
  92. Assert.AreEqual ("43-6F-6E-74-65-6E-74-2D-54-79-70-65-3A-20-74-65-78-74-2F-70-6C-61-69-6E-3B-20-63-68-61-72-73-65-74-3D-69-73-6F-2D-38-38-35-39-2D-31-0D-0A-43-6F-6E-74-65-6E-74-2D-54-72-61-6E-73-66-65-72-2D-45-6E-63-6F-64-69-6E-67-3A-20-37-62-69-74-0D-0A-0D-0A-54-68-69-73-20-69-73-20-61-20-73-61-6D-70-6C-65-20-73-69-67-6E-65-64-20-6D-65-73-73-61-67-65-2E", BitConverter.ToString (cms.ContentInfo.Content), "ContentInfo.Content");
  93. Assert.AreEqual (1, cms.SignerInfos.Count, "SignerInfos.Count");
  94. Assert.AreEqual (ee, cms.SignerInfos[0].Certificate, "SignerInfos[0].Certificate");
  95. Assert.AreEqual (0, cms.SignerInfos[0].CounterSignerInfos.Count, "SignerInfos[0].CounterSignerInfos.Count");
  96. Assert.AreEqual ("1.3.14.3.2.26", cms.SignerInfos[0].DigestAlgorithm.Value, "cms.SignerInfos[0].DigestAlgorithm");
  97. Assert.AreEqual (0, cms.SignerInfos[0].SignedAttributes.Count, "SignerInfos[0].SignedAttributes.Count");
  98. Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, cms.SignerInfos[0].SignerIdentifier.Type, "SignerInfos[0].SignerIdentifier.Type");
  99. X509IssuerSerial xis = (X509IssuerSerial) cms.SignerInfos[0].SignerIdentifier.Value;
  100. Assert.AreEqual ("CN=Bad Signed CA, O=Test Certificates, C=US", xis.IssuerName, "SignerInfos[0].SignerIdentifier.Value.IssuerName");
  101. Assert.AreEqual ("01", xis.SerialNumber, "SignerInfos[0].SignerIdentifier.Value.SerialNumber");
  102. Assert.AreEqual (0, cms.SignerInfos[0].UnsignedAttributes.Count, "SignerInfos[0].UnsignedAttributes.Count");
  103. Assert.AreEqual (1, cms.SignerInfos[0].Version, "SignerInfos[0].Version");
  104. }
  105. [Test]
  106. public void T3_InvalidEESignature ()
  107. {
  108. byte[] data = GetData ("SignedInvalidEESignatureTest3.eml");
  109. SignedCms cms = new SignedCms ();
  110. cms.Decode (data);
  111. Assert.IsTrue (CheckHash (cms), "CheckHash");
  112. Assert.IsFalse (CheckSignature (cms), "CheckSignature");
  113. X509Certificate2 ee = GetCertificate ("InvalidEESignatureTest3EE.crt");
  114. // certificates aren't in any particuliar order
  115. Assert.IsTrue (cms.Certificates.Contains (ee), "EE");
  116. Assert.IsTrue (cms.Certificates.Contains (GoodCACert), "GoodCACert");
  117. Assert.IsFalse (cms.Detached, "Detached");
  118. Assert.AreEqual (1, cms.Version, "Version");
  119. Assert.AreEqual ("1.2.840.113549.1.7.1", cms.ContentInfo.ContentType.Value, "ContentInfo.Oid");
  120. Assert.AreEqual ("43-6F-6E-74-65-6E-74-2D-54-79-70-65-3A-20-74-65-78-74-2F-70-6C-61-69-6E-3B-20-63-68-61-72-73-65-74-3D-69-73-6F-2D-38-38-35-39-2D-31-0D-0A-43-6F-6E-74-65-6E-74-2D-54-72-61-6E-73-66-65-72-2D-45-6E-63-6F-64-69-6E-67-3A-20-37-62-69-74-0D-0A-0D-0A-54-68-69-73-20-69-73-20-61-20-73-61-6D-70-6C-65-20-73-69-67-6E-65-64-20-6D-65-73-73-61-67-65-2E", BitConverter.ToString (cms.ContentInfo.Content), "ContentInfo.Content");
  121. Assert.AreEqual (1, cms.SignerInfos.Count, "SignerInfos.Count");
  122. Assert.AreEqual (ee, cms.SignerInfos[0].Certificate, "SignerInfos[0].Certificate");
  123. Assert.AreEqual (0, cms.SignerInfos[0].CounterSignerInfos.Count, "SignerInfos[0].CounterSignerInfos.Count");
  124. Assert.AreEqual ("1.3.14.3.2.26", cms.SignerInfos[0].DigestAlgorithm.Value, "cms.SignerInfos[0].DigestAlgorithm");
  125. Assert.AreEqual (0, cms.SignerInfos[0].SignedAttributes.Count, "SignerInfos[0].SignedAttributes.Count");
  126. Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, cms.SignerInfos[0].SignerIdentifier.Type, "SignerInfos[0].SignerIdentifier.Type");
  127. X509IssuerSerial xis = (X509IssuerSerial) cms.SignerInfos[0].SignerIdentifier.Value;
  128. Assert.AreEqual ("CN=Good CA, O=Test Certificates, C=US", xis.IssuerName, "SignerInfos[0].SignerIdentifier.Value.IssuerName");
  129. Assert.AreEqual ("02", xis.SerialNumber, "SignerInfos[0].SignerIdentifier.Value.SerialNumber");
  130. Assert.AreEqual (0, cms.SignerInfos[0].UnsignedAttributes.Count, "SignerInfos[0].UnsignedAttributes.Count");
  131. Assert.AreEqual (1, cms.SignerInfos[0].Version, "SignerInfos[0].Version");
  132. }
  133. [Test]
  134. public void T4_ValidDSASignatures ()
  135. {
  136. byte[] data = GetData ("SignedValidDSASignaturesTest4.eml");
  137. SignedCms cms = new SignedCms ();
  138. cms.Decode (data);
  139. Assert.IsTrue (CheckHash (cms), "CheckHash");
  140. Assert.IsTrue (CheckSignature (cms), "CheckSignature");
  141. X509Certificate2 ee = GetCertificate ("ValidDSASignaturesTest4EE.crt");
  142. // certificates aren't in any particuliar order
  143. Assert.IsTrue (cms.Certificates.Contains (ee), "EE");
  144. Assert.IsTrue (cms.Certificates.Contains (DSACACert), "DSACACert");
  145. Assert.IsFalse (cms.Detached, "Detached");
  146. Assert.AreEqual (1, cms.Version, "Version");
  147. Assert.AreEqual ("1.2.840.113549.1.7.1", cms.ContentInfo.ContentType.Value, "ContentInfo.Oid");
  148. Assert.AreEqual ("43-6F-6E-74-65-6E-74-2D-54-79-70-65-3A-20-74-65-78-74-2F-70-6C-61-69-6E-0D-0A-0D-0A-0D-0A-54-68-69-73-20-69-73-20-61-20-73-61-6D-70-6C-65-20-73-69-67-6E-65-64-20-6D-65-73-73-61-67-65-2E-0D-0A", BitConverter.ToString (cms.ContentInfo.Content), "ContentInfo.Content");
  149. Assert.AreEqual (1, cms.SignerInfos.Count, "SignerInfos.Count");
  150. Assert.AreEqual (ee, cms.SignerInfos[0].Certificate, "SignerInfos[0].Certificate");
  151. Assert.AreEqual (0, cms.SignerInfos[0].CounterSignerInfos.Count, "SignerInfos[0].CounterSignerInfos.Count");
  152. Assert.AreEqual ("1.3.14.3.2.26", cms.SignerInfos[0].DigestAlgorithm.Value, "cms.SignerInfos[0].DigestAlgorithm");
  153. Assert.AreEqual (0, cms.SignerInfos[0].SignedAttributes.Count, "SignerInfos[0].SignedAttributes.Count");
  154. Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, cms.SignerInfos[0].SignerIdentifier.Type, "SignerInfos[0].SignerIdentifier.Type");
  155. X509IssuerSerial xis = (X509IssuerSerial) cms.SignerInfos[0].SignerIdentifier.Value;
  156. Assert.AreEqual ("CN=DSA CA, O=Test Certificates, C=US", xis.IssuerName, "SignerInfos[0].SignerIdentifier.Value.IssuerName");
  157. Assert.AreEqual ("01", xis.SerialNumber, "SignerInfos[0].SignerIdentifier.Value.SerialNumber");
  158. Assert.AreEqual (0, cms.SignerInfos[0].UnsignedAttributes.Count, "SignerInfos[0].UnsignedAttributes.Count");
  159. Assert.AreEqual (1, cms.SignerInfos[0].Version, "SignerInfos[0].Version");
  160. }
  161. [Test]
  162. public void T5_ValidDSAParameterInheritance ()
  163. {
  164. byte[] data = GetData ("SignedValidDSAParameterInheritanceTest5.eml");
  165. SignedCms cms = new SignedCms ();
  166. cms.Decode (data);
  167. Assert.IsTrue (CheckHash (cms), "CheckHash");
  168. Assert.IsTrue (CheckSignature (cms), "CheckSignature");
  169. X509Certificate2 ee = GetCertificate ("ValidDSAParameterInheritanceTest5EE.crt");
  170. // certificates aren't in any particuliar order
  171. Assert.IsTrue (cms.Certificates.Contains (ee), "EE");
  172. Assert.IsTrue (cms.Certificates.Contains (DSAParametersInheritedCACert), "DSAParametersInheritedCACert");
  173. Assert.IsTrue (cms.Certificates.Contains (DSACACert), "DSACACert");
  174. Assert.IsFalse (cms.Detached, "Detached");
  175. Assert.AreEqual (1, cms.Version, "Version");
  176. Assert.AreEqual ("1.2.840.113549.1.7.1", cms.ContentInfo.ContentType.Value, "ContentInfo.Oid");
  177. Assert.AreEqual ("43-6F-6E-74-65-6E-74-2D-54-79-70-65-3A-20-74-65-78-74-2F-70-6C-61-69-6E-0D-0A-0D-0A-0D-0A-54-68-69-73-20-69-73-20-61-20-73-61-6D-70-6C-65-20-73-69-67-6E-65-64-20-6D-65-73-73-61-67-65-2E-0D-0A", BitConverter.ToString (cms.ContentInfo.Content), "ContentInfo.Content");
  178. Assert.AreEqual (1, cms.SignerInfos.Count, "SignerInfos.Count");
  179. Assert.AreEqual (ee, cms.SignerInfos[0].Certificate, "SignerInfos[0].Certificate");
  180. Assert.AreEqual (0, cms.SignerInfos[0].CounterSignerInfos.Count, "SignerInfos[0].CounterSignerInfos.Count");
  181. Assert.AreEqual ("1.3.14.3.2.26", cms.SignerInfos[0].DigestAlgorithm.Value, "cms.SignerInfos[0].DigestAlgorithm");
  182. Assert.AreEqual (0, cms.SignerInfos[0].SignedAttributes.Count, "SignerInfos[0].SignedAttributes.Count");
  183. Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, cms.SignerInfos[0].SignerIdentifier.Type, "SignerInfos[0].SignerIdentifier.Type");
  184. X509IssuerSerial xis = (X509IssuerSerial) cms.SignerInfos[0].SignerIdentifier.Value;
  185. Assert.AreEqual ("CN=DSA Parameters Inherited CA, O=Test Certificates, C=US", xis.IssuerName, "SignerInfos[0].SignerIdentifier.Value.IssuerName");
  186. Assert.AreEqual ("01", xis.SerialNumber, "SignerInfos[0].SignerIdentifier.Value.SerialNumber");
  187. Assert.AreEqual (0, cms.SignerInfos[0].UnsignedAttributes.Count, "SignerInfos[0].UnsignedAttributes.Count");
  188. Assert.AreEqual (1, cms.SignerInfos[0].Version, "SignerInfos[0].Version");
  189. }
  190. [Test]
  191. public void T6_InvalidDSASignatures ()
  192. {
  193. byte[] data = GetData ("SignedInvalidDSASignatureTest6.eml");
  194. SignedCms cms = new SignedCms ();
  195. cms.Decode (data);
  196. Assert.IsTrue (CheckHash (cms), "CheckHash");
  197. Assert.IsFalse (CheckSignature (cms), "CheckSignature");
  198. X509Certificate2 ee = GetCertificate ("InvalidDSASignatureTest6EE.crt");
  199. // certificates aren't in any particuliar order
  200. Assert.IsTrue (cms.Certificates.Contains (ee), "EE");
  201. Assert.IsTrue (cms.Certificates.Contains (DSACACert), "DSACACert");
  202. Assert.IsFalse (cms.Detached, "Detached");
  203. Assert.AreEqual (1, cms.Version, "Version");
  204. Assert.AreEqual ("1.2.840.113549.1.7.1", cms.ContentInfo.ContentType.Value, "ContentInfo.Oid");
  205. Assert.AreEqual ("43-6F-6E-74-65-6E-74-2D-54-79-70-65-3A-20-74-65-78-74-2F-70-6C-61-69-6E-0D-0A-0D-0A-0D-0A-54-68-69-73-20-69-73-20-61-20-73-61-6D-70-6C-65-20-73-69-67-6E-65-64-20-6D-65-73-73-61-67-65-2E-0D-0A", BitConverter.ToString (cms.ContentInfo.Content), "ContentInfo.Content");
  206. Assert.AreEqual (1, cms.SignerInfos.Count, "SignerInfos.Count");
  207. Assert.AreEqual (ee, cms.SignerInfos[0].Certificate, "SignerInfos[0].Certificate");
  208. Assert.AreEqual (0, cms.SignerInfos[0].CounterSignerInfos.Count, "SignerInfos[0].CounterSignerInfos.Count");
  209. Assert.AreEqual ("1.3.14.3.2.26", cms.SignerInfos[0].DigestAlgorithm.Value, "cms.SignerInfos[0].DigestAlgorithm");
  210. Assert.AreEqual (0, cms.SignerInfos[0].SignedAttributes.Count, "SignerInfos[0].SignedAttributes.Count");
  211. Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, cms.SignerInfos[0].SignerIdentifier.Type, "SignerInfos[0].SignerIdentifier.Type");
  212. X509IssuerSerial xis = (X509IssuerSerial) cms.SignerInfos[0].SignerIdentifier.Value;
  213. Assert.AreEqual ("CN=DSA CA, O=Test Certificates, C=US", xis.IssuerName, "SignerInfos[0].SignerIdentifier.Value.IssuerName");
  214. Assert.AreEqual ("03", xis.SerialNumber, "SignerInfos[0].SignerIdentifier.Value.SerialNumber");
  215. Assert.AreEqual (0, cms.SignerInfos[0].UnsignedAttributes.Count, "SignerInfos[0].UnsignedAttributes.Count");
  216. Assert.AreEqual (1, cms.SignerInfos[0].Version, "SignerInfos[0].Version");
  217. }
  218. }
  219. }
  220. #endif