Merge branch 'master' of http://git-wip-us.apache.org/repos/asf/directory-kerby
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/Asn1.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/Asn1.java
index 5015ba2..08a9019 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/Asn1.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/Asn1.java
@@ -29,7 +29,6 @@
 
 /**
  * The shortcut API for ASN1 encoding, decoding and dumping.
- * TO BE WELL DOCUMENTED.
  */
 public final class Asn1 {
 
@@ -37,31 +36,85 @@
 
     }
 
+    /**
+     * Encode value into buffer.
+     * @param buffer
+     * @param value
+     * @throws IOException
+     */
     public static void encode(ByteBuffer buffer, Asn1Type value) throws IOException {
         value.encode(buffer);
     }
 
+    /**
+     * Encode value and return the result.
+     * @param value
+     * @return
+     * @throws IOException
+     */
     public static byte[] encode(Asn1Type value) throws IOException {
         return value.encode();
     }
 
+    /**
+     * Blindly decode content and return the result ASN1 object.
+     * @param content
+     * @return
+     * @throws IOException
+     */
     public static Asn1Type decode(byte[] content) throws IOException {
         return decode(ByteBuffer.wrap(content));
     }
 
+    /**
+     * See avove.
+     */
     public static Asn1Type decode(ByteBuffer content) throws IOException {
         Asn1ParseResult parseResult = Asn1Parser.parse(content);
         return Asn1Converter.convert(parseResult, false);
     }
 
+    /**
+     * Decode using specified value container. Better to use this when the value
+     * type is known prior to the call.
+     * @param content
+     * @param value
+     * @throws IOException
+     */
+    public static void decode(byte[] content, Asn1Type value) throws IOException {
+        value.decode(content);
+    }
+
+    /**
+     * See avove.
+     */
+    public static void decode(ByteBuffer content, Asn1Type value) throws IOException {
+        value.decode(content);
+    }
+
+    /**
+     * Parse content and return parse result. Note this is different from decode,
+     * as it doesn't decode into values, only parse result info like offset,
+     * header len, body len and etc. are out.
+     * @param content
+     * @return
+     * @throws IOException
+     */
     public static Asn1ParseResult parse(byte[] content) throws IOException {
         return parse(ByteBuffer.wrap(content));
     }
 
+    /**
+     * See avove.
+     */
     public static Asn1ParseResult parse(ByteBuffer content) throws IOException {
         return Asn1Parser.parse(content);
     }
 
+    /**
+     * Dump out a value.
+     * @param value
+     */
     public static void dump(Asn1Type value) {
         Asn1Dumper dumper = new Asn1Dumper();
         dumper.dumpType(0, value);
@@ -69,28 +122,28 @@
         System.out.println(output);
     }
 
+    /**
+     * Parse first, and then dump out the parse result.
+     * @param hexStr
+     * @throws IOException
+     */
     public static void parseAndDump(String hexStr) throws IOException {
         byte[] data = HexUtil.hex2bytes(hexStr);
         parseAndDump(data);
     }
 
-    public static void decodeAndDump(String hexStr) throws IOException {
-        byte[] data = HexUtil.hex2bytes(hexStr);
-        decodeAndDump(data);
-    }
-
+    /**
+     * See avove.
+     */
     public static void parseAndDump(ByteBuffer content) throws IOException {
         byte[] bytes = new byte[content.remaining()];
         content.get(bytes);
         parseAndDump(bytes);
     }
 
-    public static void decodeAndDump(ByteBuffer content) throws IOException {
-        byte[] bytes = new byte[content.remaining()];
-        content.get(bytes);
-        decodeAndDump(bytes);
-    }
-
+    /**
+     * See avove.
+     */
     public static void parseAndDump(byte[] content) throws IOException {
         String hexStr = HexUtil.bytesToHex(content);
         Asn1Dumper dumper = new Asn1Dumper();
@@ -101,6 +154,28 @@
         System.out.println(output);
     }
 
+    /**
+     * Decode first, and then dump out the decoded value.
+     * @param hexStr
+     * @throws IOException
+     */
+    public static void decodeAndDump(String hexStr) throws IOException {
+        byte[] data = HexUtil.hex2bytes(hexStr);
+        decodeAndDump(data);
+    }
+
+    /**
+     * See avove.
+     */
+    public static void decodeAndDump(ByteBuffer content) throws IOException {
+        byte[] bytes = new byte[content.remaining()];
+        content.get(bytes);
+        decodeAndDump(bytes);
+    }
+
+    /**
+     * See avove.
+     */
     public static void decodeAndDump(byte[] content) throws IOException {
         String hexStr = HexUtil.bytesToHex(content);
         Asn1Dumper dumper = new Asn1Dumper();
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/Asn1Converter.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/Asn1Converter.java
index f0cb632..f426764 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/Asn1Converter.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/Asn1Converter.java
@@ -20,7 +20,7 @@
 package org.apache.kerby.asn1;
 
 import org.apache.kerby.asn1.parse.Asn1ParseResult;
-import org.apache.kerby.asn1.type.Asn1Specifix;
+import org.apache.kerby.asn1.type.Asn1Specific;
 import org.apache.kerby.asn1.type.Asn1Collection;
 import org.apache.kerby.asn1.type.Asn1Constructed;
 import org.apache.kerby.asn1.type.Asn1Encodeable;
@@ -49,7 +49,7 @@
             tmpValue.decode(parseResult);
             return tmpValue;
         } else if (parseResult.isTagSpecific()) {
-            Asn1Specifix app = new Asn1Specifix(parseResult.tag());
+            Asn1Specific app = new Asn1Specific(parseResult.tag());
             app.decode(parseResult);
             return app;
         } else {
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 8e65ea2..3368a44 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
@@ -22,7 +22,7 @@
 import org.apache.kerby.asn1.parse.Asn1Item;
 import org.apache.kerby.asn1.parse.Asn1ParseResult;
 import org.apache.kerby.asn1.parse.Asn1Parser;
-import org.apache.kerby.asn1.type.Asn1Specifix;
+import org.apache.kerby.asn1.type.Asn1Specific;
 import org.apache.kerby.asn1.type.Asn1Simple;
 import org.apache.kerby.asn1.type.Asn1Type;
 
@@ -66,7 +66,7 @@
         } else if (value instanceof Asn1Dumpable) {
             Asn1Dumpable dumpable = (Asn1Dumpable) value;
             dumpable.dumpWith(this, indents);
-        } else if (value instanceof Asn1Specifix) {
+        } else if (value instanceof Asn1Specific) {
             indent(indents).append(value.toString());
         } else {
             indent(indents).append("<Unknown>");
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1CollectionType.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1CollectionType.java
index 16e40b3..8f546c6 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1CollectionType.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1CollectionType.java
@@ -228,10 +228,22 @@
         setFieldAs(index, new Asn1Integer(value));
     }
 
-    protected void setFieldAsBigInteger(EnumType index, BigInteger value) {
+    protected void setFieldAsInt(EnumType index, BigInteger value) {
         setFieldAs(index, new Asn1Integer(value));
     }
 
+    protected void setFieldAsObjId(EnumType index, String value) {
+        setFieldAs(index, new Asn1ObjectIdentifier(value));
+    }
+
+    protected String getFieldAsObjId(EnumType index) {
+        Asn1ObjectIdentifier objId = getFieldAs(index, Asn1ObjectIdentifier.class);
+        if (objId != null) {
+            return objId.getValue();
+        }
+        return null;
+    }
+
     protected <T extends Asn1Type> T getFieldAsAny(EnumType index, Class<T> t) {
         Asn1Type value = fields[index.getValue()];
         if (value != null && value instanceof Asn1Any) {
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Specifix.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Specific.java
similarity index 86%
rename from kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Specifix.java
rename to kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Specific.java
index b52259c..423e67e 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Specifix.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Specific.java
@@ -25,15 +25,15 @@
 import java.io.IOException;
 
 /**
- * Application or context object mainly for using implicit encoding.
+ * Application or context specific object mainly for using implicit encoding.
  */
-public class Asn1Specifix extends AbstractAsn1Type<byte[]> {
+public class Asn1Specific extends AbstractAsn1Type<byte[]> {
 
-    public Asn1Specifix(Tag tag, byte[] value) {
+    public Asn1Specific(Tag tag, byte[] value) {
         super(tag, value);
     }
 
-    public Asn1Specifix(Tag tag) {
+    public Asn1Specific(Tag tag) {
         super(tag);
     }
 
diff --git a/kerby-config/src/main/java/org/apache/kerby/config/Conf.java b/kerby-config/src/main/java/org/apache/kerby/config/Conf.java
index d5bbcfc..86555e9 100644
--- a/kerby-config/src/main/java/org/apache/kerby/config/Conf.java
+++ b/kerby-config/src/main/java/org/apache/kerby/config/Conf.java
@@ -25,27 +25,23 @@
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 
+/**
+ * A general class to describe and store all the config files.
+ */
 public class Conf implements Config {
     private static final Logger LOGGER = LoggerFactory.getLogger(Conf.class);
 
     private List<ConfigLoader> resourceConfigs;
     private final ConfigImpl config;
-    private final Map<String, String> setValues;
-    private boolean needReload;
 
     public Conf() {
         this.resourceConfigs = new ArrayList<ConfigLoader>(1);
         this.config = new ConfigImpl("Conf");
-        this.setValues = new HashMap<>(10);
-        this.needReload = true;
-
-        addMapConfig(setValues);
     }
 
     public void addXmlConfig(File xmlFile) throws IOException {
@@ -72,10 +68,16 @@
         addResource(Resource.createMapResource(mapConfig));
     }
 
-    public void addResource(Resource resource) {
+    /**
+     * Load the resource name and content in one step.
+     * Add synchronized to avoid conflicts
+     * @param resource the config resource
+     */
+    public synchronized void addResource(Resource resource) {
         ConfigLoader loader = getLoader(resource);
         resourceConfigs.add(loader);
-        needReload = true;
+        Config loaded = loader.load();
+        config.add(loaded);
     }
 
     private static ConfigLoader getLoader(Resource resource) {
@@ -94,16 +96,12 @@
         return loader;
     }
 
-    private void checkAndLoad() {
-        if (needReload) {
-            reload();
-            needReload = false;
-        }
-    }
-
-    public void reload() {
+    /**
+     * For users usage, to determine whether to reload config files.
+     * Add synchronized to avoid conflicts
+     */
+    public synchronized void reload() {
         config.reset();
-
         for (ConfigLoader loader : resourceConfigs) {
             Config loaded = loader.load();
             config.add(loaded);
@@ -112,37 +110,38 @@
 
     @Override
     public String getResource() {
-        checkAndLoad();
         return config.getResource();
     }
 
     @Override
     public Set<String> getNames() {
-        checkAndLoad();
         return config.getNames();
     }
 
     @Override
     public String getString(String name) {
-        checkAndLoad();
         return config.getString(name);
     }
 
     @Override
     public String getString(ConfigKey name, boolean useDefault) {
-        checkAndLoad();
         return config.getString(name, useDefault);
     }
 
     @Override
     public String getString(String name, String defaultValue) {
-        checkAndLoad();
         return config.getString(name, defaultValue);
     }
 
+    /**
+     * Values user sets will be add in config directly.
+     * Add synchronized to avoid conflicts
+     * @param name The property name
+     * @param value The string value
+     */
     @Override
-    public void setString(String name, String value) {
-        setValues.put(name, value);
+    public synchronized void setString(String name, String value) {
+        config.set(name, value);
     }
 
     @Override
@@ -152,31 +151,26 @@
 
     @Override
     public String getTrimmed(String name) {
-        checkAndLoad();
         return config.getTrimmed(name);
     }
 
     @Override
     public String getTrimmed(ConfigKey name) {
-        checkAndLoad();
         return config.getTrimmed(name);
     }
 
     @Override
     public Boolean getBoolean(String name) {
-        checkAndLoad();
         return config.getBoolean(name);
     }
 
     @Override
     public Boolean getBoolean(ConfigKey name, boolean useDefault) {
-        checkAndLoad();
         return config.getBoolean(name, useDefault);
     }
 
     @Override
     public Boolean getBoolean(String name, Boolean defaultValue) {
-        checkAndLoad();
         return config.getBoolean(name, defaultValue);
     }
 
@@ -192,19 +186,16 @@
 
     @Override
     public Integer getInt(String name) {
-        checkAndLoad();
         return config.getInt(name);
     }
 
     @Override
     public Integer getInt(ConfigKey name, boolean useDefault) {
-        checkAndLoad();
         return config.getInt(name, useDefault);
     }
 
     @Override
     public Integer getInt(String name, Integer defaultValue) {
-        checkAndLoad();
         return config.getInt(name, defaultValue);
     }
 
@@ -220,19 +211,16 @@
 
     @Override
     public Long getLong(String name) {
-        checkAndLoad();
         return config.getLong(name);
     }
 
     @Override
     public Long getLong(ConfigKey name, boolean useDefault) {
-        checkAndLoad();
         return config.getLong(name, useDefault);
     }
 
     @Override
     public Long getLong(String name, Long defaultValue) {
-        checkAndLoad();
         return config.getLong(name, defaultValue);
     }
 
@@ -248,19 +236,16 @@
 
     @Override
     public Float getFloat(String name) {
-        checkAndLoad();
         return config.getFloat(name);
     }
 
     @Override
     public Float getFloat(ConfigKey name, boolean useDefault) {
-        checkAndLoad();
         return config.getFloat(name, useDefault);
     }
 
     @Override
     public Float getFloat(String name, Float defaultValue) {
-        checkAndLoad();
         return config.getFloat(name, defaultValue);
     }
 
@@ -276,69 +261,58 @@
 
     @Override
     public List<String> getList(String name) {
-        checkAndLoad();
         return config.getList(name);
     }
 
     @Override
     public List<String> getList(String name, String[] defaultValue) {
-        checkAndLoad();
         return config.getList(name, defaultValue);
     }
 
     @Override
     public List<String> getList(ConfigKey name) {
-        checkAndLoad();
         return config.getList(name);
     }
 
     @Override
     public Config getConfig(String name) {
-        checkAndLoad();
         return config.getConfig(name);
     }
 
     @Override
     public Config getConfig(ConfigKey name) {
-        checkAndLoad();
         return config.getConfig(name);
     }
 
     @Override
     public Class<?> getClass(String name) throws ClassNotFoundException {
-        checkAndLoad();
         return config.getClass(name);
     }
 
     @Override
     public Class<?> getClass(String name, Class<?> defaultValue)
             throws ClassNotFoundException {
-        checkAndLoad();
         return config.getClass(name, defaultValue);
     }
 
     @Override
     public Class<?> getClass(ConfigKey name, boolean useDefault)
             throws ClassNotFoundException {
-        checkAndLoad();
         return config.getClass(name, useDefault);
     }
 
     @Override
     public <T> T getInstance(String name) throws ClassNotFoundException {
-        checkAndLoad();
         return config.getInstance(name);
     }
 
     @Override
     public <T> T getInstance(ConfigKey name) throws ClassNotFoundException {
-        checkAndLoad();
         return config.getInstance(name);
     }
 
     @Override
     public <T> T getInstance(String name, Class<T> xface) throws ClassNotFoundException {
-        checkAndLoad();
         return config.getInstance(name, xface);
     }
 }
\ No newline at end of file
diff --git a/kerby-config/src/main/java/org/apache/kerby/config/ConfigImpl.java b/kerby-config/src/main/java/org/apache/kerby/config/ConfigImpl.java
index d083313..ec3090f 100644
--- a/kerby-config/src/main/java/org/apache/kerby/config/ConfigImpl.java
+++ b/kerby-config/src/main/java/org/apache/kerby/config/ConfigImpl.java
@@ -38,8 +38,6 @@
      */
     private List<Config> configs;
 
-    private Set<String> propNames;
-
     protected ConfigImpl(String resource) {
         this.resource = resource;
         this.properties = new HashMap<String, ConfigObject>();
@@ -58,7 +56,10 @@
 
     @Override
     public Set<String> getNames() {
-        reloadNames();
+        Set<String>propNames = new HashSet<String>(properties.keySet());
+        for (Config config : configs) {
+            propNames.addAll(config.getNames());
+        }
         return propNames;
     }
 
@@ -424,14 +425,4 @@
             this.configs.add(config);
         }
     }
-
-    private void reloadNames() {
-        if (propNames != null) {
-            propNames.clear();
-        }
-        propNames = new HashSet<String>(properties.keySet());
-        for (Config config : configs) {
-            propNames.addAll(config.getNames());
-        }
-    }
 }
diff --git a/kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/WithAccessTokenKdcTest.java b/kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/AccessTokenKdcTest.java
similarity index 88%
rename from kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/WithAccessTokenKdcTest.java
rename to kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/AccessTokenKdcTest.java
index 3971265..57b2b1b 100644
--- a/kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/WithAccessTokenKdcTest.java
+++ b/kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/AccessTokenKdcTest.java
@@ -34,7 +34,7 @@
 import org.junit.Assert;
 import org.junit.Test;
 
-public class WithAccessTokenKdcTest extends WithTokenKdcTestBase {
+public class AccessTokenKdcTest extends TokenKdcTestBase {
 
     @Test
     public void testRequestServiceTicketWithAccessToken() throws Exception {
@@ -44,7 +44,7 @@
 
     @Test
     public void testBadIssuer() throws Exception {
-        InputStream is = WithTokenKdcTestBase.class.getResourceAsStream("/private_key.pem");
+        InputStream is = TokenKdcTestBase.class.getResourceAsStream("/private_key.pem");
         PrivateKey privateKey = PrivateKeyReader.loadPrivateKey(is);
         prepareToken(getServerPrincipal(), "oauth1.com", privateKey, null);
         
@@ -59,7 +59,7 @@
 
     @Test
     public void testBadAudienceRestriction() throws Exception {
-        InputStream is = WithTokenKdcTestBase.class.getResourceAsStream("/private_key.pem");
+        InputStream is = TokenKdcTestBase.class.getResourceAsStream("/private_key.pem");
         PrivateKey privateKey = PrivateKeyReader.loadPrivateKey(is);
         prepareToken("bad-service" + "/" + getHostname() + "@" + TestKdcServer.KDC_REALM,
                 ISSUER, privateKey, null);
@@ -103,10 +103,10 @@
     
     @Test
     public void testSignedEncryptedToken() throws Exception {
-        InputStream is = WithTokenKdcTestBase.class.getResourceAsStream("/private_key.pem");
+        InputStream is = TokenKdcTestBase.class.getResourceAsStream("/private_key.pem");
         PrivateKey privateKey = PrivateKeyReader.loadPrivateKey(is);
         
-        is = WithTokenKdcTestBase.class.getResourceAsStream("/oauth2.com_public_key.pem");
+        is = TokenKdcTestBase.class.getResourceAsStream("/oauth2.com_public_key.pem");
         PublicKey publicKey = PublicKeyReader.loadPublicKey(is);
         
         prepareToken(getServerPrincipal(), ISSUER, privateKey, publicKey);
@@ -119,7 +119,7 @@
         KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
         KeyPair keyPair = keyGen.generateKeyPair();
         
-        InputStream is = WithTokenKdcTestBase.class.getResourceAsStream("/oauth2.com_public_key.pem");
+        InputStream is = TokenKdcTestBase.class.getResourceAsStream("/oauth2.com_public_key.pem");
         PublicKey publicKey = PublicKeyReader.loadPublicKey(is);
         
         prepareToken(getServerPrincipal(), ISSUER, keyPair.getPrivate(), publicKey);
@@ -136,7 +136,7 @@
     private void performTest() throws Exception {
         createCredentialCache(getClientPrincipal(), getClientPassword());
 
-        KrbTokenClient tokenClient = new KrbTokenClient(getKrbClient());
+        KrbTokenClient tokenClient = getTokenClient();
         try {
             SgtTicket sgtTicket = tokenClient.requestSgt(
                 getKrbToken(), getServerPrincipal(), getcCacheFile().getPath());
diff --git a/kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/AnonymousPkinitKdcTest.java b/kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/AnonymousPkinitKdcTest.java
index 9e64fe8..215d8b0 100644
--- a/kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/AnonymousPkinitKdcTest.java
+++ b/kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/AnonymousPkinitKdcTest.java
@@ -19,6 +19,7 @@
  */
 package org.apache.kerby.kerberos.kdc;
 
+import org.apache.kerby.kerberos.kerb.KrbConstant;
 import org.apache.kerby.kerberos.kerb.KrbException;
 import org.apache.kerby.kerberos.kerb.client.KrbConfigKey;
 import org.apache.kerby.kerberos.kerb.client.KrbPkinitClient;
@@ -26,18 +27,24 @@
 import org.apache.kerby.kerberos.kerb.server.KdcTestBase;
 import org.apache.kerby.kerberos.kerb.type.ticket.SgtTicket;
 import org.apache.kerby.kerberos.kerb.type.ticket.TgtTicket;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+/**
+ * Anonymous PKINIT test.
+ */
 public class AnonymousPkinitKdcTest extends KdcTestBase {
-
     private String serverPrincipal;
+    private KrbPkinitClient pkinitClient;
 
     @Before
     public void setUp() throws Exception {
         super.setUp();
+
+        pkinitClient = getPkinitClient();
     }
 
     @Override
@@ -57,28 +64,24 @@
         super.createPrincipals();
         //Anonymity support is not enabled by default.
         //To enable it, you must create the principal WELLKNOWN/ANONYMOUS
-        getKdcServer().createPrincipal("WELLKNOWN/ANONYMOUS");
+        getKdcServer().createPrincipal(KrbConstant.ANONYMOUS_PRINCIPAL);
     }
 
     @Test
     public void testAnonymity() throws Exception {
-
-        getKrbClient().init();
-
-
         TgtTicket tgt;
-        KrbPkinitClient pkinitClient = new KrbPkinitClient(getKrbClient());
+
         try {
             tgt = pkinitClient.requestTgt();
         } catch (KrbException te) {
             te.printStackTrace();
-            assertThat(te.getMessage().contains("timeout")).isTrue();
+            Assert.fail();
             return;
         }
         assertThat(tgt).isNotNull();
 
         serverPrincipal = getServerPrincipal();
-        SgtTicket tkt = getKrbClient().requestSgt(tgt, serverPrincipal);
+        SgtTicket tkt = pkinitClient.requestSgt(tgt, serverPrincipal);
         assertThat(tkt).isNotNull();
     }
 }
diff --git a/kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/WithIdentityTokenKdcTest.java b/kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/IdentityTokenKdcTest.java
similarity index 89%
rename from kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/WithIdentityTokenKdcTest.java
rename to kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/IdentityTokenKdcTest.java
index 5eaa176..5aa2115 100644
--- a/kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/WithIdentityTokenKdcTest.java
+++ b/kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/IdentityTokenKdcTest.java
@@ -35,7 +35,7 @@
 import java.security.PrivateKey;
 import java.security.PublicKey;
 
-public class WithIdentityTokenKdcTest extends WithTokenKdcTestBase {
+public class IdentityTokenKdcTest extends TokenKdcTestBase {
 
     @Test
     public void testKdc() throws Exception {
@@ -45,7 +45,7 @@
 
     @Test
     public void testBadIssuer() throws Exception {
-        InputStream is = WithTokenKdcTestBase.class.getResourceAsStream("/private_key.pem");
+        InputStream is = TokenKdcTestBase.class.getResourceAsStream("/private_key.pem");
         PrivateKey privateKey = PrivateKeyReader.loadPrivateKey(is);
         prepareToken(getAudience("krbtgt"), "oauth1.com", privateKey, null);
 
@@ -60,7 +60,7 @@
 
     @Test
     public void testBadAudienceRestriction() throws Exception {
-        InputStream is = WithTokenKdcTestBase.class.getResourceAsStream("/private_key.pem");
+        InputStream is = TokenKdcTestBase.class.getResourceAsStream("/private_key.pem");
         PrivateKey privateKey = PrivateKeyReader.loadPrivateKey(is);
         prepareToken("krbtgt2@EXAMPLE.COM", ISSUER, privateKey, null);
 
@@ -102,10 +102,10 @@
 
     @Test
     public void testSignedEncryptedToken() throws Exception {
-        InputStream is = WithTokenKdcTestBase.class.getResourceAsStream("/private_key.pem");
+        InputStream is = TokenKdcTestBase.class.getResourceAsStream("/private_key.pem");
         PrivateKey privateKey = PrivateKeyReader.loadPrivateKey(is);
 
-        is = WithTokenKdcTestBase.class.getResourceAsStream("/oauth2.com_public_key.pem");
+        is = TokenKdcTestBase.class.getResourceAsStream("/oauth2.com_public_key.pem");
         PublicKey publicKey = PublicKeyReader.loadPublicKey(is);
 
         prepareToken(getAudience("krbtgt"), ISSUER, privateKey, publicKey);
@@ -118,7 +118,7 @@
         KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
         KeyPair keyPair = keyGen.generateKeyPair();
 
-        InputStream is = WithTokenKdcTestBase.class.getResourceAsStream("/oauth2.com_public_key.pem");
+        InputStream is = TokenKdcTestBase.class.getResourceAsStream("/oauth2.com_public_key.pem");
         PublicKey publicKey = PublicKeyReader.loadPublicKey(is);
 
         prepareToken(getAudience("krbtgt"), ISSUER, keyPair.getPrivate(), publicKey);
@@ -137,7 +137,7 @@
         createCredentialCache(getClientPrincipal(), getClientPassword());
 
         TgtTicket tgt;
-        KrbTokenClient tokenClient = new KrbTokenClient(getKrbClient());
+        KrbTokenClient tokenClient = getTokenClient();
         try {
             tgt = tokenClient.requestTgt(getKrbToken(),
                 getcCacheFile().getPath());
diff --git a/kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/WithCertKdcTest.java b/kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/PkinitKdcTest.java
similarity index 94%
rename from kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/WithCertKdcTest.java
rename to kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/PkinitKdcTest.java
index 1705bf9..f226a97 100644
--- a/kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/WithCertKdcTest.java
+++ b/kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/PkinitKdcTest.java
@@ -25,7 +25,7 @@
 import org.apache.kerby.kerberos.kerb.server.KdcTestBase;
 import org.apache.kerby.kerberos.kerb.type.ticket.SgtTicket;
 import org.apache.kerby.kerberos.kerb.type.ticket.TgtTicket;
-import org.apache.kerby.pki.PkiLoader;
+import org.apache.kerby.pkix.PkiLoader;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -36,6 +36,10 @@
 import static org.assertj.core.api.Assertions.assertThat;
 
 /**
+ * RSA PKINIT test.
+ */
+
+/**
  openssl genrsa -out cakey.pem 2048
  openssl req -key cakey.pem -new -x509 -out cacert.pem -days 3650
  vi extensions.kdc
@@ -44,17 +48,21 @@
  env REALM=SH.INTEL.COM openssl x509 -req -in kdc.req -CAkey cakey.pem \
  -CA cacert.pem -out kdc.pem -days 365 -extfile extensions.kdc -extensions kdc_cert -CAcreateserial
  */
-public class WithCertKdcTest extends KdcTestBase {
+public class PkinitKdcTest extends KdcTestBase {
     private PkiLoader pkiLoader;
     private String serverPrincipal;
     private Certificate userCert;
     private PrivateKey userKey; //NOPMD
 
+    private KrbPkinitClient pkinitClient;
+
     @Before
     public void setUp() throws Exception {
         pkiLoader = new PkiLoader();
 
         super.setUp();
+
+        pkinitClient = getPkinitClient();
     }
 
     @Override
@@ -80,10 +88,7 @@
     public void testPkinit() throws Exception {
         assertThat(userCert).isNotNull();
 
-        getKrbClient().init();
-
         TgtTicket tgt;
-        KrbPkinitClient pkinitClient = new KrbPkinitClient(getKrbClient());
         try {
             String userCertPath = getClass().getResource("/usercert.pem").getPath();
             String userKeyPath = getClass().getResource("/userkey.pem").getPath();
diff --git a/kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/WithTokenKdcTestBase.java b/kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/TokenKdcTestBase.java
similarity index 94%
rename from kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/WithTokenKdcTestBase.java
rename to kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/TokenKdcTestBase.java
index f33309f..387ad52 100644
--- a/kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/WithTokenKdcTestBase.java
+++ b/kerby-kdc-test/src/test/java/org/apache/kerby/kerberos/kdc/TokenKdcTestBase.java
@@ -48,7 +48,7 @@
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-public class WithTokenKdcTestBase extends KdcTestBase {
+public class TokenKdcTestBase extends KdcTestBase {
     static final String SUBJECT = "test-sub";
     static final String ISSUER = "oauth2.com";
     static final String GROUP = "sales-group";
@@ -68,7 +68,7 @@
         String verifyKeyPath = this.getClass().getResource("/").getPath();
         getKdcServer().getKdcConfig().setString(KdcConfigKey.TOKEN_VERIFY_KEYS, verifyKeyPath);
         
-        URL privateKeyPath = WithTokenKdcTestBase.class.getResource("/private_key.pem");
+        URL privateKeyPath = TokenKdcTestBase.class.getResource("/private_key.pem");
         getKdcServer().getKdcConfig().setString(KdcConfigKey.TOKEN_DECRYPTION_KEYS, privateKeyPath.getPath());
         getKdcServer().getKdcConfig().setString(KdcConfigKey.TOKEN_ISSUERS, ISSUER);
     }
@@ -82,7 +82,7 @@
     }
     
     protected AuthToken prepareToken(String audience) {
-        InputStream is = WithTokenKdcTestBase.class.getResourceAsStream("/private_key.pem");
+        InputStream is = TokenKdcTestBase.class.getResourceAsStream("/private_key.pem");
         PrivateKey privateKey = null;
         try {
             privateKey = PrivateKeyReader.loadPrivateKey(is);
@@ -120,10 +120,10 @@
         TokenEncoder tokenEncoder = KrbRuntime.getTokenProvider().createTokenEncoder();
 
         if (tokenEncoder instanceof JwtTokenEncoder && signingKey != null) {
-            ((JwtTokenEncoder) tokenEncoder).setSignKey(signingKey);
+            tokenEncoder.setSignKey(signingKey);
         }
         if (tokenEncoder instanceof JwtTokenEncoder && encryptionKey != null) {
-            ((JwtTokenEncoder) tokenEncoder).setEncryptionKey(encryptionKey);
+            tokenEncoder.setEncryptionKey(encryptionKey);
         }
 
         krbToken = new KrbToken();
diff --git a/kerby-kerb/kerb-client/pom.xml b/kerby-kerb/kerb-client/pom.xml
index 5bbc680..d75eaea 100644
--- a/kerby-kerb/kerb-client/pom.xml
+++ b/kerby-kerb/kerb-client/pom.xml
@@ -46,10 +46,5 @@
       <artifactId>kerb-util</artifactId>
       <version>${project.version}</version>
     </dependency>
-    <dependency>
-      <groupId>org.bouncycastle</groupId>
-      <artifactId>bcpkix-jdk15on</artifactId>
-      <version>1.52</version>
-    </dependency>
   </dependencies>
 </project>
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbKdcOption.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbKdcOption.java
index 1a8306f..4c29394 100644
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbKdcOption.java
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbKdcOption.java
@@ -29,21 +29,21 @@
     NONE(null),
 
     /* KDC flags */
-    FORWARDABLE(new KOptionInfo("forwardable", "forwardable",
+    FORWARDABLE(new KOptionInfo("-f", "forwardable",
         KrbOptionGroup.KDC_FLAGS)),
-    PROXIABLE(new KOptionInfo("proxiable", "proxiable",
+    PROXIABLE(new KOptionInfo("-p", "proxiable",
         KrbOptionGroup.KDC_FLAGS)),
-    REQUEST_ANONYMOUS(new KOptionInfo("request-anonymous",
+    REQUEST_ANONYMOUS(new KOptionInfo("-n",
         "request anonymous", KrbOptionGroup.KDC_FLAGS)),
-    VALIDATE(new KOptionInfo("validate", "validate",
+    VALIDATE(new KOptionInfo("-v", "validate",
         KrbOptionGroup.KDC_FLAGS)),
-    RENEW(new KOptionInfo("renew", "renew",
+    RENEW(new KOptionInfo("-R", "renew",
         KrbOptionGroup.KDC_FLAGS)),
-    RENEWABLE(new KOptionInfo("renewable", "renewable",
+    RENEWABLE(new KOptionInfo("-r", "renewable-life",
         KrbOptionGroup.KDC_FLAGS)),
     RENEWABLE_OK(new KOptionInfo("renewable-ok", "renewable ok",
         KrbOptionGroup.KDC_FLAGS)),
-    CANONICALIZE(new KOptionInfo("canonicalize", "canonicalize",
+    CANONICALIZE(new KOptionInfo("-C", "canonicalize",
         KrbOptionGroup.KDC_FLAGS)),
     ANONYMOUS(new KOptionInfo("-n", "anonymous",
               KrbOptionGroup.KDC_FLAGS));
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbPkinitClient.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbPkinitClient.java
index 4668583..fd361f7 100644
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbPkinitClient.java
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbPkinitClient.java
@@ -20,6 +20,7 @@
 package org.apache.kerby.kerberos.kerb.client;
 
 import org.apache.kerby.KOptions;
+import org.apache.kerby.kerberos.kerb.KrbConstant;
 import org.apache.kerby.kerberos.kerb.KrbException;
 import org.apache.kerby.kerberos.kerb.type.ticket.TgtTicket;
 
@@ -89,7 +90,8 @@
     public TgtTicket requestTgt() throws KrbException {
         KOptions requestOptions = new KOptions();
         requestOptions.add(PkinitOption.USE_ANONYMOUS);
-        requestOptions.add(KrbOption.CLIENT_PRINCIPAL, "WELLKNOWN/ANONYMOUS");
+        requestOptions.add(KrbOption.CLIENT_PRINCIPAL,
+            KrbConstant.ANONYMOUS_PRINCIPAL);
         return requestTgt(requestOptions);
     }
 }
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/PkinitPreauth.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/PkinitPreauth.java
index 640f718..26b7203 100644
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/PkinitPreauth.java
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/PkinitPreauth.java
@@ -50,7 +50,7 @@
 import org.apache.kerby.kerberos.kerb.type.pa.pkinit.PkAuthenticator;
 import org.apache.kerby.kerberos.kerb.type.pa.pkinit.TrustedCertifiers;
 import org.apache.kerby.x509.type.AlgorithmIdentifier;
-import org.apache.kerby.x509.type.DHParameter;
+import org.apache.kerby.x509.type.DhParameter;
 import org.apache.kerby.x509.type.SubjectPublicKeyInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -241,7 +241,7 @@
             String content = "0x06 07 2A 86 48 ce 3e 02 01";
             Asn1ObjectIdentifier dhOid = PkinitCrypto.createOid(content);
             AlgorithmIdentifier dhAlg = new AlgorithmIdentifier();
-            dhAlg.setAlgorithm(dhOid);
+            dhAlg.setAlgorithm(dhOid.getValue());
 
             DhClient client = new DhClient();
 
@@ -256,7 +256,7 @@
 
             DHParameterSpec type = clientPubKey.getParams();
             BigInteger q = type.getP().shiftRight(1);
-            DHParameter dhParameter = new DHParameter();
+            DhParameter dhParameter = new DhParameter();
             dhParameter.setP(type.getP());
             dhParameter.setG(type.getG());
             dhParameter.setQ(q);
@@ -270,7 +270,7 @@
 
             authPack.setClientPublicValue(pubInfo);
 
-//            DHNonce dhNonce = new DHNonce();
+//            DhNonce dhNonce = new DhNonce();
 //            authPack.setClientDhNonce(dhNonce);
 
         } else {
@@ -293,7 +293,7 @@
 
     private byte[] signAuthPack(AuthPack authPack) throws KrbException {
 
-        Asn1ObjectIdentifier oid = pkinitContext.cryptoctx.getIdPkinitAuthDataOID();
+        String oid = pkinitContext.cryptoctx.getIdPkinitAuthDataOID();
 
         byte[] signedDataBytes = PkinitCrypto.cmsSignedDataCreate(
             KrbCodec.encode(authPack), oid, 3, null, null, null, null);
@@ -361,7 +361,6 @@
      * @return PaDataEntry to be made.
      */
     private PaDataEntry makeEntry(PaPkAsReq paPkAsReq) throws KrbException {
-
         PaDataEntry paDataEntry = new PaDataEntry();
         paDataEntry.setPaDataType(PaDataType.PK_AS_REQ);
         paDataEntry.setPaDataValue(KrbCodec.encode(paPkAsReq));
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/SignedDataEngine.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/SignedDataEngine.java
deleted file mode 100644
index a63dfe9..0000000
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/SignedDataEngine.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/**
- *  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.client.preauth.pkinit;
-
-import org.apache.kerby.kerberos.kerb.type.pa.pkinit.AuthPack;
-import org.apache.kerby.kerberos.kerb.type.pa.pkinit.KdcDHKeyInfo;
-import org.apache.kerby.kerberos.kerb.type.pa.pkinit.ReplyKeyPack;
-import org.bouncycastle.asn1.ASN1ObjectIdentifier;
-import org.bouncycastle.cert.X509CertificateHolder;
-import org.bouncycastle.cert.jcajce.JcaCertStore;
-import org.bouncycastle.cms.CMSException;
-import org.bouncycastle.cms.CMSProcessableByteArray;
-import org.bouncycastle.cms.CMSSignedData;
-import org.bouncycastle.cms.CMSSignedDataGenerator;
-import org.bouncycastle.cms.CMSTypedData;
-import org.bouncycastle.cms.SignerInformation;
-import org.bouncycastle.cms.SignerInformationStore;
-import org.bouncycastle.cms.jcajce.JcaSimpleSignerInfoGeneratorBuilder;
-import org.bouncycastle.cms.jcajce.JcaSimpleSignerInfoVerifierBuilder;
-import org.bouncycastle.jce.provider.BouncyCastleProvider;
-import org.bouncycastle.operator.OperatorCreationException;
-import org.bouncycastle.util.Store;
-
-import java.io.IOException;
-import java.security.PrivateKey;
-import java.security.Security;
-import java.security.cert.CertificateEncodingException;
-import java.security.cert.X509Certificate;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-
-/**
- * Encapsulates working with PKINIT signed data structures.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- * @version $Rev$, $Date$
- */
-public class SignedDataEngine {
-    private static final String ID_PKINIT_AUTHDATA = "1.3.6.1.5.2.3.1";
-    private static final String ID_PKINIT_DHKEYDATA = "1.3.6.1.5.2.3.2";
-    private static final String ID_PKINIT_RKEYDATA = "1.3.6.1.5.2.3.3";
-
-    /**
-     * Uses a private key to sign data in a CMS SignedData structure and returns
-     * the encoded CMS SignedData as bytes.
-     * <p/>
-     * 'signedAuthPack' contains a CMS type ContentInfo encoded according to [RFC3852].
-     * The contentType field of the type ContentInfo is id-signedData (1.2.840.113549.1.7.2),
-     * and the content field is a SignedData.
-     * <p/>
-     * The eContentType field for the type SignedData is id-pkinit-authData (1.3.6.1.5.2.3.1),
-     * and the eContent field contains the DER encoding of the type AuthPack.
-     *
-     * @param privateKey
-     * @param certificate
-     * @param authPack
-     * @return The CMS SignedData bytes.
-     * @throws OperatorCreationException
-     * @throws CertificateEncodingException
-     * @throws CMSException
-     * @throws IOException
-     */
-    public static byte[] getSignedAuthPack(PrivateKey privateKey, X509Certificate certificate,
-                                           AuthPack authPack)
-            throws OperatorCreationException, CertificateEncodingException, CMSException, IOException {
-        return getSignedData(privateKey, certificate, authPack.encode(), ID_PKINIT_AUTHDATA);
-    }
-
-
-    /**
-     * Uses a private key to sign data in a CMS SignedData structure and returns
-     * the encoded CMS SignedData as bytes.
-     * <p/>
-     * 'dhSignedData' contains a CMS type ContentInfo encoded according to [RFC3852].
-     * The contentType field of the type ContentInfo is id-signedData (1.2.840.113549.1.7.2),
-     * and the content field is a SignedData.
-     * <p/>
-     * The eContentType field for the type SignedData is id-pkinit-DHKeyData (1.3.6.1.5.2.3.2),
-     * and the eContent field contains the DER encoding of the type KDCDHKeyInfo.
-     *
-     * @param privateKey
-     * @param certificate
-     * @param kdcDhKeyInfo
-     * @return The CMS SignedData bytes.
-     * @throws OperatorCreationException
-     * @throws CertificateEncodingException
-     * @throws CMSException
-     * @throws IOException
-     */
-    public static byte[] getSignedKdcDhKeyInfo(PrivateKey privateKey, X509Certificate certificate,
-                                               KdcDHKeyInfo kdcDhKeyInfo)
-            throws OperatorCreationException, CertificateEncodingException, CMSException, IOException {
-        return getSignedData(privateKey, certificate, kdcDhKeyInfo.encode(), ID_PKINIT_DHKEYDATA);
-    }
-
-
-    /**
-     * Uses a private key to sign data in a CMS SignedData structure and returns
-     * the encoded CMS SignedData as bytes.
-     * <p/>
-     * Selected when public key encryption is used.
-     * <p/>
-     * The eContentType field for the inner type SignedData (when unencrypted) is
-     * id-pkinit-rkeyData (1.3.6.1.5.2.3.3) and the eContent field contains the
-     * DER encoding of the type ReplyKeyPack.
-     *
-     * @param privateKey
-     * @param certificate
-     * @param replyKeyPack
-     * @return The CMS SignedData bytes.
-     * @throws OperatorCreationException
-     * @throws CertificateEncodingException
-     * @throws CMSException
-     * @throws IOException
-     */
-    public static byte[] getSignedReplyKeyPack(PrivateKey privateKey, X509Certificate certificate,
-                                               ReplyKeyPack replyKeyPack)
-            throws OperatorCreationException, CertificateEncodingException, CMSException, IOException {
-        return getSignedData(privateKey, certificate, replyKeyPack.encode(), ID_PKINIT_RKEYDATA);
-    }
-
-
-    static byte[] getSignedData(PrivateKey privateKey, X509Certificate certificate, byte[] dataToSign,
-                                String eContentType) throws IOException, OperatorCreationException,
-            CertificateEncodingException, CMSException {
-
-        if (Security.getProvider("BC") == null) {
-            Security.addProvider(new BouncyCastleProvider());
-        }
-
-
-        List certList = new ArrayList();
-        certList.add(certificate);
-        Store certs = new JcaCertStore(certList);
-
-        CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
-
-        gen.addSignerInfoGenerator(
-                new JcaSimpleSignerInfoGeneratorBuilder()
-                        .setProvider("BC")
-                        .build("SHA1withRSA", privateKey, certificate));
-
-        gen.addCertificates(certs);
-
-        ASN1ObjectIdentifier asn1ObjectIdentifier = new ASN1ObjectIdentifier(eContentType);
-        CMSTypedData msg = new CMSProcessableByteArray(asn1ObjectIdentifier, dataToSign);
-        CMSSignedData s = gen.generate(msg, true);
-
-        return s.getEncoded();
-    }
-
-    /**
-     * Validates a CMS SignedData using the public key corresponding to the private
-     * key used to sign the structure.
-     *
-     * @param s
-     * @return true if the signature is valid.
-     * @throws Exception
-     */
-    public static boolean validateSignedData(CMSSignedData s) throws Exception {
-
-        Store certStore = s.getCertificates();
-        Store crlStore = s.getCRLs();
-        SignerInformationStore signers = s.getSignerInfos();
-
-        Collection c = signers.getSigners();
-        Iterator it = c.iterator();
-
-        while (it.hasNext()) {
-            SignerInformation signer = (SignerInformation) it.next();
-            Collection certCollection = certStore.getMatches(signer.getSID());
-
-            Iterator certIt = certCollection.iterator();
-            X509CertificateHolder cert = (X509CertificateHolder) certIt.next();
-
-            if (!signer.verify(new JcaSimpleSignerInfoVerifierBuilder().setProvider("BC").build(cert))) {
-                return false;
-            }
-        }
-
-        Collection certColl = certStore.getMatches(null);
-        Collection crlColl = crlStore.getMatches(null);
-
-        if (certColl.size() != s.getCertificates().getMatches(null).size()
-                || crlColl.size() != s.getCRLs().getMatches(null).size()) {
-            return false;
-        }
-        return true;
-    }
-}
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/request/AsRequestWithCert.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/request/AsRequestWithCert.java
index f6e0e41..3e7c114 100644
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/request/AsRequestWithCert.java
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/request/AsRequestWithCert.java
@@ -32,7 +32,7 @@
 import org.apache.kerby.kerberos.kerb.client.PkinitOption;
 import org.apache.kerby.kerberos.kerb.common.KrbUtil;
 import org.apache.kerby.kerberos.kerb.crypto.dh.DhClient;
-import org.apache.kerby.kerberos.kerb.preauth.pkinit.CMSMessageType;
+import org.apache.kerby.kerberos.kerb.preauth.pkinit.CmsMessageType;
 import org.apache.kerby.kerberos.kerb.preauth.pkinit.CertificateHelper;
 import org.apache.kerby.kerberos.kerb.preauth.pkinit.PkinitCrypto;
 import org.apache.kerby.kerberos.kerb.type.base.EncryptionKey;
@@ -44,8 +44,8 @@
 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.DHRepInfo;
-import org.apache.kerby.kerberos.kerb.type.pa.pkinit.KdcDHKeyInfo;
+import org.apache.kerby.kerberos.kerb.type.pa.pkinit.DhRepInfo;
+import org.apache.kerby.kerberos.kerb.type.pa.pkinit.KdcDhKeyInfo;
 import org.apache.kerby.kerberos.kerb.type.pa.pkinit.PaPkAsRep;
 import org.apache.kerby.x509.type.Certificate;
 import org.slf4j.Logger;
@@ -110,7 +110,7 @@
                 LOG.info("processing PK_AS_REP");
 
                 PaPkAsRep paPkAsRep = KrbCodec.decode(paEntry.getPaDataValue(), PaPkAsRep.class);
-                DHRepInfo dhRepInfo = paPkAsRep.getDHRepInfo();
+                DhRepInfo dhRepInfo = paPkAsRep.getDHRepInfo();
 
                 byte[] dhSignedData = dhRepInfo.getDHSignedData();
 
@@ -123,8 +123,8 @@
 
                 SignedData signedData = contentInfo.getContentAs(SignedData.class);
 
-                PkinitCrypto.verifyCMSSignedData(
-                        CMSMessageType.CMS_SIGN_SERVER, signedData);
+                PkinitCrypto.verifyCmsSignedData(
+                    CmsMessageType.CMS_SIGN_SERVER, signedData);
 
 
                 String anchorFileName = getContext().getConfig().getPkinitAnchors().get(0);
@@ -163,16 +163,16 @@
                 LOG.info("skipping EKU check");
 
                 LOG.info("as_rep: DH key transport algorithm");
-                KdcDHKeyInfo kdcDHKeyInfo = new KdcDHKeyInfo();
+                KdcDhKeyInfo kdcDhKeyInfo = new KdcDhKeyInfo();
                 try {
-                    kdcDHKeyInfo.decode(signedData.getEncapContentInfo().getContent());
+                    kdcDhKeyInfo.decode(signedData.getEncapContentInfo().getContent());
                 } catch (IOException e) {
-                    String errMessage = "failed to decode KdcDHKeyInfo " + e.getMessage();
+                    String errMessage = "failed to decode KdcDhKeyInfo " + e.getMessage();
                     LOG.error(errMessage);
                     throw new KrbException(errMessage);
                 }
 
-                byte[] subjectPublicKey = kdcDHKeyInfo.getSubjectPublicKey().getValue();
+                byte[] subjectPublicKey = kdcDhKeyInfo.getSubjectPublicKey().getValue();
 
                 Asn1Integer clientPubKey = KrbCodec.decode(subjectPublicKey, Asn1Integer.class);
                 BigInteger y = clientPubKey.getValue();
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/request/KdcRequest.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/request/KdcRequest.java
index 08ca20b..32e0db2 100644
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/request/KdcRequest.java
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/request/KdcRequest.java
@@ -23,7 +23,7 @@
 import org.apache.kerby.KOptions;
 import org.apache.kerby.kerberos.kerb.KrbException;
 import org.apache.kerby.kerberos.kerb.client.KrbContext;
-import org.apache.kerby.kerberos.kerb.client.KrbOption;
+import org.apache.kerby.kerberos.kerb.client.KrbKdcOption;
 import org.apache.kerby.kerberos.kerb.client.KrbOptionGroup;
 import org.apache.kerby.kerberos.kerb.client.preauth.KrbFastRequestState;
 import org.apache.kerby.kerberos.kerb.client.preauth.PreauthContext;
@@ -412,9 +412,9 @@
 
         for (KOption kOpt: requestOptions.getOptions()) {
             if (kOpt.getOptionInfo().getGroup() == KrbOptionGroup.KDC_FLAGS) {
-                KrbOption krbOption = (KrbOption) kOpt;
-                KdcOption kdcOption = KdcOption.valueOf(krbOption.name());
-                boolean flagValue = requestOptions.getBooleanOption(kOpt, false);
+                KrbKdcOption krbKdcOption = (KrbKdcOption) kOpt;
+                KdcOption kdcOption = KdcOption.valueOf(krbKdcOption.name());
+                boolean flagValue = requestOptions.getBooleanOption(kOpt, true);
                 kdcOptions.setFlag(kdcOption, flagValue);
             }
         }
diff --git a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/preauth/pkinit/CMSMessageType.java b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/preauth/pkinit/CmsMessageType.java
similarity index 93%
rename from kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/preauth/pkinit/CMSMessageType.java
rename to kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/preauth/pkinit/CmsMessageType.java
index 683b52f..7aa2b9f 100644
--- a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/preauth/pkinit/CMSMessageType.java
+++ b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/preauth/pkinit/CmsMessageType.java
@@ -19,7 +19,7 @@
  */
 package org.apache.kerby.kerberos.kerb.preauth.pkinit;
 
-public enum CMSMessageType {
+public enum CmsMessageType {
     UNKNOWN                  (-1),
     CMS_SIGN_CLIENT          (0x01),
     CMS_SIGN_SERVER          (0x03),
@@ -32,7 +32,7 @@
     /**
      * Create an instance of this class
      */
-    private CMSMessageType(int value) {
+    private CmsMessageType(int value) {
         this.value = value;
     }
 
@@ -48,7 +48,7 @@
      * @param value The integer value
      * @return The associated UniversalTag
      */
-    public static CMSMessageType fromValue(int value) {
+    public static CmsMessageType fromValue(int value) {
         switch (value) {
             case 0x01 : return CMS_SIGN_CLIENT;
             case 0x03 : return CMS_SIGN_SERVER;
diff --git a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/preauth/pkinit/PkinitCrypto.java b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/preauth/pkinit/PkinitCrypto.java
index e9cca99..262f84c 100644
--- a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/preauth/pkinit/PkinitCrypto.java
+++ b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/preauth/pkinit/PkinitCrypto.java
@@ -30,8 +30,9 @@
 import org.apache.kerby.kerberos.kerb.KrbErrorCode;
 import org.apache.kerby.kerberos.kerb.KrbException;
 import org.apache.kerby.kerberos.kerb.type.base.PrincipalName;
+import org.apache.kerby.util.HexUtil;
 import org.apache.kerby.x509.type.Certificate;
-import org.apache.kerby.x509.type.DHParameter;
+import org.apache.kerby.x509.type.DhParameter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -63,15 +64,15 @@
      * @param cmsMsgType The CMS message type
      * @param signedData The signed data
      */
-    public static void verifyCMSSignedData(CMSMessageType cmsMsgType, SignedData signedData)
+    public static void verifyCmsSignedData(CmsMessageType cmsMsgType, SignedData signedData)
             throws KrbException {
-        Asn1ObjectIdentifier oid = pkinitType2OID(cmsMsgType);
+        String oid = pkinitType2OID(cmsMsgType);
         if (oid == null) {
             throw new KrbException("Can't get the right oid ");
         }
 
-        Asn1ObjectIdentifier etype = signedData.getEncapContentInfo().getContentType();
-        if (oid.getValue().equals(etype.getValue())) {
+        String etype = signedData.getEncapContentInfo().getContentType();
+        if (oid.equals(etype)) {
             LOG.info("CMS Verification successful");
         } else {
             LOG.error("Wrong oid in eContentType");
@@ -80,25 +81,11 @@
     }
 
     /**
-     * Check whether signed of data, true if the SignerInfos are not null
-     * @param signedData The signed data
-     * @return boolean
-     */
-    public static boolean isSigned(SignedData signedData) {
-        /* Not actually signed; anonymous case */
-        if (signedData.getSignerInfos().getElements().size() == 0) {
-            return false;
-        } else {
-            return true;
-        }
-    }
-
-    /**
      * Change the CMS message type to oid
      * @param cmsMsgType The CMS message type
      * @return oid
      */
-    public static Asn1ObjectIdentifier pkinitType2OID(CMSMessageType cmsMsgType) {
+    public static String pkinitType2OID(CmsMessageType cmsMsgType) {
         switch (cmsMsgType) {
             case UNKNOWN:
                 return null;
@@ -117,10 +104,10 @@
      * KDC check the key parameter
      * @param pluginOpts The PluginOpts
      * @param cryptoctx The PkinitPlgCryptoContext
-     * @param dhParameter The DHParameter
+     * @param dhParameter The DhParameter
      */
     public static void serverCheckDH(PluginOpts pluginOpts, PkinitPlgCryptoContext cryptoctx,
-                                     DHParameter dhParameter) throws KrbException {
+                                     DhParameter dhParameter) throws KrbException {
          /* KDC SHOULD check to see if the key parameters satisfy its policy */
         int dhPrimeBits = dhParameter.getP().bitLength();
         if (dhPrimeBits < pluginOpts.dhMinBits) {
@@ -135,12 +122,12 @@
     /**
      * Check DH wellknown
      * @param cryptoctx The PkinitPlgCryptoContext
-     * @param dhParameter The DHParameter
+     * @param dhParameter The DhParameter
      * @param dhPrimeBits The dh prime bits
      * @return boolean
      */
     public static boolean checkDHWellknown(PkinitPlgCryptoContext cryptoctx,
-                                           DHParameter dhParameter, int dhPrimeBits) throws KrbException {
+                                           DhParameter dhParameter, int dhPrimeBits) throws KrbException {
         boolean valid = false;
         switch (dhPrimeBits) {
             case 1024:
@@ -161,9 +148,9 @@
      * Check parameters against a well-known DH group
      *
      * @param dh1 The DHParameterSpec
-     * @param dh2 The DHParameter
+     * @param dh2 The DhParameter
      */
-    public static boolean pkinitCheckDhParams(DHParameterSpec dh1, DHParameter dh2) {
+    public static boolean pkinitCheckDhParams(DHParameterSpec dh1, DhParameter dh2) {
 
         if (!dh1.getP().equals(dh2.getP())) {
             LOG.error("p is not well-known group dhparameter");
@@ -221,12 +208,12 @@
      * @param signerInfos The signerInfos
      * @return The encoded ContentInfo
      */
-    public static byte[] cmsSignedDataCreate(byte[] data, Asn1ObjectIdentifier oid, int version,
+    public static byte[] cmsSignedDataCreate(byte[] data, String oid, int version,
                                              DigestAlgorithmIdentifiers digestAlgorithmIdentifiers,
                                              CertificateSet certificateSet,
                                              RevocationInfoChoices crls, SignerInfos signerInfos) throws KrbException {
         SignedContentInfo contentInfo = new SignedContentInfo();
-        contentInfo.setContentType(new Asn1ObjectIdentifier("1.2.840.113549.1.7.2"));
+        contentInfo.setContentType("1.2.840.113549.1.7.2");
         SignedData signedData = new SignedData();
         signedData.setVersion(version);
         if (digestAlgorithmIdentifiers != null) {
@@ -327,17 +314,19 @@
             InvalidAlgorithmParameterException, CertPathValidatorException {
 
         //TODO
-//        CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
-//        CertPath certPath = certificateFactory.generateCertPath(certificateList);
-//
-//        CertPathValidator cpv = CertPathValidator.getInstance("PKIX");
-//
-//        TrustAnchor trustAnchor = new TrustAnchor(anchor, null);
-//
-//        PKIXParameters parameters = new PKIXParameters(Collections.singleton(trustAnchor));
-//        parameters.setRevocationEnabled(false);
-//
-//        cpv.validate(certPath, parameters);
+        /*
+        CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
+        CertPath certPath = certificateFactory.generatertPath(certificateList);
+
+        CertPathValidator cpv = CertPathValidator.getInstance("PKIX");
+
+        TrustAnchor trustAnchor = new TrustAnchor(anchor, null);
+
+        PKIXParameters parameters = new PKIXParameters(Collections.singleton(trustAnchor));
+        parameters.setRevocationEnabled(false);
+
+        cpv.validate(certPath, parameters);
+        */
     }
 
     /**
@@ -346,14 +335,10 @@
      * @param content The hex content
      * @return  The oid
      */
-    public static Asn1ObjectIdentifier createOid(String content) {
+    public static Asn1ObjectIdentifier createOid(String content) throws KrbException {
         Asn1ObjectIdentifier oid = new Asn1ObjectIdentifier();
         oid.useDER();
-        try {
-            oid.decode(Util.hex2bytes(content));
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
+        KrbCodec.decode(HexUtil.hex2bytesFriendly(content), oid);
         return oid;
     }
 
diff --git a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/preauth/pkinit/PkinitPlgCryptoContext.java b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/preauth/pkinit/PkinitPlgCryptoContext.java
index 23206db..6732b7d 100644
--- a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/preauth/pkinit/PkinitPlgCryptoContext.java
+++ b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/preauth/pkinit/PkinitPlgCryptoContext.java
@@ -18,7 +18,6 @@
  */
 package org.apache.kerby.kerberos.kerb.preauth.pkinit;
 
-import org.apache.kerby.asn1.type.Asn1ObjectIdentifier;
 import org.apache.kerby.kerberos.kerb.KrbException;
 
 import javax.crypto.spec.DHParameterSpec;
@@ -134,15 +133,15 @@
     }
 
 
-    public static Asn1ObjectIdentifier getIdPkinitAuthDataOID() {
-        return new Asn1ObjectIdentifier(ID_PKINIT_AUTHDATA);
+    public static String getIdPkinitAuthDataOID() {
+        return ID_PKINIT_AUTHDATA;
     }
 
-    public static Asn1ObjectIdentifier getIdPkinitDHKeyDataOID() {
-        return new Asn1ObjectIdentifier(ID_PKINIT_DHKEYDATA);
+    public static String getIdPkinitDHKeyDataOID() {
+        return ID_PKINIT_DHKEYDATA;
     }
 
-    public static Asn1ObjectIdentifier getIdPkinitRkeyDataOID() {
-        return new Asn1ObjectIdentifier(ID_PKINIT_RKEYDATA);
+    public static String getIdPkinitRkeyDataOID() {
+        return ID_PKINIT_RKEYDATA;
     }
 }
diff --git a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/preauth/pkinit/PkinitUtil.java b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/preauth/pkinit/PkinitUtil.java
new file mode 100644
index 0000000..a45f380
--- /dev/null
+++ b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/preauth/pkinit/PkinitUtil.java
@@ -0,0 +1,114 @@
+/**
+ *  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.preauth.pkinit;
+
+import org.apache.kerby.kerberos.kerb.KrbCodec;
+import org.apache.kerby.kerberos.kerb.KrbException;
+import org.apache.kerby.kerberos.kerb.type.pa.pkinit.AuthPack;
+import org.apache.kerby.kerberos.kerb.type.pa.pkinit.KdcDhKeyInfo;
+import org.apache.kerby.kerberos.kerb.type.pa.pkinit.ReplyKeyPack;
+import org.apache.kerby.pkix.PkiException;
+import org.apache.kerby.pkix.PkiUtil;
+
+import java.security.PrivateKey;
+import java.security.cert.X509Certificate;
+
+
+/**
+ * Encapsulates working with PKINIT signed data structures.
+ */
+public class PkinitUtil {
+    private static final String ID_PKINIT_AUTHDATA = "1.3.6.1.5.2.3.1";
+    //private static final String ID_PKINIT_DHKEYDATA = "1.3.6.1.5.2.3.2";
+    //private static final String ID_PKINIT_RKEYDATA = "1.3.6.1.5.2.3.3";
+
+    /**
+     * Uses a private key to sign data in a CMS SignedData structure and returns
+     * the encoded CMS SignedData as bytes.
+     * <p/>
+     * 'signedAuthPack' contains a CMS type ContentInfo encoded according to [RFC3852].
+     * The contentType field of the type ContentInfo is id-signedData (1.2.840.113549.1.7.2),
+     * and the content field is a SignedData.
+     * <p/>
+     * The eContentType field for the type SignedData is id-pkinit-authData (1.3.6.1.5.2.3.1),
+     * and the eContent field contains the DER encoding of the type AuthPack.
+     */
+    public static byte[] getSignedAuthPack(PrivateKey privateKey, X509Certificate certificate,
+                                           AuthPack authPack) throws KrbException {
+        byte[] dataToSign = KrbCodec.encode(authPack);
+        byte[] signedData;
+        try {
+            signedData = PkiUtil.getSignedData(privateKey, certificate, dataToSign, ID_PKINIT_AUTHDATA);
+        } catch (PkiException e) {
+            throw new KrbException("Failed to sign data", e);
+        }
+
+        return signedData;
+    }
+
+
+    /**
+     * Uses a private key to sign data in a CMS SignedData structure and returns
+     * the encoded CMS SignedData as bytes.
+     * <p/>
+     * 'dhSignedData' contains a CMS type ContentInfo encoded according to [RFC3852].
+     * The contentType field of the type ContentInfo is id-signedData (1.2.840.113549.1.7.2),
+     * and the content field is a SignedData.
+     * <p/>
+     * The eContentType field for the type SignedData is id-pkinit-DHKeyData (1.3.6.1.5.2.3.2),
+     * and the eContent field contains the DER encoding of the type KDCDHKeyInfo.
+     */
+    public static byte[] getSignedKdcDhKeyInfo(PrivateKey privateKey, X509Certificate certificate,
+                                               KdcDhKeyInfo kdcDhKeyInfo) throws KrbException {
+        byte[] dataToSign = KrbCodec.encode(kdcDhKeyInfo);
+        byte[] signedData;
+        try {
+            signedData = PkiUtil.getSignedData(privateKey, certificate, dataToSign, ID_PKINIT_AUTHDATA);
+        } catch (PkiException e) {
+            throw new KrbException("Failed to sign data", e);
+        }
+
+        return signedData;
+    }
+
+
+    /**
+     * Uses a private key to sign data in a CMS SignedData structure and returns
+     * the encoded CMS SignedData as bytes.
+     * <p/>
+     * Selected when public key encryption is used.
+     * <p/>
+     * The eContentType field for the inner type SignedData (when unencrypted) is
+     * id-pkinit-rkeyData (1.3.6.1.5.2.3.3) and the eContent field contains the
+     * DER encoding of the type ReplyKeyPack.
+     */
+    public static byte[] getSignedReplyKeyPack(PrivateKey privateKey, X509Certificate certificate,
+                                               ReplyKeyPack replyKeyPack) throws KrbException {
+        byte[] dataToSign = KrbCodec.encode(replyKeyPack);
+        byte[] signedData;
+        try {
+            signedData = PkiUtil.getSignedData(privateKey, certificate, dataToSign, ID_PKINIT_AUTHDATA);
+        } catch (PkiException e) {
+            throw new KrbException("Failed to sign data", e);
+        }
+
+        return signedData;
+    }
+}
diff --git a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/preauth/pkinit/PluginOpts.java b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/preauth/pkinit/PluginOpts.java
index dcb55bd..96bb23f 100644
--- a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/preauth/pkinit/PluginOpts.java
+++ b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/preauth/pkinit/PluginOpts.java
@@ -20,6 +20,7 @@
 package org.apache.kerby.kerberos.kerb.preauth.pkinit;
 
 import org.apache.kerby.asn1.type.Asn1ObjectIdentifier;
+import org.apache.kerby.kerberos.kerb.KrbException;
 import org.apache.kerby.kerberos.kerb.type.pa.pkinit.AlgorithmIdentifiers;
 import org.apache.kerby.kerberos.kerb.type.pa.pkinit.TrustedCertifiers;
 import org.apache.kerby.x509.type.AlgorithmIdentifier;
@@ -42,14 +43,14 @@
     // The acceptable values are 1024, 2048, and 4096. The default is 1024.
     public int dhMinBits = 1024;
 
-    public AlgorithmIdentifiers createSupportedCMSTypes() {
+    public AlgorithmIdentifiers createSupportedCMSTypes() throws KrbException {
         AlgorithmIdentifiers cmsAlgorithms = new AlgorithmIdentifiers();
         AlgorithmIdentifier des3Alg = new AlgorithmIdentifier();
 
         /* krb5_data des3oid = {0, 8, "\x2A\x86\x48\x86\xF7\x0D\x03\x07" };*/
         String content = "0x06 08 2A 86 48 86 F7 0D 03 07";
         Asn1ObjectIdentifier des3Oid = PkinitCrypto.createOid(content);
-        des3Alg.setAlgorithm(des3Oid);
+        des3Alg.setAlgorithm(des3Oid.getValue());
 
         cmsAlgorithms.add(des3Alg);
 
diff --git a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/preauth/pkinit/Util.java b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/preauth/pkinit/Util.java
deleted file mode 100644
index 74626cb..0000000
--- a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/preauth/pkinit/Util.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/**
- *  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.preauth.pkinit;
-
-public class Util {
-
-    static final String HEX_CHARS_STR = "0123456789ABCDEF";
-    static final char[] HEX_CHARS = HEX_CHARS_STR.toCharArray();
-
-    /**
-     * Convert bytes into format as:
-     * 0x02 02 00 80
-     */
-    public static String bytesToHex(byte[] bytes) {
-        int len = bytes.length * 2;
-        len += bytes.length; // for ' ' appended for each char
-        len += 2; // for '0x' prefix
-        char[] hexChars = new char[len];
-        hexChars[0] = '0';
-        hexChars[1] = 'x';
-        for (int j = 0; j < bytes.length; j++) {
-            int v = bytes[j] & 0xFF;
-            hexChars[j * 3 + 2] = HEX_CHARS[v >>> 4];
-            hexChars[j * 3 + 3] = HEX_CHARS[v & 0x0F];
-            hexChars[j * 3 + 4] = ' ';
-        }
-
-        return new String(hexChars);
-    }
-
-    /**
-     * Convert hex string like follows into byte array
-     * 0x02 02 00 80
-     */
-    public static byte[] hex2bytes(String hexString) {
-        if (hexString == null) {
-            throw new IllegalArgumentException("Invalid hex string to convert : null");
-        }
-        char[] hexStr = hexString.toCharArray();
-
-        if (hexStr.length < 4) {
-            throw new IllegalArgumentException("Invalid hex string to convert : length below 4");
-        }
-        if (hexStr[0] != '0' || (hexStr[1] != 'x') && (hexStr[1] != 'X')) {
-            throw new IllegalArgumentException("Invalid hex string to convert : not starting with '0x'");
-        }
-        byte[] bytes = new byte[(hexStr.length - 1) / 3];
-        int pos = 0;
-        boolean high = false;
-        boolean prefix = true;
-        for (char c : hexStr) {
-            if (prefix) {
-                if (c == 'x' || c == 'X') {
-                    prefix = false;
-                }
-                continue;
-            }
-            switch (c) {
-                case ' ' :
-                    if (high) {
-                        // We have had only the high part
-                        throw new IllegalArgumentException("Invalid hex string to convert");
-                    }
-                    // A hex pair has been decoded
-                    pos++;
-                    high = false;
-                    break;
-                case '0':
-                case '1':
-                case '2':
-                case '3':
-                case '4':
-                case '5':
-                case '6':
-                case '7':
-                case '8':
-                case '9':
-                    if (high) {
-                        bytes[pos] += (byte) (c - '0');
-                    } else {
-                        bytes[pos] = (byte) ((c - '0') << 4);
-                    }
-                    high = !high;
-                    break;
-                case 'a' :
-                case 'b' :
-                case 'c' :
-                case 'd' :
-                case 'e' :
-                case 'f' :
-                    if (high) {
-                        bytes[pos] += (byte) (c - 'a' + 10);
-                    } else {
-                        bytes[pos] = (byte) ((c - 'a' + 10) << 4);
-                    }
-
-                    high = !high;
-                    break;
-
-                case 'A' :
-                case 'B' :
-                case 'C' :
-                case 'D' :
-                case 'E' :
-                case 'F' :
-                    if (high) {
-                        bytes[pos] += (byte) (c - 'A' + 10);
-                    } else {
-                        bytes[pos] = (byte) ((c - 'A' + 10) << 4);
-                    }
-
-                    high = !high;
-                    break;
-                default :
-                    throw new IllegalArgumentException("Invalid hex string to convert");
-            }
-        }
-        if (high) {
-            throw new IllegalArgumentException("Invalid hex string to convert");
-        }
-
-        return bytes;
-    }
-}
diff --git a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/KrbCodec.java b/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/KrbCodec.java
index 1c2f4dc..98a272c 100644
--- a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/KrbCodec.java
+++ b/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/KrbCodec.java
@@ -49,7 +49,19 @@
         try {
             krbObj.encode(buffer);
         } catch (IOException e) {
-            throw new KrbException("encode failed", e);
+            throw new KrbException("Encoding failed", e);
+        }
+    }
+
+    public static void decode(byte[] content, Asn1Type value) throws KrbException {
+        decode(ByteBuffer.wrap(content), value);
+    }
+
+    public static void decode(ByteBuffer content, Asn1Type value) throws KrbException {
+        try {
+            value.decode(content);
+        } catch (IOException e) {
+            throw new KrbException("Decoding failed", e);
         }
     }
 
diff --git a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/KrbConstant.java b/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/KrbConstant.java
index 7a97d1b..d9b4315 100644
--- a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/KrbConstant.java
+++ b/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/KrbConstant.java
@@ -23,4 +23,5 @@
     public static final int KRB_V5 = 5;
 
     public static final String TGS_PRINCIPAL = "krbtgt";
+    public static final String ANONYMOUS_PRINCIPAL = "WELLKNOWN/ANONYMOUS";
 }
diff --git a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/KrbException.java b/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/KrbException.java
index bfe2513..ee3fa8d 100644
--- a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/KrbException.java
+++ b/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/KrbException.java
@@ -21,7 +21,6 @@
 
 public class KrbException extends Exception {
     private static final long serialVersionUID = 7305497872367599428L;
-    private KrbErrorCode errorCode;
 
     public KrbException(String message) {
         super(message);
@@ -33,20 +32,13 @@
 
     public KrbException(KrbErrorCode errorCode) {
         super(errorCode.getMessage());
-        this.errorCode = errorCode;
     }
 
     public KrbException(KrbErrorCode errorCode, Throwable cause) {
         super(errorCode.getMessage(), cause);
-        this.errorCode = errorCode;
     }
 
     public KrbException(KrbErrorCode errorCode, String message) {
         super(message + " with error code: " + errorCode.name());
-        this.errorCode = errorCode;
-    }
-
-    public KrbErrorCode getErrorCode() {
-        return errorCode;
     }
 }
diff --git a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/base/HostAddress.java b/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/base/HostAddress.java
index 603b776..f2ef67a 100644
--- a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/base/HostAddress.java
+++ b/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/base/HostAddress.java
@@ -52,8 +52,8 @@
     }
 
     static Asn1FieldInfo[] fieldInfos = new Asn1FieldInfo[] {
-            new ExplicitField(HostAddressField.ADDR_TYPE, 0, Asn1Integer.class),
-            new ExplicitField(HostAddressField.ADDRESS, 1, Asn1OctetString.class)
+            new ExplicitField(HostAddressField.ADDR_TYPE, Asn1Integer.class),
+            new ExplicitField(HostAddressField.ADDRESS, Asn1OctetString.class)
     };
 
     public HostAddress() {
diff --git a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/AuthPack.java b/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/AuthPack.java
index 0b75714..dea3f5e 100644
--- a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/AuthPack.java
+++ b/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/AuthPack.java
@@ -31,6 +31,11 @@
      clientPublicValue       [1] SubjectPublicKeyInfo OPTIONAL,
      supportedCMSTypes       [2] SEQUENCE OF AlgorithmIdentifier OPTIONAL,
      clientDHNonce           [3] DHNonce OPTIONAL
+     supportedKDFs           [4] SEQUENCE OF KDFAlgorithmId OPTIONAL,
+                             -- Contains an unordered set of KDFs supported by the client.
+ KDFAlgorithmId ::= SEQUENCE {
+     kdf-id            [0] OBJECT IDENTIFIER,
+                       -- The object identifier of the KDF
  }
  */
 public class AuthPack extends KrbSequenceType {
@@ -56,8 +61,8 @@
             new ExplicitField(AuthPackField.PK_AUTHENTICATOR, PkAuthenticator.class),
             new ExplicitField(AuthPackField.CLIENT_PUBLIC_VALUE, SubjectPublicKeyInfo.class),
             new ExplicitField(AuthPackField.SUPPORTED_CMS_TYPES, AlgorithmIdentifiers.class),
-            new ExplicitField(AuthPackField.CLIENT_DH_NONCE, DHNonce.class),
-            new ExplicitField(AuthPackField.SUPPORTED_KDFS, SupportedKDFs.class)
+            new ExplicitField(AuthPackField.CLIENT_DH_NONCE, DhNonce.class),
+            new ExplicitField(AuthPackField.SUPPORTED_KDFS, SupportedKdfs.class)
     };
 
     public AuthPack() {
@@ -88,19 +93,19 @@
         setFieldAs(AuthPackField.SUPPORTED_CMS_TYPES, supportedCMSTypes);
     }
 
-    public DHNonce getClientDhNonce() {
-        return getFieldAs(AuthPackField.CLIENT_DH_NONCE, DHNonce.class);
+    public DhNonce getClientDhNonce() {
+        return getFieldAs(AuthPackField.CLIENT_DH_NONCE, DhNonce.class);
     }
 
-    public void setClientDhNonce(DHNonce dhNonce) {
+    public void setClientDhNonce(DhNonce dhNonce) {
         setFieldAs(AuthPackField.CLIENT_DH_NONCE, dhNonce);
     }
 
-    public SupportedKDFs getsupportedKDFs() {
-        return getFieldAs(AuthPackField.SUPPORTED_KDFS, SupportedKDFs.class);
+    public SupportedKdfs getsupportedKDFs() {
+        return getFieldAs(AuthPackField.SUPPORTED_KDFS, SupportedKdfs.class);
     }
 
-    public void setsupportedKDFs(SupportedKDFs supportedKDFs) {
-        setFieldAs(AuthPackField.SUPPORTED_KDFS, supportedKDFs);
+    public void setsupportedKDFs(SupportedKdfs supportedKdfs) {
+        setFieldAs(AuthPackField.SUPPORTED_KDFS, supportedKdfs);
     }
 }
diff --git a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/DHNonce.java b/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/DhNonce.java
similarity index 95%
rename from kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/DHNonce.java
rename to kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/DhNonce.java
index e6653b8..9fc86c1 100644
--- a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/DHNonce.java
+++ b/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/DhNonce.java
@@ -24,5 +24,5 @@
 /**
  * DHNonce ::= OCTET STRING
  */
-public class DHNonce extends Asn1OctetString {
+public class DhNonce extends Asn1OctetString {
 }
diff --git a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/DHRepInfo.java b/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/DhRepInfo.java
similarity index 64%
rename from kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/DHRepInfo.java
rename to kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/DhRepInfo.java
index 853fe65..05855a6 100644
--- a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/DHRepInfo.java
+++ b/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/DhRepInfo.java
@@ -23,18 +23,19 @@
 import org.apache.kerby.asn1.EnumType;
 import org.apache.kerby.asn1.ExplicitField;
 import org.apache.kerby.asn1.ImplicitField;
-import org.apache.kerby.asn1.type.Asn1ObjectIdentifier;
 import org.apache.kerby.asn1.type.Asn1OctetString;
 import org.apache.kerby.kerberos.kerb.type.KrbSequenceType;
 
 /**
- DHRepInfo ::= SEQUENCE {
+ DhRepInfo ::= SEQUENCE {
     dhSignedData            [0] IMPLICIT OCTET STRING,
     serverDHNonce           [1] DHNonce OPTIONAL
+    kdf                     [2] KDFAlgorithmId OPTIONAL,
+                                -- The KDF picked by the KDC.
  }
  */
-public class DHRepInfo extends KrbSequenceType {
-    protected enum DHRepInfoField implements EnumType {
+public class DhRepInfo extends KrbSequenceType {
+    protected enum DhRepInfoField implements EnumType {
         DH_SIGNED_DATA,
         SERVER_DH_NONCE,
         KDF_ID;
@@ -51,36 +52,36 @@
     }
 
     static Asn1FieldInfo[] fieldInfos = new Asn1FieldInfo[] {
-            new ImplicitField(DHRepInfoField.DH_SIGNED_DATA, Asn1OctetString.class),
-            new ExplicitField(DHRepInfoField.SERVER_DH_NONCE, DHNonce.class),
-            new ExplicitField(DHRepInfoField.KDF_ID, Asn1ObjectIdentifier.class)
+            new ImplicitField(DhRepInfoField.DH_SIGNED_DATA, Asn1OctetString.class),
+            new ExplicitField(DhRepInfoField.SERVER_DH_NONCE, DhNonce.class),
+            new ExplicitField(DhRepInfoField.KDF_ID, KdfAlgorithmId.class)
     };
 
-    public DHRepInfo() {
+    public DhRepInfo() {
         super(fieldInfos);
     }
 
     public byte[] getDHSignedData() {
-        return getFieldAsOctets(DHRepInfoField.DH_SIGNED_DATA);
+        return getFieldAsOctets(DhRepInfoField.DH_SIGNED_DATA);
     }
 
     public void setDHSignedData(byte[] dhSignedData) {
-        setFieldAsOctets(DHRepInfoField.DH_SIGNED_DATA, dhSignedData);
+        setFieldAsOctets(DhRepInfoField.DH_SIGNED_DATA, dhSignedData);
     }
 
-    public DHNonce getServerDhNonce() {
-        return getFieldAs(DHRepInfoField.SERVER_DH_NONCE, DHNonce.class);
+    public DhNonce getServerDhNonce() {
+        return getFieldAs(DhRepInfoField.SERVER_DH_NONCE, DhNonce.class);
     }
 
-    public void setServerDhNonce(DHNonce dhNonce) {
-        setFieldAs(DHRepInfoField.SERVER_DH_NONCE, dhNonce);
+    public void setServerDhNonce(DhNonce dhNonce) {
+        setFieldAs(DhRepInfoField.SERVER_DH_NONCE, dhNonce);
     }
 
-    public Asn1ObjectIdentifier getKdfId() {
-        return getFieldAs(DHRepInfoField.KDF_ID, Asn1ObjectIdentifier.class);
+    public KdfAlgorithmId getKdfId() {
+        return getFieldAs(DhRepInfoField.KDF_ID, KdfAlgorithmId.class);
     }
 
-    public void setKdfId(Asn1ObjectIdentifier kdfId) {
-        setFieldAs(DHRepInfoField.KDF_ID, kdfId);
+    public void setKdfId(KdfAlgorithmId kdfId) {
+        setFieldAs(DhRepInfoField.KDF_ID, kdfId);
     }
 }
diff --git a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/KdcDHKeyInfo.java b/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/KdcDhKeyInfo.java
similarity index 76%
rename from kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/KdcDHKeyInfo.java
rename to kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/KdcDhKeyInfo.java
index 4f66a15..4ecbbcc 100644
--- a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/KdcDHKeyInfo.java
+++ b/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/KdcDhKeyInfo.java
@@ -34,8 +34,8 @@
     dhKeyExpiration         [2] KerberosTime OPTIONAL,
  }
  */
-public class KdcDHKeyInfo extends KrbSequenceType {
-    protected static enum KdcDHKeyInfoField implements EnumType {
+public class KdcDhKeyInfo extends KrbSequenceType {
+    protected enum KdcDhKeyInfoField implements EnumType {
         SUBJECT_PUBLIC_KEY,
         NONCE,
         DH_KEY_EXPIRATION;
@@ -52,36 +52,36 @@
     }
 
     static Asn1FieldInfo[] fieldInfos = new Asn1FieldInfo[] {
-            new ExplicitField(KdcDHKeyInfoField.SUBJECT_PUBLIC_KEY, Asn1BitString.class),
-            new ExplicitField(KdcDHKeyInfoField.NONCE, Asn1Integer.class),
-            new ExplicitField(KdcDHKeyInfoField.DH_KEY_EXPIRATION, KerberosTime.class)
+            new ExplicitField(KdcDhKeyInfoField.SUBJECT_PUBLIC_KEY, Asn1BitString.class),
+            new ExplicitField(KdcDhKeyInfoField.NONCE, Asn1Integer.class),
+            new ExplicitField(KdcDhKeyInfoField.DH_KEY_EXPIRATION, KerberosTime.class)
     };
 
-    public KdcDHKeyInfo() {
+    public KdcDhKeyInfo() {
         super(fieldInfos);
     }
 
     public Asn1BitString getSubjectPublicKey() {
-        return getFieldAs(KdcDHKeyInfoField.SUBJECT_PUBLIC_KEY, Asn1BitString.class);
+        return getFieldAs(KdcDhKeyInfoField.SUBJECT_PUBLIC_KEY, Asn1BitString.class);
     }
 
     public void setSubjectPublicKey(byte[] subjectPubKey) {
-        setFieldAs(KdcDHKeyInfoField.SUBJECT_PUBLIC_KEY, new Asn1BitString(subjectPubKey));
+        setFieldAs(KdcDhKeyInfoField.SUBJECT_PUBLIC_KEY, new Asn1BitString(subjectPubKey));
     }
 
     public int getNonce() {
-        return getFieldAsInt(KdcDHKeyInfoField.NONCE);
+        return getFieldAsInt(KdcDhKeyInfoField.NONCE);
     }
 
     public void setNonce(int nonce) {
-        setFieldAsInt(KdcDHKeyInfoField.NONCE, nonce);
+        setFieldAsInt(KdcDhKeyInfoField.NONCE, nonce);
     }
 
     public KerberosTime getDHKeyExpiration() {
-        return getFieldAsTime(KdcDHKeyInfoField.DH_KEY_EXPIRATION);
+        return getFieldAsTime(KdcDhKeyInfoField.DH_KEY_EXPIRATION);
     }
 
     public void setDHKeyExpiration(KerberosTime time) {
-        setFieldAs(KdcDHKeyInfoField.DH_KEY_EXPIRATION, time);
+        setFieldAs(KdcDhKeyInfoField.DH_KEY_EXPIRATION, time);
     }
 }
diff --git a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/KdfAlgorithmId.java b/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/KdfAlgorithmId.java
new file mode 100644
index 0000000..4dd44ee
--- /dev/null
+++ b/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/KdfAlgorithmId.java
@@ -0,0 +1,64 @@
+/**
+ *  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.type.pa.pkinit;
+
+import org.apache.kerby.asn1.Asn1FieldInfo;
+import org.apache.kerby.asn1.EnumType;
+import org.apache.kerby.asn1.ExplicitField;
+import org.apache.kerby.asn1.type.Asn1ObjectIdentifier;
+import org.apache.kerby.kerberos.kerb.type.KrbSequenceType;
+
+/*
+ KDFAlgorithmId ::= SEQUENCE {
+     kdf-id            [0] OBJECT IDENTIFIER,
+                       -- The object identifier of the KDF
+ }
+ */
+public class KdfAlgorithmId extends KrbSequenceType {
+    protected enum KdfAlgorithmIdField implements EnumType {
+        KDF_ID;
+
+        @Override
+        public int getValue() {
+            return ordinal();
+        }
+
+        @Override
+        public String getName() {
+            return name();
+        }
+    }
+
+    static Asn1FieldInfo[] fieldInfos = new Asn1FieldInfo[] {
+            new ExplicitField(KdfAlgorithmIdField.KDF_ID, Asn1ObjectIdentifier.class)
+    };
+
+    public KdfAlgorithmId() {
+        super(fieldInfos);
+    }
+
+    public String getKdfId() {
+        return getFieldAsObjId(KdfAlgorithmIdField.KDF_ID);
+    }
+
+    public void setKdfId(String kdfId) {
+        setFieldAsObjId(KdfAlgorithmIdField.KDF_ID, kdfId);
+    }
+}
diff --git a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/PaPkAsRep.java b/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/PaPkAsRep.java
index 9d835ec..d882d84 100644
--- a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/PaPkAsRep.java
+++ b/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/PaPkAsRep.java
@@ -28,7 +28,7 @@
 
 /**
  PA-PK-AS-REP ::= CHOICE {
-    dhInfo                  [0] DHRepInfo,
+    dhInfo                  [0] DhRepInfo,
     encKeyPack              [1] IMPLICIT OCTET STRING,
  }
  */
@@ -49,7 +49,7 @@
     }
 
     static Asn1FieldInfo[] fieldInfos = new Asn1FieldInfo[] {
-            new ExplicitField(PaPkAsRepField.DH_INFO, DHRepInfo.class),
+            new ExplicitField(PaPkAsRepField.DH_INFO, DhRepInfo.class),
             new ImplicitField(PaPkAsRepField.ENCKEY_PACK, Asn1OctetString.class)
     };
 
@@ -57,11 +57,11 @@
         super(fieldInfos);
     }
 
-    public DHRepInfo getDHRepInfo() {
-        return getChoiceValueAs(PaPkAsRepField.DH_INFO, DHRepInfo.class);
+    public DhRepInfo getDHRepInfo() {
+        return getChoiceValueAs(PaPkAsRepField.DH_INFO, DhRepInfo.class);
     }
 
-    public void setDHRepInfo(DHRepInfo dhRepInfo) {
+    public void setDHRepInfo(DhRepInfo dhRepInfo) {
         setChoiceValue(PaPkAsRepField.DH_INFO, dhRepInfo);
     }
 
diff --git a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/SupportedKDFs.java b/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/SupportedKdfs.java
similarity index 87%
rename from kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/SupportedKDFs.java
rename to kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/SupportedKdfs.java
index 2d1e654..e436018 100644
--- a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/SupportedKDFs.java
+++ b/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/SupportedKdfs.java
@@ -19,8 +19,7 @@
  */
 package org.apache.kerby.kerberos.kerb.type.pa.pkinit;
 
-import org.apache.kerby.asn1.type.Asn1ObjectIdentifier;
 import org.apache.kerby.kerberos.kerb.type.KrbSequenceOfType;
 
-public class SupportedKDFs extends KrbSequenceOfType<Asn1ObjectIdentifier> {
+public class SupportedKdfs extends KrbSequenceOfType<KdfAlgorithmId> {
 }
diff --git a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/ticket/EncTicketPart.java b/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/ticket/EncTicketPart.java
index 9428630..e7ca968 100644
--- a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/ticket/EncTicketPart.java
+++ b/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/ticket/EncTicketPart.java
@@ -83,7 +83,7 @@
             new ExplicitField(EncTicketPartField.AUTHTIME, KerberosTime.class),
             new ExplicitField(EncTicketPartField.STARTTIME, KerberosTime.class),
             new ExplicitField(EncTicketPartField.ENDTIME, KerberosTime.class),
-            new ExplicitField(EncTicketPartField.ENDTIME, KerberosTime.class),
+            new ExplicitField(EncTicketPartField.RENEW_TILL, KerberosTime.class),
             new ExplicitField(EncTicketPartField.CADDR, HostAddresses.class),
             new ExplicitField(EncTicketPartField.AUTHORIZATION_DATA, AuthorizationData.class)
     };
diff --git a/kerby-kerb/kerb-core/src/test/java/org/apache/kerby/kerberos/kerb/codec/TestPaPkAsRep.java b/kerby-kerb/kerb-core/src/test/java/org/apache/kerby/kerberos/kerb/codec/TestPaPkAsRep.java
index 53d7abf..8af6fe8 100644
--- a/kerby-kerb/kerb-core/src/test/java/org/apache/kerby/kerberos/kerb/codec/TestPaPkAsRep.java
+++ b/kerby-kerb/kerb-core/src/test/java/org/apache/kerby/kerberos/kerb/codec/TestPaPkAsRep.java
@@ -20,11 +20,10 @@
 package org.apache.kerby.kerberos.kerb.codec;
 
 import org.apache.kerby.asn1.Asn1;
-import org.apache.kerby.asn1.type.Asn1ObjectIdentifier;
 import org.apache.kerby.cms.type.ContentInfo;
 import org.apache.kerby.kerberos.kerb.KrbCodec;
 import org.apache.kerby.kerberos.kerb.KrbException;
-import org.apache.kerby.kerberos.kerb.type.pa.pkinit.DHRepInfo;
+import org.apache.kerby.kerberos.kerb.type.pa.pkinit.DhRepInfo;
 import org.apache.kerby.kerberos.kerb.type.pa.pkinit.PaPkAsRep;
 import org.junit.Test;
 
@@ -35,9 +34,9 @@
     @Test
     public void test() throws IOException, KrbException {
         PaPkAsRep paPkAsRep = new PaPkAsRep();
-        DHRepInfo dhRepInfo = new DHRepInfo();
+        DhRepInfo dhRepInfo = new DhRepInfo();
         ContentInfo contentInfo = new ContentInfo();
-        contentInfo.setContentType(new Asn1ObjectIdentifier("1.2.840.113549.1.7.2"));
+        contentInfo.setContentType("1.2.840.113549.1.7.2");
         dhRepInfo.setDHSignedData(contentInfo.encode());
         paPkAsRep.setDHRepInfo(dhRepInfo);
         Asn1.parseAndDump(paPkAsRep.encode());
diff --git a/kerby-kerb/kerb-core/src/test/java/org/apache/kerby/kerberos/kerb/codec/TestPkinitAnonymousAsRepCodec.java b/kerby-kerb/kerb-core/src/test/java/org/apache/kerby/kerberos/kerb/codec/TestPkinitAnonymousAsRepCodec.java
index a67bb2c..ac660f5 100644
--- a/kerby-kerb/kerb-core/src/test/java/org/apache/kerby/kerberos/kerb/codec/TestPkinitAnonymousAsRepCodec.java
+++ b/kerby-kerb/kerb-core/src/test/java/org/apache/kerby/kerberos/kerb/codec/TestPkinitAnonymousAsRepCodec.java
@@ -31,8 +31,8 @@
 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.DHRepInfo;
-import org.apache.kerby.kerberos.kerb.type.pa.pkinit.KdcDHKeyInfo;
+import org.apache.kerby.kerberos.kerb.type.pa.pkinit.DhRepInfo;
+import org.apache.kerby.kerberos.kerb.type.pa.pkinit.KdcDhKeyInfo;
 import org.apache.kerby.kerberos.kerb.type.pa.pkinit.PaPkAsRep;
 import org.apache.kerby.kerberos.kerb.type.ticket.Ticket;
 import org.junit.Test;
@@ -102,19 +102,19 @@
     private void testPaPkAsRep(PaPkAsRep paPkAsRep) throws IOException {
         assertThat(paPkAsRep.getDHRepInfo()).isNotNull();
 
-        DHRepInfo dhRepInfo = paPkAsRep.getDHRepInfo();
+        DhRepInfo dhRepInfo = paPkAsRep.getDHRepInfo();
         byte[] dhSignedData = dhRepInfo.getDHSignedData();
         SignedContentInfo contentInfo = new SignedContentInfo();
         contentInfo.decode(dhSignedData);
-        assertThat(contentInfo.getContentType().getValue()).isEqualTo("1.2.840.113549.1.7.2");
+        assertThat(contentInfo.getContentType()).isEqualTo("1.2.840.113549.1.7.2");
         SignedData signedData = contentInfo.getContentAs(SignedData.class);
         assertThat(signedData.getCertificates()).isNotNull();
 
         EncapsulatedContentInfo encapsulatedContentInfo = signedData.getEncapContentInfo();
-        assertThat(encapsulatedContentInfo.getContentType().getValue()).isEqualTo("1.3.6.1.5.2.3.2");
+        assertThat(encapsulatedContentInfo.getContentType()).isEqualTo("1.3.6.1.5.2.3.2");
 
         byte[] eContentInfo = encapsulatedContentInfo.getContent();
-        KdcDHKeyInfo kdcDhKeyInfo = new KdcDHKeyInfo();
+        KdcDhKeyInfo kdcDhKeyInfo = new KdcDhKeyInfo();
         kdcDhKeyInfo.decode(eContentInfo);
         assertThat(kdcDhKeyInfo.getSubjectPublicKey()).isNotNull();
         assertThat(kdcDhKeyInfo.getDHKeyExpiration()).isNotNull();
diff --git a/kerby-kerb/kerb-core/src/test/java/org/apache/kerby/kerberos/kerb/codec/TestPkinitAnonymousAsReqCodec.java b/kerby-kerb/kerb-core/src/test/java/org/apache/kerby/kerberos/kerb/codec/TestPkinitAnonymousAsReqCodec.java
index 8a59ee1..442bb7d 100644
--- a/kerby-kerb/kerb-core/src/test/java/org/apache/kerby/kerberos/kerb/codec/TestPkinitAnonymousAsReqCodec.java
+++ b/kerby-kerb/kerb-core/src/test/java/org/apache/kerby/kerberos/kerb/codec/TestPkinitAnonymousAsReqCodec.java
@@ -22,6 +22,7 @@
 import org.apache.kerby.asn1.Asn1;
 import org.apache.kerby.cms.type.SignedContentInfo;
 import org.apache.kerby.cms.type.SignedData;
+import org.apache.kerby.kerberos.kerb.KrbConstant;
 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;
@@ -33,7 +34,7 @@
 import org.apache.kerby.kerberos.kerb.type.pa.PaDataType;
 import org.apache.kerby.kerberos.kerb.type.pa.pkinit.AuthPack;
 import org.apache.kerby.kerberos.kerb.type.pa.pkinit.PaPkAsReq;
-import org.apache.kerby.x509.type.DHParameter;
+import org.apache.kerby.x509.type.DhParameter;
 import org.apache.kerby.x509.type.SubjectPublicKeyInfo;
 import org.junit.Test;
 
@@ -44,7 +45,7 @@
 import java.util.Arrays;
 import java.util.List;
 
-import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.*;
 
 public class TestPkinitAnonymousAsReqCodec {
     @Test
@@ -84,7 +85,7 @@
         assertThat(body.getKdcOptions().getValue()).isEqualTo(Arrays.copyOfRange(bytes, 1389, 1393));
         PrincipalName cName = body.getCname();
         assertThat(cName.getNameType()).isEqualTo(NameType.NT_WELLKNOWN);
-        assertThat(cName.getName()).isEqualTo("WELLKNOWN/ANONYMOUS");
+        assertThat(cName.getName()).isEqualTo(KrbConstant.ANONYMOUS_PRINCIPAL);
         assertThat(body.getRealm()).isEqualTo("EXAMPLE.COM");
         PrincipalName sName = body.getSname();
         assertThat(sName.getNameType()).isEqualTo(NameType.NT_SRV_INST);
@@ -113,7 +114,7 @@
         SignedContentInfo contentInfo = new SignedContentInfo();
         Asn1.parseAndDump(paPkAsReq.getSignedAuthPack());
         contentInfo.decode(paPkAsReq.getSignedAuthPack());
-        assertThat(contentInfo.getContentType().getValue()).isEqualTo("1.2.840.113549.1.7.2");
+        assertThat(contentInfo.getContentType()).isEqualTo("1.2.840.113549.1.7.2");
         Asn1.dump(contentInfo);
 
         SignedData signedData = contentInfo.getSignedData();
@@ -122,29 +123,29 @@
         assertThat(signedData.getCertificates().getElements().isEmpty()).isTrue();
         assertThat(signedData.getCrls().getElements().isEmpty()).isTrue();
         assertThat(signedData.getSignerInfos().getElements().isEmpty()).isTrue();
-        assertThat(signedData.getEncapContentInfo().getContentType().getValue())
+        assertThat(signedData.getEncapContentInfo().getContentType())
                 .isEqualTo("1.3.6.1.5.2.3.1");
 
         AuthPack authPack = new AuthPack();
         Asn1.parseAndDump(signedData.getEncapContentInfo().getContent());
         authPack.decode(signedData.getEncapContentInfo().getContent());
         assertThat(authPack.getsupportedCmsTypes().getElements().size()).isEqualTo(1);
-        assertThat(authPack.getsupportedCmsTypes().getElements().get(0).getAlgorithm().getValue())
+        assertThat(authPack.getsupportedCmsTypes().getElements().get(0).getAlgorithm())
                 .isEqualTo("1.2.840.113549.3.7");
         SubjectPublicKeyInfo subjectPublicKeyInfo = authPack.getClientPublicValue();
-        assertThat(subjectPublicKeyInfo.getAlgorithm().getAlgorithm().getValue())
+        assertThat(subjectPublicKeyInfo.getAlgorithm().getAlgorithm())
                 .isEqualTo("1.2.840.10046.2.1");
-        DHParameter dhParameter = subjectPublicKeyInfo.getAlgorithm().getParametersAs(DHParameter.class);
+        DhParameter dhParameter =
+            subjectPublicKeyInfo.getAlgorithm().getParametersAs(DhParameter.class);
         assertThat(dhParameter.getG()).isEqualTo(BigInteger.valueOf(2));
 
         assertThat(authPack.getsupportedKDFs().getElements().size()).isEqualTo(3);
 
-        //TO BE FIXED
-//        assertThat(authPack.getsupportedKDFs().getElements().get(0).getValue())
-//                .isEqualTo("1.3.6.1.5.2.3.6.2");
-//        assertThat(authPack.getsupportedKDFs().getElements().get(1).getValue())
-//                .isEqualTo("1.3.6.1.5.2.3.6.1");
-//        assertThat(authPack.getsupportedKDFs().getElements().get(2).getValue())
-//                .isEqualTo("1.3.6.1.5.2.3.6.3");
+        assertThat(authPack.getsupportedKDFs().getElements().get(0).getKdfId())
+                .isEqualTo("1.3.6.1.5.2.3.6.2");
+        assertThat(authPack.getsupportedKDFs().getElements().get(1).getKdfId())
+                .isEqualTo("1.3.6.1.5.2.3.6.1");
+        assertThat(authPack.getsupportedKDFs().getElements().get(2).getKdfId())
+                .isEqualTo("1.3.6.1.5.2.3.6.3");
     }
 }
diff --git a/kerby-kerb/kerb-core/src/test/java/org/apache/kerby/kerberos/kerb/codec/TestPkinitRsaAsRepCodec.java b/kerby-kerb/kerb-core/src/test/java/org/apache/kerby/kerberos/kerb/codec/TestPkinitRsaAsRepCodec.java
index 0de845e..9e96cef 100644
--- a/kerby-kerb/kerb-core/src/test/java/org/apache/kerby/kerberos/kerb/codec/TestPkinitRsaAsRepCodec.java
+++ b/kerby-kerb/kerb-core/src/test/java/org/apache/kerby/kerberos/kerb/codec/TestPkinitRsaAsRepCodec.java
@@ -33,7 +33,7 @@
 import java.io.IOException;
 import java.nio.ByteBuffer;
 
-import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.*;
 
 public class TestPkinitRsaAsRepCodec {
     @Test
@@ -61,7 +61,7 @@
         Asn1.parseAndDump(encKeyPack);
         ContentInfo contentInfo = new ContentInfo();
         contentInfo.decode(encKeyPack);
-        assertThat(contentInfo.getContentType().getValue()).isEqualTo("1.2.840.113549.1.7.3");
+        assertThat(contentInfo.getContentType()).isEqualTo("1.2.840.113549.1.7.3");
         EnvelopedData envelopedData = contentInfo.getContentAs(EnvelopedData.class);
         Asn1.dump(envelopedData);
     }
diff --git a/kerby-kerb/kerb-core/src/test/java/org/apache/kerby/kerberos/kerb/codec/TestPkinitRsaAsReqCodec.java b/kerby-kerb/kerb-core/src/test/java/org/apache/kerby/kerberos/kerb/codec/TestPkinitRsaAsReqCodec.java
index 0cb6ad4..a5d6efc 100644
--- a/kerby-kerb/kerb-core/src/test/java/org/apache/kerby/kerberos/kerb/codec/TestPkinitRsaAsReqCodec.java
+++ b/kerby-kerb/kerb-core/src/test/java/org/apache/kerby/kerberos/kerb/codec/TestPkinitRsaAsReqCodec.java
@@ -40,7 +40,7 @@
 import java.util.Arrays;
 import java.util.List;
 
-import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.*;
 
 public class TestPkinitRsaAsReqCodec {
     @Test
@@ -71,12 +71,12 @@
         ContentInfo contentInfo = new ContentInfo();
         //Asn1.parseAndDump(paPkAsReq.getSignedAuthPack());
         contentInfo.decode(paPkAsReq.getSignedAuthPack());
-        assertThat(contentInfo.getContentType().getValue()).isEqualTo("1.2.840.113549.1.7.2");
+        assertThat(contentInfo.getContentType()).isEqualTo("1.2.840.113549.1.7.2");
         //Asn1.dump(contentInfo);
 
         SignedData signedData = contentInfo.getContentAs(SignedData.class);
         assertThat(signedData.getCertificates().getElements().size()).isEqualTo(1);
-        assertThat(signedData.getEncapContentInfo().getContentType().getValue()).isEqualTo("1.3.6.1.5.2.3.1");
+        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);
diff --git a/kerby-kerb/kerb-crypto/src/main/java/org/apache/kerby/kerberos/kerb/crypto/EncryptionHandler.java b/kerby-kerb/kerb-crypto/src/main/java/org/apache/kerby/kerberos/kerb/crypto/EncryptionHandler.java
index 91d7e34..0e6344b 100644
--- a/kerby-kerb/kerb-crypto/src/main/java/org/apache/kerby/kerberos/kerb/crypto/EncryptionHandler.java
+++ b/kerby-kerb/kerb-crypto/src/main/java/org/apache/kerby/kerberos/kerb/crypto/EncryptionHandler.java
@@ -38,8 +38,6 @@
 import org.apache.kerby.kerberos.kerb.type.base.KeyUsage;
 import org.apache.kerby.kerberos.kerb.type.base.PrincipalName;
 
-import javax.crypto.Cipher;
-
 /**
  * Encryption handler as the highest level API for encryption stuffs defined in
  * Kerberos RFC3961. It supports all the encryption types. New encryption type
@@ -47,23 +45,6 @@
  */
 public class EncryptionHandler {
 
-    private static boolean isAES256Enabled = false;
-
-    static {
-        try {
-            isAES256Enabled = Cipher.getMaxAllowedKeyLength("AES") >= 256;
-        } catch (Exception e) {
-            System.err.println(e);
-        }
-    }
-
-    /**
-     * @return true if aes256 is enabled
-     */
-    public static boolean isAES256Enabled() {
-        return isAES256Enabled;
-    }
-
     /**
      * Get the encryption type.
      * @param eType The encryption type string.
diff --git a/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/CheckSumsTest.java b/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/CheckSumsTest.java
index 9220f94..fc23f77 100644
--- a/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/CheckSumsTest.java
+++ b/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/CheckSumsTest.java
@@ -23,6 +23,7 @@
 import org.apache.kerby.kerberos.kerb.type.base.CheckSumType;
 import org.apache.kerby.kerberos.kerb.type.base.EncryptionType;
 import org.apache.kerby.kerberos.kerb.type.base.KeyUsage;
+import org.apache.kerby.util.EncryptoUtil;
 import org.apache.kerby.util.HexUtil;
 import org.junit.Test;
 
@@ -112,7 +113,7 @@
 
     @Test
     public void testCheckSums_HMAC_SHA1_96_AES256() throws Exception {
-        assumeTrue(EncryptionHandler.isAES256Enabled());
+        assumeTrue(EncryptoUtil.isAES256Enabled());
 
         performTest(new CksumTest(
             "fourteen",
diff --git a/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/DecryptionTest.java b/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/DecryptionTest.java
index c0c938d..cf0bda2 100644
--- a/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/DecryptionTest.java
+++ b/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/DecryptionTest.java
@@ -22,6 +22,7 @@
 import org.apache.kerby.kerberos.kerb.type.base.EncryptionKey;
 import org.apache.kerby.kerberos.kerb.type.base.EncryptionType;
 import org.apache.kerby.kerberos.kerb.type.base.KeyUsage;
+import org.apache.kerby.util.EncryptoUtil;
 import org.apache.kerby.util.HexUtil;
 import org.junit.Test;
 
@@ -695,7 +696,7 @@
      */
     @Test
     public void testDecryptAES256_CTS_HMAC_SHA1_96_0() {
-        assumeTrue(EncryptionHandler.isAES256Enabled());
+        assumeTrue(EncryptoUtil.isAES256Enabled());
 
         TestCase testCase = new TestCase(
                 EncryptionType.AES256_CTS_HMAC_SHA1_96,
@@ -715,7 +716,7 @@
      */
     @Test
     public void testDecryptAES256_CTS_HMAC_SHA1_96_1() {
-        assumeTrue(EncryptionHandler.isAES256Enabled());
+        assumeTrue(EncryptoUtil.isAES256Enabled());
 
         TestCase testCase = new TestCase(
                 EncryptionType.AES256_CTS_HMAC_SHA1_96,
@@ -735,7 +736,7 @@
      */
     @Test
     public void testDecryptAES256_CTS_HMAC_SHA1_96_9() {
-        assumeTrue(EncryptionHandler.isAES256Enabled());
+        assumeTrue(EncryptoUtil.isAES256Enabled());
 
         TestCase testCase = new TestCase(
                 EncryptionType.AES256_CTS_HMAC_SHA1_96,
@@ -756,7 +757,7 @@
      */
     @Test
     public void testDecryptAES256_CTS_HMAC_SHA1_96_13() {
-        assumeTrue(EncryptionHandler.isAES256Enabled());
+        assumeTrue(EncryptoUtil.isAES256Enabled());
 
         TestCase testCase = new TestCase(
                 EncryptionType.AES256_CTS_HMAC_SHA1_96,
@@ -777,7 +778,7 @@
      */
     @Test
     public void testDecryptAES256_CTS_HMAC_SHA1_96_30() {
-        assumeTrue(EncryptionHandler.isAES256Enabled());
+        assumeTrue(EncryptoUtil.isAES256Enabled());
 
         TestCase testCase = new TestCase(
                 EncryptionType.AES256_CTS_HMAC_SHA1_96,
diff --git a/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/FastUtilTest.java b/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/FastUtilTest.java
index a08f01f..5130ed5 100644
--- a/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/FastUtilTest.java
+++ b/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/FastUtilTest.java
@@ -22,6 +22,7 @@
 import org.apache.kerby.kerberos.kerb.crypto.fast.FastUtil;
 import org.apache.kerby.kerberos.kerb.type.base.EncryptionKey;
 import org.apache.kerby.kerberos.kerb.type.base.EncryptionType;
+import org.apache.kerby.util.EncryptoUtil;
 import org.apache.kerby.util.HexUtil;
 import org.junit.Test;
 
@@ -125,7 +126,7 @@
 
     @Test
     public void testFastUtil_AES256_CTS_HMAC_SHA1() throws Exception {
-        assumeTrue(EncryptionHandler.isAES256Enabled());
+        assumeTrue(EncryptoUtil.isAES256Enabled());
 
         performTest(new TestCase(
                 EncryptionType.AES256_CTS_HMAC_SHA1_96,
diff --git a/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/KeyDeriveTest.java b/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/KeyDeriveTest.java
index 7b44da0..3d9ee9a 100644
--- a/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/KeyDeriveTest.java
+++ b/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/KeyDeriveTest.java
@@ -29,6 +29,7 @@
 import org.apache.kerby.kerberos.kerb.crypto.key.Des3KeyMaker;
 import org.apache.kerby.kerberos.kerb.crypto.key.DkKeyMaker;
 import org.apache.kerby.kerberos.kerb.type.base.EncryptionType;
+import org.apache.kerby.util.EncryptoUtil;
 import org.apache.kerby.util.HexUtil;
 import org.junit.Test;
 
@@ -126,7 +127,7 @@
     
     @Test
     public void testKeyDerive_AES256_CTS_HMAC_SHA1_96_299() throws Exception {
-        assumeTrue(EncryptionHandler.isAES256Enabled());
+        assumeTrue(EncryptoUtil.isAES256Enabled());
 
         performTest(new TestCase(
                 EncryptionType.AES256_CTS_HMAC_SHA1_96,
@@ -140,7 +141,7 @@
     
     @Test
     public void testKeyDerive_AES256_CTS_HMAC_SHA1_96_2AA() throws Exception {
-        assumeTrue(EncryptionHandler.isAES256Enabled());
+        assumeTrue(EncryptoUtil.isAES256Enabled());
 
         performTest(new TestCase(
                 EncryptionType.AES256_CTS_HMAC_SHA1_96,
@@ -154,7 +155,7 @@
     
     @Test
     public void testKeyDerive_AES256_CTS_HMAC_SHA1_96_255() throws Exception {
-        assumeTrue(EncryptionHandler.isAES256Enabled());
+        assumeTrue(EncryptoUtil.isAES256Enabled());
 
         performTest(new TestCase(
                 EncryptionType.AES256_CTS_HMAC_SHA1_96,
diff --git a/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/PrfTest.java b/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/PrfTest.java
index c5dcac6..b87ba9b 100644
--- a/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/PrfTest.java
+++ b/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/PrfTest.java
@@ -20,6 +20,7 @@
 package org.apache.kerby.kerberos.kerb.crypto;
 
 import org.apache.kerby.kerberos.kerb.type.base.EncryptionType;
+import org.apache.kerby.util.EncryptoUtil;
 import org.apache.kerby.util.HexUtil;
 import org.junit.Test;
 
@@ -86,7 +87,7 @@
 
     @Test
     public void testPrf_AES256_CTS_HMAC_SHA1() throws Exception {
-        assumeTrue(EncryptionHandler.isAES256Enabled());
+        assumeTrue(EncryptoUtil.isAES256Enabled());
 
         performTest(new TestCase(
                 EncryptionType.AES256_CTS_HMAC_SHA1_96,
diff --git a/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/String2keyTest.java b/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/String2keyTest.java
index abbbbfb..042b42a 100644
--- a/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/String2keyTest.java
+++ b/kerby-kerb/kerb-crypto/src/test/java/org/apache/kerby/kerberos/kerb/crypto/String2keyTest.java
@@ -21,6 +21,7 @@
 
 import org.apache.kerby.kerberos.kerb.type.base.EncryptionKey;
 import org.apache.kerby.kerberos.kerb.type.base.EncryptionType;
+import org.apache.kerby.util.EncryptoUtil;
 import org.apache.kerby.util.HexUtil;
 import org.junit.Test;
 
@@ -270,7 +271,7 @@
 
     @Test
     public void test_AES256_CTS_HMAC_SHA1_96_0() {
-        assumeTrue(EncryptionHandler.isAES256Enabled());
+        assumeTrue(EncryptoUtil.isAES256Enabled());
 
         performTest(new TestCase(
                 EncryptionType.AES256_CTS_HMAC_SHA1_96,
@@ -284,7 +285,7 @@
 
     @Test
     public void test_AES256_CTS_HMAC_SHA1_96_1() {
-        assumeTrue(EncryptionHandler.isAES256Enabled());
+        assumeTrue(EncryptoUtil.isAES256Enabled());
 
         performTest(new TestCase(
                 EncryptionType.AES256_CTS_HMAC_SHA1_96,
@@ -298,7 +299,7 @@
 
     @Test
     public void test_AES256_CTS_HMAC_SHA1_96_2() {
-        assumeTrue(EncryptionHandler.isAES256Enabled());
+        assumeTrue(EncryptoUtil.isAES256Enabled());
 
         performTest(new TestCase(
                 EncryptionType.AES256_CTS_HMAC_SHA1_96,
@@ -312,7 +313,7 @@
 
     @Test
     public void test_AES256_CTS_HMAC_SHA1_96_3() {
-        assumeTrue(EncryptionHandler.isAES256Enabled());
+        assumeTrue(EncryptoUtil.isAES256Enabled());
 
         performTest(new TestCase(
                 EncryptionType.AES256_CTS_HMAC_SHA1_96,
@@ -326,7 +327,7 @@
 
     @Test
     public void test_AES256_CTS_HMAC_SHA1_96_4() {
-        assumeTrue(EncryptionHandler.isAES256Enabled());
+        assumeTrue(EncryptoUtil.isAES256Enabled());
 
         performTest(new TestCase(
                 EncryptionType.AES256_CTS_HMAC_SHA1_96,
@@ -342,7 +343,7 @@
 
     @Test
     public void test_AES256_CTS_HMAC_SHA1_96_5() {
-        assumeTrue(EncryptionHandler.isAES256Enabled());
+        assumeTrue(EncryptoUtil.isAES256Enabled());
 
         performTest(new TestCase(
                 EncryptionType.AES256_CTS_HMAC_SHA1_96,
@@ -356,7 +357,7 @@
 
     @Test
     public void test_AES256_CTS_HMAC_SHA1_96_6() {
-        assumeTrue(EncryptionHandler.isAES256Enabled());
+        assumeTrue(EncryptoUtil.isAES256Enabled());
 
         performTest(new TestCase(
                 EncryptionType.AES256_CTS_HMAC_SHA1_96,
@@ -371,7 +372,7 @@
     // Check for KRB5_ERR_BAD_S2K_PARAMS return when weak iteration counts are forbidden
     @Test
     public void test_AES256_CTS_HMAC_SHA1_96_7() {
-        assumeTrue(EncryptionHandler.isAES256Enabled());
+        assumeTrue(EncryptoUtil.isAES256Enabled());
 
         performTest(new TestCase(
                 EncryptionType.AES256_CTS_HMAC_SHA1_96,
diff --git a/kerby-kerb/kerb-kdc-test/src/test/java/org/apache/kerby/kerberos/kerb/server/KdcTestBase.java b/kerby-kerb/kerb-kdc-test/src/test/java/org/apache/kerby/kerberos/kerb/server/KdcTestBase.java
index 49bf5cf..8bc4205 100644
--- a/kerby-kerb/kerb-kdc-test/src/test/java/org/apache/kerby/kerberos/kerb/server/KdcTestBase.java
+++ b/kerby-kerb/kerb-kdc-test/src/test/java/org/apache/kerby/kerberos/kerb/server/KdcTestBase.java
@@ -21,6 +21,8 @@
 
 import org.apache.kerby.kerberos.kerb.KrbException;
 import org.apache.kerby.kerberos.kerb.client.KrbClient;
+import org.apache.kerby.kerberos.kerb.client.KrbPkinitClient;
+import org.apache.kerby.kerberos.kerb.client.KrbTokenClient;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
@@ -71,6 +73,14 @@
         return kdcServer.getKrbClient();
     }
 
+    protected KrbPkinitClient getPkinitClient() {
+        return kdcServer.getPkinitClient();
+    }
+
+    protected KrbTokenClient getTokenClient() {
+        return kdcServer.getTokenClient();
+    }
+
     protected String getClientPrincipalName() {
         return clientPrincipalName;
     }
diff --git a/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/preauth/pkinit/PkinitPreauth.java b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/preauth/pkinit/PkinitPreauth.java
index 86d0a61..7782e41 100644
--- a/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/preauth/pkinit/PkinitPreauth.java
+++ b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/preauth/pkinit/PkinitPreauth.java
@@ -23,7 +23,6 @@
 import org.apache.kerby.asn1.parse.Asn1Container;
 import org.apache.kerby.asn1.parse.Asn1ParseResult;
 import org.apache.kerby.asn1.type.Asn1Integer;
-import org.apache.kerby.asn1.type.Asn1ObjectIdentifier;
 import org.apache.kerby.cms.type.CertificateChoices;
 import org.apache.kerby.cms.type.CertificateSet;
 import org.apache.kerby.cms.type.ContentInfo;
@@ -35,8 +34,8 @@
 import org.apache.kerby.kerberos.kerb.common.KrbUtil;
 import org.apache.kerby.kerberos.kerb.crypto.dh.DhServer;
 import org.apache.kerby.kerberos.kerb.preauth.PluginRequestContext;
-import org.apache.kerby.kerberos.kerb.preauth.pkinit.CMSMessageType;
 import org.apache.kerby.kerberos.kerb.preauth.pkinit.CertificateHelper;
+import org.apache.kerby.kerberos.kerb.preauth.pkinit.CmsMessageType;
 import org.apache.kerby.kerberos.kerb.preauth.pkinit.PkinitCrypto;
 import org.apache.kerby.kerberos.kerb.preauth.pkinit.PkinitPlgCryptoContext;
 import org.apache.kerby.kerberos.kerb.preauth.pkinit.PkinitPreauthMeta;
@@ -52,13 +51,13 @@
 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.AuthPack;
-import org.apache.kerby.kerberos.kerb.type.pa.pkinit.DHRepInfo;
-import org.apache.kerby.kerberos.kerb.type.pa.pkinit.KdcDHKeyInfo;
+import org.apache.kerby.kerberos.kerb.type.pa.pkinit.DhRepInfo;
+import org.apache.kerby.kerberos.kerb.type.pa.pkinit.KdcDhKeyInfo;
 import org.apache.kerby.kerberos.kerb.type.pa.pkinit.PaPkAsRep;
 import org.apache.kerby.kerberos.kerb.type.pa.pkinit.PaPkAsReq;
 import org.apache.kerby.kerberos.kerb.type.pa.pkinit.PkAuthenticator;
 import org.apache.kerby.x509.type.Certificate;
-import org.apache.kerby.x509.type.DHParameter;
+import org.apache.kerby.x509.type.DhParameter;
 import org.apache.kerby.x509.type.SubjectPublicKeyInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -143,9 +142,9 @@
 
             SignedData signedData = contentInfo.getContentAs(SignedData.class);
 
-            PkinitCrypto.verifyCMSSignedData(CMSMessageType.CMS_SIGN_CLIENT, signedData);
+            PkinitCrypto.verifyCmsSignedData(CmsMessageType.CMS_SIGN_CLIENT, signedData);
 
-            Boolean isSigned = PkinitCrypto.isSigned(signedData);
+            Boolean isSigned = signedData.isSigned();
             if (isSigned) {
                 //TODO
                 LOG.info("Signed data.");
@@ -213,9 +212,9 @@
 
             SubjectPublicKeyInfo publicKeyInfo = authPack.getClientPublicValue();
 
-            DHParameter dhParameter;
+            DhParameter dhParameter;
             if (publicKeyInfo.getSubjectPubKey() != null) {
-                dhParameter = authPack.getClientPublicValue().getAlgorithm().getParametersAs(DHParameter.class);
+                dhParameter = authPack.getClientPublicValue().getAlgorithm().getParametersAs(DhParameter.class);
                 PkinitCrypto.serverCheckDH(pkinitContext.pluginOpts, pkinitContext.cryptoctx, dhParameter);
 
                 byte[] clientSubjectPubKey = publicKeyInfo.getSubjectPubKey().getValue();
@@ -321,8 +320,8 @@
         }
 
         PaPkAsRep paPkAsRep = new PaPkAsRep();
-        DHRepInfo dhRepInfo = new DHRepInfo();
-        KdcDHKeyInfo kdcDhKeyInfo = new KdcDHKeyInfo();
+        DhRepInfo dhRepInfo = new DhRepInfo();
+        KdcDhKeyInfo kdcDhKeyInfo = new KdcDhKeyInfo();
 
         Asn1Integer publickey = new Asn1Integer(severPubKey.getY());
         byte[] pubKeyData = KrbCodec.encode(publickey);
@@ -341,7 +340,7 @@
             certificateSet.addElement(certificateChoices);
         }
 
-        Asn1ObjectIdentifier oid = cryptoContext.getIdPkinitDHKeyDataOID();
+        String oid = cryptoContext.getIdPkinitDHKeyDataOID();
         signedDataBytes = PkinitCrypto.cmsSignedDataCreate(KrbCodec.encode(kdcDhKeyInfo), oid, 3, null,
                 null, null, null);
 
diff --git a/kerby-kerb/kerb-simplekdc/src/main/java/org/apache/kerby/kerberos/kerb/server/SimpleKdcServer.java b/kerby-kerb/kerb-simplekdc/src/main/java/org/apache/kerby/kerberos/kerb/server/SimpleKdcServer.java
index 0a7ad1d..5e83207 100644
--- a/kerby-kerb/kerb-simplekdc/src/main/java/org/apache/kerby/kerberos/kerb/server/SimpleKdcServer.java
+++ b/kerby-kerb/kerb-simplekdc/src/main/java/org/apache/kerby/kerberos/kerb/server/SimpleKdcServer.java
@@ -23,6 +23,8 @@
 import org.apache.kerby.kerberos.kerb.admin.Kadmin;
 import org.apache.kerby.kerberos.kerb.client.Krb5Conf;
 import org.apache.kerby.kerberos.kerb.client.KrbClient;
+import org.apache.kerby.kerberos.kerb.client.KrbPkinitClient;
+import org.apache.kerby.kerberos.kerb.client.KrbTokenClient;
 import org.apache.kerby.util.NetworkUtil;
 
 import java.io.File;
@@ -36,9 +38,11 @@
     private final KrbClient krbClnt;
     private Kadmin kadmin;
     private Krb5Conf krb5Conf;
-
     private File workDir;
 
+    private KrbPkinitClient pkinitClient;
+    private KrbTokenClient tokenClient;
+
     /**
      * Default constructor.
      *
@@ -155,6 +159,26 @@
     }
 
     /**
+     * @return PKINIT client
+     */
+    public KrbPkinitClient getPkinitClient() {
+        if (pkinitClient == null) {
+            pkinitClient = new KrbPkinitClient(krbClnt);
+        }
+        return pkinitClient;
+    }
+
+    /**
+     * @return Token client
+     */
+    public KrbTokenClient getTokenClient() {
+        if (tokenClient == null) {
+            tokenClient = new KrbTokenClient(krbClnt);
+        }
+        return tokenClient;
+    }
+
+    /**
      * Get Kadmin operation interface.
      * @return Kadmin
      */
diff --git a/kerby-kerb/kerb-util/src/test/java/org/apache/kerby/kerberos/kerb/util/EncryptionTest.java b/kerby-kerb/kerb-util/src/test/java/org/apache/kerby/kerberos/kerb/util/EncryptionTest.java
index a00667a..2ae0baa 100644
--- a/kerby-kerb/kerb-util/src/test/java/org/apache/kerby/kerberos/kerb/util/EncryptionTest.java
+++ b/kerby-kerb/kerb-util/src/test/java/org/apache/kerby/kerberos/kerb/util/EncryptionTest.java
@@ -31,6 +31,7 @@
 import org.apache.kerby.kerberos.kerb.type.base.PrincipalName;
 import org.apache.kerby.kerberos.kerb.type.ticket.EncTicketPart;
 import org.apache.kerby.kerberos.kerb.type.ticket.Ticket;
+import org.apache.kerby.util.EncryptoUtil;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -74,7 +75,7 @@
 
     @Test
     public void testAes256() throws IOException, KrbException {
-        assumeTrue(EncryptionHandler.isAES256Enabled());
+        assumeTrue(EncryptoUtil.isAES256Enabled());
 
         testEncWith("aes256-cts-hmac-sha1-96.cc");
     }
diff --git a/kerby-kerb/kerb-util/src/test/java/org/apache/kerby/kerberos/kerb/util/NewEncryptionTest.java b/kerby-kerb/kerb-util/src/test/java/org/apache/kerby/kerberos/kerb/util/NewEncryptionTest.java
index 5790bda..8ccbb03 100644
--- a/kerby-kerb/kerb-util/src/test/java/org/apache/kerby/kerberos/kerb/util/NewEncryptionTest.java
+++ b/kerby-kerb/kerb-util/src/test/java/org/apache/kerby/kerberos/kerb/util/NewEncryptionTest.java
@@ -25,6 +25,7 @@
 import org.apache.kerby.kerberos.kerb.type.base.EncryptionKey;
 import org.apache.kerby.kerberos.kerb.type.base.EncryptionType;
 import org.apache.kerby.kerberos.kerb.type.base.KeyUsage;
+import org.apache.kerby.util.EncryptoUtil;
 import org.junit.Test;
 
 import java.io.IOException;
@@ -67,7 +68,7 @@
 
     @Test
     public void testAes256CtsHmacSha1() throws IOException, KrbException {
-        assumeTrue(EncryptionHandler.isAES256Enabled());
+        assumeTrue(EncryptoUtil.isAES256Enabled());
 
         testEncWith(EncryptionType.AES256_CTS_HMAC_SHA1_96);
     }
diff --git a/kerby-pkix/pom.xml b/kerby-pkix/pom.xml
index e53c6b8..03ed9cd 100644
--- a/kerby-pkix/pom.xml
+++ b/kerby-pkix/pom.xml
@@ -41,12 +41,18 @@
 
     <dependency>
       <groupId>org.bouncycastle</groupId>
-      <artifactId>bcprov-ext-jdk15on</artifactId>
+      <artifactId>bcpkix-jdk15on</artifactId>
       <version>1.52</version>
       <scope>test</scope>
     </dependency>
 
     <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <version>${slf4j.version}</version>
+    </dependency>
+
+    <dependency>
       <groupId>org.mockito</groupId>
       <artifactId>mockito-all</artifactId>
       <version>1.9.5</version>
diff --git a/kerby-pkix/src/main/java/org/apache/kerby/cms/type/ContentInfo.java b/kerby-pkix/src/main/java/org/apache/kerby/cms/type/ContentInfo.java
index 077abe2..5037efa 100644
--- a/kerby-pkix/src/main/java/org/apache/kerby/cms/type/ContentInfo.java
+++ b/kerby-pkix/src/main/java/org/apache/kerby/cms/type/ContentInfo.java
@@ -66,12 +66,12 @@
         super(fieldInfos);
     }
 
-    public Asn1ObjectIdentifier getContentType() {
-        return getFieldAs(CONTENT_TYPE, Asn1ObjectIdentifier.class);
+    public String getContentType() {
+        return getFieldAsObjId(CONTENT_TYPE);
     }
 
-    public void setContentType(Asn1ObjectIdentifier contentType) {
-        setFieldAs(CONTENT_TYPE, contentType);
+    public void setContentType(String contentType) {
+        setFieldAsObjId(CONTENT_TYPE, contentType);
     }
 
     public <T extends Asn1Type> T getContentAs(Class<T> t) {
diff --git a/kerby-pkix/src/main/java/org/apache/kerby/cms/type/EncapsulatedContentInfo.java b/kerby-pkix/src/main/java/org/apache/kerby/cms/type/EncapsulatedContentInfo.java
index 17b5c76..a7a260a 100644
--- a/kerby-pkix/src/main/java/org/apache/kerby/cms/type/EncapsulatedContentInfo.java
+++ b/kerby-pkix/src/main/java/org/apache/kerby/cms/type/EncapsulatedContentInfo.java
@@ -61,12 +61,12 @@
         super(fieldInfos);
     }
 
-    public Asn1ObjectIdentifier getContentType() {
-        return getFieldAs(CONTENT_TYPE, Asn1ObjectIdentifier.class);
+    public String getContentType() {
+        return getFieldAsObjId(CONTENT_TYPE);
     }
 
-    public void setContentType(Asn1ObjectIdentifier contentType) {
-        setFieldAs(CONTENT_TYPE, contentType);
+    public void setContentType(String contentType) {
+        setFieldAsObjId(CONTENT_TYPE, contentType);
     }
 
     public byte[] getContent() {
diff --git a/kerby-pkix/src/main/java/org/apache/kerby/cms/type/SignedData.java b/kerby-pkix/src/main/java/org/apache/kerby/cms/type/SignedData.java
index 7be20a2..776e028 100644
--- a/kerby-pkix/src/main/java/org/apache/kerby/cms/type/SignedData.java
+++ b/kerby-pkix/src/main/java/org/apache/kerby/cms/type/SignedData.java
@@ -120,4 +120,16 @@
     public void setSignerInfos(SignerInfos signerInfos) {
         setFieldAs(SIGNER_INFOS, signerInfos);
     }
+
+    /**
+     * Check whether signed of data, true if the SignerInfos are not null
+     * @return boolean
+     */
+    public boolean isSigned() {
+        if (getSignerInfos().getElements().size() == 0) {
+            return false;
+        } else {
+            return true;
+        }
+    }
 }
diff --git a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/DHNonce.java b/kerby-pkix/src/main/java/org/apache/kerby/pkix/PkiException.java
similarity index 69%
copy from kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/DHNonce.java
copy to kerby-pkix/src/main/java/org/apache/kerby/pkix/PkiException.java
index e6653b8..a5fee6b 100644
--- a/kerby-kerb/kerb-core/src/main/java/org/apache/kerby/kerberos/kerb/type/pa/pkinit/DHNonce.java
+++ b/kerby-pkix/src/main/java/org/apache/kerby/pkix/PkiException.java
@@ -17,12 +17,19 @@
  *  under the License. 
  *  
  */
-package org.apache.kerby.kerberos.kerb.type.pa.pkinit;
-
-import org.apache.kerby.asn1.type.Asn1OctetString;
+package org.apache.kerby.pkix;
 
 /**
- * DHNonce ::= OCTET STRING
+ * The root exception for the module.
  */
-public class DHNonce extends Asn1OctetString {
+public class PkiException extends Exception {
+    private static final long serialVersionUID = 7305497872367599428L;
+
+    public PkiException(String message) {
+        super(message);
+    }
+
+    public PkiException(String message, Throwable cause) {
+        super(message, cause);
+    }
 }
diff --git a/kerby-pkix/src/main/java/org/apache/kerby/pki/PkiLoader.java b/kerby-pkix/src/main/java/org/apache/kerby/pkix/PkiLoader.java
similarity index 94%
rename from kerby-pkix/src/main/java/org/apache/kerby/pki/PkiLoader.java
rename to kerby-pkix/src/main/java/org/apache/kerby/pkix/PkiLoader.java
index 7523f39..402e5d4 100644
--- a/kerby-pkix/src/main/java/org/apache/kerby/pki/PkiLoader.java
+++ b/kerby-pkix/src/main/java/org/apache/kerby/pkix/PkiLoader.java
@@ -17,7 +17,7 @@
  *  under the License. 
  *  
  */
-package org.apache.kerby.pki;
+package org.apache.kerby.pkix;
 
 import org.apache.commons.ssl.PKCS8Key;
 
@@ -53,9 +53,9 @@
         CertificateFactory certFactory = null;
         try {
             certFactory = CertificateFactory.getInstance("X.509");
-            Collection<? extends Certificate> certs = (Collection<? extends Certificate>)
-                    certFactory.generateCertificates(inputStream);
-            return new ArrayList<Certificate>(certs);
+            Collection<? extends Certificate> certs =
+                certFactory.generateCertificates(inputStream);
+            return new ArrayList<>(certs);
         } catch (CertificateException e) {
             throw new IOException("Failed to load certificates", e);
         }
diff --git a/kerby-pkix/src/main/java/org/apache/kerby/pkix/PkiUtil.java b/kerby-pkix/src/main/java/org/apache/kerby/pkix/PkiUtil.java
new file mode 100644
index 0000000..34eda66
--- /dev/null
+++ b/kerby-pkix/src/main/java/org/apache/kerby/pkix/PkiUtil.java
@@ -0,0 +1,59 @@
+/**
+ *  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.pkix;
+
+import org.apache.kerby.cms.type.SignedData;
+
+import java.security.PrivateKey;
+import java.security.cert.X509Certificate;
+
+/**
+ * Pki utilities.
+ */
+public final class PkiUtil {
+    private PkiUtil() {
+
+    }
+
+    public static byte[] getSignedData(PrivateKey privateKey,
+                                       X509Certificate certificate, byte[] dataToSign,
+                                       String eContentType) throws PkiException {
+
+        /**
+         * TO DO
+         */
+        return null;
+    }
+
+    /**
+     * Validates a CMS SignedData using the public key corresponding to the private
+     * key used to sign the structure.
+     *
+     * @param signedData
+     * @return true if the signature is valid.
+     * @throws PkiException
+     */
+    public static boolean validateSignedData(SignedData signedData) throws PkiException {
+        /**
+         * TO DO
+         */
+        return false;
+    }
+}
diff --git a/kerby-pkix/src/main/java/org/apache/kerby/x509/type/AlgorithmIdentifier.java b/kerby-pkix/src/main/java/org/apache/kerby/x509/type/AlgorithmIdentifier.java
index 913768a..97623a2 100644
--- a/kerby-pkix/src/main/java/org/apache/kerby/x509/type/AlgorithmIdentifier.java
+++ b/kerby-pkix/src/main/java/org/apache/kerby/x509/type/AlgorithmIdentifier.java
@@ -60,12 +60,12 @@
         super(fieldInfos);
     }
 
-    public Asn1ObjectIdentifier getAlgorithm() {
-        return getFieldAs(ALGORITHM, Asn1ObjectIdentifier.class);
+    public String getAlgorithm() {
+        return getFieldAsObjId(ALGORITHM);
     }
 
-    public void setAlgorithm(Asn1ObjectIdentifier algorithm) {
-        setFieldAs(ALGORITHM, algorithm);
+    public void setAlgorithm(String algorithm) {
+        setFieldAsObjId(ALGORITHM, algorithm);
     }
 
     public <T extends Asn1Type> T getParametersAs(Class<T> t) {
diff --git a/kerby-pkix/src/main/java/org/apache/kerby/x509/type/DHParameter.java b/kerby-pkix/src/main/java/org/apache/kerby/x509/type/DhParameter.java
similarity index 80%
rename from kerby-pkix/src/main/java/org/apache/kerby/x509/type/DHParameter.java
rename to kerby-pkix/src/main/java/org/apache/kerby/x509/type/DhParameter.java
index beb9474..af319ce 100644
--- a/kerby-pkix/src/main/java/org/apache/kerby/x509/type/DHParameter.java
+++ b/kerby-pkix/src/main/java/org/apache/kerby/x509/type/DhParameter.java
@@ -7,10 +7,10 @@
 
 import java.math.BigInteger;
 
-import static org.apache.kerby.x509.type.DHParameter.MyEnum.*;
+import static org.apache.kerby.x509.type.DhParameter.MyEnum.*;
 
-public class DHParameter extends Asn1SequenceType {
-    protected static enum MyEnum implements EnumType {
+public class DhParameter extends Asn1SequenceType {
+    protected enum MyEnum implements EnumType {
         P,
         G,
         Q;
@@ -32,12 +32,12 @@
             new Asn1FieldInfo(Q, Asn1Integer.class),
     };
 
-    public DHParameter() {
+    public DhParameter() {
         super(fieldInfos);
     }
 
     public void setP(BigInteger p) {
-        setFieldAsBigInteger(P, p);
+        setFieldAsInt(P, p);
     }
 
     public BigInteger getP() {
@@ -46,7 +46,7 @@
     }
 
     public void setG(BigInteger g) {
-        setFieldAsBigInteger(G, g);
+        setFieldAsInt(G, g);
     }
 
     public BigInteger getG() {
@@ -55,7 +55,7 @@
     }
 
     public void setQ(BigInteger q) {
-        setFieldAsBigInteger(Q, q);
+        setFieldAsInt(Q, q);
     }
 
     public BigInteger getQ() {
diff --git a/kerby-pkix/src/test/java/org/apache/commons/ssl/TestKeyMaterial.java b/kerby-pkix/src/test/java/org/apache/commons/ssl/TestKeyMaterial.java
index 2b9329e..99a98e1 100644
--- a/kerby-pkix/src/test/java/org/apache/commons/ssl/TestKeyMaterial.java
+++ b/kerby-pkix/src/test/java/org/apache/commons/ssl/TestKeyMaterial.java
@@ -1,5 +1,6 @@
 package org.apache.commons.ssl;
 
+import org.apache.kerby.util.EncryptoUtil;
 import org.bouncycastle.jce.provider.BouncyCastleProvider;
 import org.junit.Test;
 
@@ -14,6 +15,7 @@
 import static org.apache.commons.ssl.JUnitConfig.TEST_HOME;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
 
 public class TestKeyMaterial {
     public static final char[] PASSWORD1 = "changeit".toCharArray();
@@ -54,7 +56,10 @@
 
         Date today = new Date();
         KeyMaterial km;
+
+
         try {
+            assumeTrue(EncryptoUtil.isAES256Enabled());
             km = new KeyMaterial(dir + "/" + fileName, file2, pass1, pass2);
         } catch (ProbablyBadPasswordException pbpe) {
             System.out.println("  WARN:  " + pbpe);
diff --git a/kerby-pkix/src/test/java/org/apache/commons/ssl/TestOpenSSL.java b/kerby-pkix/src/test/java/org/apache/commons/ssl/TestOpenSSL.java
index b4f26de..df6837f 100644
--- a/kerby-pkix/src/test/java/org/apache/commons/ssl/TestOpenSSL.java
+++ b/kerby-pkix/src/test/java/org/apache/commons/ssl/TestOpenSSL.java
@@ -1,5 +1,6 @@
 package org.apache.commons.ssl;
 
+import org.apache.kerby.util.EncryptoUtil;
 import org.apache.kerby.util.Util;
 import org.junit.Test;
 
@@ -12,6 +13,7 @@
 import static org.apache.commons.ssl.JUnitConfig.TEST_HOME;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
 
 public class TestOpenSSL {
 
@@ -130,6 +132,7 @@
                     byte[] encrypted = Util.streamToBytes(in);
                     char[] pwd = "changeit".toCharArray();
                     try {
+                        assumeTrue(EncryptoUtil.isAES256Enabled());
                         byte[] result = OpenSSL.decrypt(cipher, pwd, encrypted);
                         String s = new String(result, "ISO-8859-1");
                         if (!"Hello World!".equals(s)) {
diff --git a/kerby-pkix/src/test/java/org/apache/commons/ssl/TestPKCS8Key.java b/kerby-pkix/src/test/java/org/apache/commons/ssl/TestPKCS8Key.java
index c166f42..59127da 100644
--- a/kerby-pkix/src/test/java/org/apache/commons/ssl/TestPKCS8Key.java
+++ b/kerby-pkix/src/test/java/org/apache/commons/ssl/TestPKCS8Key.java
@@ -1,5 +1,6 @@
 package org.apache.commons.ssl;
 
+import org.apache.kerby.util.EncryptoUtil;
 import org.apache.kerby.util.Util;
 import org.junit.Test;
 
@@ -11,6 +12,7 @@
 import static org.apache.commons.ssl.JUnitConfig.TEST_HOME;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
 
 public class TestPKCS8Key {
 
@@ -44,6 +46,7 @@
             System.out.println("Checking PKCS file:" + filename);
             FileInputStream in = new FileInputStream(f);
             byte[] bytes = Util.streamToBytes(in);
+            assumeTrue(EncryptoUtil.isAES256Enabled());
             PKCS8Key key = new PKCS8Key(bytes, password.toCharArray());
             byte[] decrypted = key.getDecryptedBytes();
             if (original == null) {
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 18d452e..ab85e93 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
@@ -20,7 +20,6 @@
 package org.apache.kerby.cms;
 
 import org.apache.kerby.asn1.Asn1;
-import org.apache.kerby.asn1.type.Asn1ObjectIdentifier;
 import org.apache.kerby.cms.type.CertificateChoices;
 import org.apache.kerby.cms.type.CertificateSet;
 import org.apache.kerby.cms.type.ContentInfo;
@@ -61,10 +60,10 @@
     @Test
     public void testEncoding() throws IOException {
         SignedContentInfo contentInfo = new SignedContentInfo();
-        contentInfo.setContentType(new Asn1ObjectIdentifier("1.2.840.113549.1.7.2"));
+        contentInfo.setContentType("1.2.840.113549.1.7.2");
         SignedData signedData = new SignedData();
         EncapsulatedContentInfo eContentInfo = new EncapsulatedContentInfo();
-        eContentInfo.setContentType(new Asn1ObjectIdentifier("1.3.6.1.5.2.3.1"));
+        eContentInfo.setContentType("1.3.6.1.5.2.3.1");
         eContentInfo.setContent("data".getBytes());
         signedData.setEncapContentInfo(eContentInfo);
 
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/certs/CertificateChainFactory.java b/kerby-pkix/src/test/java/org/apache/kerby/pkix/CertificateChainFactory.java
similarity index 95%
rename from kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/certs/CertificateChainFactory.java
rename to kerby-pkix/src/test/java/org/apache/kerby/pkix/CertificateChainFactory.java
index 8434f50..88907ae 100644
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/certs/CertificateChainFactory.java
+++ b/kerby-pkix/src/test/java/org/apache/kerby/pkix/CertificateChainFactory.java
@@ -17,7 +17,7 @@
  *  under the License.
  *
  */
-package org.apache.kerby.kerberos.kerb.client.preauth.pkinit.certs;
+package org.apache.kerby.pkix;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -35,14 +35,8 @@
 
 /**
  * Factory for dynamically generating certificate chains.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- * @version $Rev$, $Date$
  */
 public class CertificateChainFactory {
-    /**
-     * The log for this class.
-     */
     private static final Logger LOG = LoggerFactory.getLogger(CertificateChainFactory.class);
 
     private static int trustAnchorLevel = 2;
@@ -117,7 +111,7 @@
         PublicKey trustAnchorPublicKey = keyPair.getPublic();
 
         X509Certificate trustAnchorCert = TrustAnchorGenerator.generate(trustAnchorPublicKey, trustAnchorPrivateKey,
-                dn, validityDays, friendlyName);
+            dn, validityDays, friendlyName);
 
         trustAnchorCert.checkValidity();
         trustAnchorCert.verify(trustAnchorPublicKey);
@@ -134,7 +128,7 @@
         PublicKey clientCaPublicKey = keyPair.getPublic();
 
         X509Certificate clientCaCert = IntermediateCaGenerator.generate(trustAnchorCert, trustAnchorPrivateKey,
-                clientCaPublicKey, dn, validityDays, friendlyName);
+            clientCaPublicKey, dn, validityDays, friendlyName);
 
         clientCaCert.checkValidity();
         clientCaCert.verify(trustAnchorPublicKey);
@@ -151,7 +145,7 @@
         PublicKey clientPublicKey = keyPair.getPublic();
 
         X509Certificate clientCert = EndEntityGenerator.generate(clientCaCert, clientCaPrivateKey, clientPublicKey,
-                dn, validityDays, friendlyName);
+            dn, validityDays, friendlyName);
 
         clientCert.checkValidity();
         clientCert.verify(clientCaPublicKey);
diff --git a/kerby-kerb/kerb-client/src/test/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/certs/CertificateChainFactoryTest.java b/kerby-pkix/src/test/java/org/apache/kerby/pkix/CertificateChainFactoryTest.java
similarity index 97%
rename from kerby-kerb/kerb-client/src/test/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/certs/CertificateChainFactoryTest.java
rename to kerby-pkix/src/test/java/org/apache/kerby/pkix/CertificateChainFactoryTest.java
index 556aaf5..31059c4 100644
--- a/kerby-kerb/kerb-client/src/test/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/certs/CertificateChainFactoryTest.java
+++ b/kerby-pkix/src/test/java/org/apache/kerby/pkix/CertificateChainFactoryTest.java
@@ -17,7 +17,7 @@
  *  under the License.
  *
  */
-package org.apache.kerby.kerberos.kerb.client.preauth.pkinit.certs;
+package org.apache.kerby.pkix;
 
 import org.bouncycastle.jce.provider.BouncyCastleProvider;
 import org.junit.Before;
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/certs/EndEntityGenerator.java b/kerby-pkix/src/test/java/org/apache/kerby/pkix/EndEntityGenerator.java
similarity index 98%
rename from kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/certs/EndEntityGenerator.java
rename to kerby-pkix/src/test/java/org/apache/kerby/pkix/EndEntityGenerator.java
index e2bf201..8f80599 100644
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/certs/EndEntityGenerator.java
+++ b/kerby-pkix/src/test/java/org/apache/kerby/pkix/EndEntityGenerator.java
@@ -17,7 +17,7 @@
  *  under the License.
  *
  */
-package org.apache.kerby.kerberos.kerb.client.preauth.pkinit.certs;
+package org.apache.kerby.pkix;
 
 import org.bouncycastle.asn1.ASN1EncodableVector;
 import org.bouncycastle.asn1.DERBMPString;
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/EnvelopedDataEngine.java b/kerby-pkix/src/test/java/org/apache/kerby/pkix/EnvelopedDataEngine.java
similarity index 98%
rename from kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/EnvelopedDataEngine.java
rename to kerby-pkix/src/test/java/org/apache/kerby/pkix/EnvelopedDataEngine.java
index a72656a..63e1816 100644
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/EnvelopedDataEngine.java
+++ b/kerby-pkix/src/test/java/org/apache/kerby/pkix/EnvelopedDataEngine.java
@@ -17,7 +17,7 @@
  *  under the License.
  *
  */
-package org.apache.kerby.kerberos.kerb.client.preauth.pkinit;
+package org.apache.kerby.pkix;
 
 import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
 import org.bouncycastle.cert.jcajce.JcaX509CertificateHolder;
diff --git a/kerby-kerb/kerb-client/src/test/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/EnvelopedDataEngineTest.java b/kerby-pkix/src/test/java/org/apache/kerby/pkix/EnvelopedDataEngineTest.java
similarity index 93%
rename from kerby-kerb/kerb-client/src/test/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/EnvelopedDataEngineTest.java
rename to kerby-pkix/src/test/java/org/apache/kerby/pkix/EnvelopedDataEngineTest.java
index 578602a..826815e 100644
--- a/kerby-kerb/kerb-client/src/test/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/EnvelopedDataEngineTest.java
+++ b/kerby-pkix/src/test/java/org/apache/kerby/pkix/EnvelopedDataEngineTest.java
@@ -17,9 +17,8 @@
  *  under the License.
  *
  */
-package org.apache.kerby.kerberos.kerb.client.preauth.pkinit;
+package org.apache.kerby.pkix;
 
-import org.apache.kerby.kerberos.kerb.client.preauth.pkinit.certs.CertificateChainFactory;
 import org.bouncycastle.jce.provider.BouncyCastleProvider;
 import org.junit.Before;
 import org.junit.Test;
@@ -44,10 +43,7 @@
 import java.util.Arrays;
 
 public class EnvelopedDataEngineTest extends org.junit.Assert {
-    /**
-     * The log for this class.
-     */
-    private static final Logger LOG = LoggerFactory.getLogger(EnvelopedDataEngineTest.class);
+    private static final Logger LOG = LoggerFactory.getLogger(CertificateChainFactory.class);
 
     /**
      * Certificate used to encrypt the data.
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/certs/IntermediateCaGenerator.java b/kerby-pkix/src/test/java/org/apache/kerby/pkix/IntermediateCaGenerator.java
similarity index 98%
rename from kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/certs/IntermediateCaGenerator.java
rename to kerby-pkix/src/test/java/org/apache/kerby/pkix/IntermediateCaGenerator.java
index ec977b0..3b90eea 100644
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/certs/IntermediateCaGenerator.java
+++ b/kerby-pkix/src/test/java/org/apache/kerby/pkix/IntermediateCaGenerator.java
@@ -17,7 +17,7 @@
  *  under the License.
  *
  */
-package org.apache.kerby.kerberos.kerb.client.preauth.pkinit.certs;
+package org.apache.kerby.pkix;
 
 
 import org.bouncycastle.asn1.DERBMPString;
diff --git a/kerby-pkix/src/test/java/org/apache/kerby/pkix/JavaSignTest.java b/kerby-pkix/src/test/java/org/apache/kerby/pkix/JavaSignTest.java
new file mode 100644
index 0000000..cf07eaa
--- /dev/null
+++ b/kerby-pkix/src/test/java/org/apache/kerby/pkix/JavaSignTest.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.pkix;
+
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.Signature;
+
+/**
+ * This is a JAVA sign and verify test to serve as a good sample.
+ */
+public class JavaSignTest {
+
+    static class SignAlgorithm {
+        String algo;
+        String keyType;
+
+        SignAlgorithm(String algo, String keyType) {
+            this.algo = algo;
+            this.keyType = keyType;
+        }
+    }
+
+    static final SignAlgorithm[] ALGORITHMS = {
+        new SignAlgorithm("DSA", "DSA"),
+        new SignAlgorithm("SHA1withDSA", "DSA"),
+        new SignAlgorithm("SHA1withRSA", "RSA"),
+        new SignAlgorithm("SHA256withRSA", "RSA"),
+        new SignAlgorithm("SHA384withRSA", "RSA"),
+        new SignAlgorithm("SHA512withRSA", "RSA"),
+        new SignAlgorithm("MD5withRSA", "RSA"),
+        new SignAlgorithm("MD5andSHA1withRSA", "RSA"),
+        new SignAlgorithm("SHA256withRSA", "RSA")
+    };
+
+    static byte[] signData(byte[] dataToSign, KeyPair keyPair,
+                           SignAlgorithm sa) throws Exception {
+        byte[] signResult;
+        Signature signer = Signature.getInstance(sa.algo);
+        signer.initSign(keyPair.getPrivate());
+        signer.update(dataToSign);
+        signResult = signer.sign();
+
+        return signResult;
+    }
+
+    static boolean verifyData(byte[] dataToVerify, byte[] signature,
+                              KeyPair keyPair, SignAlgorithm sa) throws Exception {
+        boolean verifyResult;
+        Signature verifier = Signature.getInstance(sa.algo);
+        verifier.initVerify(keyPair.getPublic());
+        verifier.update(dataToVerify);
+        verifyResult = verifier.verify(signature);
+
+        return verifyResult;
+    }
+
+    public static void main(String[] args) throws Exception {
+        for (SignAlgorithm sa : ALGORITHMS) {
+            KeyPairGenerator keyGen = KeyPairGenerator.getInstance(sa.keyType);
+            keyGen.initialize(1024);
+            KeyPair keyPair = keyGen.generateKeyPair();
+
+            byte[] testMessage = "Hello, Kerby!!".getBytes();
+            byte[] signature = signData(testMessage, keyPair, sa);
+            boolean isOk = verifyData(testMessage, signature, keyPair, sa);
+            if (!isOk) {
+                throw new RuntimeException("Failed");
+            }
+        }
+    }
+}
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/certs/KeyPairSpec.java b/kerby-pkix/src/test/java/org/apache/kerby/pkix/KeyPairSpec.java
similarity index 97%
rename from kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/certs/KeyPairSpec.java
rename to kerby-pkix/src/test/java/org/apache/kerby/pkix/KeyPairSpec.java
index 7c6a091..b6cfa17 100644
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/certs/KeyPairSpec.java
+++ b/kerby-pkix/src/test/java/org/apache/kerby/pkix/KeyPairSpec.java
@@ -17,7 +17,7 @@
  *  under the License.
  *
  */
-package org.apache.kerby.kerberos.kerb.client.preauth.pkinit.certs;
+package org.apache.kerby.pkix;
 
 
 import java.math.BigInteger;
@@ -27,9 +27,6 @@
 
 /**
  * Specifications for asymmetric key pairs.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- * @version $Rev$, $Date$
  */
 @SuppressWarnings("checkstyle:linelength")
 class KeyPairSpec {
diff --git a/kerby-pkix/src/test/java/org/apache/kerby/pkix/SignedDataEngine.java b/kerby-pkix/src/test/java/org/apache/kerby/pkix/SignedDataEngine.java
new file mode 100644
index 0000000..bb10273
--- /dev/null
+++ b/kerby-pkix/src/test/java/org/apache/kerby/pkix/SignedDataEngine.java
@@ -0,0 +1,124 @@
+/**
+ *  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.pkix;
+
+import org.bouncycastle.asn1.ASN1ObjectIdentifier;
+import org.bouncycastle.cert.X509CertificateHolder;
+import org.bouncycastle.cert.jcajce.JcaCertStore;
+import org.bouncycastle.cms.CMSException;
+import org.bouncycastle.cms.CMSProcessableByteArray;
+import org.bouncycastle.cms.CMSSignedData;
+import org.bouncycastle.cms.CMSSignedDataGenerator;
+import org.bouncycastle.cms.CMSTypedData;
+import org.bouncycastle.cms.SignerInformation;
+import org.bouncycastle.cms.SignerInformationStore;
+import org.bouncycastle.cms.jcajce.JcaSimpleSignerInfoGeneratorBuilder;
+import org.bouncycastle.cms.jcajce.JcaSimpleSignerInfoVerifierBuilder;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.bouncycastle.operator.OperatorCreationException;
+import org.bouncycastle.util.Store;
+
+import java.io.IOException;
+import java.security.PrivateKey;
+import java.security.Security;
+import java.security.cert.CertificateEncodingException;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+
+/**
+ * Encapsulates working with PKINIT signed data structures.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class SignedDataEngine {
+
+    static byte[] getSignedData(PrivateKey privateKey, X509Certificate certificate, byte[] dataToSign,
+                                String eContentType) throws IOException, OperatorCreationException,
+            CertificateEncodingException, CMSException {
+
+        if (Security.getProvider("BC") == null) {
+            Security.addProvider(new BouncyCastleProvider());
+        }
+
+
+        List certList = new ArrayList();
+        certList.add(certificate);
+        Store certs = new JcaCertStore(certList);
+
+        CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
+
+        gen.addSignerInfoGenerator(
+                new JcaSimpleSignerInfoGeneratorBuilder()
+                        .setProvider("BC")
+                        .build("SHA1withRSA", privateKey, certificate));
+
+        gen.addCertificates(certs);
+
+        ASN1ObjectIdentifier asn1ObjectIdentifier = new ASN1ObjectIdentifier(eContentType);
+        CMSTypedData msg = new CMSProcessableByteArray(asn1ObjectIdentifier, dataToSign);
+        CMSSignedData s = gen.generate(msg, true);
+
+        return s.getEncoded();
+    }
+
+    /**
+     * Validates a CMS SignedData using the public key corresponding to the private
+     * key used to sign the structure.
+     *
+     * @param s
+     * @return true if the signature is valid.
+     * @throws Exception
+     */
+    public static boolean validateSignedData(CMSSignedData s) throws Exception {
+
+        Store certStore = s.getCertificates();
+        Store crlStore = s.getCRLs();
+        SignerInformationStore signers = s.getSignerInfos();
+
+        Collection c = signers.getSigners();
+        Iterator it = c.iterator();
+
+        while (it.hasNext()) {
+            SignerInformation signer = (SignerInformation) it.next();
+            Collection certCollection = certStore.getMatches(signer.getSID());
+
+            Iterator certIt = certCollection.iterator();
+            X509CertificateHolder cert = (X509CertificateHolder) certIt.next();
+
+            if (!signer.verify(new JcaSimpleSignerInfoVerifierBuilder().setProvider("BC").build(cert))) {
+                return false;
+            }
+        }
+
+        Collection certColl = certStore.getMatches(null);
+        Collection crlColl = crlStore.getMatches(null);
+
+        if (certColl.size() != s.getCertificates().getMatches(null).size()
+                || crlColl.size() != s.getCRLs().getMatches(null).size()) {
+            return false;
+        }
+        return true;
+    }
+}
diff --git a/kerby-kerb/kerb-client/src/test/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/SignedDataEngineTest.java b/kerby-pkix/src/test/java/org/apache/kerby/pkix/SignedDataEngineTest.java
similarity index 83%
rename from kerby-kerb/kerb-client/src/test/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/SignedDataEngineTest.java
rename to kerby-pkix/src/test/java/org/apache/kerby/pkix/SignedDataEngineTest.java
index 8989a88..60db909 100644
--- a/kerby-kerb/kerb-client/src/test/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/SignedDataEngineTest.java
+++ b/kerby-pkix/src/test/java/org/apache/kerby/pkix/SignedDataEngineTest.java
@@ -17,10 +17,9 @@
  *  under the License.
  *
  */
-package org.apache.kerby.kerberos.kerb.client.preauth.pkinit;
+package org.apache.kerby.pkix;
 
 
-import org.apache.kerby.kerberos.kerb.client.preauth.pkinit.certs.CertificateChainFactory;
 import org.bouncycastle.cms.CMSSignedData;
 import org.bouncycastle.jce.provider.BouncyCastleProvider;
 import org.junit.Before;
@@ -30,18 +29,9 @@
 
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.security.InvalidKeyException;
 import java.security.KeyStore;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.NoSuchProviderException;
 import java.security.PrivateKey;
 import java.security.Security;
-import java.security.SignatureException;
-import java.security.UnrecoverableKeyException;
-import java.security.cert.CertificateException;
 import java.security.cert.X509Certificate;
 import java.security.interfaces.RSAPrivateCrtKey;
 
@@ -80,7 +70,6 @@
         getCaFromFactory();
     }
 
-
     /**
      * Tests that signed data signature validation works.
      *
@@ -106,9 +95,7 @@
     }
 
 
-    void getCaFromFile(String caFile, String caPassword, String caAlias) throws KeyStoreException,
-            NoSuchAlgorithmException, CertificateException, FileNotFoundException, IOException,
-            UnrecoverableKeyException, InvalidKeyException, SignatureException, NoSuchProviderException {
+    void getCaFromFile(String caFile, String caPassword, String caAlias) throws Exception {
         // Open the keystore.
         KeyStore caKs = KeyStore.getInstance("PKCS12");
         caKs.load(new FileInputStream(new File(caFile)), caPassword.toCharArray());
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/certs/TrustAnchorGenerator.java b/kerby-pkix/src/test/java/org/apache/kerby/pkix/TrustAnchorGenerator.java
similarity index 95%
rename from kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/certs/TrustAnchorGenerator.java
rename to kerby-pkix/src/test/java/org/apache/kerby/pkix/TrustAnchorGenerator.java
index cdb601f..f26354d 100644
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/preauth/pkinit/certs/TrustAnchorGenerator.java
+++ b/kerby-pkix/src/test/java/org/apache/kerby/pkix/TrustAnchorGenerator.java
@@ -17,7 +17,7 @@
  *  under the License.
  *
  */
-package org.apache.kerby.kerberos.kerb.client.preauth.pkinit.certs;
+package org.apache.kerby.pkix;
 
 import org.bouncycastle.asn1.DERBMPString;
 import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
@@ -47,9 +47,6 @@
 
 /**
  * Generates an X.509 "trust anchor" certificate programmatically.
- *
- * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
- * @version $Rev$, $Date$
  */
 public class TrustAnchorGenerator {
     /**
diff --git a/kerby-pkix/src/test/java/org/apache/kerby/x509/PkiLoaderTest.java b/kerby-pkix/src/test/java/org/apache/kerby/x509/PkiLoaderTest.java
index b78e466..c150fc4 100644
--- a/kerby-pkix/src/test/java/org/apache/kerby/x509/PkiLoaderTest.java
+++ b/kerby-pkix/src/test/java/org/apache/kerby/x509/PkiLoaderTest.java
@@ -19,7 +19,7 @@
  */
 package org.apache.kerby.x509;
 
-import org.apache.kerby.pki.PkiLoader;
+import org.apache.kerby.pkix.PkiLoader;
 import org.junit.Before;
 import org.junit.Test;
 
diff --git a/kerby-tool/client-tool/src/main/java/org/apache/kerby/kerberos/tool/kinit/KinitTool.java b/kerby-tool/client-tool/src/main/java/org/apache/kerby/kerberos/tool/kinit/KinitTool.java
index d59867a..7014960 100644
--- a/kerby-tool/client-tool/src/main/java/org/apache/kerby/kerberos/tool/kinit/KinitTool.java
+++ b/kerby-tool/client-tool/src/main/java/org/apache/kerby/kerberos/tool/kinit/KinitTool.java
@@ -24,6 +24,7 @@
 import org.apache.kerby.KOptionInfo;
 import org.apache.kerby.KOptionType;
 import org.apache.kerby.KOptions;
+import org.apache.kerby.kerberos.kerb.KrbConstant;
 import org.apache.kerby.kerberos.kerb.KrbException;
 import org.apache.kerby.kerberos.kerb.client.KrbClient;
 import org.apache.kerby.kerberos.kerb.client.KrbKdcOption;
@@ -188,10 +189,6 @@
         return krbClient;
     }
 
-    private static String getAnonymousPrincipal() {
-        return "WELLKNOWN/ANONYMOUS";
-    }
-
     public static void main(String[] args) throws Exception {
         KOptions ktOptions = new KOptions();
         KinitOption kto;
@@ -238,7 +235,7 @@
 
         if (principal == null) {
             if (ktOptions.contains(KinitOption.ANONYMOUS)) {
-                principal = getAnonymousPrincipal();
+                principal = KrbConstant.ANONYMOUS_PRINCIPAL;
             } else {
                 printUsage("No principal is specified");
             }
diff --git a/kerby-util/src/main/java/org/apache/kerby/util/ByteArrayReadLine.java b/kerby-util/src/main/java/org/apache/kerby/util/ByteArrayReadLine.java
index 557181e..c0323d1 100644
--- a/kerby-util/src/main/java/org/apache/kerby/util/ByteArrayReadLine.java
+++ b/kerby-util/src/main/java/org/apache/kerby/util/ByteArrayReadLine.java
@@ -1,3 +1,23 @@
+/**
+ *  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.util;
 
 import java.io.ByteArrayInputStream;
diff --git a/kerby-util/src/main/java/org/apache/kerby/util/EncryptoUtil.java b/kerby-util/src/main/java/org/apache/kerby/util/EncryptoUtil.java
new file mode 100644
index 0000000..a9e4b7a
--- /dev/null
+++ b/kerby-util/src/main/java/org/apache/kerby/util/EncryptoUtil.java
@@ -0,0 +1,46 @@
+/**

+ *  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.util;

+

+import javax.crypto.Cipher;

+

+/**

+ * This class gives a method to detect if system support AES256 or above.

+ */

+public class EncryptoUtil {

+    private static boolean isAES256Enabled = false;

+

+    static {

+        try {

+            isAES256Enabled = Cipher.getMaxAllowedKeyLength("AES") >= 256;

+        } catch (Exception e) {

+            System.err.println(e);

+        }

+    }

+

+    /**

+     * @return true if aes256 is enabled

+     */

+    public static boolean isAES256Enabled() {

+        return isAES256Enabled;

+    }

+

+}

diff --git a/kerby-util/src/main/java/org/apache/kerby/util/HexUtil.java b/kerby-util/src/main/java/org/apache/kerby/util/HexUtil.java
index 93f6dfd..f682f03 100644
--- a/kerby-util/src/main/java/org/apache/kerby/util/HexUtil.java
+++ b/kerby-util/src/main/java/org/apache/kerby/util/HexUtil.java
@@ -26,6 +26,53 @@
     private static final char[] HEX_CHARS = HEX_CHARS_STR.toCharArray();
 
     /**
+     * Convert bytes into friendly format as:
+     * 0x02 02 00 80
+     */
+    public static String bytesToHexFriendly(byte[] bytes) {
+        int len = bytes.length * 2;
+        len += bytes.length; // for ' ' appended for each char
+        len += 2; // for '0x' prefix
+        char[] hexChars = new char[len];
+        hexChars[0] = '0';
+        hexChars[1] = 'x';
+        for (int j = 0; j < bytes.length; j++) {
+            int v = bytes[j] & 0xFF;
+            hexChars[j * 3 + 2] = HEX_CHARS[v >>> 4];
+            hexChars[j * 3 + 3] = HEX_CHARS[v & 0x0F];
+            hexChars[j * 3 + 4] = ' ';
+        }
+
+        return new String(hexChars);
+    }
+
+    /**
+     * Convert friendly hex string like follows into byte array
+     * 0x02 02 00 80
+     */
+    public static byte[] hex2bytesFriendly(String hexString) {
+        hexString = hexString.toUpperCase();
+        String hexStr = hexString;
+        if (hexString.startsWith("0X")) {
+            hexStr = hexString.substring(2);
+        }
+        String[] hexParts = hexStr.split(" ");
+
+        byte[] bytes = new byte[hexParts.length];
+        char[] hexPart;
+        for (int i = 0; i < hexParts.length; ++i) {
+            hexPart = hexParts[i].toCharArray();
+            if (hexPart.length != 2) {
+                throw new IllegalArgumentException("Invalid hex string to convert");
+            }
+            bytes[i] = (byte) ((HEX_CHARS_STR.indexOf(hexPart[0]) << 4)
+                + HEX_CHARS_STR.indexOf(hexPart[1]));
+        }
+
+        return bytes;
+    }
+
+    /**
      * Convert bytes into format as:
      * 02020080
      * @param bytes The bytes
diff --git a/kerby-util/src/main/java/org/apache/kerby/util/ReadLine.java b/kerby-util/src/main/java/org/apache/kerby/util/ReadLine.java
index 9d30095..f7a1db0 100644
--- a/kerby-util/src/main/java/org/apache/kerby/util/ReadLine.java
+++ b/kerby-util/src/main/java/org/apache/kerby/util/ReadLine.java
@@ -1,3 +1,22 @@
+/**
+ *  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.util;
 
 import java.io.IOException;