[bcl] Remove more NET_2_0 checks from class libs
[mono.git] / mcs / class / System.Security / Test / System.Security.Cryptography.Pkcs / CmsSignerTest.cs
1 //
2 // CmsSignerTest.cs - NUnit tests for CmsSigner
3 //
4 // Author:
5 //      Sebastien Pouliot  <sebastien@ximian.com>
6 //
7 // (C) 2003 Motus Technologies Inc. (http://www.motus.com)
8 // Copyright (C) 2004 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
30
31 using NUnit.Framework;
32
33 using System;
34 using System.Collections;
35 using System.Security.Cryptography;
36 using System.Security.Cryptography.Pkcs;
37 using System.Security.Cryptography.X509Certificates;
38
39 namespace MonoTests.System.Security.Cryptography.Pkcs {
40
41         [TestFixture]
42         public class CmsSignerTest {
43
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";
49
50                 [Test]
51                 public void ConstructorEmpty () 
52                 {
53                         CmsSigner ps = new CmsSigner ();
54                         // default properties
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");
62                 }
63
64                 [Test]
65                 public void ConstructorIssuerAndSerialNumber () 
66                 {
67                         CmsSigner ps = new CmsSigner (SubjectIdentifierType.IssuerAndSerialNumber);
68                         // default properties
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");
76                 }
77
78                 [Test]
79                 public void ConstructorSubjectKeyIdentifier () 
80                 {
81                         CmsSigner ps = new CmsSigner (SubjectIdentifierType.SubjectKeyIdentifier);
82                         // default properties
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");
90                 }
91
92                 [Test]
93                 public void ConstructorUnknown ()
94                 {
95                         CmsSigner ps = new CmsSigner (SubjectIdentifierType.Unknown);
96                         // default properties
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");
105                 }
106
107                 // TODO: return valid x509 certifiate with private key
108                 private X509Certificate2 GetValidCertificateWithPrivateKey () 
109                 {
110                         X509Certificate2 x509 = new X509Certificate2 ();
111                         return x509;
112                 }
113
114                 [Test]
115                 public void ConstructorX509CertificateEx () 
116                 {
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");
127                 }
128
129                 [Test]
130                 public void ConstructorX509CertificateExEmpty () 
131                 {
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");
142                 }
143
144                 [Test]
145                 //BUG [ExpectedException (typeof (ArgumentNullException))]
146                 public void ConstructorX509CertificateExNull () 
147                 {
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");
158                 }
159
160                 [Test]
161                 public void ConstructorIssuerAndSerialNumberX509CertificateEx () 
162                 {
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");
173                 }
174
175                 [Test]
176                 public void ConstructorSubjectKeyIdentifierX509CertificateEx () 
177                 {
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");
188                 }
189
190                 [Test]
191                 public void ConstructorUnknownX509CertificateEx () 
192                 {
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");
204                 }
205
206                 [Test]
207                 //BUG [ExpectedException (typeof (ArgumentNullException))]
208                 public void ConstructorIssuerAndSerialNumberX509CertificateExNull () 
209                 {
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");
219                 }
220
221                 [Test]
222                 public void SignedAttributes ()
223                 {
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");
228                 }
229
230                 [Test]
231                 public void Certificate () 
232                 {
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");
239                 }
240
241                 [Test]
242                 public void Digest () 
243                 {
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");
250                 }
251
252                 [Test]
253                 public void IncludeOption () 
254                 {
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");
264                 }
265
266                 [Test]
267                 public void SubjectIdentifierTypeProperty () 
268                 {
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");
274                 }
275
276                 [Test]
277                 [ExpectedException (typeof (ArgumentException))]
278                 public void SubjectIdentifierTypeUnknown () 
279                 {
280                         CmsSigner ps = new CmsSigner ();
281                         ps.SignerIdentifierType = SubjectIdentifierType.Unknown;
282                 }
283
284                 [Test]
285                 public void UnauthenticatedAttributes () 
286                 {
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");
291                 }
292         }
293 }
294