Add tests to decode mit pkinit anonymous AsReq and AsRep.
diff --git a/kerby-kerb/kerb-core/src/main/test/java/org/apache/kerby/kerberos/kerb/codec/CodecTestUtil.java b/kerby-kerb/kerb-core/src/main/test/java/org/apache/kerby/kerberos/kerb/codec/CodecTestUtil.java
index e2fb3cf..3f78570 100644
--- a/kerby-kerb/kerb-core/src/main/test/java/org/apache/kerby/kerberos/kerb/codec/CodecTestUtil.java
+++ b/kerby-kerb/kerb-core/src/main/test/java/org/apache/kerby/kerberos/kerb/codec/CodecTestUtil.java
@@ -19,6 +19,9 @@
  */
 package org.apache.kerby.kerberos.kerb.codec;
 
+import org.apache.kerby.asn1.util.HexUtil;
+import org.apache.kerby.asn1.util.IOUtil;
+
 import java.io.IOException;
 import java.io.InputStream;
 
@@ -30,4 +33,10 @@
         is.read(bytes);
         return bytes;
     }
+
+    static byte[] readDataFile(String resource) throws IOException {
+        InputStream is = CodecTestUtil.class.getResourceAsStream(resource);
+        String hexStr = IOUtil.readInput(is);
+        return HexUtil.hex2bytes(hexStr);
+    }
 }
diff --git a/kerby-kerb/kerb-core/src/main/test/java/org/apache/kerby/kerberos/kerb/codec/TestAsReqCodec.java b/kerby-kerb/kerb-core/src/main/test/java/org/apache/kerby/kerberos/kerb/codec/TestAsReqCodec.java
index b8599a7..30fe74c 100644
--- a/kerby-kerb/kerb-core/src/main/test/java/org/apache/kerby/kerberos/kerb/codec/TestAsReqCodec.java
+++ b/kerby-kerb/kerb-core/src/main/test/java/org/apache/kerby/kerberos/kerb/codec/TestAsReqCodec.java
@@ -54,7 +54,7 @@
     @Test
     public void test() throws IOException, ParseException {
         byte[] bytes = CodecTestUtil.readBinaryFile("/asreq.token");
-        Asn1.dump(bytes);
+        Asn1.dump(bytes, false);
         ByteBuffer asReqToken = ByteBuffer.wrap(bytes);
 
         AsReq asReq = new AsReq();
diff --git a/kerby-kerb/kerb-core/src/main/test/java/org/apache/kerby/kerberos/kerb/codec/TestPkinitAnonymousAsRepCodec.java b/kerby-kerb/kerb-core/src/main/test/java/org/apache/kerby/kerberos/kerb/codec/TestPkinitAnonymousAsRepCodec.java
new file mode 100644
index 0000000..448b44d
--- /dev/null
+++ b/kerby-kerb/kerb-core/src/main/test/java/org/apache/kerby/kerberos/kerb/codec/TestPkinitAnonymousAsRepCodec.java
@@ -0,0 +1,89 @@
+/**
+ *  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.kerberos.kerb.codec;
+
+import org.apache.kerby.asn1.Asn1;
+import org.apache.kerby.kerberos.kerb.type.base.EncryptedData;
+import org.apache.kerby.kerberos.kerb.type.base.KrbMessageType;
+import org.apache.kerby.kerberos.kerb.type.base.NameType;
+import org.apache.kerby.kerberos.kerb.type.base.PrincipalName;
+import org.apache.kerby.kerberos.kerb.type.kdc.AsRep;
+import org.apache.kerby.kerberos.kerb.type.pa.PaData;
+import org.apache.kerby.kerberos.kerb.type.pa.PaDataEntry;
+import org.apache.kerby.kerberos.kerb.type.pa.PaDataType;
+import org.apache.kerby.kerberos.kerb.type.pa.pkinit.PaPkAsRep;
+import org.apache.kerby.kerberos.kerb.type.ticket.Ticket;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class TestPkinitAnonymousAsRepCodec {
+    @Test
+    public void test() throws IOException {
+        byte[] bytes = CodecTestUtil.readDataFile("/pkinit_anonymous_asrep.token");
+        Asn1.dump(bytes, true);
+        ByteBuffer asRepToken = ByteBuffer.wrap(bytes);
+
+        AsRep asRep = new AsRep();
+        asRep.decode(asRepToken);
+        Asn1.dump(asRep, false);
+
+        assertThat(asRep.getPvno()).isEqualTo(5);
+        assertThat(asRep.getMsgType()).isEqualTo(KrbMessageType.AS_REP);
+        PaData paData = asRep.getPaData();
+
+        PaDataEntry pkAsRepEntry = paData.findEntry(PaDataType.PK_AS_REP);
+        assertThat(pkAsRepEntry.getPaDataType()).isEqualTo(PaDataType.PK_AS_REP);
+
+        PaPkAsRep paPkAsRep = new PaPkAsRep();
+        paPkAsRep.decode(pkAsRepEntry.getPaDataValue());
+        //Failed
+//        assertThat(paPkAsRep.getDHRepInfo()).isNotNull();
+
+        PaDataEntry etypeInfo2Entry = paData.findEntry(PaDataType.ETYPE_INFO2);
+        assertThat(etypeInfo2Entry.getPaDataType()).isEqualTo(PaDataType.ETYPE_INFO2);
+
+        PaDataEntry pkinitKxEntry = paData.findEntry(PaDataType.PKINIT_KX);
+        assertThat(pkinitKxEntry.getPaDataType()).isEqualTo(PaDataType.PKINIT_KX);
+
+        assertThat(asRep.getPvno()).isEqualTo(5);
+        assertThat(asRep.getMsgType()).isEqualTo(KrbMessageType.AS_REP);
+        assertThat(asRep.getCrealm()).isEqualTo("WELLKNOWN:ANONYMOUS");
+
+        PrincipalName cName = asRep.getCname();
+        assertThat(cName.getNameType()).isEqualTo(NameType.NT_UNKNOWN);
+        assertThat(cName.getNameStrings()).hasSize(2).contains("WELLKNOWN", "ANONYMOUS");
+
+        Ticket ticket = asRep.getTicket();
+        assertThat(ticket.getTktvno()).isEqualTo(5);
+        assertThat(ticket.getRealm()).isEqualTo("EXAMPLE.COM");
+        PrincipalName sName = ticket.getSname();
+        assertThat(sName.getNameType()).isEqualTo(NameType.NT_SRV_INST);
+        assertThat(sName.getNameStrings()).hasSize(2)
+                .contains("krbtgt", "EXAMPLE.COM");
+
+        EncryptedData encryptedData = ticket.getEncryptedEncPart();
+        assertThat(encryptedData.getKvno()).isEqualTo(1);
+        assertThat(encryptedData.getEType().getValue()).isEqualTo(0x0012);
+    }
+}
diff --git a/kerby-kerb/kerb-core/src/main/test/java/org/apache/kerby/kerberos/kerb/codec/TestPkinitAnonymousAsReqCodec.java b/kerby-kerb/kerb-core/src/main/test/java/org/apache/kerby/kerberos/kerb/codec/TestPkinitAnonymousAsReqCodec.java
new file mode 100644
index 0000000..e9965cf
--- /dev/null
+++ b/kerby-kerb/kerb-core/src/main/test/java/org/apache/kerby/kerberos/kerb/codec/TestPkinitAnonymousAsReqCodec.java
@@ -0,0 +1,107 @@
+/**
+ *  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.kerberos.kerb.codec;
+
+import org.apache.kerby.asn1.Asn1;
+import org.apache.kerby.cms.type.ContentInfo;
+import org.apache.kerby.kerberos.kerb.type.base.EncryptionType;
+import org.apache.kerby.kerberos.kerb.type.base.KrbMessageType;
+import org.apache.kerby.kerberos.kerb.type.base.NameType;
+import org.apache.kerby.kerberos.kerb.type.base.PrincipalName;
+import org.apache.kerby.kerberos.kerb.type.kdc.AsReq;
+import org.apache.kerby.kerberos.kerb.type.kdc.KdcReqBody;
+import org.apache.kerby.kerberos.kerb.type.pa.PaData;
+import org.apache.kerby.kerberos.kerb.type.pa.PaDataEntry;
+import org.apache.kerby.kerberos.kerb.type.pa.PaDataType;
+import org.apache.kerby.kerberos.kerb.type.pa.pkinit.PaPkAsReq;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.text.ParseException;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class TestPkinitAnonymousAsReqCodec {
+    @Test
+    public void test() throws IOException, ParseException {
+        byte[] bytes = CodecTestUtil.readDataFile("/pkinit_anonymous_asreq.token");
+//        Asn1.dump(bytes, true);
+        ByteBuffer asReqToken = ByteBuffer.wrap(bytes);
+
+        AsReq asReq = new AsReq();
+        asReq.decode(asReqToken);
+//        Asn1.dump(asReq, false);
+
+        assertThat(asReq.getPvno()).isEqualTo(5);
+        assertThat(asReq.getMsgType()).isEqualTo(KrbMessageType.AS_REQ);
+
+        PaData paData = asReq.getPaData();
+
+        PaDataEntry paFxCookieEntry = paData.findEntry(PaDataType.FX_COOKIE);
+        assertThat(paFxCookieEntry.getPaDataType()).isEqualTo(PaDataType.FX_COOKIE);
+        assertThat(paFxCookieEntry.getPaDataValue()).isEqualTo(Arrays.copyOfRange(bytes, 38, 41));
+
+        PaDataEntry pkAsReqEntry = paData.findEntry(PaDataType.PK_AS_REQ);
+        assertThat(pkAsReqEntry.getPaDataType()).isEqualTo(PaDataType.PK_AS_REQ);
+        assertThat(pkAsReqEntry.getPaDataValue()).isEqualTo(Arrays.copyOfRange(bytes, 58, 1366));
+
+        PaPkAsReq paPkAsReq = new PaPkAsReq();
+        paPkAsReq.decode(pkAsReqEntry.getPaDataValue());
+        ContentInfo contentInfo = new ContentInfo();
+        Asn1.dump(paPkAsReq.getSignedAuthPack(), true);
+        contentInfo.decode(paPkAsReq.getSignedAuthPack());
+        assertThat(contentInfo.getContentType().getValue()).isEqualTo("1.2.840.113549.1.7.2");
+        Asn1.dump(contentInfo);
+        //Failed
+//        SignedData signedData = contentInfo.getContentAs(SignedData.class);
+//        assertThat(signedData.getCertificates()).isNull();
+//        assertThat(signedData.getEncapContentInfo().getContentType()).isEqualTo("1.3.6.1.5.2.3.1");
+
+        PaDataEntry encpaEntry = paData.findEntry(PaDataType.ENCPADATA_REQ_ENC_PA_REP);
+        assertThat(encpaEntry.getPaDataType()).isEqualTo(PaDataType.ENCPADATA_REQ_ENC_PA_REP);
+        assertThat(encpaEntry.getPaDataValue()).isEqualTo(Arrays.copyOfRange(bytes, 1376, 1376));
+
+        KdcReqBody body = asReq.getReqBody();
+        assertThat(body.getKdcOptions().getPadding()).isEqualTo(0);
+        assertThat(body.getKdcOptions().getValue()).isEqualTo(Arrays.copyOfRange(bytes, 1389, 1393));
+        PrincipalName cName = body.getCname();
+        assertThat(cName.getNameType()).isEqualTo(NameType.NT_UNKNOWN);
+        assertThat(cName.getName()).isEqualTo("WELLKNOWN/ANONYMOUS");
+        assertThat(body.getRealm()).isEqualTo("EXAMPLE.COM");
+        PrincipalName sName = body.getSname();
+        assertThat(sName.getNameType()).isEqualTo(NameType.NT_SRV_INST);
+        assertThat(sName.getNameStrings()).hasSize(2)
+                .contains("krbtgt", "EXAMPLE.COM");
+
+        assertThat(body.getNonce()).isEqualTo(1797404543);
+
+        List<EncryptionType> types = body.getEtypes();
+        assertThat(types).hasSize(6);
+        assertThat(types.get(0).getValue()).isEqualTo(0x0012);
+        assertThat(types.get(1).getValue()).isEqualTo(0x0011);
+        assertThat(types.get(2).getValue()).isEqualTo(0x0010);
+        assertThat(types.get(3).getValue()).isEqualTo(0x0017);
+        assertThat(types.get(4).getValue()).isEqualTo(0x0019);
+        assertThat(types.get(5).getValue()).isEqualTo(0x001A);
+    }
+}
diff --git a/kerby-kerb/kerb-core/src/main/test/resources/pkinit_anonymous_asrep.token b/kerby-kerb/kerb-core/src/main/test/resources/pkinit_anonymous_asrep.token
new file mode 100644
index 0000000..91eba94
--- /dev/null
+++ b/kerby-kerb/kerb-core/src/main/test/resources/pkinit_anonymous_asrep.token
@@ -0,0 +1 @@
+6b820adb30820ad7a003020105a10302010ba282085530820851308207baa103020111a28207b1048207ada08207a9308207a5808207913082078d06092a864886f70d010702a082077e3082077a020103310b300906052b0e03021a05003082012a06072b060105020302a082011d0482011930820115a08201090382010500028201000cdc45eedbf7daa0bc998f34b68f102a6fb1eaa4f7e6938cba8a27e9b78c9423f090a6f99f9ab892ad8bb48cb192bd7155b83444aaa0e2f07398bd118b73955bb80739b35c5da1b3dc9b1f75d168f9b37b0550734c63f874f2ffe7361944e17b55929601fdfd1d12aa32d740e5183167df3d1ad2558c80c277a3f8d4f9c5014557a588a75081c1a95070f3de737693ed5b7373fbb6916a9439a4d8636963a136bf3fd732b61426fd7161b19c12129e676743c4c60262d479e1a7bb79744cec7bdbe6a8741fbc665e45bb1771ad1fe8c6c35a1214c880b8217015ababddd5c6da157b085869b17a0f9cd449471d0763bd530ed4deab4d5c07219ca759888095c3a10602046b22377fa08204443082044030820328a003020102020900957b3b7d599fdde1300d06092a864886f70d0101050500307c310b300906035504061302434e310b300906035504080c025348310b300906035504070c025348310e300c060355040a0c05494e54454c310e300c060355040b0c05494e54454c310f300d06035504030c064a49414a49413122302006092a864886f70d01090116134a49414a49412e4c4940494e54454c2e434f4d301e170d3135303931353032313935395a170d3136303931343032313935395a307c310b300906035504061302434e310b300906035504080c025348310b300906035504070c025348310e300c060355040a0c05494e54454c310e300c060355040b0c05494e54454c310f300d06035504030c064a49414a49413122302006092a864886f70d01090116134a49414a49412e4c4940494e54454c2e434f4d30820122300d06092a864886f70d01010105000382010f003082010a0282010100b490346b97ea3dbfa85d596c94b404fbacaf3b8a0f25aaddf1799008f4def1c231bdc7d6e927d29679ff8894fd7bc9912cec6d863ba32522cd9283eeb89e3fb6150d1a7d0d622e7c77b18f33a0b2569c0124cd82acc794d3a139a3037d2cf07a9decd5d27dfe2e10d52b7c80d14b5b859bb423644c1a9e97eaff6ab16a7bd157bcc24d6cf39f5f14135fa0051d47f8e3351c7dd9d5008eb074d2767e0ae7a7f58f20fb43b2c38036594c4a60aa720d5cc3d89395fe58a9ff5fcfe85fd009bc2e59c7a080eedd883ce5c151f698836cbbb9f3b8c8bad45fdcf0390ddbc9e45ddbe6cbe75c501287dbb9744f09bea7a638efc03d74b25933bc0f39744423f9f2610203010001a381c43081c130090603551d1304023000300b0603551d0f0404030203e830120603551d25040b300906072b060105020305301d0603551d0e041604141f9467fe30efc615c9aa4e81097e11436ca4df09301f0603551d23041830168014423d560a460d97a08abad00436f8a4d42661d7b030090603551d120402300030480603551d110441303fa03d06062b0601050202a0333031a00d1b0b4558414d504c452e434f4da120301ea003020101a11730151b066b72627467741b0b4558414d504c452e434f4d300d06092a864886f70d010105050003820101008ef86de60f1eb04f4b611beec70bcd10294144a2e4616d7f1fc0246cd0a160f862078ced3ef41eaefb4c41a20028afa43d47c3cdaef9e3fd8b3984fb5c5092d39b6254335e55f27b2c170878415c3624c45c71297980b1d179393016209d1f338de31fc1333fd2d1d5e4556dde24a509ec46d90215ff9625302ac6dd1073be73a40f526d0153df2d9fa8fd040974b5d95344300c0b8d0c18ea27090b34a381c615e1886f02d8c714b43b4a28eb5bcc147633772cdd99bca2c601929e6672199cb250f6e863503eed53c231dbf0c417ab777044bd2ded683a3ad9946f5eb99299c2ad6e59b5164c4bcba0368a5ce16c9ff7e550dade9866bd557bdd01c71f9823318201f0308201ec020101308189307c310b300906035504061302434e310b300906035504080c025348310b300906035504070c025348310e300c060355040a0c05494e54454c310e300c060355040b0c05494e54454c310f300d06035504030c064a49414a49413122302006092a864886f70d01090116134a49414a49412e4c4940494e54454c2e434f4d020900957b3b7d599fdde1300906052b0e03021a0500a03d301606092a864886f70d010903310906072b060105020302302306092a864886f70d010904311604147ba5ddc6130b5e088e9b225e90ce6996f48d8878300d06092a864886f70d0101050500048201009e1651dd0bb1b37baa7bf9c2629e161974c08a12687bf3670edc0eb43a9ecd140ae2caf4b95f71a55cf5a393ee73c6313d10e1542519cc6c6a054e63dc3bebe4584f068020ff9cb4c63d7dcd02c3e9a740b05886d0bab669b2e0611319d75f4b889ac6b306ad8694dbdc47963efa8a2c8dc775e4b060980f9bd68714aa2bde1760ecd1d40fd79f9e9ebe619918b5db7f669eac35923bd27df1d3fc69d5e496c12d53d53a4f28dd5e40517ccb02c449ba793bfd6d97fb1b0011d48c8ce555a72bc63b4ab04c5e65d09010c526f9167dba6c516f9bd1850f257ffbaaf4f4b36b14186424a7c5a537d8630dea9e5fff73cf56c8443e17bf248339525e6ec7a1890fa20e300ca00a06082b060105020306023033a103020113a22c042a30283026a003020112a11f1b1d4558414d504c452e434f4d57454c4c4b4e4f574e414e4f4e594d4f5553305ca10402020093a25404523050a003020112a249044716e179a3dcd5469db874d6368831355831c7e114ce594c1fd02967f0283521138719aa671409d9789d9b885c89332eb5062f95e4b7578d3d31251ff3ef4c64524a8ba7457726a2a3151b1357454c4c4b4e4f574e3a414e4f4e594d4f5553a421301fa00302010ba11830161b0957454c4c4b4e4f574e1b09414e4f4e594d4f5553a58201196182011530820111a003020105a10d1b0b4558414d504c452e434f4da220301ea003020102a11730151b066b72627467741b0b4558414d504c452e434f4da381d83081d5a003020112a103020101a281c80481c5ce3b2d0bb66f8d9cd0b2c50a2c34885e718a821f78d7cc8b0e951f12115b723acf4388e3c4416a53eb5d380d08a0ca7af47d1946cecd586db4881ef62c8cfa9b1152dc9e4a28d9bb65994d58ad6acbc56f403d0092a82758855ba9d6e881cabf74ff0952fc897962186c786fb60baf75459590cce9e9b807d164f5054446ee88b3a7cce307cf5eccce040e478d291fb23f7de11c8c781217561eadf3635283271146cafa0042a90affe3ff9bc70cb824273a53bef7eb1e10dcb807440fbc054e815effa526a682011930820115a003020112a282010c048201084f01264b02e309704682ec1c44c550ff0a097d892e5802fbd4899215bc60be074373bf53e820a3fab5e755dae7ac938ff6b4866e3fb869913b910ff3a1b8238105b26c592a470291d864bd2780a4c91d706464f4560e0abd1998c1fa1c22e2bb35f80764ab3b39a3b273ed05f4d069722e66d0415d5e56c9acd82e2226ab7efb85ea53aa9f4f40aa057780a003e926a3d0c824165005ebbb4ce2bb9c4cf3c6e07e8b9eef74bfa7d41d445fc563e9d9ef8c3574cb804eae3d7de534b616ca4854e5919322bbd71dfb71f125f626c99aca05e1f95126b1ec8b8c5b50ca8874cf1524e682966eebfc5264e3a03086b64ac5dc66a3484265843f2336b0ca5d0c8abca96abe6fcd15a51c
\ No newline at end of file
diff --git a/kerby-kerb/kerb-core/src/main/test/resources/pkinit_anonymous_asreq.token b/kerby-kerb/kerb-core/src/main/test/resources/pkinit_anonymous_asreq.token
new file mode 100644
index 0000000..5144f1e
--- /dev/null
+++ b/kerby-kerb/kerb-core/src/main/test/resources/pkinit_anonymous_asreq.token
@@ -0,0 +1 @@
+6a8205f2308205eea103020105a20302010aa382054c30820548300da10402020085a20504034d495430820529a103020110a28205200482051c30820518808203e1308203dd06092a864886f70d010702a08203ce308203ca0201033100308203bf06072b060105020301a08203b2048203ae308203aaa03c303aa005020306c39ca111180f32303135313231303032353031355aa20602046b22377fa3160414e592c909d320dd4ce1ccaa4708e8bc73d48d03bfa182032a308203263082021906072a8648ce3e02013082020c0282010100ffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca18217c32905e462e36ce3be39e772c180e86039b2783a2ec07a28fb5c55df06f4c52c9de2bcbf6955817183995497cea956ae515d2261898fa051015728e5a8aacaa68ffffffffffffffff020102028201007fffffffffffffffe487ed5110b4611a62633145c06e0e68948127044533e63a0105df531d89cd9128a5043cc71a026ef7ca8cd9e69d218d98158536f92f8a1ba7f09ab6b6a8e122f242dabb312f3f637a262174d31bf6b585ffae5b7a035bf6f71c35fdad44cfd2d74f9208be258ff324943328f6722d9ee1003e5c50b1df82cc6d241b0e2ae9cd348b1fd47e9267afc1b2ae91ee51d6cb0e3179ab1042a95dcf6a9483b84b4b36b3861aa7255e4c0278ba3604650c10be19482f23171b671df1cf3b960c074301cd93c1d17603d147dae2aef837a62964ef15e5fb4aac0b8c1ccaa4be754ab5728ae9130c4c7d02880ab9472d455655347fffffffffffffff0382010500028201006c3c8337692b63f663ab2d953c5adce3dbc840339a426408761c1bced206e84c9898b2d44f35a2f0d8604752b1530580dfeb3d7649d9736ca12dcab7dafa34a8c1c143a20ff7f9103b3fdedc6208e39330bf0c3fa6be6c3a6821270d194d9f27a80f0b8e4d6f59a75a0e384a588cfbecf75ac294d85ab8966ba26f49562c56f57c450cd1eacad30f5994dac89ab11d3229e9d1d6aaa4e80aead122115aa2a737dc82a70a99e6f50892135d5d50442b88243c564b6c5b7975def3dbc7c541e4c83b55aee3b44a989cb577b6c7d3b583463d026eb8aad908bfc8d9e4186ac7a7ba17d4c9c591e035fd9ab1325bb21544bb63f18bb499c8af244cc92ee4497533b1a20e300c300a06082a864886f70d0307a42c302a300ca00a06082b06010502030602300ca00a06082b06010502030601300ca00a06082b060105020306033100a182012f3082012b30820127807e307c310b300906035504061302434e310b300906035504080c025348310b300906035504070c025348310e300c060355040a0c05494e54454c310e300c060355040b0c05494e54454c310f300d06035504030c064a49414a49413122302006092a864886f70d01090116134a49414a49412e4c4940494e54454c2e434f4d81818c308189307c310b300906035504061302434e310b300906035504080c025348310b300906035504070c025348310e300c060355040a0c05494e54454c310e300c060355040b0c05494e54454c310f300d06035504030c064a49414a49413122302006092a864886f70d01090116134a49414a49412e4c4940494e54454c2e434f4d0209009f561dd97cee1bf982160414423d560a460d97a08abad00436f8a4d42661d7b0300aa10402020095a2020400a4819130818ea00703050000008010a121301fa00302010ba11830161b0957454c4c4b4e4f574e1b09414e4f4e594d4f5553a20d1b0b4558414d504c452e434f4da320301ea003020102a11730151b066b72627467741b0b4558414d504c452e434f4da511180f32303135313231313032353031355aa70602046b22377fa814301202011202011102011002011702011902011a
\ No newline at end of file
diff --git a/kerby-pkix/src/test/java/org/apache/kerby/cms/TestSignedData.java b/kerby-pkix/src/test/java/org/apache/kerby/cms/TestSignedData.java
index bd2cef1..edf56ce 100644
--- a/kerby-pkix/src/test/java/org/apache/kerby/cms/TestSignedData.java
+++ b/kerby-pkix/src/test/java/org/apache/kerby/cms/TestSignedData.java
@@ -75,4 +75,23 @@
                 decodedContentInfo.getContentAs(SignedData.class);
         Asn1.dump(decodedSignedData);
     }
+
+    @Test
+    public void testContentInfo() throws IOException {
+        byte[] data = readDataFile("/anonymous.txt");
+        try {
+            Asn1.dump(data, true);
+
+            ContentInfo contentInfo = new ContentInfo();
+            contentInfo.decode(data);
+            Asn1.dump(contentInfo);
+/** Failed in DigestAlgorithmIdentifiers*/
+//            SignedData signedData =
+//                    contentInfo.getContentAs(SignedData.class);
+//            Asn1.dump(signedData);
+        } catch (Exception e) {
+            e.printStackTrace();
+            Assert.fail();
+        }
+    }
 }
diff --git a/kerby-pkix/src/test/resources/anonymous.txt b/kerby-pkix/src/test/resources/anonymous.txt
new file mode 100644
index 0000000..017a748
--- /dev/null
+++ b/kerby-pkix/src/test/resources/anonymous.txt
@@ -0,0 +1,20 @@
+308203DD06092A864886F70D010702A08203CE308203CA0201033100308203BF06072B060105020301A08203B2048203AE30
+8203AAA03C303AA005020306C39CA111180F32303135313231303032353031355AA20602046B22377FA3160414E592C909D3
+20DD4CE1CCAA4708E8BC73D48D03BFA182032A308203263082021906072A8648CE3E02013082020C0282010100FFFFFFFFFF
+FFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A43
+1B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE
+9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F3
+56208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC
+07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFF
+FF020102028201007FFFFFFFFFFFFFFFE487ED5110B4611A62633145C06E0E68948127044533E63A0105DF531D89CD9128A5
+043CC71A026EF7CA8CD9E69D218D98158536F92F8A1BA7F09AB6B6A8E122F242DABB312F3F637A262174D31BF6B585FFAE5B
+7A035BF6F71C35FDAD44CFD2D74F9208BE258FF324943328F6722D9EE1003E5C50B1DF82CC6D241B0E2AE9CD348B1FD47E92
+67AFC1B2AE91EE51D6CB0E3179AB1042A95DCF6A9483B84B4B36B3861AA7255E4C0278BA3604650C10BE19482F23171B671D
+F1CF3B960C074301CD93C1D17603D147DAE2AEF837A62964EF15E5FB4AAC0B8C1CCAA4BE754AB5728AE9130C4C7D02880AB9
+472D455655347FFFFFFFFFFFFFFF0382010500028201006C3C8337692B63F663AB2D953C5ADCE3DBC840339A426408761C1B
+CED206E84C9898B2D44F35A2F0D8604752B1530580DFEB3D7649D9736CA12DCAB7DAFA34A8C1C143A20FF7F9103B3FDEDC62
+08E39330BF0C3FA6BE6C3A6821270D194D9F27A80F0B8E4D6F59A75A0E384A588CFBECF75AC294D85AB8966BA26F49562C56
+F57C450CD1EACAD30F5994DAC89AB11D3229E9D1D6AAA4E80AEAD122115AA2A737DC82A70A99E6F50892135D5D50442B8824
+3C564B6C5B7975DEF3DBC7C541E4C83B55AEE3B44A989CB577B6C7D3B583463D026EB8AAD908BFC8D9E4186AC7A7BA17D4C9
+C591E035FD9AB1325BB21544BB63F18BB499C8AF244CC92EE4497533B1A20E300C300A06082A864886F70D0307A42C302A30
+0CA00A06082B06010502030602300CA00A06082B06010502030601300CA00A06082B060105020306033100
\ No newline at end of file