2 // X509SubjectKeyIdentifierExtensionTest.cs
3 // - NUnit tests for X509SubjectKeyIdentifierExtension
6 // Sebastien Pouliot <sebastien@ximian.com>
8 // Copyright (C) 2005, 2006 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.Security.Cryptography;
35 using System.Security.Cryptography.X509Certificates;
38 namespace MonoTests.System.Security.Cryptography.X509Certificates {
41 public class X509SubjectKeyIdentifierExtensionTest {
43 private const string oid = "2.5.29.14";
44 private const string fname = "Subject Key Identifier";
46 private PublicKey pk1;
49 public void FixtureSetUp ()
51 pk1 = new X509Certificate2 (Encoding.ASCII.GetBytes (X509Certificate2Test.base64_cert)).PublicKey;
55 public void ConstructorEmpty ()
57 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ();
58 Assert.IsFalse (ski.Critical, "Critical");
59 Assert.IsNull (ski.RawData, "RawData");
60 Assert.AreEqual (oid, ski.Oid.Value, "Oid.Value");
61 // FIXME: Don't expect that FriendlyName is English. This test fails under non-English Windows.
62 //Assert.AreEqual (fname, ski.Oid.FriendlyName, "Oid.FriendlyName");
63 Assert.AreEqual (String.Empty, ski.Format (true), "Format(true)");
64 Assert.AreEqual (String.Empty, ski.Format (false), "Format(false)");
68 public void ConstructorEmpty_SubjectKeyIdentifier ()
70 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ();
71 Assert.IsNull (ski.SubjectKeyIdentifier, "SubjectKeyIdentifier");
75 public void ConstructorAsnEncodedData ()
77 AsnEncodedData aed = new AsnEncodedData (new byte[] { 0x04, 0x08, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF });
78 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension (aed, true);
79 Assert.IsTrue (ski.Critical, "Critical");
80 Assert.AreEqual (oid, ski.Oid.Value, "Oid.Value");
81 // FIXME: Don't expect that FriendlyName is English. This test fails under non-English Windows.
82 //Assert.AreEqual (fname, ski.Oid.FriendlyName, "Oid.FriendlyName");
83 Assert.AreEqual ("04-08-01-23-45-67-89-AB-CD-EF", BitConverter.ToString (ski.RawData), "RawData");
84 Assert.AreEqual ("0123456789ABCDEF", ski.SubjectKeyIdentifier, "SubjectKeyIdentifier");
85 Assert.AreEqual ("01 23 45 67 89 ab cd ef" + Environment.NewLine, ski.Format (true), "Format(true)");
86 Assert.AreEqual ("01 23 45 67 89 ab cd ef", ski.Format (false), "Format(false)");
90 [ExpectedException (typeof (CryptographicException))]
91 public void ConstructorAsnEncodedData_BadAsn ()
93 AsnEncodedData aed = new AsnEncodedData ("1.2.3", new byte[0]);
94 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension (aed, true);
95 Assert.AreEqual (String.Empty, ski.Format (true), "Format(true)");
96 Assert.AreEqual (String.Empty, ski.Format (false), "Format(false)");
97 string s = ski.SubjectKeyIdentifier;
101 [ExpectedException (typeof (CryptographicException))]
102 public void ConstructorAsnEncodedData_BadAsnTag ()
104 AsnEncodedData aed = new AsnEncodedData ("1.2.3", new byte[] { 0x05, 0x00 });
105 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension (aed, true);
106 Assert.AreEqual ("0500", ski.Format (true), "Format(true)");
107 Assert.AreEqual ("0500", ski.Format (false), "Format(false)");
108 string s = ski.SubjectKeyIdentifier;
112 [ExpectedException (typeof (CryptographicException))]
113 public void ConstructorAsnEncodedData_BadAsnLength ()
115 AsnEncodedData aed = new AsnEncodedData ("1.2.3", new byte[] { 0x30, 0x01 });
116 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension (aed, true);
117 Assert.AreEqual ("3001", ski.Format (true), "Format(true)");
118 Assert.AreEqual ("3001", ski.Format (false), "Format(false)");
119 string s = ski.SubjectKeyIdentifier;
123 public void ConstructorAsnEncodedData_SmallestValid ()
125 AsnEncodedData aed = new AsnEncodedData ("1.2.3", new byte[] { 0x04, 0x00 });
126 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension (aed, true);
127 Assert.AreEqual (String.Empty, ski.SubjectKeyIdentifier, "SubjectKeyIdentifier");
128 Assert.AreEqual ("04-00", BitConverter.ToString (ski.RawData), "RawData");
129 // FIXME: Don't expect that FriendlyName is English. This test fails under non-English Windows.
130 //Assert.AreEqual ("Information Not Available", ski.Format (true), "Format(true)");
131 //Assert.AreEqual ("Information Not Available", ski.Format (false), "Format(false)");
135 [ExpectedException (typeof (NullReferenceException))]
136 public void ConstructorAsnEncodedData_Null ()
138 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ((AsnEncodedData)null, true);
142 [ExpectedException (typeof (ArgumentNullException))]
143 public void ConstructorByteArray_Null ()
145 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ((byte[])null, true);
149 [ExpectedException (typeof (ArgumentException))]
150 public void ConstructorByteArray_Empty ()
152 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension (new byte[0], true);
156 public void ConstructorByteArray_20 ()
158 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension (new byte[20], true);
159 Assert.IsTrue (ski.Critical, "Critical");
160 Assert.AreEqual ("04-14-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00", BitConverter.ToString (ski.RawData), "RawData");
161 Assert.AreEqual (oid, ski.Oid.Value, "Oid.Value");
162 // FIXME: Don't expect that FriendlyName is English. This test fails under non-English Windows.
163 //Assert.AreEqual (fname, ski.Oid.FriendlyName, "Oid.FriendlyName");
164 Assert.AreEqual ("0000000000000000000000000000000000000000", ski.SubjectKeyIdentifier, "SubjectKeyIdentifier");
165 Assert.AreEqual ("00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00" + Environment.NewLine, ski.Format (true), "Format(true)");
166 Assert.AreEqual ("00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00", ski.Format (false), "Format(false)");
170 [ExpectedException (typeof (ArgumentNullException))]
171 public void ConstructorString_Null ()
173 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ((String)null, true);
177 [ExpectedException (typeof (ArgumentException))]
178 public void ConstructorString_Empty ()
180 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension (String.Empty, true);
184 [ExpectedException (typeof (ArgumentException))]
185 public void ConstructorString_Single ()
187 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ("f", false);
191 public void ConstructorString ()
193 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ("ffFFfFFf", false);
194 Assert.IsFalse (ski.Critical, "Critical");
195 Assert.AreEqual ("04-04-FF-FF-FF-FF", BitConverter.ToString (ski.RawData), "RawData");
196 Assert.AreEqual (oid, ski.Oid.Value, "Oid.Value");
197 // FIXME: Don't expect that FriendlyName is English. This test fails under non-English Windows.
198 //Assert.AreEqual (fname, ski.Oid.FriendlyName, "Oid.FriendlyName");
199 Assert.AreEqual ("FFFFFFFF", ski.SubjectKeyIdentifier, "SubjectKeyIdentifier");
200 Assert.AreEqual ("ff ff ff ff" + Environment.NewLine, ski.Format (true), "Format(true)");
201 Assert.AreEqual ("ff ff ff ff", ski.Format (false), "Format(false)");
205 public void ConstructorString_NotHex ()
207 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ("Mono::", true);
208 Assert.IsTrue (ski.Critical, "Critical");
209 Assert.AreEqual ("04-03-FF-FF-FF", BitConverter.ToString (ski.RawData), "RawData");
210 Assert.AreEqual (oid, ski.Oid.Value, "Oid.Value");
211 // FIXME: Don't expect that FriendlyName is English. This test fails under non-English Windows.
212 //Assert.AreEqual (fname, ski.Oid.FriendlyName, "Oid.FriendlyName");
213 Assert.AreEqual ("FFFFFF", ski.SubjectKeyIdentifier, "SubjectKeyIdentifier");
214 Assert.AreEqual ("ff ff ff" + Environment.NewLine, ski.Format (true), "Format(true)");
215 Assert.AreEqual ("ff ff ff", ski.Format (false), "Format(false)");
219 [ExpectedException (typeof (ArgumentNullException))]
220 public void ConstructorPublicKey_Null ()
222 new X509SubjectKeyIdentifierExtension ((PublicKey)null, true);
226 [ExpectedException (typeof (ArgumentNullException))]
227 public void ConstructorPublicKeyHash_Null ()
229 new X509SubjectKeyIdentifierExtension (null, X509SubjectKeyIdentifierHashAlgorithm.Sha1, true);
233 [ExpectedException (typeof (ArgumentException))]
234 public void ConstructorPublicKeyHash_BadX509SubjectKeyIdentifierHashAlgorithm ()
236 new X509SubjectKeyIdentifierExtension (pk1, (X509SubjectKeyIdentifierHashAlgorithm)Int32.MinValue, true);
240 public void ConstructorPublicKeyHash_Critical ()
242 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension (pk1, true);
243 Assert.IsTrue (ski.Critical, "Critical");
244 Assert.AreEqual ("2.5.29.14", ski.Oid.Value, "Oid");
245 Assert.AreEqual ("4A0200E2E8D33DBA05FC37BDC36DCF47212D77D1", ski.SubjectKeyIdentifier, "SubjectKeyIdentifier");
246 Assert.AreEqual ("04-14-4A-02-00-E2-E8-D3-3D-BA-05-FC-37-BD-C3-6D-CF-47-21-2D-77-D1", BitConverter.ToString (ski.RawData), "RawData");
250 public void ConstructorPublicKeyHash_Sha1_Critical ()
252 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension (pk1, X509SubjectKeyIdentifierHashAlgorithm.Sha1, true);
253 Assert.IsTrue (ski.Critical, "Critical");
254 Assert.AreEqual ("2.5.29.14", ski.Oid.Value, "Oid");
255 Assert.AreEqual ("4A0200E2E8D33DBA05FC37BDC36DCF47212D77D1", ski.SubjectKeyIdentifier, "SubjectKeyIdentifier");
256 Assert.AreEqual ("04-14-4A-02-00-E2-E8-D3-3D-BA-05-FC-37-BD-C3-6D-CF-47-21-2D-77-D1", BitConverter.ToString (ski.RawData), "RawData");
260 public void ConstructorPublicKeyHash_ShortSha1_Critical ()
262 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension (pk1, X509SubjectKeyIdentifierHashAlgorithm.ShortSha1, true);
263 Assert.IsTrue (ski.Critical, "Critical");
264 Assert.AreEqual ("2.5.29.14", ski.Oid.Value, "Oid");
265 Assert.AreEqual ("436DCF47212D77D1", ski.SubjectKeyIdentifier, "SubjectKeyIdentifier");
266 Assert.AreEqual ("04-08-43-6D-CF-47-21-2D-77-D1", BitConverter.ToString (ski.RawData), "RawData");
270 public void ConstructorPublicKeyHash_CapiSha1_Critical ()
272 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension (pk1, X509SubjectKeyIdentifierHashAlgorithm.CapiSha1, true);
273 Assert.IsTrue (ski.Critical, "Critical");
274 Assert.AreEqual ("2.5.29.14", ski.Oid.Value, "Oid");
275 Assert.AreEqual ("0E73CE0E2E059378FC782707EBF0B4E7AEA652E1", ski.SubjectKeyIdentifier, "SubjectKeyIdentifier");
276 Assert.AreEqual ("04-14-0E-73-CE-0E-2E-05-93-78-FC-78-27-07-EB-F0-B4-E7-AE-A6-52-E1", BitConverter.ToString (ski.RawData), "RawData");
280 public void ConstructorPublicKeyHash ()
282 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension (pk1, false);
283 Assert.IsFalse (ski.Critical, "Critical");
284 Assert.AreEqual ("2.5.29.14", ski.Oid.Value, "Oid");
285 Assert.AreEqual ("4A0200E2E8D33DBA05FC37BDC36DCF47212D77D1", ski.SubjectKeyIdentifier, "SubjectKeyIdentifier");
286 Assert.AreEqual ("04-14-4A-02-00-E2-E8-D3-3D-BA-05-FC-37-BD-C3-6D-CF-47-21-2D-77-D1", BitConverter.ToString (ski.RawData), "RawData");
290 public void ConstructorPublicKeyHash_Sha1 ()
292 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension (pk1, X509SubjectKeyIdentifierHashAlgorithm.Sha1, false);
293 Assert.IsFalse (ski.Critical, "Critical");
294 Assert.AreEqual ("2.5.29.14", ski.Oid.Value, "Oid");
295 Assert.AreEqual ("4A0200E2E8D33DBA05FC37BDC36DCF47212D77D1", ski.SubjectKeyIdentifier, "SubjectKeyIdentifier");
296 Assert.AreEqual ("04-14-4A-02-00-E2-E8-D3-3D-BA-05-FC-37-BD-C3-6D-CF-47-21-2D-77-D1", BitConverter.ToString (ski.RawData), "RawData");
300 public void ConstructorPublicKeyHash_ShortSha1 ()
302 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension (pk1, X509SubjectKeyIdentifierHashAlgorithm.ShortSha1, false);
303 Assert.IsFalse (ski.Critical, "Critical");
304 Assert.AreEqual ("2.5.29.14", ski.Oid.Value, "Oid");
305 Assert.AreEqual ("436DCF47212D77D1", ski.SubjectKeyIdentifier, "SubjectKeyIdentifier");
306 Assert.AreEqual ("04-08-43-6D-CF-47-21-2D-77-D1", BitConverter.ToString (ski.RawData), "RawData");
310 public void ConstructorPublicKeyHash_CapiSha1 ()
312 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension (pk1, X509SubjectKeyIdentifierHashAlgorithm.CapiSha1, false);
313 Assert.IsFalse (ski.Critical, "Critical");
314 Assert.AreEqual ("2.5.29.14", ski.Oid.Value, "Oid");
315 Assert.AreEqual ("0E73CE0E2E059378FC782707EBF0B4E7AEA652E1", ski.SubjectKeyIdentifier, "SubjectKeyIdentifier");
316 Assert.AreEqual ("04-14-0E-73-CE-0E-2E-05-93-78-FC-78-27-07-EB-F0-B4-E7-AE-A6-52-E1", BitConverter.ToString (ski.RawData), "RawData");
320 [ExpectedException (typeof (ArgumentNullException))]
321 public void WrongExtension_X509KeyUsageExtension ()
323 X509KeyUsageExtension ku = new X509KeyUsageExtension ();
324 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ();
329 public void WrongExtension_X509Extension ()
331 X509Extension ex = new X509Extension ("1.2.3", new byte[0], true);
332 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ("www.go-mono.com", false); // odd length
333 Assert.IsFalse (ski.Critical, "Critical");
334 Assert.AreEqual ("FFFFFFFFFFFFFF", ski.SubjectKeyIdentifier, "SubjectKeyIdentifier");
335 Assert.AreEqual ("ff ff ff ff ff ff ff" + Environment.NewLine, ski.Format (true), "Format(true)");
336 Assert.AreEqual ("ff ff ff ff ff ff ff", ski.Format (false), "Format(false)");
339 Assert.IsTrue (ski.Critical, "Critical");
340 Assert.AreEqual (String.Empty, BitConverter.ToString (ski.RawData), "RawData");
341 Assert.AreEqual ("1.2.3", ski.Oid.Value, "Oid.Value");
342 // FIXME: Don't expect that FriendlyName is English. This test fails under non-English Windows.
343 //Assert.IsNull (ski.Oid.FriendlyName, "Oid.FriendlyName");
344 Assert.AreEqual (String.Empty, ski.Format (true), "Format(true)");
345 Assert.AreEqual (String.Empty, ski.Format (false), "Format(false)");
349 [ExpectedException (typeof (CryptographicException))]
350 public void WrongExtension_X509Extension_CertificateAuthority ()
352 X509Extension ex = new X509Extension ("1.2.3", new byte[0], true);
353 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ();
355 string s = ski.SubjectKeyIdentifier;
359 [ExpectedException (typeof (ArgumentException))]
360 public void WrongAsnEncodedData ()
362 AsnEncodedData aed = new AsnEncodedData (new byte[0]);
363 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ("www.mono-project.com", false);
364 ski.CopyFrom (aed); // note: not the same behaviour than using the constructor!
368 [ExpectedException (typeof (ArgumentNullException))]
369 public void CopyFrom_Null ()
371 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ();
376 public void CopyFrom_Self ()
378 X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ("ff", true);
379 Assert.IsTrue (ski.Critical, "Critical");
380 byte[] raw = ski.RawData;
381 Assert.AreEqual ("04-01-FF", BitConverter.ToString (raw), "RawData");
383 AsnEncodedData aed = new AsnEncodedData (raw);
384 X509SubjectKeyIdentifierExtension copy = new X509SubjectKeyIdentifierExtension (aed, false);
385 Assert.IsFalse (copy.Critical, "Critical");
386 Assert.AreEqual ("04-01-FF", BitConverter.ToString (copy.RawData), "copy.RawData");
387 Assert.AreEqual (oid, copy.Oid.Value, "Oid.Value");
388 // FIXME: Don't expect that FriendlyName is English. This test fails under non-English Windows.
389 //Assert.AreEqual (fname, copy.Oid.FriendlyName, "Oid.FriendlyName");
390 Assert.AreEqual ("FF", copy.SubjectKeyIdentifier, "SubjectKeyIdentifier");
395 public void CreateViaCryptoConfig ()
397 // extensions can be created with CryptoConfig
398 AsnEncodedData aed = new AsnEncodedData (new byte[] { 0x04, 0x00 });
399 X509SubjectKeyIdentifierExtension ski = (X509SubjectKeyIdentifierExtension) CryptoConfig.CreateFromName (oid, new object[2] { aed, true });
400 Assert.AreEqual (String.Empty, ski.SubjectKeyIdentifier, "SubjectKeyIdentifier");
401 Assert.AreEqual ("04-00", BitConverter.ToString (ski.RawData), "RawData");