2 // CmsSignerTest.cs - NUnit tests for CmsSigner
5 // Sebastien Pouliot <sebastien@ximian.com>
7 // (C) 2003 Motus Technologies Inc. (http://www.motus.com)
8 // Copyright (C) 2004 Novell, Inc (http://www.novell.com)
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:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
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.
31 using NUnit.Framework;
34 using System.Collections;
35 using System.Security.Cryptography;
36 using System.Security.Cryptography.Pkcs;
37 using System.Security.Cryptography.X509Certificates;
39 namespace MonoTests.System.Security.Cryptography.Pkcs {
42 public class CmsSignerTest {
44 static byte[] asnNull = { 0x05, 0x00 };
45 static string sha1Oid = "1.3.14.3.2.26";
46 static string sha1Name = "sha1";
47 static string rsaOid = "1.2.840.113549.1.1.1";
48 static string rsaName = "RSA";
51 public void ConstructorEmpty ()
53 CmsSigner ps = new CmsSigner ();
55 Assert.AreEqual (0, ps.SignedAttributes.Count, "SignedAttributes");
56 Assert.IsNull (ps.Certificate, "Certificate");
57 Assert.AreEqual (sha1Name, ps.DigestAlgorithm.FriendlyName, "DigestAlgorithm.FriendlyName");
58 Assert.AreEqual (sha1Oid, ps.DigestAlgorithm.Value, "DigestAlgorithm.Value");
59 Assert.AreEqual (X509IncludeOption.ExcludeRoot, ps.IncludeOption, "IncludeOption");
60 Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType, "SignerIdentifierType");
61 Assert.AreEqual (0, ps.UnsignedAttributes.Count, "UnsignedAttributes");
65 public void ConstructorIssuerAndSerialNumber ()
67 CmsSigner ps = new CmsSigner (SubjectIdentifierType.IssuerAndSerialNumber);
69 Assert.AreEqual (0, ps.SignedAttributes.Count, "SignedAttributes");
70 Assert.IsNull (ps.Certificate, "Certificate");
71 Assert.AreEqual (sha1Name, ps.DigestAlgorithm.FriendlyName, "DigestAlgorithm.FriendlyName");
72 Assert.AreEqual (sha1Oid, ps.DigestAlgorithm.Value, "DigestAlgorithm.Value");
73 Assert.AreEqual (X509IncludeOption.ExcludeRoot, ps.IncludeOption, "IncludeOption");
74 Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType, "SignerIdentifierType");
75 Assert.AreEqual (0, ps.UnsignedAttributes.Count, "UnsignedAttributes");
79 public void ConstructorSubjectKeyIdentifier ()
81 CmsSigner ps = new CmsSigner (SubjectIdentifierType.SubjectKeyIdentifier);
83 Assert.AreEqual (0, ps.SignedAttributes.Count, "SignedAttributes");
84 Assert.IsNull (ps.Certificate, "Certificate");
85 Assert.AreEqual (sha1Name, ps.DigestAlgorithm.FriendlyName, "DigestAlgorithm.FriendlyName");
86 Assert.AreEqual (sha1Oid, ps.DigestAlgorithm.Value, "DigestAlgorithm.Value");
87 Assert.AreEqual (X509IncludeOption.ExcludeRoot, ps.IncludeOption, "IncludeOption");
88 Assert.AreEqual (SubjectIdentifierType.SubjectKeyIdentifier, ps.SignerIdentifierType, "SignerIdentifierType");
89 Assert.AreEqual (0, ps.UnsignedAttributes.Count, "UnsignedAttributes");
93 public void ConstructorUnknown ()
95 CmsSigner ps = new CmsSigner (SubjectIdentifierType.Unknown);
97 Assert.AreEqual (0, ps.SignedAttributes.Count, "SignedAttributes");
98 Assert.IsNull (ps.Certificate, "Certificate");
99 Assert.AreEqual (sha1Name, ps.DigestAlgorithm.FriendlyName, "DigestAlgorithm.FriendlyName");
100 Assert.AreEqual (sha1Oid, ps.DigestAlgorithm.Value, "DigestAlgorithm.Value");
101 Assert.AreEqual (X509IncludeOption.ExcludeRoot, ps.IncludeOption, "IncludeOption");
102 // Unknown is converted to IssuerAndSerialNumber
103 Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType, "SignerIdentifierType");
104 Assert.AreEqual (0, ps.UnsignedAttributes.Count, "UnsignedAttributes");
107 // TODO: return valid x509 certifiate with private key
108 private X509Certificate2 GetValidCertificateWithPrivateKey ()
110 X509Certificate2 x509 = new X509Certificate2 ();
115 public void ConstructorX509CertificateEx ()
117 X509Certificate2 x509 = GetValidCertificateWithPrivateKey ();
118 CmsSigner ps = new CmsSigner (x509);
119 // default properties
120 Assert.AreEqual (0, ps.SignedAttributes.Count, "SignedAttributes");
121 Assert.IsNotNull (ps.Certificate, "Certificate");
122 Assert.AreEqual (sha1Name, ps.DigestAlgorithm.FriendlyName, "DigestAlgorithm.FriendlyName");
123 Assert.AreEqual (sha1Oid, ps.DigestAlgorithm.Value, "DigestAlgorithm.Value");
124 Assert.AreEqual (X509IncludeOption.ExcludeRoot, ps.IncludeOption, "IncludeOption");
125 Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType, "SignerIdentifierType");
126 Assert.AreEqual (0, ps.UnsignedAttributes.Count, "UnsignedAttributes");
130 public void ConstructorX509CertificateExEmpty ()
132 X509Certificate2 x509 = new X509Certificate2 (); // empty
133 CmsSigner ps = new CmsSigner (x509);
134 // default properties
135 Assert.AreEqual (0, ps.SignedAttributes.Count, "SignedAttributes");
136 Assert.IsNotNull (ps.Certificate, "Certificate");
137 Assert.AreEqual (sha1Name, ps.DigestAlgorithm.FriendlyName, "DigestAlgorithm.FriendlyName");
138 Assert.AreEqual (sha1Oid, ps.DigestAlgorithm.Value, "DigestAlgorithm.Value");
139 Assert.AreEqual (X509IncludeOption.ExcludeRoot, ps.IncludeOption, "IncludeOption");
140 Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType, "SignerIdentifierType");
141 Assert.AreEqual (0, ps.UnsignedAttributes.Count, "UnsignedAttributes");
145 //BUG [ExpectedException (typeof (ArgumentNullException))]
146 public void ConstructorX509CertificateExNull ()
148 X509Certificate2 x509 = null;
149 CmsSigner ps = new CmsSigner (x509);
150 // default properties
151 Assert.AreEqual (0, ps.SignedAttributes.Count, "SignedAttributes");
152 Assert.IsNull (ps.Certificate, "Certificate");
153 Assert.AreEqual (sha1Name, ps.DigestAlgorithm.FriendlyName, "DigestAlgorithm.FriendlyName");
154 Assert.AreEqual (sha1Oid, ps.DigestAlgorithm.Value, "DigestAlgorithm.Value");
155 Assert.AreEqual (X509IncludeOption.ExcludeRoot, ps.IncludeOption, "IncludeOption");
156 Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType, "SignerIdentifierType");
157 Assert.AreEqual (0, ps.UnsignedAttributes.Count, "UnsignedAttributes");
161 public void ConstructorIssuerAndSerialNumberX509CertificateEx ()
163 X509Certificate2 x509 = GetValidCertificateWithPrivateKey ();
164 CmsSigner ps = new CmsSigner (SubjectIdentifierType.IssuerAndSerialNumber, x509);
165 // default properties
166 Assert.AreEqual (0, ps.SignedAttributes.Count, "SignedAttributes");
167 Assert.IsNotNull (ps.Certificate, "Certificate");
168 Assert.AreEqual (sha1Name, ps.DigestAlgorithm.FriendlyName, "DigestAlgorithm.FriendlyName");
169 Assert.AreEqual (sha1Oid, ps.DigestAlgorithm.Value, "DigestAlgorithm.Value");
170 Assert.AreEqual (X509IncludeOption.ExcludeRoot, ps.IncludeOption, "IncludeOption");
171 Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType, "SignerIdentifierType");
172 Assert.AreEqual (0, ps.UnsignedAttributes.Count, "UnsignedAttributes");
176 public void ConstructorSubjectKeyIdentifierX509CertificateEx ()
178 X509Certificate2 x509 = GetValidCertificateWithPrivateKey ();
179 CmsSigner ps = new CmsSigner (SubjectIdentifierType.SubjectKeyIdentifier, x509);
180 // default properties
181 Assert.AreEqual (0, ps.SignedAttributes.Count, "SignedAttributes");
182 Assert.IsNotNull (ps.Certificate, "Certificate");
183 Assert.AreEqual (sha1Name, ps.DigestAlgorithm.FriendlyName, "DigestAlgorithm.FriendlyName");
184 Assert.AreEqual (sha1Oid, ps.DigestAlgorithm.Value, "DigestAlgorithm.Value");
185 Assert.AreEqual (X509IncludeOption.ExcludeRoot, ps.IncludeOption, "IncludeOption");
186 Assert.AreEqual (SubjectIdentifierType.SubjectKeyIdentifier, ps.SignerIdentifierType, "SignerIdentifierType");
187 Assert.AreEqual (0, ps.UnsignedAttributes.Count, "UnsignedAttributes");
191 public void ConstructorUnknownX509CertificateEx ()
193 X509Certificate2 x509 = GetValidCertificateWithPrivateKey ();
194 CmsSigner ps = new CmsSigner (SubjectIdentifierType.Unknown, x509);
195 // default properties
196 Assert.AreEqual (0, ps.SignedAttributes.Count, "SignedAttributes");
197 Assert.IsNotNull (ps.Certificate, "Certificate");
198 Assert.AreEqual (sha1Name, ps.DigestAlgorithm.FriendlyName, "DigestAlgorithm.FriendlyName");
199 Assert.AreEqual (sha1Oid, ps.DigestAlgorithm.Value, "DigestAlgorithm.Value");
200 Assert.AreEqual (X509IncludeOption.ExcludeRoot, ps.IncludeOption, "IncludeOption");
201 // Unknown is converted to IssuerAndSerialNumber
202 Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType, "SignerIdentifierType");
203 Assert.AreEqual (0, ps.UnsignedAttributes.Count, "UnsignedAttributes");
207 //BUG [ExpectedException (typeof (ArgumentNullException))]
208 public void ConstructorIssuerAndSerialNumberX509CertificateExNull ()
210 CmsSigner ps = new CmsSigner (SubjectIdentifierType.IssuerAndSerialNumber, null);
211 // default properties
212 Assert.AreEqual (0, ps.SignedAttributes.Count, "SignedAttributes");
213 Assert.IsNull (ps.Certificate, "Certificate");
214 Assert.AreEqual (sha1Name, ps.DigestAlgorithm.FriendlyName, "DigestAlgorithm.FriendlyName");
215 Assert.AreEqual (sha1Oid, ps.DigestAlgorithm.Value, "DigestAlgorithm.Value");
216 Assert.AreEqual (X509IncludeOption.ExcludeRoot, ps.IncludeOption, "IncludeOption");
217 Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType, "SignerIdentifierType");
218 Assert.AreEqual (0, ps.UnsignedAttributes.Count, "UnsignedAttributes");
222 public void SignedAttributes ()
224 CmsSigner ps = new CmsSigner ();
225 Assert.AreEqual (0, ps.SignedAttributes.Count, "SignedAttributes=0");
226 ps.SignedAttributes.Add (new Pkcs9DocumentDescription ("mono"));
227 Assert.AreEqual (1, ps.SignedAttributes.Count, "SignedAttributes=1");
231 public void Certificate ()
233 CmsSigner ps = new CmsSigner ();
234 Assert.IsNull (ps.Certificate, "Certificate=default(null)");
235 ps.Certificate = GetValidCertificateWithPrivateKey ();
236 Assert.IsNotNull (ps.Certificate, "Certificate!=null");
237 ps.Certificate = null;
238 Assert.IsNull (ps.Certificate, "Certificate=null");
242 public void Digest ()
244 CmsSigner ps = new CmsSigner ();
245 ps.DigestAlgorithm = new Oid ("1.2.840.113549.2.5");
246 Assert.AreEqual ("md5", ps.DigestAlgorithm.FriendlyName, "DigestAlgorithm.FriendlyName");
247 Assert.AreEqual ("1.2.840.113549.2.5", ps.DigestAlgorithm.Value, "DigestAlgorithm.Value");
248 ps.DigestAlgorithm = null;
249 Assert.IsNull (ps.DigestAlgorithm, "DigestAlgorithm=null");
253 public void IncludeOption ()
255 CmsSigner ps = new CmsSigner ();
256 ps.IncludeOption = X509IncludeOption.EndCertOnly;
257 Assert.AreEqual (X509IncludeOption.EndCertOnly, ps.IncludeOption, "EndCertOnly");
258 ps.IncludeOption = X509IncludeOption.ExcludeRoot;
259 Assert.AreEqual (X509IncludeOption.ExcludeRoot, ps.IncludeOption, "ExcludeRoot");
260 ps.IncludeOption = X509IncludeOption.None;
261 Assert.AreEqual (X509IncludeOption.None, ps.IncludeOption, "None");
262 ps.IncludeOption = X509IncludeOption.WholeChain;
263 Assert.AreEqual (X509IncludeOption.WholeChain, ps.IncludeOption, "WholeChain");
267 public void SubjectIdentifierTypeProperty ()
269 CmsSigner ps = new CmsSigner ();
270 ps.SignerIdentifierType = SubjectIdentifierType.IssuerAndSerialNumber;
271 Assert.AreEqual (SubjectIdentifierType.IssuerAndSerialNumber, ps.SignerIdentifierType, "IssuerAndSerialNumber");
272 ps.SignerIdentifierType = SubjectIdentifierType.SubjectKeyIdentifier;
273 Assert.AreEqual (SubjectIdentifierType.SubjectKeyIdentifier, ps.SignerIdentifierType, "SubjectKeyIdentifier");
277 [ExpectedException (typeof (ArgumentException))]
278 public void SubjectIdentifierTypeUnknown ()
280 CmsSigner ps = new CmsSigner ();
281 ps.SignerIdentifierType = SubjectIdentifierType.Unknown;
285 public void UnauthenticatedAttributes ()
287 CmsSigner ps = new CmsSigner ();
288 Assert.AreEqual (0, ps.UnsignedAttributes.Count, "UnsignedAttributes=0");
289 ps.UnsignedAttributes.Add (new Pkcs9DocumentDescription ("mono"));
290 Assert.AreEqual (1, ps.UnsignedAttributes.Count, "UnsignedAttributes=1");