Merge pull request #1057 from lextm/master
authorSebastien Pouliot <sebastien.pouliot@gmail.com>
Tue, 27 May 2014 00:00:43 +0000 (20:00 -0400)
committerSebastien Pouliot <sebastien.pouliot@gmail.com>
Tue, 27 May 2014 00:00:43 +0000 (20:00 -0400)
[Mono.Security] Added Encode to AuthorityKeyIdentifierExtension and Subj...

mcs/class/Mono.Security/Mono.Security-tests-net_2_0.csproj
mcs/class/Mono.Security/Mono.Security-tests-net_4_0.csproj
mcs/class/Mono.Security/Mono.Security-tests-net_4_5.csproj
mcs/class/Mono.Security/Mono.Security.X509.Extensions/AuthorityKeyIdentifierExtension.cs
mcs/class/Mono.Security/Mono.Security.X509.Extensions/SubjectKeyIdentifierExtension.cs
mcs/class/Mono.Security/Test/Mono.Security.X509.Extensions/AuthorityKeyIdentifierExtensionTest.cs [new file with mode: 0644]
mcs/class/Mono.Security/Test/Mono.Security.X509.Extensions/SubjectKeyIdentifierExtensionTest.cs [new file with mode: 0644]

index a00ab1b55a33083eacf78a41b8539ce2a691e653..3da8463338b3f21468e6b54c4b8acd309676e3b2 100644 (file)
     <Compile Include="Test\Mono.Security.Protocol.Ntlm\Type1MessageTest.cs" />\r
     <Compile Include="Test\Mono.Security.Protocol.Ntlm\Type2MessageTest.cs" />\r
     <Compile Include="Test\Mono.Security.Protocol.Ntlm\Type3MessageTest.cs" />\r
+    <Compile Include="Test\Mono.Security.X509.Extensions\AuthorityKeyIdentifierExtensionTest.cs" />\r
     <Compile Include="Test\Mono.Security.X509.Extensions\BasicConstraintsExtensionTest.cs" />\r
     <Compile Include="Test\Mono.Security.X509.Extensions\ExtendedKeyUsageExtensionTest.cs" />\r
     <Compile Include="Test\Mono.Security.X509.Extensions\KeyUsageExtensionTest.cs" />\r
     <Compile Include="Test\Mono.Security.X509.Extensions\SubjectAltNameExtensionTest.cs" />\r
+    <Compile Include="Test\Mono.Security.X509.Extensions\SubjectKeyIdentifierExtensionTest.cs" />\r
     <Compile Include="Test\Mono.Security.X509\PKCS12Test.cs" />\r
     <Compile Include="Test\Mono.Security.X509\X501NameTest.cs" />\r
     <Compile Include="Test\Mono.Security.X509\X509CertificateTest.cs" />\r
index 4b1f0c56c9a71a7ca7d84694aa39021a8d6b4123..fa6828bdb8a461df196e64bf44774c8fcb7be391 100644 (file)
     <Compile Include="Test\Mono.Security.Protocol.Ntlm\Type1MessageTest.cs" />\r
     <Compile Include="Test\Mono.Security.Protocol.Ntlm\Type2MessageTest.cs" />\r
     <Compile Include="Test\Mono.Security.Protocol.Ntlm\Type3MessageTest.cs" />\r
+    <Compile Include="Test\Mono.Security.X509.Extensions\AuthorityKeyIdentifierExtensionTest.cs" />\r
     <Compile Include="Test\Mono.Security.X509.Extensions\BasicConstraintsExtensionTest.cs" />\r
     <Compile Include="Test\Mono.Security.X509.Extensions\ExtendedKeyUsageExtensionTest.cs" />\r
     <Compile Include="Test\Mono.Security.X509.Extensions\KeyUsageExtensionTest.cs" />\r
     <Compile Include="Test\Mono.Security.X509.Extensions\SubjectAltNameExtensionTest.cs" />\r
+    <Compile Include="Test\Mono.Security.X509.Extensions\SubjectKeyIdentifierExtensionTest.cs" />\r
     <Compile Include="Test\Mono.Security.X509\PKCS12Test.cs" />\r
     <Compile Include="Test\Mono.Security.X509\X501NameTest.cs" />\r
     <Compile Include="Test\Mono.Security.X509\X509CertificateTest.cs" />\r
index 27e8ad50ba5804add70d49516384b6627646c093..9f6dd3aab9c7f7bc086348d1e5edae69ef4a990c 100644 (file)
     <Compile Include="Test\Mono.Security.Protocol.Ntlm\Type1MessageTest.cs" />\r
     <Compile Include="Test\Mono.Security.Protocol.Ntlm\Type2MessageTest.cs" />\r
     <Compile Include="Test\Mono.Security.Protocol.Ntlm\Type3MessageTest.cs" />\r
+    <Compile Include="Test\Mono.Security.X509.Extensions\AuthorityKeyIdentifierExtensionTest.cs" />\r
     <Compile Include="Test\Mono.Security.X509.Extensions\BasicConstraintsExtensionTest.cs" />\r
     <Compile Include="Test\Mono.Security.X509.Extensions\ExtendedKeyUsageExtensionTest.cs" />\r
     <Compile Include="Test\Mono.Security.X509.Extensions\KeyUsageExtensionTest.cs" />\r
     <Compile Include="Test\Mono.Security.X509.Extensions\SubjectAltNameExtensionTest.cs" />\r
+    <Compile Include="Test\Mono.Security.X509.Extensions\SubjectKeyIdentifierExtensionTest.cs" />\r
     <Compile Include="Test\Mono.Security.X509\PKCS12Test.cs" />\r
     <Compile Include="Test\Mono.Security.X509\X501NameTest.cs" />\r
     <Compile Include="Test\Mono.Security.X509\X509CertificateTest.cs" />\r
index fb6f940a1ecbc9f4355bf11602c330229ed75bda..858ee1e7e59895c7cbe55cee79deb47da343127c 100644 (file)
@@ -87,6 +87,18 @@ namespace Mono.Security.X509.Extensions {
                        }
                }
 
+               protected override void Encode ()
+               {
+                       ASN1 seq = new ASN1 (0x30);
+                       if (aki == null) {
+                               throw new InvalidOperationException ("Invalid AuthorityKeyIdentifier extension");
+                       }
+
+                       seq.Add (new ASN1 (0x80, aki));
+                       extnValue = new ASN1 (0x04);
+                       extnValue.Add (seq);
+               }
+
                public override string Name {
                        get { return "Authority Key Identifier"; }
                }
@@ -97,6 +109,7 @@ namespace Mono.Security.X509.Extensions {
                                        return null;
                                return (byte[]) aki.Clone (); 
                        }
+                       set { aki = value; }
                }
 
                public override string ToString () 
index 945111675e3b95e3169422f01a56d1c099bba9a7..8f15c28e34a13d7595f53f073b46fcec1cd19743 100644 (file)
@@ -75,6 +75,17 @@ namespace Mono.Security.X509.Extensions {
                        ski = sequence.Value;
                }
 
+               protected override void Encode ()
+               {
+                       if (ski == null) {
+                               throw new InvalidOperationException ("Invalid SubjectKeyIdentifier extension");
+                       }
+
+                       var seq = new ASN1 (0x04, ski);
+                       extnValue = new ASN1 (0x04);
+                       extnValue.Add (seq);
+               }
+
                public override string Name {
                        get { return "Subject Key Identifier"; }
                }
@@ -85,6 +96,7 @@ namespace Mono.Security.X509.Extensions {
                                        return null;
                                return (byte[]) ski.Clone (); 
                        }
+                       set { ski = value; }
                }
 
                public override string ToString () 
diff --git a/mcs/class/Mono.Security/Test/Mono.Security.X509.Extensions/AuthorityKeyIdentifierExtensionTest.cs b/mcs/class/Mono.Security/Test/Mono.Security.X509.Extensions/AuthorityKeyIdentifierExtensionTest.cs
new file mode 100644 (file)
index 0000000..e095df4
--- /dev/null
@@ -0,0 +1,122 @@
+//
+// AuthorityKeyIdentifierExtensionTest.cs - NUnit Test Cases for 
+//     Mono.Security.X509.Extensions.AuthorityKeyIdentifierExtension
+//
+// Authors:
+//     Lex Li  <support@lextm.com>
+//
+// Copyright (C) 2014 Lex Li
+// 
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this
+// software and associated documentation files (the "Software"), to deal in the Software
+// without restriction, including without limitation the rights to use, copy, modify, merge,
+// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
+// to whom the Software is furnished to do so, subject to the following conditions:
+// 
+// The above copyright notice and this permission notice shall be included in all copies or
+// substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+using System;
+using Mono.Security.X509.Extensions;
+using NUnit.Framework;
+
+namespace MonoTests.Mono.Security.X509.Extensions
+{
+       [TestFixture]
+       public class AuthorityKeyIdentifierExtensionTest
+       {
+               private void Empty (AuthorityKeyIdentifierExtension aki)
+               {
+                       Assert.IsFalse (aki.Critical, "Critical");
+                       Assert.AreEqual ("2.5.29.35", aki.Oid, "Oid");
+                       Assert.IsNotNull (aki.Name, "Name");
+                       Assert.IsFalse (aki.Name == aki.Oid, "Name!=Oid");
+                       Assert.AreEqual (new byte[] {
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00
+                       }, aki.Identifier, "Identifier");
+               }
+
+               [Test]
+               public void Constructor_Empty ()
+               {
+                       AuthorityKeyIdentifierExtension aki = new AuthorityKeyIdentifierExtension ();
+                       aki.Identifier = new byte[] {
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00
+                       };
+                       Empty (aki);
+               }
+
+               [Test]
+               public void Constructor_Extension ()
+               {
+                       AuthorityKeyIdentifierExtension ext = new AuthorityKeyIdentifierExtension ();
+                       ext.Identifier = new byte[] {
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00
+                       };
+                       AuthorityKeyIdentifierExtension aki = new AuthorityKeyIdentifierExtension (ext);
+                       Empty (aki);
+               }
+
+               [Test]
+               public void Constructor_ASN1 ()
+               {
+                       AuthorityKeyIdentifierExtension ext = new AuthorityKeyIdentifierExtension ();
+                       ext.Identifier = new byte[] {
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00
+                       };
+                       AuthorityKeyIdentifierExtension aki = new AuthorityKeyIdentifierExtension (ext.ASN1);
+                       Empty (aki);
+               }
+
+               [Test]
+               public void AuthorityKeyIdentifier_Critical ()
+               {
+                       AuthorityKeyIdentifierExtension aki = new AuthorityKeyIdentifierExtension ();
+                       aki.Critical = true;
+                       aki.Identifier = new byte[] {
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00
+                       };
+                       Assert.AreEqual ("30-22-06-03-55-1D-23-01-01-FF-04-18-30-16-80-14-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00", BitConverter.ToString (aki.GetBytes ()), "GetBytes");
+
+                       AuthorityKeyIdentifierExtension aki2 = new AuthorityKeyIdentifierExtension (aki.ASN1);
+                       Assert.IsTrue (aki2.Critical, "Critical");
+                       Assert.AreEqual (new byte[] {
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00
+                       }, aki2.Identifier, "Identifier");
+               }
+
+               [Test]
+               [ExpectedException (typeof(InvalidOperationException))]
+               public void EmptyIdentifier ()
+               {
+                       AuthorityKeyIdentifierExtension ext = new AuthorityKeyIdentifierExtension ();
+                       AuthorityKeyIdentifierExtension aki = new AuthorityKeyIdentifierExtension (ext);
+                       Empty (aki);
+               }
+       }
+}
diff --git a/mcs/class/Mono.Security/Test/Mono.Security.X509.Extensions/SubjectKeyIdentifierExtensionTest.cs b/mcs/class/Mono.Security/Test/Mono.Security.X509.Extensions/SubjectKeyIdentifierExtensionTest.cs
new file mode 100644 (file)
index 0000000..5acdd73
--- /dev/null
@@ -0,0 +1,122 @@
+//
+// SubjectKeyIdentifierExtensionTest.cs - NUnit Test Cases for 
+//     Mono.Security.X509.Extensions.SubjectKeyIdentifierExtension
+//
+// Authors:
+//     Lex Li  <support@lextm.com>
+//
+// Copyright (C) 2014 Lex Li
+// 
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this
+// software and associated documentation files (the "Software"), to deal in the Software
+// without restriction, including without limitation the rights to use, copy, modify, merge,
+// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
+// to whom the Software is furnished to do so, subject to the following conditions:
+// 
+// The above copyright notice and this permission notice shall be included in all copies or
+// substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
+// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+// DEALINGS IN THE SOFTWARE.
+
+using System;
+using Mono.Security.X509.Extensions;
+using NUnit.Framework;
+
+namespace MonoTests.Mono.Security.X509.Extensions
+{
+       [TestFixture]
+       public class SubjectKeyIdentifierExtensionTest
+       {
+               private void Empty (SubjectKeyIdentifierExtension ski)
+               {
+                       Assert.IsFalse (ski.Critical, "Critical");
+                       Assert.AreEqual ("2.5.29.14", ski.Oid, "Oid");
+                       Assert.IsNotNull (ski.Name, "Name");
+                       Assert.IsFalse (ski.Name == ski.Oid, "Name!=Oid");
+                       Assert.AreEqual (new byte[] {
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00
+                       }, ski.Identifier, "Identifier");
+               }
+
+               [Test]
+               public void Constructor_Empty ()
+               {
+                       SubjectKeyIdentifierExtension ski = new SubjectKeyIdentifierExtension ();
+                       ski.Identifier = new byte[] {
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00
+                       };
+                       Empty (ski);
+               }
+
+               [Test]
+               public void Constructor_Extension ()
+               {
+                       SubjectKeyIdentifierExtension ext = new SubjectKeyIdentifierExtension ();
+                       ext.Identifier = new byte[] {
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00
+                       };
+                       SubjectKeyIdentifierExtension ski = new SubjectKeyIdentifierExtension (ext);
+                       Empty (ski);
+               }
+
+               [Test]
+               public void Constructor_ASN1 ()
+               {
+                       SubjectKeyIdentifierExtension ext = new SubjectKeyIdentifierExtension ();
+                       ext.Identifier = new byte[] {
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00
+                       };
+                       SubjectKeyIdentifierExtension ski = new SubjectKeyIdentifierExtension (ext.ASN1);
+                       Empty (ski);
+               }
+
+               [Test]
+               public void AuthorityKeyIdentifier_Critical ()
+               {
+                       SubjectKeyIdentifierExtension ski = new SubjectKeyIdentifierExtension ();
+                       ski.Critical = true;
+                       ski.Identifier = new byte[] {
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00
+                       };
+                       Assert.AreEqual ("30-20-06-03-55-1D-0E-01-01-FF-04-16-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.GetBytes ()), "GetBytes");
+
+                       SubjectKeyIdentifierExtension ski2 = new SubjectKeyIdentifierExtension (ski.ASN1);
+                       Assert.IsTrue (ski2.Critical, "Critical");
+                       Assert.AreEqual (new byte[] {
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00,
+                               0x00, 0x00, 0x00, 0x00, 0x00
+                       }, ski2.Identifier, "Identifier");
+               }
+
+               [Test]
+               [ExpectedException (typeof(InvalidOperationException))]
+               public void EmptyIdentifier ()
+               {
+                       SubjectKeyIdentifierExtension ext = new SubjectKeyIdentifierExtension ();
+                       SubjectKeyIdentifierExtension ski = new SubjectKeyIdentifierExtension (ext);
+                       Empty (ski);
+               }
+       }
+}