Merge pull request #2396 from akoeplinger/flaky-osx-socket-test
[mono.git] / mcs / class / System / Test / System.Security.Cryptography.X509Certificates / X509EnhancedKeyUsageExtensionTest.cs
1 //
2 // X509EnhancedKeyUsageExtensionTest.cs 
3 //      - NUnit tests for X509EnhancedKeyUsageExtension
4 //
5 // Author:
6 //      Sebastien Pouliot  <sebastien@ximian.com>
7 //
8 // Copyright (C) 2005, 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
30
31 using NUnit.Framework;
32
33 using System;
34 using System.Security.Cryptography;
35 using System.Security.Cryptography.X509Certificates;
36
37 namespace MonoTests.System.Security.Cryptography.X509Certificates {
38
39         [TestFixture]
40         public class X509EnhancedKeyUsageExtensionTest {
41
42                 private const string oid = "2.5.29.37";
43                 private const string fname = "Enhanced Key Usage";
44
45                 [Test]
46                 public void ConstructorEmpty ()
47                 {
48                         X509EnhancedKeyUsageExtension eku = new X509EnhancedKeyUsageExtension ();
49                         Assert.IsFalse (eku.Critical, "Critical");
50                         Assert.IsNull (eku.RawData, "RawData");
51                         Assert.AreEqual (oid, eku.Oid.Value, "Oid.Value");
52                         // FIXME: Don't expect that FriendlyName is English. This test fails under non-English Windows.
53                         //Assert.AreEqual (fname, eku.Oid.FriendlyName, "Oid.FriendlyName");
54                         Assert.AreEqual (String.Empty, eku.Format (true), "Format(true)");
55                         Assert.AreEqual (String.Empty, eku.Format (false), "Format(false)");
56                 }
57
58                 [Test]
59                 public void ConstructorEmpty_EnhancedKeyUsages ()
60                 {
61                         X509EnhancedKeyUsageExtension eku = new X509EnhancedKeyUsageExtension ();
62                         Assert.AreEqual (0, eku.EnhancedKeyUsages.Count, "EnhancedKeyUsages");
63                 }
64
65                 [Test]
66                 public void ConstructorAsnEncodedData ()
67                 {
68                         AsnEncodedData aed = new AsnEncodedData (new byte[] { 0x30, 0x05, 0x06, 0x03, 0x2A, 0x03, 0x04 });
69                         X509EnhancedKeyUsageExtension eku = new X509EnhancedKeyUsageExtension (aed, true);
70                         Assert.IsTrue (eku.Critical, "Critical");
71                         Assert.AreEqual (7, eku.RawData.Length, "RawData");     // original Oid ignored
72                         Assert.AreEqual (oid, eku.Oid.Value, "Oid.Value");
73                         // FIXME: Don't expect that FriendlyName is English. This test fails under non-English Windows.
74                         //Assert.AreEqual (fname, eku.Oid.FriendlyName, "Oid.FriendlyName");
75                         Assert.AreEqual (1, eku.EnhancedKeyUsages.Count, "EnhancedKeyUsages");
76                         Assert.AreEqual ("1.2.3.4", eku.EnhancedKeyUsages[0].Value, "EnhancedKeyUsages Oid");
77                         // FIXME: Don't expect that FriendlyName is English. This test fails under non-English Windows.
78                         //Assert.AreEqual ("Unknown Key Usage (1.2.3.4)" + Environment.NewLine, eku.Format (true), "Format(true)");
79                         //Assert.AreEqual ("Unknown Key Usage (1.2.3.4)", eku.Format (false), "Format(false)");
80                 }
81
82                 [Test]
83                 [ExpectedException (typeof (CryptographicException))]
84                 public void ConstructorAsnEncodedData_BadAsn ()
85                 {
86                         AsnEncodedData aed = new AsnEncodedData ("1.2.3", new byte[0]);
87                         X509EnhancedKeyUsageExtension eku = new X509EnhancedKeyUsageExtension (aed, true);
88                         Assert.AreEqual (String.Empty, eku.Format (true), "Format(true)");
89                         Assert.AreEqual (String.Empty, eku.Format (false), "Format(false)");
90                         OidCollection oc = eku.EnhancedKeyUsages;
91                 }
92
93                 [Test]
94                 [ExpectedException (typeof (CryptographicException))]
95                 public void ConstructorAsnEncodedData_BadAsnTag ()
96                 {
97                         AsnEncodedData aed = new AsnEncodedData ("1.2.3", new byte[] { 0x05, 0x00 });
98                         X509EnhancedKeyUsageExtension eku = new X509EnhancedKeyUsageExtension (aed, true);
99                         OidCollection oc = eku.EnhancedKeyUsages;
100                 }
101
102                 [Test]
103                 [ExpectedException (typeof (CryptographicException))]
104                 public void ConstructorAsnEncodedData_BadAsnLength ()
105                 {
106                         AsnEncodedData aed = new AsnEncodedData ("1.2.3", new byte[] { 0x30, 0x01 });
107                         X509EnhancedKeyUsageExtension eku = new X509EnhancedKeyUsageExtension (aed, true);
108                         OidCollection oc = eku.EnhancedKeyUsages;
109                 }
110
111                 [Test]
112                 [ExpectedException (typeof (NullReferenceException))]
113                 public void ConstructorAsnEncodedData_Null ()
114                 {
115                         X509EnhancedKeyUsageExtension eku = new X509EnhancedKeyUsageExtension ((AsnEncodedData)null, true);
116                 }
117
118                 [Test]
119                 [ExpectedException (typeof (ArgumentNullException))]
120                 public void ConstructorOidCollection_Null ()
121                 {
122                         X509EnhancedKeyUsageExtension eku = new X509EnhancedKeyUsageExtension ((OidCollection)null, true);
123                 }
124
125                 [Test]
126                 public void ConstructorOidCollection ()
127                 {
128                         OidCollection oc = new OidCollection ();
129                         X509EnhancedKeyUsageExtension eku = new X509EnhancedKeyUsageExtension (oc, true);
130                         Assert.AreEqual ("30-00", BitConverter.ToString (eku.RawData), "RawData");
131                         Assert.AreEqual (0, eku.EnhancedKeyUsages.Count, "Count 0");
132                         // FIXME: Don't expect that FriendlyName is English. This test fails under non-English Windows.
133                         //Assert.AreEqual ("Information Not Available", eku.Format (true), "Format(true)");
134                         //Assert.AreEqual ("Information Not Available", eku.Format (false), "Format(false)");
135                         oc.Add (new Oid ("1.2.3.4"));
136                         Assert.AreEqual (0, eku.EnhancedKeyUsages.Count, "Count still 0");
137                         int n = eku.EnhancedKeyUsages.Add (new Oid ("1.2.3"));
138                         Assert.AreEqual (0, n, "Add");
139                         Assert.AreEqual (0, eku.EnhancedKeyUsages.Count, "Count again 0");      // readonly!
140                         Assert.AreEqual (1, oc.Count, "Count 1 - oc");
141                         Assert.AreEqual ("1.2.3.4", oc [0].Value, "Value - oc");
142
143                         oc.Add (new Oid ("1.3.6.1.5.5.7.3.1"));
144                         eku = new X509EnhancedKeyUsageExtension (oc, true);
145                         Assert.AreEqual (2, eku.EnhancedKeyUsages.Count, "Count 2");
146                         Assert.AreEqual ("1.2.3.4", eku.EnhancedKeyUsages[0].Value, "Value - 1");
147                         Assert.AreEqual ("1.3.6.1.5.5.7.3.1", eku.EnhancedKeyUsages[1].Value, "Value - 2");
148                         // FIXME: Don't expect that FriendlyName is English. This test fails under non-English Windows.
149                         //Assert.AreEqual ("Unknown Key Usage (1.2.3.4)" + Environment.NewLine + "Server Authentication (1.3.6.1.5.5.7.3.1)" + Environment.NewLine,
150                         //      eku.Format (true), "Format(true)");
151                         //Assert.AreEqual ("Unknown Key Usage (1.2.3.4), Server Authentication (1.3.6.1.5.5.7.3.1)", eku.Format (false), "Format(false)");
152                 }
153
154                 [Test]
155                 [ExpectedException (typeof (ArgumentNullException))]
156                 public void WrongExtension_X509EnhancedKeyUsageExtension ()
157                 {
158                         X509KeyUsageExtension ku = new X509KeyUsageExtension ();
159                         X509EnhancedKeyUsageExtension eku = new X509EnhancedKeyUsageExtension ();
160                         eku.CopyFrom (ku);
161                 }
162
163                 [Test]
164                 public void WrongExtension_X509Extension ()
165                 {
166                         X509Extension ex = new X509Extension ("1.2.3", new byte[0], true);
167                         OidCollection oc = new OidCollection ();
168                         oc.Add (new Oid ("1.2.3.4"));
169                         X509EnhancedKeyUsageExtension eku = new X509EnhancedKeyUsageExtension (oc, false);
170                         Assert.AreEqual (1, eku.EnhancedKeyUsages.Count, "EnhancedKeyUsages");
171                         Assert.IsFalse (eku.Critical, "Critical");
172                         eku.CopyFrom (ex);
173                         Assert.IsTrue (eku.Critical, "Critical");
174                         Assert.AreEqual (String.Empty, BitConverter.ToString (eku.RawData), "RawData");
175                         Assert.AreEqual ("1.2.3", eku.Oid.Value, "Oid.Value");
176                         Assert.IsNull (eku.Oid.FriendlyName, "Oid.FriendlyName");
177                 }
178
179                 [Test]
180                 [ExpectedException (typeof (CryptographicException))]
181                 public void WrongExtension_X509Extension_KeyUsages ()
182                 {
183                         X509Extension ex = new X509Extension ("1.2.3", new byte[0], true);
184                         X509EnhancedKeyUsageExtension eku = new X509EnhancedKeyUsageExtension ();
185                         eku.CopyFrom (ex);
186                         Assert.AreEqual (0, eku.EnhancedKeyUsages.Count, "EnhancedKeyUsages");
187                 }
188
189                 [Test]
190                 [ExpectedException (typeof (ArgumentException))]
191                 public void WrongAsnEncodedData ()
192                 {
193                         AsnEncodedData aed = new AsnEncodedData (new byte[0]);
194                         X509EnhancedKeyUsageExtension eku = new X509EnhancedKeyUsageExtension (new OidCollection (), true);
195                         eku.CopyFrom (aed); // note: not the same behaviour than using the constructor!
196                 }
197
198                 [Test]
199                 [ExpectedException (typeof (ArgumentNullException))]
200                 public void CopyFrom_Null ()
201                 {
202                         X509EnhancedKeyUsageExtension eku = new X509EnhancedKeyUsageExtension ();
203                         eku.CopyFrom (null);
204                 }
205
206                 [Test]
207                 public void CopyFrom_Self ()
208                 {
209                         OidCollection oc = new OidCollection ();
210                         oc.Add (new Oid ("1.2.3.4"));
211                         X509EnhancedKeyUsageExtension eku = new X509EnhancedKeyUsageExtension (oc, true);
212                         Assert.IsTrue (eku.Critical, "Critical");
213                         byte[] raw = eku.RawData;
214                         Assert.AreEqual ("30-05-06-03-2A-03-04", BitConverter.ToString (raw), "RawData");
215
216                         AsnEncodedData aed = new AsnEncodedData (raw);
217                         X509EnhancedKeyUsageExtension copy = new X509EnhancedKeyUsageExtension (aed, false);
218                         Assert.IsFalse (copy.Critical, "Critical");
219                         Assert.AreEqual (7, copy.RawData.Length, "RawData");    // original Oid ignored
220                         Assert.AreEqual (oid, copy.Oid.Value, "Oid.Value");
221                         // FIXME: Don't expect that FriendlyName is English. This test fails under non-English Windows.
222                         //Assert.AreEqual (fname, copy.Oid.FriendlyName, "Oid.FriendlyName");
223                         Assert.AreEqual (1, copy.EnhancedKeyUsages.Count, "EnhancedKeyUsages");
224                         Assert.AreEqual ("1.2.3.4", copy.EnhancedKeyUsages[0].Value, "EnhancedKeyUsages Oid");
225                 }
226
227 #if !MOBILE
228                 [Test]
229                 public void CreateViaCryptoConfig ()
230                 {
231                         // extensions can be created with CryptoConfig
232                         AsnEncodedData aed = new AsnEncodedData (new byte[] { 0x30, 0x05, 0x06, 0x03, 0x2A, 0x03, 0x04 });
233                         X509EnhancedKeyUsageExtension eku = (X509EnhancedKeyUsageExtension) CryptoConfig.CreateFromName (oid, new object[2] { aed, true });
234                         Assert.IsTrue (eku.Critical, "Critical");
235                         Assert.AreEqual (7, eku.RawData.Length, "RawData");     // original Oid ignored
236                         Assert.AreEqual (oid, eku.Oid.Value, "Oid.Value");
237                         Assert.AreEqual (1, eku.EnhancedKeyUsages.Count, "EnhancedKeyUsages");
238                         Assert.AreEqual ("1.2.3.4", eku.EnhancedKeyUsages[0].Value, "EnhancedKeyUsages Oid");
239                 }
240 #endif
241         }
242 }
243