X509SubjectKeyIdentifierExtensionTest.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. //
  2. // X509SubjectKeyIdentifierExtensionTest.cs
  3. // - NUnit tests for X509SubjectKeyIdentifierExtension
  4. //
  5. // Author:
  6. // Sebastien Pouliot <[email protected]>
  7. //
  8. // Copyright (C) 2005 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;
  33. using System.Security.Cryptography.X509Certificates;
  34. namespace MonoTests.System.Security.Cryptography.X509Certificates {
  35. [TestFixture]
  36. public class X509SubjectKeyIdentifierExtensionTest {
  37. private const string oid = "2.5.29.14";
  38. private const string fname = "Subject Key Identifier";
  39. [Test]
  40. public void ConstructorEmpty ()
  41. {
  42. X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ();
  43. Assert.IsFalse (ski.Critical, "Critical");
  44. Assert.IsNull (ski.RawData, "RawData");
  45. Assert.AreEqual (oid, ski.Oid.Value, "Oid.Value");
  46. Assert.AreEqual (fname, ski.Oid.FriendlyName, "Oid.FriendlyName");
  47. Assert.AreEqual (String.Empty, ski.Format (true), "Format(true)");
  48. Assert.AreEqual (String.Empty, ski.Format (false), "Format(false)");
  49. }
  50. [Test]
  51. public void ConstructorEmpty_SubjectKeyIdentifier ()
  52. {
  53. X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ();
  54. Assert.IsNull (ski.SubjectKeyIdentifier, "SubjectKeyIdentifier");
  55. }
  56. [Test]
  57. public void ConstructorAsnEncodedData ()
  58. {
  59. AsnEncodedData aed = new AsnEncodedData (new byte[] { 0x04, 0x08, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF });
  60. X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension (aed, true);
  61. Assert.IsTrue (ski.Critical, "Critical");
  62. Assert.AreEqual (oid, ski.Oid.Value, "Oid.Value");
  63. Assert.AreEqual (fname, ski.Oid.FriendlyName, "Oid.FriendlyName");
  64. Assert.AreEqual ("04-08-01-23-45-67-89-AB-CD-EF", BitConverter.ToString (ski.RawData), "RawData");
  65. Assert.AreEqual ("0123456789ABCDEF", ski.SubjectKeyIdentifier, "SubjectKeyIdentifier");
  66. Assert.AreEqual ("01 23 45 67 89 ab cd ef" + Environment.NewLine, ski.Format (true), "Format(true)");
  67. Assert.AreEqual ("01 23 45 67 89 ab cd ef", ski.Format (false), "Format(false)");
  68. }
  69. [Test]
  70. [ExpectedException (typeof (CryptographicException))]
  71. public void ConstructorAsnEncodedData_BadAsn ()
  72. {
  73. AsnEncodedData aed = new AsnEncodedData ("1.2.3", new byte[0]);
  74. X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension (aed, true);
  75. Assert.AreEqual (String.Empty, ski.Format (true), "Format(true)");
  76. Assert.AreEqual (String.Empty, ski.Format (false), "Format(false)");
  77. string s = ski.SubjectKeyIdentifier;
  78. }
  79. [Test]
  80. [ExpectedException (typeof (CryptographicException))]
  81. public void ConstructorAsnEncodedData_BadAsnTag ()
  82. {
  83. AsnEncodedData aed = new AsnEncodedData ("1.2.3", new byte[] { 0x05, 0x00 });
  84. X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension (aed, true);
  85. Assert.AreEqual ("0500", ski.Format (true), "Format(true)");
  86. Assert.AreEqual ("0500", ski.Format (false), "Format(false)");
  87. string s = ski.SubjectKeyIdentifier;
  88. }
  89. [Test]
  90. [ExpectedException (typeof (CryptographicException))]
  91. public void ConstructorAsnEncodedData_BadAsnLength ()
  92. {
  93. AsnEncodedData aed = new AsnEncodedData ("1.2.3", new byte[] { 0x30, 0x01 });
  94. X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension (aed, true);
  95. Assert.AreEqual ("3001", ski.Format (true), "Format(true)");
  96. Assert.AreEqual ("3001", ski.Format (false), "Format(false)");
  97. string s = ski.SubjectKeyIdentifier;
  98. }
  99. [Test]
  100. public void ConstructorAsnEncodedData_SmallestValid ()
  101. {
  102. AsnEncodedData aed = new AsnEncodedData ("1.2.3", new byte[] { 0x04, 0x00 });
  103. X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension (aed, true);
  104. Assert.AreEqual (String.Empty, ski.SubjectKeyIdentifier, "SubjectKeyIdentifier");
  105. Assert.AreEqual ("04-00", BitConverter.ToString (ski.RawData), "RawData");
  106. Assert.AreEqual ("Information Not Available", ski.Format (true), "Format(true)");
  107. Assert.AreEqual ("Information Not Available", ski.Format (false), "Format(false)");
  108. }
  109. [Test]
  110. [ExpectedException (typeof (NullReferenceException))]
  111. public void ConstructorAsnEncodedData_Null ()
  112. {
  113. X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ((AsnEncodedData)null, true);
  114. }
  115. [Test]
  116. [ExpectedException (typeof (ArgumentNullException))]
  117. public void ConstructorByteArray_Null ()
  118. {
  119. X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ((byte[])null, true);
  120. }
  121. [Test]
  122. [ExpectedException (typeof (ArgumentException))]
  123. public void ConstructorByteArray_Empty ()
  124. {
  125. X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension (new byte[0], true);
  126. }
  127. [Test]
  128. public void ConstructorByteArray_20 ()
  129. {
  130. X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension (new byte[20], true);
  131. Assert.IsTrue (ski.Critical, "Critical");
  132. 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");
  133. Assert.AreEqual (oid, ski.Oid.Value, "Oid.Value");
  134. Assert.AreEqual (fname, ski.Oid.FriendlyName, "Oid.FriendlyName");
  135. Assert.AreEqual ("0000000000000000000000000000000000000000", ski.SubjectKeyIdentifier, "SubjectKeyIdentifier");
  136. 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)");
  137. 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)");
  138. }
  139. [Test]
  140. [ExpectedException (typeof (ArgumentNullException))]
  141. public void ConstructorString_Null ()
  142. {
  143. X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ((String)null, true);
  144. }
  145. [Test]
  146. [ExpectedException (typeof (ArgumentException))]
  147. public void ConstructorString_Empty ()
  148. {
  149. X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension (String.Empty, true);
  150. }
  151. [Test]
  152. [ExpectedException (typeof (ArgumentException))]
  153. public void ConstructorString_Single ()
  154. {
  155. X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ("f", false);
  156. }
  157. [Test]
  158. public void ConstructorString ()
  159. {
  160. X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ("ffFFfFFf", false);
  161. Assert.IsFalse (ski.Critical, "Critical");
  162. Assert.AreEqual ("04-04-FF-FF-FF-FF", BitConverter.ToString (ski.RawData), "RawData");
  163. Assert.AreEqual (oid, ski.Oid.Value, "Oid.Value");
  164. Assert.AreEqual (fname, ski.Oid.FriendlyName, "Oid.FriendlyName");
  165. Assert.AreEqual ("FFFFFFFF", ski.SubjectKeyIdentifier, "SubjectKeyIdentifier");
  166. Assert.AreEqual ("ff ff ff ff" + Environment.NewLine, ski.Format (true), "Format(true)");
  167. Assert.AreEqual ("ff ff ff ff", ski.Format (false), "Format(false)");
  168. }
  169. [Test]
  170. public void ConstructorString_NotHex ()
  171. {
  172. X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ("Mono::", true);
  173. Assert.IsTrue (ski.Critical, "Critical");
  174. Assert.AreEqual ("04-03-FF-FF-FF", BitConverter.ToString (ski.RawData), "RawData");
  175. Assert.AreEqual (oid, ski.Oid.Value, "Oid.Value");
  176. Assert.AreEqual (fname, ski.Oid.FriendlyName, "Oid.FriendlyName");
  177. Assert.AreEqual ("FFFFFF", ski.SubjectKeyIdentifier, "SubjectKeyIdentifier");
  178. Assert.AreEqual ("ff ff ff" + Environment.NewLine, ski.Format (true), "Format(true)");
  179. Assert.AreEqual ("ff ff ff", ski.Format (false), "Format(false)");
  180. }
  181. [Test]
  182. [ExpectedException (typeof (ArgumentNullException))]
  183. public void ConstructorPublicKey_Null ()
  184. {
  185. X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ((PublicKey)null, true);
  186. }
  187. [Test]
  188. [ExpectedException (typeof (ArgumentNullException))]
  189. public void ConstructorPublicKeyHash_Null ()
  190. {
  191. X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension (null, X509SubjectKeyIdentifierHashAlgorithm.Sha1, true);
  192. }
  193. [Test]
  194. [ExpectedException (typeof (ArgumentNullException))]
  195. public void WrongExtension_X509KeyUsageExtension ()
  196. {
  197. X509KeyUsageExtension ku = new X509KeyUsageExtension ();
  198. X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ();
  199. ski.CopyFrom (ku);
  200. }
  201. [Test]
  202. public void WrongExtension_X509Extension ()
  203. {
  204. X509Extension ex = new X509Extension ("1.2.3", new byte[0], true);
  205. X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ("www.go-mono.com", false); // odd length
  206. Assert.IsFalse (ski.Critical, "Critical");
  207. Assert.AreEqual ("FFFFFFFFFFFFFF", ski.SubjectKeyIdentifier, "SubjectKeyIdentifier");
  208. Assert.AreEqual ("ff ff ff ff ff ff ff" + Environment.NewLine, ski.Format (true), "Format(true)");
  209. Assert.AreEqual ("ff ff ff ff ff ff ff", ski.Format (false), "Format(false)");
  210. ski.CopyFrom (ex);
  211. Assert.IsTrue (ski.Critical, "Critical");
  212. Assert.AreEqual (String.Empty, BitConverter.ToString (ski.RawData), "RawData");
  213. Assert.AreEqual ("1.2.3", ski.Oid.Value, "Oid.Value");
  214. Assert.IsNull (ski.Oid.FriendlyName, "Oid.FriendlyName");
  215. Assert.AreEqual (String.Empty, ski.Format (true), "Format(true)");
  216. Assert.AreEqual (String.Empty, ski.Format (false), "Format(false)");
  217. }
  218. [Test]
  219. [ExpectedException (typeof (CryptographicException))]
  220. public void WrongExtension_X509Extension_CertificateAuthority ()
  221. {
  222. X509Extension ex = new X509Extension ("1.2.3", new byte[0], true);
  223. X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ();
  224. ski.CopyFrom (ex);
  225. string s = ski.SubjectKeyIdentifier;
  226. }
  227. [Test]
  228. [ExpectedException (typeof (ArgumentException))]
  229. public void WrongAsnEncodedData ()
  230. {
  231. AsnEncodedData aed = new AsnEncodedData (new byte[0]);
  232. X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ("www.mono-project.com", false);
  233. ski.CopyFrom (aed); // note: not the same behaviour than using the constructor!
  234. }
  235. [Test]
  236. [ExpectedException (typeof (ArgumentNullException))]
  237. public void CopyFrom_Null ()
  238. {
  239. X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ();
  240. ski.CopyFrom (null);
  241. }
  242. [Test]
  243. public void CopyFrom_Self ()
  244. {
  245. X509SubjectKeyIdentifierExtension ski = new X509SubjectKeyIdentifierExtension ("ff", true);
  246. Assert.IsTrue (ski.Critical, "Critical");
  247. byte[] raw = ski.RawData;
  248. Assert.AreEqual ("04-01-FF", BitConverter.ToString (raw), "RawData");
  249. AsnEncodedData aed = new AsnEncodedData (raw);
  250. X509SubjectKeyIdentifierExtension copy = new X509SubjectKeyIdentifierExtension (aed, false);
  251. Assert.IsFalse (copy.Critical, "Critical");
  252. Assert.AreEqual ("04-01-FF", BitConverter.ToString (copy.RawData), "copy.RawData");
  253. Assert.AreEqual (oid, copy.Oid.Value, "Oid.Value");
  254. Assert.AreEqual (fname, copy.Oid.FriendlyName, "Oid.FriendlyName");
  255. Assert.AreEqual ("FF", copy.SubjectKeyIdentifier, "SubjectKeyIdentifier");
  256. }
  257. }
  258. }
  259. #endif