Add the Certificate test.
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/Asn1Dumper.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/Asn1Dumper.java
index 38addf4..c701eb6 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/Asn1Dumper.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/Asn1Dumper.java
@@ -24,6 +24,7 @@
 import org.apache.kerby.asn1.parse.Asn1Parser;
 import org.apache.kerby.asn1.type.Asn1Any;
 import org.apache.kerby.asn1.type.Asn1Application;
+import org.apache.kerby.asn1.type.Asn1Choice;
 import org.apache.kerby.asn1.type.Asn1Simple;
 import org.apache.kerby.asn1.type.Asn1Type;
 import org.apache.kerby.asn1.util.HexUtil;
@@ -91,6 +92,8 @@
             indent(indents).append(value.toString());
         } else if (value instanceof Asn1Any) {
             indent(indents).append("<Any>");
+        } else if (value instanceof Asn1Choice) {
+            indent(indents).append("<Choice>");
         } else {
             indent(indents).append("<Unknown>");
         }
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/UniversalTag.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/UniversalTag.java
index 63abbee..3fc5026 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/UniversalTag.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/UniversalTag.java
@@ -87,6 +87,7 @@
      */
     public static UniversalTag fromValue(int value) {
         switch (value) {
+            case -2 : return CHOICE;
             case 0x00 : return EOC;
             case 0x01 : return BOOLEAN;
             case 0x02 : return INTEGER;
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Choice.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Choice.java
index a7ff5ca..eca455a 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Choice.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Choice.java
@@ -148,7 +148,7 @@
             return null;
         }
 
-        if (chosenField != null && index != chosenField) {
+        if (chosenField != null && index != chosenField.getIndex()) {
             throw new IllegalArgumentException("Incorrect chosen value requested");
         }
 
diff --git a/kerby-pkix/src/test/java/org/apache/kerby/cms/TestCertificate.java b/kerby-pkix/src/test/java/org/apache/kerby/cms/TestCertificate.java
new file mode 100644
index 0000000..29391cf
--- /dev/null
+++ b/kerby-pkix/src/test/java/org/apache/kerby/cms/TestCertificate.java
@@ -0,0 +1,60 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+package org.apache.kerby.cms;
+
+import org.apache.kerby.asn1.Asn1;
+import org.apache.kerby.asn1.type.Asn1Type;
+import org.apache.kerby.cms.type.Certificate;
+import org.apache.kerby.x500.type.Name;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.IOException;
+
+public class TestCertificate extends CmsTestBase {
+    @Test
+    public void testDecodingCertificate() throws IOException {
+        byte[] data = readDataFile("/certificate1.txt");
+        try {
+            Asn1.dump(data, true);
+            Certificate certificate = new Certificate();
+            certificate.decode(data);
+            Asn1.dump(certificate);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            Assert.fail();
+        }
+    }
+
+    @Test
+    public void testDecodingName() throws IOException {
+        byte[] data = readDataFile("/name.txt");
+        try {
+            Asn1.dump(data, true);
+            Name name = new Name();
+            name.decode(data);
+            Asn1.dump(name.getName());
+        } catch (Exception e) {
+            e.printStackTrace();
+            Assert.fail();
+        }
+    }
+}
diff --git a/kerby-pkix/src/test/resources/certificate1.txt b/kerby-pkix/src/test/resources/certificate1.txt
new file mode 100644
index 0000000..5609025
--- /dev/null
+++ b/kerby-pkix/src/test/resources/certificate1.txt
@@ -0,0 +1 @@
+3082035E308202C7A003020102020107300D06092A864886F70D01010405003081B7310B30090603550406130241553111300F06035504081308566963746F726961311830160603550407130F536F757468204D656C626F75726E65311A3018060355040A1311436F6E6E656374203420507479204C7464311E301C060355040B1315436572746966696361746520417574686F72697479311530130603550403130C436F6E6E65637420342043413128302606092A864886F70D01090116197765626D617374657240636F6E6E656374342E636F6D2E6175301E170D3030303630323037353632315A170D3031303630323037353632315A3081B8310B30090603550406130241553111300F06035504081308566963746F726961311830160603550407130F536F757468204D656C626F75726E65311A3018060355040A1311436F6E6E656374203420507479204C746431173015060355040B130E576562736572766572205465616D311D301B06035504031314777777322E636F6E6E656374342E636F6D2E61753128302606092A864886F70D01090116197765626D617374657240636F6E6E656374342E636F6D2E617530819F300D06092A864886F70D010101050003818D0030818902818100AEF0F1725280872BFB43F5A6AF6ADE1B0E172FD0A787D7BEE95816CB6016372FCC55E5DD971CDDED002E73578E59090640488B3F2E5742D4D8FAC05427700E46F7767C454921C8DFDBD7B2EDB62E6BD27FBF3E4C1B6298A3DFD6087230A83F66986F60D312DC7F0ABFB3C64906CC04EEC6FCE5553E87DE0F4EFB163AC5AE29A10203010001A377307530240603551D11041D301B81197765626D617374657240636F6E6E656374342E636F6D2E6175303A06096086480186F842010D042D162B6D6F645F73736C2067656E65726174656420637573746F6D20736572766572206365727469666963617465301106096086480186F8420101040403020640300D06092A864886F70D010104050003818100A2D71C7CAA704AC2313351DA7BC0D1ECCFD1C3C760FD1A8E5B1E391CD54B8814B8FF737F4CED7DE7279029B7E6CDB000DA36CF56F22F1A04F13E03B530FE1982F81185AB1A6B4A82242916BE9338C907F7DEF3A26106E9BF8AD3C3353C026465046E3959D8F23488A0195FA845CEB568A0939CBABBCC1F0DDF3D5317F6C5E7FF
\ No newline at end of file
diff --git a/kerby-pkix/src/test/resources/name.txt b/kerby-pkix/src/test/resources/name.txt
new file mode 100644
index 0000000..930ac37
--- /dev/null
+++ b/kerby-pkix/src/test/resources/name.txt
@@ -0,0 +1 @@
+3081B7310B30090603550406130241553111300F06035504081308566963746F726961311830160603550407130F536F757468204D656C626F75726E65311A3018060355040A1311436F6E6E656374203420507479204C7464311E301C060355040B1315436572746966696361746520417574686F72697479311530130603550403130C436F6E6E65637420342043413128302606092A864886F70D01090116197765626D617374657240636F6E6E656374342E636F6D2E6175301E170D3030303630323037353632315A170D3031303630323037353632315A3081B8310B30090603550406130241553111300F06035504081308566963746F726961311830160603550407130F536F757468204D656C626F75726E65311A3018060355040A1311436F6E6E656374203420507479204C746431173015060355040B130E576562736572766572205465616D311D301B06035504031314777777322E636F6E6E656374342E636F6D2E6175