directory-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From dran...@apache.org
Subject [09/42] directory-kerberos git commit: Initially import Haox codebase (https://github.com/drankye/haox)
Date Sat, 10 Jan 2015 13:30:53 GMT
http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/ap/Authenticator.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/ap/Authenticator.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/ap/Authenticator.java
new file mode 100644
index 0000000..1d7b076
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/ap/Authenticator.java
@@ -0,0 +1,125 @@
+package org.apache.kerberos.kerb.spec.ap;
+
+import org.apache.haox.asn1.type.Asn1FieldInfo;
+import org.apache.haox.asn1.type.Asn1Integer;
+import org.apache.kerberos.kerb.spec.KerberosString;
+import org.apache.kerberos.kerb.spec.KerberosTime;
+import org.apache.kerberos.kerb.spec.KrbAppSequenceType;
+import org.apache.kerberos.kerb.spec.common.AuthorizationData;
+import org.apache.kerberos.kerb.spec.common.CheckSum;
+import org.apache.kerberos.kerb.spec.common.EncryptionKey;
+import org.apache.kerberos.kerb.spec.common.PrincipalName;
+
+/**
+ Authenticator   ::= [APPLICATION 2] SEQUENCE  {
+ authenticator-vno       [0] INTEGER (5),
+ crealm                  [1] Realm,
+ cname                   [2] PrincipalName,
+ cksum                   [3] Checksum OPTIONAL,
+ cusec                   [4] Microseconds,
+ ctime                   [5] KerberosTime,
+ subkey                  [6] EncryptionKey OPTIONAL,
+ seq-number              [7] UInt32 OPTIONAL,
+ authorization-data      [8] AuthorizationData OPTIONAL
+ }
+ */
+public class Authenticator extends KrbAppSequenceType {
+    public static int TAG = 2;
+    private static int AUTHENTICATOR_VNO = 0;
+    private static int CREALM = 1;
+    private static int CNAME = 2;
+    private static int CKSUM = 3;
+    private static int CUSEC = 4;
+    private static int CTIME = 5;
+    private static int SUBKEY = 6;
+    private static int SEQ_NUMBER = 7;
+    private static int AUTHORIZATION_DATA = 8;
+
+    static Asn1FieldInfo[] fieldInfos = new Asn1FieldInfo[] {
+            new Asn1FieldInfo(AUTHENTICATOR_VNO, 0, Asn1Integer.class),
+            new Asn1FieldInfo(CREALM, 1, KerberosString.class),
+            new Asn1FieldInfo(CNAME, 2, PrincipalName.class),
+            new Asn1FieldInfo(CKSUM, 3, CheckSum.class),
+            new Asn1FieldInfo(CUSEC, 4, Asn1Integer.class),
+            new Asn1FieldInfo(CTIME, 5, KerberosTime.class),
+            new Asn1FieldInfo(SUBKEY, 6, EncryptionKey.class),
+            new Asn1FieldInfo(SEQ_NUMBER, 7, Asn1Integer.class),
+            new Asn1FieldInfo(AUTHORIZATION_DATA, 8, AuthorizationData.class)
+    };
+
+    public Authenticator() {
+        super(TAG, fieldInfos);
+    }
+
+    public int getAuthenticatorVno() {
+        return getFieldAsInt(AUTHENTICATOR_VNO);
+    }
+
+    public void setAuthenticatorVno(int authenticatorVno) {
+        setFieldAsInt(AUTHENTICATOR_VNO, authenticatorVno);
+    }
+
+    public String getCrealm() {
+        return getFieldAsString(CREALM);
+    }
+
+    public void setCrealm(String crealm) {
+        setFieldAsString(CREALM, crealm);
+    }
+
+    public PrincipalName getCname() {
+        return getFieldAs(CNAME, PrincipalName.class);
+    }
+
+    public void setCname(PrincipalName cname) {
+        setFieldAs(CNAME, cname);
+    }
+
+    public CheckSum getCksum() {
+        return getFieldAs(CKSUM, CheckSum.class);
+    }
+
+    public void setCksum(CheckSum cksum) {
+        setFieldAs(CKSUM, cksum);
+    }
+
+    public int getCusec() {
+        return getFieldAsInt(CUSEC);
+    }
+
+    public void setCusec(int cusec) {
+        setFieldAsInt(CUSEC, cusec);
+    }
+
+    public KerberosTime getCtime() {
+        return getFieldAsTime(CTIME);
+    }
+
+    public void setCtime(KerberosTime ctime) {
+        setFieldAs(CTIME, ctime);
+    }
+
+    public EncryptionKey getSubKey() {
+        return getFieldAs(SUBKEY, EncryptionKey.class);
+    }
+
+    public void setSubKey(EncryptionKey subKey) {
+        setFieldAs(SUBKEY, subKey);
+    }
+
+    public int getSeqNumber() {
+        return getFieldAsInt(SEQ_NUMBER);
+    }
+
+    public void setSeqNumber(Integer seqNumber) {
+        setFieldAsInt(SEQ_NUMBER, seqNumber);
+    }
+
+    public AuthorizationData getAuthorizationData() {
+        return getFieldAs(AUTHORIZATION_DATA, AuthorizationData.class);
+    }
+
+    public void setAuthorizationData(AuthorizationData authorizationData) {
+        setFieldAs(AUTHORIZATION_DATA, authorizationData);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/ap/EncAPRepPart.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/ap/EncAPRepPart.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/ap/EncAPRepPart.java
new file mode 100644
index 0000000..871ffc1
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/ap/EncAPRepPart.java
@@ -0,0 +1,66 @@
+package org.apache.kerberos.kerb.spec.ap;
+
+import org.apache.haox.asn1.type.Asn1FieldInfo;
+import org.apache.haox.asn1.type.Asn1Integer;
+import org.apache.kerberos.kerb.spec.KerberosTime;
+import org.apache.kerberos.kerb.spec.KrbAppSequenceType;
+import org.apache.kerberos.kerb.spec.common.EncryptionKey;
+
+/**
+ EncAPRepPart    ::= [APPLICATION 27] SEQUENCE {
+ ctime           [0] KerberosTime,
+ cusec           [1] Microseconds,
+ subkey          [2] EncryptionKey OPTIONAL,
+ seq-number      [3] UInt32 OPTIONAL
+ }
+ */
+public class EncAPRepPart extends KrbAppSequenceType {
+    public static int TAG = 27;
+    private static int CTIME = 0;
+    private static int CUSEC = 1;
+    private static int SUBKEY = 2;
+    private static int SEQ_NUMBER = 3;
+
+    static Asn1FieldInfo[] fieldInfos = new Asn1FieldInfo[] {
+            new Asn1FieldInfo(CTIME, 0, KerberosTime.class),
+            new Asn1FieldInfo(CUSEC, 1, Asn1Integer.class),
+            new Asn1FieldInfo(SUBKEY, 2, EncryptionKey.class),
+            new Asn1FieldInfo(SEQ_NUMBER, 3, Asn1Integer.class)
+    };
+
+    public EncAPRepPart() {
+        super(TAG, fieldInfos);
+    }
+
+    public KerberosTime getCtime() {
+        return getFieldAsTime(CTIME);
+    }
+
+    public void setCtime(KerberosTime ctime) {
+        setFieldAs(CTIME, ctime);
+    }
+
+    public int getCusec() {
+        return getFieldAsInt(CUSEC);
+    }
+
+    public void setCusec(int cusec) {
+        setFieldAsInt(CUSEC, cusec);
+    }
+
+    public EncryptionKey getSubkey() {
+        return getFieldAs(SUBKEY, EncryptionKey.class);
+    }
+
+    public void setSubkey(EncryptionKey subkey) {
+        setFieldAs(SUBKEY, subkey);
+    }
+
+    public int getSeqNumber() {
+        return getFieldAsInt(SEQ_NUMBER);
+    }
+
+    public void setSeqNumber(Integer seqNumber) {
+        setFieldAsInt(SEQ_NUMBER, seqNumber);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/AdToken.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/AdToken.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/AdToken.java
new file mode 100644
index 0000000..11e8580
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/AdToken.java
@@ -0,0 +1,30 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.haox.asn1.type.Asn1FieldInfo;
+import org.apache.kerberos.kerb.spec.KrbSequenceType;
+
+/**
+ AD-TOKEN ::= SEQUENCE {
+    token     [0]  OCTET STRING,
+ }
+*/
+public class AdToken extends KrbSequenceType {
+    private static int TOKEN = 0;
+
+    static Asn1FieldInfo[] fieldInfos = new Asn1FieldInfo[] {
+            new Asn1FieldInfo(TOKEN, KrbToken.class)
+    };
+
+    public AdToken() {
+        super(fieldInfos);
+    }
+
+    public KrbToken getToken() {
+        return getFieldAs(TOKEN, KrbToken.class);
+    }
+
+    public void setToken(KrbToken token) {
+        setFieldAs(TOKEN, token);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/AuthorizationData.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/AuthorizationData.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/AuthorizationData.java
new file mode 100644
index 0000000..88758b8
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/AuthorizationData.java
@@ -0,0 +1,13 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.kerberos.kerb.spec.KrbSequenceOfType;
+
+/**
+ AuthorizationData       ::= SEQUENCE OF SEQUENCE {
+ ad-type         [0] Int32,
+ ad-data         [1] OCTET STRING
+ }
+ */
+public class AuthorizationData extends KrbSequenceOfType<AuthorizationDataEntry> {
+
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/AuthorizationDataEntry.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/AuthorizationDataEntry.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/AuthorizationDataEntry.java
new file mode 100644
index 0000000..216eebe
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/AuthorizationDataEntry.java
@@ -0,0 +1,43 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.haox.asn1.type.Asn1FieldInfo;
+import org.apache.haox.asn1.type.Asn1Integer;
+import org.apache.haox.asn1.type.Asn1OctetString;
+import org.apache.kerberos.kerb.spec.KrbSequenceType;
+
+/**
+ AuthorizationData       ::= SEQUENCE OF SEQUENCE {
+ ad-type         [0] Int32,
+ ad-data         [1] OCTET STRING
+ }
+ */
+public class AuthorizationDataEntry extends KrbSequenceType {
+    private static int AD_TYPE = 0;
+    private static int AD_DATA = 1;
+
+    static Asn1FieldInfo[] fieldInfos = new Asn1FieldInfo[] {
+            new Asn1FieldInfo(AD_TYPE, 0, Asn1Integer.class),
+            new Asn1FieldInfo(AD_DATA, 1, Asn1OctetString.class)
+    };
+
+    public AuthorizationDataEntry() {
+        super(fieldInfos);
+    }
+
+    public AuthorizationType getAuthzType() {
+        Integer value = getFieldAsInteger(AD_TYPE);
+        return AuthorizationType.fromValue(value);
+    }
+
+    public void setAuthzType(AuthorizationType authzType) {
+        setFieldAsInt(AD_TYPE, authzType.getValue());
+    }
+
+    public byte[] getAuthzData() {
+        return getFieldAsOctets(AD_DATA);
+    }
+
+    public void setAuthzData(byte[] authzData) {
+        setFieldAsOctets(AD_DATA, authzData);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/AuthorizationType.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/AuthorizationType.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/AuthorizationType.java
new file mode 100644
index 0000000..53f5588
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/AuthorizationType.java
@@ -0,0 +1,124 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.kerberos.kerb.spec.KrbEnum;
+
+public enum AuthorizationType implements KrbEnum {
+    /**
+     * Constant for the "null" authorization type.
+     */
+    NULL(0),
+
+    /**
+     * Constant for the "if relevant" authorization type.
+     *
+     * RFC 4120
+     */
+    AD_IF_RELEVANT(1),
+
+    /**
+     * Constant for the "intended for server" authorization type.
+     *
+     * RFC 4120
+     */
+    AD_INTENDED_FOR_SERVER(2),
+
+    /**
+     * Constant for the  "intended for application class" authorization type.
+     *
+     * RFC 4120
+     */
+    AD_INTENDED_FOR_APPLICATION_CLASS(3),
+
+    /**
+     * Constant for the "kdc issued" authorization type.
+     *
+     * RFC 4120
+     */
+    AD_KDC_ISSUED(4),
+
+    /**
+     * Constant for the "or" authorization type.
+     *
+     * RFC 4120
+     */
+    AD_OR(5),
+
+    /**
+     * Constant for the "mandatory ticket extensions" authorization type.
+     *
+     * RFC 4120
+     */
+    AD_MANDATORY_TICKET_EXTENSIONS(6),
+
+    /**
+     * Constant for the "in ticket extensions" authorization type.
+     *
+     * RFC 4120
+     */
+    AD_IN_TICKET_EXTENSIONS(7),
+
+    /**
+     * Constant for the "mandatory-for-kdc" authorization type.
+     *
+     * RFC 4120
+     */
+    AD_MANDATORY_FOR_KDC(8),
+
+    /**
+     * Constant for the "OSF DCE" authorization type.
+     *
+     * RFC 1510
+     */
+    OSF_DCE(64),
+
+    /**
+     * Constant for the "sesame" authorization type.
+     *
+     * RFC 1510
+     */
+    SESAME(65),
+
+    /**
+     * Constant for the "OSF-DCE pki certid" authorization type.
+     *
+     * RFC 1510
+     */
+    AD_OSF_DCE_PKI_CERTID(66),
+
+    /**
+     * Constant for the "sesame" authorization type.
+     *
+     * RFC 1510
+     */
+    AD_WIN2K_PAC(128),
+
+    /**
+     * Constant for the "sesame" authorization type.
+     *
+     * RFC 1510
+     */
+    AD_ETYPE_NEGOTIATION(129);
+
+    private final int value;
+
+    private AuthorizationType(int value) {
+        this.value = value;
+    }
+
+    @Override
+    public int getValue() {
+        return value;
+    }
+
+    public static AuthorizationType fromValue(Integer value) {
+        if (value != null) {
+            for (KrbEnum e : values()) {
+                if (e.getValue() == value.intValue()) {
+                    return (AuthorizationType) e;
+                }
+            }
+        }
+
+        return NULL;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/CheckSum.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/CheckSum.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/CheckSum.java
new file mode 100644
index 0000000..e50dbca
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/CheckSum.java
@@ -0,0 +1,76 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.haox.asn1.type.Asn1FieldInfo;
+import org.apache.haox.asn1.type.Asn1Integer;
+import org.apache.haox.asn1.type.Asn1OctetString;
+import org.apache.kerberos.kerb.spec.KrbSequenceType;
+
+import java.util.Arrays;
+
+/**
+ Checksum        ::= SEQUENCE {
+ cksumtype       [0] Int32,
+ checksum        [1] OCTET STRING
+ }
+ */
+public class CheckSum extends KrbSequenceType {
+    private static int CKSUM_TYPE = 0;
+    private static int CHECK_SUM = 1;
+
+    static Asn1FieldInfo[] fieldInfos = new Asn1FieldInfo[] {
+        new Asn1FieldInfo(CKSUM_TYPE, 0, Asn1Integer.class),
+        new Asn1FieldInfo(CHECK_SUM, 1, Asn1OctetString.class)
+    };
+
+    public CheckSum() {
+        super(fieldInfos);
+    }
+
+    public CheckSum(CheckSumType cksumType, byte[] checksum) {
+        this();
+
+        setCksumtype(cksumType);
+        setChecksum(checksum);
+    }
+
+    public CheckSum(int cksumType, byte[] checksum) {
+        this(CheckSumType.fromValue(cksumType), checksum);
+    }
+
+    public CheckSumType getCksumtype() {
+        Integer value = getFieldAsInteger(CKSUM_TYPE);
+        return CheckSumType.fromValue(value);
+    }
+
+    public void setCksumtype(CheckSumType cksumtype) {
+        setFieldAsInt(CKSUM_TYPE, cksumtype.getValue());
+    }
+
+    public byte[] getChecksum() {
+        return getFieldAsOctets(CHECK_SUM);
+    }
+
+    public void setChecksum(byte[] checksum) {
+        setFieldAsOctets(CHECK_SUM, checksum);
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (this == other) return true;
+        if (other == null || getClass() != other.getClass()) return false;
+
+        CheckSum that = (CheckSum) other;
+
+        if (getCksumtype() != that.getCksumtype()) return false;
+
+        return Arrays.equals(getChecksum(), that.getChecksum());
+    }
+
+    public boolean isEqual(CheckSum other) {
+        return this.equals(other);
+    }
+
+    public boolean isEqual(byte[] cksumBytes) {
+        return Arrays.equals(getChecksum(), cksumBytes);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/CheckSumType.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/CheckSumType.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/CheckSumType.java
new file mode 100644
index 0000000..0dc7a4f
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/CheckSumType.java
@@ -0,0 +1,96 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.kerberos.kerb.spec.KrbEnum;
+
+public enum CheckSumType implements KrbEnum {
+    NONE(0, "none", "None checksum type"),
+
+    CRC32(0x0001, "crc32", "CRC-32"),
+
+    RSA_MD4(0x0002, "md4", "RSA-MD4"),
+
+    RSA_MD4_DES(0x0003, "md4-des", "RSA-MD4 with DES cbc mode"),
+
+    DES_CBC(0x0004, "des-cbc", "DES cbc mode"),
+    DES_MAC(0x0004, "des-mac", "DES cbc mode"),
+
+    //des-mac-k
+
+    //rsa-md4-des-k
+
+    RSA_MD5(0x0007, "md5", "RSA-MD5"),
+
+    RSA_MD5_DES(0x0008, "md5-des", "RSA-MD5 with DES cbc mode"),
+
+    NIST_SHA(0x0009, "sha", "NIST-SHA"),
+
+    HMAC_SHA1_DES3(0x000c, "hmac-sha1-des3", "HMAC-SHA1 DES3 key"),
+    HMAC_SHA1_DES3_KD(0x000c, "hmac-sha1-des3-kd", "HMAC-SHA1 DES3 key"),
+
+    ////RFC 3962. Used with ENCTYPE_AES128_CTS_HMAC_SHA1_96
+    HMAC_SHA1_96_AES128(0x000f, "hmac-sha1-96-aes128", "HMAC-SHA1 AES128 key"),
+
+    //RFC 3962. Used with ENCTYPE_AES256_CTS_HMAC_SHA1_96
+    HMAC_SHA1_96_AES256(0x0010, "hmac-sha1-96-aes256", "HMAC-SHA1 AES256 key"),
+
+    //RFC 6803
+    CMAC_CAMELLIA128(0x0011, "cmac-camellia128", "CMAC Camellia128 key"),
+
+    //RFC 6803
+    CMAC_CAMELLIA256(0x0012, "cmac-camellia256", "CMAC Camellia256 key"),
+
+    //Microsoft netlogon cksumtype
+    MD5_HMAC_ARCFOUR(-137, "md5-hmac-rc4", "Microsoft MD5 HMAC"),
+
+    //Microsoft md5 hmac cksumtype
+    HMAC_MD5_ARCFOUR(-138, "hmac-md5-arcfour", "Microsoft HMAC MD5"),
+    HMAC_MD5_ENC(-138, "hmac-md5-enc", "Microsoft HMAC MD5"),
+    HMAC_MD5_RC4(-138, "hmac-md5-rc4", "Microsoft HMAC MD5");
+
+    private final int value;
+
+    private final String name;
+
+    private final String displayName;
+
+    private CheckSumType(int value, String name, String displayName) {
+        this.value = value;
+        this.name = name;
+        this.displayName = displayName;
+    }
+
+    @Override
+    public int getValue() {
+        return value;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getDisplayName() {
+        return displayName;
+    }
+
+    public static CheckSumType fromValue(Integer value) {
+        if (value != null) {
+            for (KrbEnum e : values()) {
+                if (e.getValue() == value) {
+                    return (CheckSumType) e;
+                }
+            }
+        }
+        return NONE;
+    }
+
+    public static CheckSumType fromName(String name) {
+        if (name != null) {
+            for (CheckSumType cs : values()) {
+                if (cs.getName() == name) {
+                    return (CheckSumType) cs;
+                }
+            }
+        }
+        return NONE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EncryptedData.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EncryptedData.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EncryptedData.java
new file mode 100644
index 0000000..27361fc
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EncryptedData.java
@@ -0,0 +1,77 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.haox.asn1.type.Asn1FieldInfo;
+import org.apache.haox.asn1.type.Asn1Integer;
+import org.apache.haox.asn1.type.Asn1OctetString;
+import org.apache.kerberos.kerb.spec.KrbSequenceType;
+
+import java.util.Arrays;
+
+/**
+ EncryptedData   ::= SEQUENCE {
+ etype   [0] Int32 -- EncryptionType --,
+ kvno    [1] UInt32 OPTIONAL,
+ cipher  [2] OCTET STRING -- ciphertext
+ }
+ */
+public class EncryptedData extends KrbSequenceType {
+    private static int ETYPE = 0;
+    private static int KVNO = 1;
+    private static int CIPHER = 2;
+
+    static Asn1FieldInfo[] fieldInfos = new Asn1FieldInfo[] {
+            new Asn1FieldInfo(ETYPE, 0, Asn1Integer.class),
+            new Asn1FieldInfo(KVNO, 1, Asn1Integer.class),
+            new Asn1FieldInfo(CIPHER, 2, Asn1OctetString.class)
+    };
+
+    public EncryptedData() {
+        super(fieldInfos);
+    }
+
+    public EncryptionType getEType() {
+        Integer value = getFieldAsInteger(ETYPE);
+        return EncryptionType.fromValue(value);
+    }
+
+    public void setEType(EncryptionType eType) {
+        setFieldAsInt(ETYPE, eType.getValue());
+    }
+
+    public int getKvno() {
+        Integer value = getFieldAsInteger(KVNO);
+        if (value != null) {
+            return value.intValue();
+        }
+        return -1;
+    }
+
+    public void setKvno(int kvno) {
+        setFieldAsInt(KVNO, kvno);
+    }
+
+    public byte[] getCipher() {
+        return getFieldAsOctets(CIPHER);
+    }
+
+    public void setCipher(byte[] cipher) {
+        setFieldAsOctets(CIPHER, cipher);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        EncryptedData that = (EncryptedData) o;
+
+        /*
+        if (getKvno() != -1 && that.getKvno() != -1 &&
+                getKvno() != that.getKvno()) return false;
+        */
+
+        if (getEType() != that.getEType()) return false;
+
+        return Arrays.equals(getCipher(), that.getCipher());
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EncryptionKey.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EncryptionKey.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EncryptionKey.java
new file mode 100644
index 0000000..4e1e440
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EncryptionKey.java
@@ -0,0 +1,88 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.haox.asn1.type.Asn1FieldInfo;
+import org.apache.haox.asn1.type.Asn1Integer;
+import org.apache.haox.asn1.type.Asn1OctetString;
+import org.apache.kerberos.kerb.spec.KrbSequenceType;
+
+import java.util.Arrays;
+
+/**
+ EncryptionKey   ::= SEQUENCE {
+ keytype         [0] Int32 -- actually encryption type --,
+ keyvalue        [1] OCTET STRING
+ }
+ */
+public class EncryptionKey extends KrbSequenceType {
+    private static int KEY_TYPE = 0;
+    private static int KEY_VALUE = 1;
+
+    private int kvno = -1;
+
+    static Asn1FieldInfo[] fieldInfos = new Asn1FieldInfo[] {
+            new Asn1FieldInfo(KEY_TYPE, 0, Asn1Integer.class),
+            new Asn1FieldInfo(KEY_VALUE, 1, Asn1OctetString.class)
+    };
+
+    public EncryptionKey() {
+        super(fieldInfos);
+    }
+
+    public EncryptionKey(int keyType, byte[] keyData) {
+        this(keyType, keyData, -1);
+    }
+
+    public EncryptionKey(int keyType, byte[] keyData, int kvno) {
+        this(EncryptionType.fromValue(keyType), keyData, kvno);
+    }
+
+    public EncryptionKey(EncryptionType keyType, byte[] keyData) {
+        this(keyType, keyData, -1);
+    }
+
+    public EncryptionKey(EncryptionType keyType, byte[] keyData, int kvno) {
+        this();
+        setKeyType(keyType);
+        setKeyData(keyData);
+        setKvno(kvno);
+    }
+
+    public EncryptionType getKeyType() {
+        Integer value = getFieldAsInteger(KEY_TYPE);
+        return EncryptionType.fromValue(value);
+    }
+
+    public void setKeyType(EncryptionType keyType) {
+        setFieldAsInt(KEY_TYPE, keyType.getValue());
+    }
+
+    public byte[] getKeyData() {
+        return getFieldAsOctets(KEY_VALUE);
+    }
+
+    public void setKeyData(byte[] keyData) {
+        setFieldAsOctets(KEY_VALUE, keyData);
+    }
+
+    public void setKvno(int kvno) {
+        this.kvno = kvno;
+    }
+
+    public int getKvno() {
+        return kvno;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        EncryptionKey that = (EncryptionKey) o;
+
+        if (kvno != -1 && that.kvno != -1 && kvno != that.kvno) return false;
+
+        if (getKeyType() != that.getKeyType()) return false;
+
+        return Arrays.equals(getKeyData(), that.getKeyData());
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EncryptionType.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EncryptionType.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EncryptionType.java
new file mode 100644
index 0000000..f50b05b
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EncryptionType.java
@@ -0,0 +1,113 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.kerberos.kerb.spec.KrbEnum;
+
+/**
+ * According to krb5.hin
+ */
+public enum EncryptionType implements KrbEnum {
+
+    NONE(0, "none", "None encryption type"),
+
+    DES_CBC_CRC(0x0001, "des-cbc-crc", "DES cbc mode with CRC-32"),
+
+    DES_CBC_MD4(0x0002, "des-cbc-md4", "DES cbc mode with RSA-MD4"),
+
+    DES_CBC_MD5(0x0003, "des-cbc-md5", "DES cbc mode with RSA-MD5"),
+    DES(0x0003, "des", "DES cbc mode with RSA-MD5"),
+
+    DES_CBC_RAW(0x0004, "des-cbc-raw", "DES cbc mode raw"),
+
+    DES3_CBC_SHA(0x0005, "des3-cbc-sha", "DES-3 cbc with SHA1"),
+
+    DES3_CBC_RAW(0x0006, "des3-cbc-raw", "Triple DES cbc mode raw"),
+
+    DES_HMAC_SHA1(0x0008, "des-hmac-sha1", "DES with HMAC/sha1"),
+
+    DSA_SHA1_CMS(0x0009, "dsa-sha1-cms", "DSA with SHA1, CMS signature"),
+
+    MD5_RSA_CMS(0x000a, "md5-rsa-cms", "MD5 with RSA, CMS signature"),
+
+    SHA1_RSA_CMS(0x000b, "sha1-rsa-cms", "SHA1 with RSA, CMS signature"),
+
+    RC2_CBC_ENV(0x000c, "rc2-cbc-env", "RC2 cbc mode, CMS enveloped data"),
+
+    RSA_ENV(0x000d, "rsa-env", "RSA encryption, CMS enveloped data"),
+
+    RSA_ES_OAEP_ENV(0x000e, "rsa-es-oaep-env", "RSA w/OEAP encryption, CMS enveloped data"),
+
+    DES3_CBC_ENV(0x000f, "des3-cbc-env", "DES-3 cbc mode, CMS enveloped data"),
+
+    DES3_CBC_SHA1(0x0010, "des3-cbc-sha1", "Triple DES cbc mode with HMAC/sha1"),
+    DES3_HMAC_SHA1(0x0010, "des3-hmac-sha1", "Triple DES cbc mode with HMAC/sha1"),
+    DES3_CBC_SHA1_KD(0x0010, "des3-cbc-sha1-kd", "Triple DES cbc mode with HMAC/sha1"),
+
+    AES128_CTS_HMAC_SHA1_96 (0x0011, "aes128-cts-hmac-sha1-96", "AES-128 CTS mode with 96-bit SHA-1 HMAC"),
+    AES128_CTS (0x0011, "aes128-cts", "AES-128 CTS mode with 96-bit SHA-1 HMAC"),
+
+    AES256_CTS_HMAC_SHA1_96(0x0012, "aes256-cts-hmac-sha1-96", "AES-256 CTS mode with 96-bit SHA-1 HMAC"),
+    AES256_CTS(0x0012, "aes256-cts", "AES-256 CTS mode with 96-bit SHA-1 HMAC"),
+
+    ARCFOUR_HMAC(0x0017, "arcfour-hmac", "ArcFour with HMAC/md5"),
+    RC4_HMAC(0x0017, "rc4-hmac", "ArcFour with HMAC/md5"),
+    ARCFOUR_HMAC_MD5(0x0017, "arcfour-hmac-md5", "ArcFour with HMAC/md5"),
+
+    ARCFOUR_HMAC_EXP(0x0018, "arcfour-hmac-exp", "Exportable ArcFour with HMAC/md5"),
+    RC4_HMAC_EXP(0x0018, "rc4-hmac-exp", "Exportable ArcFour with HMAC/md5"),
+    ARCFOUR_HMAC_MD5_EXP(0x0018, "arcfour-hmac-md5-exp", "Exportable ArcFour with HMAC/md5"),
+
+    CAMELLIA128_CTS_CMAC(0x0019, "camellia128-cts-cmac", "Camellia-128 CTS mode with CMAC"),
+    CAMELLIA128_CTS(0x0019, "camellia128-cts", "Camellia-128 CTS mode with CMAC"),
+
+    CAMELLIA256_CTS_CMAC(0x001a, "camellia256-cts-cmac", "Camellia-256 CTS mode with CMAC"),
+    CAMELLIA256_CTS(0x001a, "camellia256-cts", "Camellia-256 CTS mode with CMAC");
+
+    //UNKNOWN(0x01ff, "UNKNOWN", "Unknown encryption type");
+
+    private final int value;
+
+    private final String name;
+
+    private final String displayName;
+
+    private EncryptionType(int value, String name, String displayName) {
+        this.value = value;
+        this.name = name;
+        this.displayName = displayName;
+    }
+
+    @Override
+    public int getValue() {
+        return value;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getDisplayName() {
+        return displayName;
+    }
+
+    public static EncryptionType fromValue(Integer value) {
+        if (value != null) {
+            for (KrbEnum e : values()) {
+                if (e.getValue() == value) {
+                    return (EncryptionType) e;
+                }
+            }
+        }
+        return NONE;
+    }
+
+    public static EncryptionType fromName(String name) {
+        if (name != null) {
+            for (EncryptionType e : values()) {
+                if (e.getName() == name) {
+                    return (EncryptionType) e;
+                }
+            }
+        }
+        return NONE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EtypeInfo.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EtypeInfo.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EtypeInfo.java
new file mode 100644
index 0000000..c7b1eaf
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EtypeInfo.java
@@ -0,0 +1,10 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.kerberos.kerb.spec.KrbSequenceOfType;
+
+/**
+ ETYPE-INFO              ::= SEQUENCE OF ETYPE-INFO-ENTRY
+ */
+public class EtypeInfo extends KrbSequenceOfType<EtypeInfoEntry> {
+
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EtypeInfo2.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EtypeInfo2.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EtypeInfo2.java
new file mode 100644
index 0000000..59d9a3b
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EtypeInfo2.java
@@ -0,0 +1,10 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.kerberos.kerb.spec.KrbSequenceOfType;
+
+/**
+ ETYPE-INFO2             ::= SEQUENCE SIZE (1..MAX) OF ETYPE-INFO2-ENTRY
+ */
+public class EtypeInfo2 extends KrbSequenceOfType<EtypeInfo2Entry> {
+
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EtypeInfo2Entry.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EtypeInfo2Entry.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EtypeInfo2Entry.java
new file mode 100644
index 0000000..883abf8
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EtypeInfo2Entry.java
@@ -0,0 +1,54 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.haox.asn1.type.Asn1FieldInfo;
+import org.apache.haox.asn1.type.Asn1Integer;
+import org.apache.haox.asn1.type.Asn1OctetString;
+import org.apache.kerberos.kerb.spec.KerberosString;
+import org.apache.kerberos.kerb.spec.KrbSequenceType;
+
+/**
+ ETYPE-INFO2-ENTRY       ::= SEQUENCE {
+ etype           [0] Int32,
+ salt            [1] KerberosString OPTIONAL,
+ s2kparams       [2] OCTET STRING OPTIONAL
+ }
+ */
+public class EtypeInfo2Entry extends KrbSequenceType {
+    private static int ETYPE = 0;
+    private static int SALT = 1;
+    private static int S2KPARAMS = 2;
+
+    static Asn1FieldInfo[] fieldInfos = new Asn1FieldInfo[] {
+            new Asn1FieldInfo(ETYPE, 0, Asn1Integer.class),
+            new Asn1FieldInfo(SALT, 1, KerberosString.class),
+            new Asn1FieldInfo(S2KPARAMS, 2, Asn1OctetString.class)
+    };
+
+    public EtypeInfo2Entry() {
+        super(fieldInfos);
+    }
+
+    public EncryptionType getEtype() {
+        return EncryptionType.fromValue(getFieldAsInt(ETYPE));
+    }
+
+    public void setEtype(EncryptionType etype) {
+        setField(ETYPE, etype);
+    }
+
+    public String getSalt() {
+        return getFieldAsString(SALT);
+    }
+
+    public void setSalt(String salt) {
+        setFieldAsString(SALT, salt);
+    }
+
+    public byte[] getS2kParams() {
+        return getFieldAsOctets(S2KPARAMS);
+    }
+
+    public void setS2kParams(byte[] s2kParams) {
+        setFieldAsOctets(S2KPARAMS, s2kParams);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EtypeInfoEntry.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EtypeInfoEntry.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EtypeInfoEntry.java
new file mode 100644
index 0000000..836db12
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/EtypeInfoEntry.java
@@ -0,0 +1,42 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.haox.asn1.type.Asn1FieldInfo;
+import org.apache.haox.asn1.type.Asn1Integer;
+import org.apache.haox.asn1.type.Asn1OctetString;
+import org.apache.kerberos.kerb.spec.KrbSequenceType;
+
+/**
+ ETYPE-INFO-ENTRY        ::= SEQUENCE {
+ etype           [0] Int32,
+ salt            [1] OCTET STRING OPTIONAL
+ }
+ */
+public class EtypeInfoEntry extends KrbSequenceType {
+    private static int ETYPE = 0;
+    private static int SALT = 1;
+
+    static Asn1FieldInfo[] fieldInfos = new Asn1FieldInfo[] {
+            new Asn1FieldInfo(ETYPE, 0, Asn1Integer.class),
+            new Asn1FieldInfo(SALT, 1, Asn1OctetString.class)
+    };
+
+    public EtypeInfoEntry() {
+        super(fieldInfos);
+    }
+
+    public EncryptionType getEtype() {
+        return EncryptionType.fromValue(getFieldAsInt(ETYPE));
+    }
+
+    public void setEtype(EncryptionType etype) {
+        setField(ETYPE, etype);
+    }
+
+    public byte[] getSalt() {
+        return getFieldAsOctets(SALT);
+    }
+
+    public void setSalt(byte[] salt) {
+        setFieldAsOctets(SALT, salt);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/HostAddrType.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/HostAddrType.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/HostAddrType.java
new file mode 100644
index 0000000..cb49a94
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/HostAddrType.java
@@ -0,0 +1,81 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.kerberos.kerb.spec.KrbEnum;
+
+public enum HostAddrType implements KrbEnum {
+    /**
+     * Constant for the "null" host address type.
+     */
+    NULL(0),
+
+    /**
+     * Constant for the "Internet" host address type.
+     */
+    ADDRTYPE_INET(2),
+
+    /**
+     * Constant for the "Arpanet" host address type.
+     */
+    ADDRTYPE_IMPLINK(3),
+
+    /**
+     * Constant for the "CHAOS" host address type.
+     */
+    ADDRTYPE_CHAOS(5),
+
+    /**
+     * Constant for the "XEROX Network Services" host address type.
+     */
+    ADDRTYPE_XNS(6),
+
+    /**
+     * Constant for the "OSI" host address type.
+     */
+    ADDRTYPE_OSI(7),
+
+    /**
+     * Constant for the "DECnet" host address type.
+     */
+    ADDRTYPE_DECNET(12),
+
+    /**
+     * Constant for the "AppleTalk" host address type.
+     */
+    ADDRTYPE_APPLETALK(16),
+
+    /**
+     * Constant for the "NetBios" host address type.
+     *
+     * Not in RFC
+     */
+    ADDRTYPE_NETBIOS(20),
+
+    /**
+     * Constant for the "Internet Protocol V6" host address type.
+     */
+    ADDRTYPE_INET6(24);
+
+
+    private final int value;
+
+    private HostAddrType(int value) {
+        this.value = value;
+    }
+
+    @Override
+    public int getValue() {
+        return value;
+    }
+
+    public static HostAddrType fromValue(Integer value) {
+        if (value != null) {
+            for (KrbEnum e : values()) {
+                if (e.getValue() == value.intValue()) {
+                    return (HostAddrType) e;
+                }
+            }
+        }
+
+        return NULL;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/HostAddress.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/HostAddress.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/HostAddress.java
new file mode 100644
index 0000000..5c44e04
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/HostAddress.java
@@ -0,0 +1,90 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.haox.asn1.type.Asn1FieldInfo;
+import org.apache.haox.asn1.type.Asn1Integer;
+import org.apache.haox.asn1.type.Asn1OctetString;
+import org.apache.kerberos.kerb.spec.KrbSequenceType;
+
+import java.net.InetAddress;
+import java.util.Arrays;
+
+/*
+HostAddress     ::= SEQUENCE  {
+        addr-type       [0] Int32,
+        address         [1] OCTET STRING
+}
+ */
+public class HostAddress extends KrbSequenceType {
+    private static int ADDR_TYPE = 0;
+    private static int ADDRESS = 1;
+
+    static Asn1FieldInfo[] fieldInfos = new Asn1FieldInfo[] {
+            new Asn1FieldInfo(ADDR_TYPE, 0, Asn1Integer.class),
+            new Asn1FieldInfo(ADDRESS, 1, Asn1OctetString.class)
+    };
+
+    public HostAddress() {
+        super(fieldInfos);
+    }
+
+    public HostAddress(InetAddress inetAddress) {
+        this();
+
+        setAddrType(HostAddrType.ADDRTYPE_INET);
+        setAddress(inetAddress.getAddress());
+    }
+
+    public HostAddrType getAddrType() {
+        Integer value = getFieldAsInteger(ADDR_TYPE);
+        return HostAddrType.fromValue(value);
+    }
+
+    public void setAddrType(HostAddrType addrType) {
+        setField(ADDR_TYPE, addrType);
+    }
+
+    public byte[] getAddress() {
+        return getFieldAsOctets(ADDRESS);
+    }
+
+    public void setAddress(byte[] address) {
+        setFieldAsOctets(ADDRESS, address);
+    }
+
+    public boolean equalsWith(InetAddress address) {
+        if (address == null) {
+            return false;
+        }
+        HostAddress that = new HostAddress(address);
+        return that.equals(this);
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (other == null) {
+            return false;
+        }
+        if (other == this) {
+            return true;
+        } else if (! (other instanceof HostAddress)) {
+            return false;
+        }
+
+        HostAddress that = (HostAddress) other;
+        if (getAddrType() == that.getAddrType() &&
+                Arrays.equals(getAddress(), that.getAddress())) {
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = getAddrType().getValue();
+        if (getAddress() != null) {
+            result = 31 * result + getAddress().hashCode();
+        }
+
+        return result;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/HostAddresses.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/HostAddresses.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/HostAddresses.java
new file mode 100644
index 0000000..fef9283
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/HostAddresses.java
@@ -0,0 +1,24 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.kerberos.kerb.spec.KrbSequenceOfType;
+
+import java.net.InetAddress;
+
+/**
+ -- NOTE: HostAddresses is always used as an OPTIONAL field and
+ -- should not be empty.
+ HostAddresses   -- NOTE: subtly different from rfc1510,
+ -- but has a value mapping and encodes the same
+ ::= SEQUENCE OF HostAddress
+ */
+public class HostAddresses extends KrbSequenceOfType<HostAddress> {
+
+    public boolean contains(InetAddress address) {
+        for (HostAddress hostAddress : getElements()) {
+            if (hostAddress.equalsWith(address)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KeyUsage.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KeyUsage.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KeyUsage.java
new file mode 100644
index 0000000..ce6b930
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KeyUsage.java
@@ -0,0 +1,109 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.kerberos.kerb.spec.KrbEnum;
+
+/**
+ * From krb5.hin
+ */
+public enum KeyUsage implements KrbEnum
+{
+    UNKNOWN(-1),
+    NONE(0),
+    //AS-REQ PA-ENC-TIMESTAMP padata timestamp, encrypted with the client key
+    AS_REQ_PA_ENC_TS(1),
+    //AS-REP Ticket and TGS-REP Ticket (includes TGS session key or application session key),
+    //encrypted with the service key (Section 5.3)
+    KDC_REP_TICKET(2),
+    //AS-REP encrypted part (includes TGS session key or application session key),
+    //encrypted with the client key (Section 5.4.2)
+    AS_REP_ENCPART(3),
+    //TGS-REQ KDC-REQ-BODY AuthorizationData,
+    //encrypted with the TGS session key (Section 5.4.1)
+    TGS_REQ_AD_SESSKEY(4),
+    //TGS-REQ KDC-REQ-BODY AuthorizationData,
+    //encrypted with the TGS authenticator subkey (Section 5.4.1)
+    TGS_REQ_AD_SUBKEY(5),
+    //TGS-REQ PA-TGS-REQ padata AP-REQ Authenticator cksum,
+    //keyed with the TGS session key (Section 5.5.1)
+    TGS_REQ_AUTH_CKSUM(6),
+    //TGS-REQ PA-TGS-REQ padata AP-REQ Authenticator (includes TGS authenticator subkey),
+    //encrypted with the TGS session key (Section 5.5.1)
+    TGS_REQ_AUTH(7),
+    //TGS-REP encrypted part (includes application session key),
+    //encrypted with the TGS session key (Section 5.4.2)
+    TGS_REP_ENCPART_SESSKEY(8),
+    //TGS-REP encrypted part (includes application session key),
+    //encrypted with the TGS authenticator subkey (Section 5.4.2)
+    TGS_REP_ENCPART_SUBKEY(9),
+    //AP-REQ Authenticator cksum, keyed with the application session key (Section 5.5.1)
+    AP_REQ_AUTH_CKSUM(10),
+    //AP-REQ Authenticator (includes application authenticator subkey),
+    //encrypted with the application session key (Section 5.5.1)
+    AP_REQ_AUTH(11),
+    //AP-REP encrypted part (includes application session subkey),
+    //encrypted with the application session key (Section 5.5.2)
+    AP_REP_ENCPART(12),
+    //KRB-PRIV encrypted part, encrypted with a key chosen by the application (Section 5.7.1)
+    KRB_PRIV_ENCPART(13),
+    KRB_CRED_ENCPART(14),
+    KRB_SAFE_CKSUM(15),
+    APP_DATA_ENCRYPT(16),
+    APP_DATA_CKSUM(17),
+    KRB_ERROR_CKSUM(18),
+    AD_KDCISSUED_CKSUM(19),
+    AD_MTE(20),
+    AD_ITE(21),
+    GSS_TOK_MIC(22),
+    GSS_TOK_WRAP_INTEG(23),
+    GSS_TOK_WRAP_PRIV(24),
+    //Defined in Integrating SAM Mechanisms with Kerberos draft
+    PA_SAM_CHALLENGE_CKSUM(25),
+    //Note conflict with @ref PA_S4U_X509_USER_REQUEST
+    PA_SAM_CHALLENGE_TRACKID(26),
+    //Note conflict with @ref PA_S4U_X509_USER_REPLY
+    PA_SAM_RESPONSE(27),
+    //Defined in [MS-SFU]
+    //Note conflict with @ref PA_SAM_CHALLENGE_TRACKID
+    PA_S4U_X509_USER_REQUEST(26),
+    //Note conflict with @ref PA_SAM_RESPONSE
+    PA_S4U_X509_USER_REPLY(27),
+    //unused
+    PA_REFERRAL(26),
+    AD_SIGNEDPATH(-21),
+    IAKERB_FINISHED(42),
+    PA_PKINIT_KX(44),
+    PA_OTP_REQUEST(45),  //See RFC 6560 section 4.2
+    //define in preauth-framework
+    FAST_REQ_CHKSUM(50),
+    FAST_ENC(51),
+    FAST_REP(52),
+    FAST_FINISHED(53),
+    ENC_CHALLENGE_CLIENT(54),
+    ENC_CHALLENGE_KDC(55),
+    AS_REQ(56);
+
+    private int value;
+
+    private KeyUsage(int value) {
+        this.value = value;
+    }
+
+    public int getValue() {
+        return value;
+    }
+
+    public static KeyUsage fromValue(Integer value) {
+        if (value != null) {
+            for (KrbEnum e : values()) {
+                if (e.getValue() == value) {
+                    return (KeyUsage) e;
+                }
+            }
+        }
+        return UNKNOWN;
+    }
+
+    public static final boolean isValid(int usage) {
+        return usage > -1;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KrbError.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KrbError.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KrbError.java
new file mode 100644
index 0000000..0f49eb8
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KrbError.java
@@ -0,0 +1,147 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.haox.asn1.type.Asn1FieldInfo;
+import org.apache.haox.asn1.type.Asn1Integer;
+import org.apache.haox.asn1.type.Asn1OctetString;
+import org.apache.kerberos.kerb.KrbErrorCode;
+import org.apache.kerberos.kerb.spec.KerberosString;
+import org.apache.kerberos.kerb.spec.KerberosTime;
+
+/**
+ KRB-ERROR       ::= [APPLICATION 30] SEQUENCE {
+ pvno            [0] INTEGER (5),
+ msg-type        [1] INTEGER (30),
+ ctime           [2] KerberosTime OPTIONAL,
+ cusec           [3] Microseconds OPTIONAL,
+ stime           [4] KerberosTime,
+ susec           [5] Microseconds,
+ error-code      [6] Int32,
+ crealm          [7] Realm OPTIONAL,
+ cname           [8] PrincipalName OPTIONAL,
+ realm           [9] Realm -- service realm --,
+ sname           [10] PrincipalName -- service name --,
+ e-text          [11] KerberosString OPTIONAL,
+ e-data          [12] OCTET STRING OPTIONAL
+ }
+ */
+public class KrbError extends KrbMessage {
+    private static int CTIME = 2;
+    private static int CUSEC = 3;
+    private static int STIME = 4;
+    private static int SUSEC = 5;
+    private static int ERROR_CODE = 6;
+    private static int CREALM = 7;
+    private static int CNAME = 8;
+    private static int REALM = 9;
+    private static int SNAME = 10;
+    private static int ETEXT = 11;
+    private static int EDATA = 12;
+
+    static Asn1FieldInfo[] fieldInfos = new Asn1FieldInfo[] {
+            new Asn1FieldInfo(PVNO, Asn1Integer.class),
+            new Asn1FieldInfo(MSG_TYPE, Asn1Integer.class),
+            new Asn1FieldInfo(CTIME, KerberosTime.class),
+            new Asn1FieldInfo(CUSEC, Asn1Integer.class),
+            new Asn1FieldInfo(STIME, KerberosTime.class),
+            new Asn1FieldInfo(SUSEC, Asn1Integer.class),
+            new Asn1FieldInfo(ERROR_CODE, Asn1Integer.class),
+            new Asn1FieldInfo(CREALM, KerberosString.class),
+            new Asn1FieldInfo(CNAME, PrincipalName.class),
+            new Asn1FieldInfo(REALM, KerberosString.class),
+            new Asn1FieldInfo(SNAME, PrincipalName.class),
+            new Asn1FieldInfo(ETEXT, KerberosString.class),
+            new Asn1FieldInfo(EDATA, Asn1OctetString.class)
+    };
+
+    public KrbError() {
+        super(KrbMessageType.KRB_ERROR, fieldInfos);
+    }
+
+    public KerberosTime getCtime() {
+        return getFieldAs(CTIME, KerberosTime.class);
+    }
+
+    public void setCtime(KerberosTime ctime) {
+        setFieldAs(CTIME, ctime);
+    }
+
+    public int getCusec() {
+        return getFieldAsInt(CUSEC);
+    }
+
+    public void setCusec(int cusec) {
+        setFieldAsInt(0, cusec);
+    }
+
+    public KerberosTime getStime() {
+        return getFieldAs(STIME, KerberosTime.class);
+    }
+
+    public void setStime(KerberosTime stime) {
+        setFieldAs(STIME, stime);
+    }
+
+    public int getSusec() {
+        return getFieldAsInt(SUSEC);
+    }
+
+    public void setSusec(int susec) {
+        setFieldAsInt(0, susec);
+    }
+
+    public KrbErrorCode getErrorCode() {
+        return KrbErrorCode.fromValue(getFieldAsInt(ERROR_CODE));
+    }
+
+    public void setErrorCode(KrbErrorCode errorCode) {
+        setField(0, errorCode);
+    }
+
+    public String getCrealm() {
+        return getFieldAsString(CREALM);
+    }
+
+    public void setCrealm(String realm) {
+        setFieldAs(CREALM, new KerberosString(realm));
+    }
+
+    public PrincipalName getCname() {
+        return getFieldAs(CNAME, PrincipalName.class);
+    }
+
+    public void setCname(PrincipalName sname) {
+        setFieldAs(CNAME, sname);
+    }
+
+    public PrincipalName getSname() {
+        return getFieldAs(SNAME, PrincipalName.class);
+    }
+
+    public void setSname(PrincipalName sname) {
+        setFieldAs(SNAME, sname);
+    }
+
+    public String getRealm() {
+        return getFieldAsString(REALM);
+    }
+
+    public void setRealm(String realm) {
+        setFieldAs(REALM, new KerberosString(realm));
+    }
+
+    public String getEtext() {
+        return getFieldAsString(ETEXT);
+    }
+
+    public void setEtext(String realm) {
+        setFieldAs(ETEXT, new KerberosString(realm));
+    }
+
+    public byte[] getEdata() {
+        return getFieldAsOctetBytes(EDATA);
+    }
+
+    public void setEdata(byte[] edata) {
+        setFieldAsOctetBytes(EDATA, edata);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KrbFlags.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KrbFlags.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KrbFlags.java
new file mode 100644
index 0000000..713ddff
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KrbFlags.java
@@ -0,0 +1,99 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.haox.asn1.type.Asn1BitString;
+import org.apache.kerberos.kerb.spec.KrbEnum;
+
+import java.io.IOException;
+
+/**
+ KrbFlags   ::= BIT STRING (SIZE (32..MAX))
+ -- minimum number of bits shall be sent,
+ -- but no fewer than 32
+ */
+public class KrbFlags extends Asn1BitString {
+    private static final int MAX_SIZE = 32;
+    private int flags;
+
+    public KrbFlags() {
+        this(0);
+    }
+
+    public KrbFlags(int value) {
+        super();
+        setFlags(value);
+    }
+
+    public void setFlags(int flags) {
+        this.flags = flags;
+        flags2Value();
+    }
+
+    public int getFlags() {
+        return flags;
+    }
+
+    public boolean isFlagSet(int flag) {
+        return (flags & (1 << flagPos(flag))) != 0;
+    }
+
+    public void setFlag(int flag)  {
+        int newFlags = flags | 1 << flagPos(flag);
+        setFlags(newFlags);
+    }
+
+    public void clearFlag(int flag) {
+        int newFlags = flags & ~(1 << flagPos(flag));
+        setFlags(newFlags);
+    }
+
+    public void clear() {
+        setFlags(0);
+    }
+
+    public boolean isFlagSet(KrbEnum flag) {
+        return isFlagSet(flag.getValue());
+    }
+
+    public void setFlag(KrbEnum flag)  {
+        setFlag(flag.getValue());
+    }
+
+    public void setFlag(KrbEnum flag, boolean isSet)  {
+        if (isSet) {
+            setFlag(flag.getValue());
+        } else {
+            clearFlag(flag);
+        }
+    }
+
+    public void clearFlag(KrbEnum flag) {
+        clearFlag(flag.getValue());
+    }
+
+    private int flagPos(int flag)  {
+        return MAX_SIZE - 1 - flag;
+    }
+
+    private void flags2Value() {
+        byte[] bytes = new byte[4];
+        bytes[0] = (byte) (flags >> 24);
+        bytes[1] = (byte) ((flags >> 16) & 0xFF);
+        bytes[2] = (byte) ((flags >> 8) & 0xFF);
+        bytes[3] = (byte) (flags & 0xFF);
+
+        setValue(bytes);
+    }
+
+    @Override
+    protected void toValue() throws IOException {
+        super.toValue();
+
+        if (getPadding() != 0 || getValue().length != 4) {
+            throw new IOException("Bad bitstring decoded as invalid krb flags");
+        }
+
+        byte[] valueBytes = getValue();
+        flags = ((valueBytes[0] & 0xFF) << 24) | ((valueBytes[1] & 0xFF) << 16) |
+                ((valueBytes[2] & 0xFF) << 8) | (0xFF & valueBytes[3]);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KrbMessage.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KrbMessage.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KrbMessage.java
new file mode 100644
index 0000000..a6fbe05
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KrbMessage.java
@@ -0,0 +1,35 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.haox.asn1.type.Asn1FieldInfo;
+import org.apache.kerberos.kerb.KrbConstant;
+import org.apache.kerberos.kerb.spec.KrbAppSequenceType;
+
+public abstract class KrbMessage extends KrbAppSequenceType {
+    protected static int PVNO = 0;
+    protected static int MSG_TYPE = 1;
+
+    private final int pvno = KrbConstant.KRB_V5;
+
+    public KrbMessage(KrbMessageType msgType, Asn1FieldInfo[] fieldInfos) {
+        super(msgType.getValue(), fieldInfos);
+        setPvno(pvno);
+        setMsgType(msgType);
+    }
+
+    public int getPvno() {
+        return pvno;
+    }
+
+    protected void setPvno(int pvno) {
+        setFieldAsInt(0, pvno);
+    }
+
+    public KrbMessageType getMsgType() {
+        Integer value = getFieldAsInteger(MSG_TYPE);
+        return KrbMessageType.fromValue(value);
+    }
+
+    public void setMsgType(KrbMessageType msgType) {
+        setFieldAsInt(MSG_TYPE, msgType.getValue());
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KrbMessageType.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KrbMessageType.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KrbMessageType.java
new file mode 100644
index 0000000..996aaf0
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KrbMessageType.java
@@ -0,0 +1,40 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.kerberos.kerb.spec.KrbEnum;
+
+public enum KrbMessageType implements KrbEnum {
+    NONE(-1),
+    AS_REQ(10),
+    AS_REP(11),
+    TGS_REQ(12),
+    TGS_REP(13),
+    AP_REQ(14),
+    AP_REP(15),
+    KRB_SAFE(20),
+    KRB_PRIV(21),
+    KRB_CRED(22),
+    KRB_ERROR(30);
+
+    private int value;
+
+    private KrbMessageType(int value) {
+        this.value = value;
+    }
+
+    @Override
+    public int getValue() {
+        return value;
+    }
+
+    public static KrbMessageType fromValue(Integer value) {
+        if (value != null) {
+            for (KrbEnum e : values()) {
+                if (e.getValue() == value.intValue()) {
+                    return (KrbMessageType) e;
+                }
+            }
+        }
+
+        return NONE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KrbToken.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KrbToken.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KrbToken.java
new file mode 100644
index 0000000..439bf3d
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KrbToken.java
@@ -0,0 +1,80 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.haox.asn1.type.Asn1FieldInfo;
+import org.apache.haox.asn1.type.Asn1Integer;
+import org.apache.haox.asn1.type.Asn1OctetString;
+import org.apache.kerberos.kerb.spec.KrbSequenceType;
+
+import java.nio.ByteBuffer;
+import java.util.Map;
+
+/**
+ KRB-TOKEN_VALUE ::= SEQUENCE {
+    token-format [0] INTEGER,
+    token-value  [1] OCTET STRING,
+ }
+ */
+public class KrbToken extends KrbSequenceType {
+    private static KrbTokenEncoder tokenEncoder;
+
+    private static int TOKEN_FORMAT = 0;
+    private static int TOKEN_VALUE = 1;
+
+    private Map<String, Object> attributes;
+
+    static Asn1FieldInfo[] fieldInfos = new Asn1FieldInfo[] {
+            new Asn1FieldInfo(TOKEN_FORMAT, 0, Asn1Integer.class),
+            new Asn1FieldInfo(TOKEN_VALUE, 1, Asn1OctetString.class)
+    };
+
+    public KrbToken() {
+        super(fieldInfos);
+    }
+
+    @Override
+    public void encode(ByteBuffer buffer) {
+        setTokenValue(tokenEncoder.encode(this));
+        super.encode(buffer);
+    }
+
+    /*
+    @Override
+    public void decode(ByteBuffer content) throws IOException {
+        super.decode(content);
+        this.attributes = tokenEncoder.decode(this);
+    }
+    */
+
+    public static void setTokenEncoder(KrbTokenEncoder encoder) {
+        tokenEncoder = encoder;
+    }
+
+    public TokenFormat getTokenFormat() {
+        Integer value = getFieldAsInteger(TOKEN_FORMAT);
+        return TokenFormat.fromValue(value);
+    }
+
+    public void setTokenFormat(TokenFormat tokenFormat) {
+        setFieldAsInt(TOKEN_FORMAT, tokenFormat.getValue());
+    }
+
+    public byte[] getTokenValue() {
+        return getFieldAsOctets(TOKEN_VALUE);
+    }
+
+    public void setTokenValue(byte[] tokenValue) {
+        setFieldAsOctets(TOKEN_VALUE, tokenValue);
+    }
+
+    public Map<String, Object> getAttributes() {
+        if (attributes == null) {
+            this.attributes = tokenEncoder.decode(this);
+        }
+        return attributes;
+    }
+
+    public String getPrincipal() {
+        return (String) attributes.get("sub");
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KrbTokenEncoder.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KrbTokenEncoder.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KrbTokenEncoder.java
new file mode 100644
index 0000000..b8804a0
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/KrbTokenEncoder.java
@@ -0,0 +1,9 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import java.util.Map;
+
+public interface KrbTokenEncoder {
+
+    public byte[] encode(KrbToken token);
+    public Map<String, Object> decode(KrbToken token);
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/LastReq.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/LastReq.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/LastReq.java
new file mode 100644
index 0000000..2175536
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/LastReq.java
@@ -0,0 +1,13 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.kerberos.kerb.spec.KrbSequenceOfType;
+
+/**
+ LastReq         ::=     SEQUENCE OF SEQUENCE {
+ lr-type         [0] Int32,
+ lr-value        [1] KerberosTime
+ }
+ */
+public class LastReq extends KrbSequenceOfType<LastReqEntry> {
+
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/LastReqEntry.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/LastReqEntry.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/LastReqEntry.java
new file mode 100644
index 0000000..9bc4b44
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/LastReqEntry.java
@@ -0,0 +1,43 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.haox.asn1.type.Asn1FieldInfo;
+import org.apache.haox.asn1.type.Asn1Integer;
+import org.apache.kerberos.kerb.spec.KerberosTime;
+import org.apache.kerberos.kerb.spec.KrbSequenceType;
+
+/**
+ LastReq         ::=     SEQUENCE OF SEQUENCE {
+ lr-type         [0] Int32,
+ lr-value        [1] KerberosTime
+ }
+ */
+public class LastReqEntry extends KrbSequenceType {
+    private static int LR_TYPE = 0;
+    private static int LR_VALUE = 1;
+
+    static Asn1FieldInfo[] fieldInfos = new Asn1FieldInfo[] {
+            new Asn1FieldInfo(LR_TYPE, 0, Asn1Integer.class),
+            new Asn1FieldInfo(LR_VALUE, 1, KerberosTime.class)
+    };
+
+    public LastReqEntry() {
+        super(fieldInfos);
+    }
+
+    public LastReqType getLrType() {
+        Integer value = getFieldAsInteger(LR_TYPE);
+        return LastReqType.fromValue(value);
+    }
+
+    public void setLrType(LastReqType lrType) {
+        setFieldAsInt(LR_TYPE, lrType.getValue());
+    }
+
+    public KerberosTime getLrValue() {
+        return getFieldAs(LR_VALUE, KerberosTime.class);
+    }
+
+    public void setLrValue(KerberosTime lrValue) {
+        setFieldAs(LR_VALUE, lrValue);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/LastReqType.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/LastReqType.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/LastReqType.java
new file mode 100644
index 0000000..19d25b7
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/LastReqType.java
@@ -0,0 +1,43 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.kerberos.kerb.spec.KrbEnum;
+
+public enum LastReqType implements KrbEnum {
+    NONE(0),
+    ALL_LAST_TGT(1),
+    THE_LAST_TGT(-1),
+    ALL_LAST_INITIAL(2),
+    THE_LAST_INITIAL(-2),
+    ALL_LAST_TGT_ISSUED(3),
+    THE_LAST_TGT_ISSUED(-3),
+    ALL_LAST_RENEWAL(4),
+    THE_LAST_RENEWAL(-4),
+    ALL_LAST_REQ(5),
+    THE_LAST_REQ(-5),
+    ALL_PW_EXPTIME(6),
+    THE_PW_EXPTIME(-6),
+    ALL_ACCT_EXPTIME(7),
+    THE_ACCT_EXPTIME(-7);
+
+    private int value;
+
+    private LastReqType(int value) {
+        this.value = value;
+    }
+
+    @Override
+    public int getValue() {
+        return value;
+    }
+
+    public static LastReqType fromValue(Integer value) {
+        if (value != null) {
+            for (KrbEnum e : values()) {
+                if (e.getValue() == value) {
+                    return (LastReqType) e;
+                }
+            }
+        }
+        return NONE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/MethodData.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/MethodData.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/MethodData.java
new file mode 100644
index 0000000..bece84c
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/MethodData.java
@@ -0,0 +1,11 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.kerberos.kerb.spec.KrbSequenceOfType;
+import org.apache.kerberos.kerb.spec.pa.PaDataEntry;
+
+/**
+ METHOD-DATA     ::= SEQUENCE OF PA-DATA
+ */
+public class MethodData extends KrbSequenceOfType<PaDataEntry> {
+
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/NameType.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/NameType.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/NameType.java
new file mode 100644
index 0000000..18cbdaf
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/NameType.java
@@ -0,0 +1,35 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.kerberos.kerb.spec.KrbEnum;
+
+public enum NameType implements KrbEnum {
+    NT_UNKNOWN(0),
+    NT_PRINCIPAL(1),
+    NT_SRV_INST(2),
+    NT_SRV_HST(3),
+    NT_SRV_XHST(4),
+    NT_UID(5);
+    
+    private int value;
+
+    private NameType(int value) {
+        this.value = value;
+    }
+
+    @Override
+    public int getValue() {
+        return value;
+    }
+
+    public static NameType fromValue(Integer value) {
+        if (value != null) {
+            for (KrbEnum e : values()) {
+                if (e.getValue() == value.intValue()) {
+                    return (NameType) e;
+                }
+            }
+        }
+
+        return NT_UNKNOWN;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/PrincipalName.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/PrincipalName.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/PrincipalName.java
new file mode 100644
index 0000000..79e296e
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/PrincipalName.java
@@ -0,0 +1,180 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.haox.asn1.type.Asn1FieldInfo;
+import org.apache.haox.asn1.type.Asn1Integer;
+import org.apache.kerberos.kerb.spec.KerberosStrings;
+import org.apache.kerberos.kerb.spec.KrbSequenceType;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ PrincipalName   ::= SEQUENCE {
+ name-type       [0] Int32,
+ name-string     [1] SEQUENCE OF KerberosString
+ }
+ */
+public class PrincipalName extends KrbSequenceType {
+    private String realm;
+
+    private static int NAME_TYPE = 0;
+    private static int NAME_STRING = 1;
+
+    static Asn1FieldInfo[] fieldInfos = new Asn1FieldInfo[] {
+            new Asn1FieldInfo(NAME_TYPE, Asn1Integer.class),
+            new Asn1FieldInfo(NAME_STRING, KerberosStrings.class)
+    };
+
+    public PrincipalName() {
+        super(fieldInfos);
+    }
+
+    public PrincipalName(String nameString) {
+        this();
+        setNameType(NameType.NT_PRINCIPAL);
+        fromNameString(nameString);
+    }
+
+    public PrincipalName(List<String> nameStrings, NameType type) {
+        this();
+        setNameStrings(nameStrings);
+        setNameType(type);
+    }
+
+    public NameType getNameType() {
+        Integer value = getFieldAsInteger(NAME_TYPE);
+        return NameType.fromValue(value);
+    }
+
+    public void setNameType(NameType nameType) {
+        setFieldAsInt(NAME_TYPE, nameType.getValue());
+    }
+
+    public List<String> getNameStrings() {
+        KerberosStrings krbStrings = getFieldAs(NAME_STRING, KerberosStrings.class);
+        if (krbStrings != null) {
+            return krbStrings.getAsStrings();
+        }
+        return Collections.EMPTY_LIST;
+    }
+
+    public void setNameStrings(List<String> nameStrings) {
+        setFieldAs(NAME_STRING, new KerberosStrings(nameStrings));
+    }
+
+    public void setRealm(String realm) {
+        this.realm = realm;
+    }
+
+    public String getRealm() {
+        return this.realm;
+    }
+
+    public String getName() {
+        return makeSingleName();
+    }
+
+    private String makeSingleName() {
+        List<String> names = getNameStrings();
+        StringBuilder sb = new StringBuilder();
+        boolean isFirst = true;
+        for (String name : names) {
+            sb.append(name);
+            if (isFirst && names.size() > 1) {
+                sb.append('/');
+            }
+            isFirst = false;
+        }
+
+        String realm = getRealm();
+        if (realm != null && !realm.isEmpty()) {
+            sb.append('@');
+            sb.append(realm);
+        }
+
+        return sb.toString();
+    }
+
+    @Override
+    public String toString() {
+        return getName();
+    }
+
+    @Override
+    public int hashCode() {
+        return getName().hashCode();
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (other == null) {
+            return false;
+        } else if (this == other) {
+            return true;
+        } else if (other instanceof String) {
+            String otherPrincipal = (String) other;
+            String thisPrincipal = getName();
+            return thisPrincipal.equals(otherPrincipal);
+        } else if (! (other instanceof PrincipalName)) {
+            return false;
+        }
+
+        PrincipalName otherPrincipal = (PrincipalName) other;
+        if (getNameType() != ((PrincipalName) other).getNameType()) {
+            return false;
+        }
+
+        return getName().equals(otherPrincipal.getName());
+    }
+
+    private void fromNameString(String nameString) {
+        String tmpRealm = null;
+        List<String> nameStrings;
+        int pos = nameString.indexOf('@');
+        String nameParts = nameString;
+        if (pos != -1) {
+            nameParts = nameString.substring(0, pos);
+            tmpRealm = nameString.substring(pos + 1);
+        }
+        String parts[] = nameParts.split("\\/");
+        nameStrings = Arrays.asList(parts);
+
+        setNameStrings(nameStrings);
+        setRealm(tmpRealm);
+    }
+
+    public static String extractRealm(String principal) {
+        int pos = principal.indexOf('@');
+
+        if (pos > 0) {
+            return principal.substring(pos + 1);
+        }
+
+        throw new IllegalArgumentException("Not a valid principal, missing realm name");
+    }
+
+
+    public static String extractName(String principal) {
+        int pos = principal.indexOf('@');
+
+        if (pos < 0) {
+            return principal;
+        }
+
+        return principal.substring(0, pos);
+    }
+
+    public static String makeSalt(PrincipalName principalName) {
+        StringBuilder salt = new StringBuilder();
+        if (principalName.getRealm() != null) {
+            salt.append(principalName.getRealm().toString());
+        }
+        List<String> nameStrings = principalName.getNameStrings();
+        for (String ns : nameStrings) {
+            salt.append(ns);
+        }
+        return salt.toString();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/Realm.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/Realm.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/Realm.java
new file mode 100644
index 0000000..3236dd5
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/Realm.java
@@ -0,0 +1,15 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.kerberos.kerb.spec.KerberosString;
+
+/**
+ * Realm           ::= KerberosString
+ */
+public class Realm extends KerberosString {
+    public Realm() {
+    }
+
+    public Realm(String value) {
+        super(value);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/SamType.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/SamType.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/SamType.java
new file mode 100644
index 0000000..6c3ccc4
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/SamType.java
@@ -0,0 +1,47 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.kerberos.kerb.spec.KrbEnum;
+
+public enum SamType implements KrbEnum
+{
+    SAM_NONE(0),
+    /** safe SAM type enum for Enigma Logic */
+    SAM_TYPE_ENIGMA(1), // Enigma Logic"
+
+    /** safe SAM type enum for Digital Pathways */
+    SAM_TYPE_DIGI_PATH(2), // Digital Pathways
+
+    /** safe SAM type enum for S/key where KDC has key 0 */
+    SAM_TYPE_SKEY_K0(3), // S/key where KDC has key 0
+
+    /** safe SAM type enum for Traditional S/Key */
+    SAM_TYPE_SKEY(4), // Traditional S/Key
+
+    /** safe SAM type enum for Security Dynamics */
+    SAM_TYPE_SECURID(5), // Security Dynamics
+
+    /** safe SAM type enum for CRYPTOCard */
+    SAM_TYPE_CRYPTOCARD(6); // CRYPTOCard
+
+    private int value;
+
+    private SamType(int value) {
+        this.value = value;
+    }
+
+    @Override
+    public int getValue() {
+        return value;
+    }
+
+    public static SamType fromValue(Integer value) {
+        if (value != null) {
+            for (SamType st : SamType.values() ) {
+                if (value == st.getValue()) {
+                    return st;
+                }
+            }
+        }
+        return SAM_NONE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/TokenFormat.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/TokenFormat.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/TokenFormat.java
new file mode 100644
index 0000000..f5a070b
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/TokenFormat.java
@@ -0,0 +1,31 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.kerberos.kerb.spec.KrbEnum;
+
+public enum TokenFormat implements KrbEnum {
+    NONE                (0),
+    JWT                 (1);
+
+    private final int value;
+
+    private TokenFormat(int value) {
+        this.value = value;
+    }
+
+    @Override
+    public int getValue() {
+        return value;
+    }
+
+    public static TokenFormat fromValue(Integer value) {
+        if (value != null) {
+            for (KrbEnum e : values()) {
+                if (e.getValue() == value.intValue()) {
+                    return (TokenFormat) e;
+                }
+            }
+        }
+
+        return NONE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/TransitedEncoding.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/TransitedEncoding.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/TransitedEncoding.java
new file mode 100644
index 0000000..80574b7
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/TransitedEncoding.java
@@ -0,0 +1,43 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.haox.asn1.type.Asn1FieldInfo;
+import org.apache.haox.asn1.type.Asn1Integer;
+import org.apache.haox.asn1.type.Asn1OctetString;
+import org.apache.kerberos.kerb.spec.KrbSequenceType;
+
+/**
+ TransitedEncoding       ::= SEQUENCE {
+ tr-type         [0] Int32 -- must be registered --,
+ contents        [1] OCTET STRING
+ }
+ */
+public class TransitedEncoding extends KrbSequenceType {
+    private static int TR_TYPE = 0;
+    private static int CONTENTS = 1;
+
+    static Asn1FieldInfo[] fieldInfos = new Asn1FieldInfo[] {
+            new Asn1FieldInfo(TR_TYPE, 0, Asn1Integer.class),
+            new Asn1FieldInfo(CONTENTS, 1, Asn1OctetString.class)
+    };
+
+    public TransitedEncoding() {
+        super(fieldInfos);
+    }
+
+    public TransitedEncodingType getTrType() {
+        Integer value = getFieldAsInteger(TR_TYPE);
+        return TransitedEncodingType.fromValue(value);
+    }
+
+    public void setTrType(TransitedEncodingType trType) {
+        setField(TR_TYPE, trType);
+    }
+
+    public byte[] getContents() {
+        return getFieldAsOctets(CONTENTS);
+    }
+
+    public void setContents(byte[] contents) {
+        setFieldAsOctets(CONTENTS, contents);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/TransitedEncodingType.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/TransitedEncodingType.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/TransitedEncodingType.java
new file mode 100644
index 0000000..c96df4e
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/common/TransitedEncodingType.java
@@ -0,0 +1,32 @@
+package org.apache.kerberos.kerb.spec.common;
+
+import org.apache.kerberos.kerb.spec.KrbEnum;
+
+public enum TransitedEncodingType implements KrbEnum {
+    UNKNOWN(-1),
+    NULL(0),
+    DOMAIN_X500_COMPRESS(1);
+
+    private final int value;
+
+    private TransitedEncodingType(int value) {
+        this.value = value;
+    }
+
+    @Override
+    public int getValue() {
+        return value;
+    }
+
+    public static TransitedEncodingType fromValue(Integer value) {
+        if (value != null) {
+            for (KrbEnum e : values()) {
+                if (e.getValue() == value.intValue()) {
+                    return (TransitedEncodingType) e;
+                }
+            }
+        }
+
+        return NULL;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/fast/ArmorType.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/fast/ArmorType.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/fast/ArmorType.java
new file mode 100644
index 0000000..35a1011
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/fast/ArmorType.java
@@ -0,0 +1,31 @@
+package org.apache.kerberos.kerb.spec.fast;
+
+import org.apache.kerberos.kerb.spec.KrbEnum;
+
+public enum ArmorType implements KrbEnum {
+    NONE                (0),
+    ARMOR_AP_REQUEST              (1);
+
+    private final int value;
+
+    private ArmorType(int value) {
+        this.value = value;
+    }
+
+    @Override
+    public int getValue() {
+        return value;
+    }
+
+    public static ArmorType fromValue(Integer value) {
+        if (value != null) {
+            for (KrbEnum e : values()) {
+                if (e.getValue() == value.intValue()) {
+                    return (ArmorType) e;
+                }
+            }
+        }
+
+        return NONE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/fast/FastOption.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/fast/FastOption.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/fast/FastOption.java
new file mode 100644
index 0000000..42cae2f
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/fast/FastOption.java
@@ -0,0 +1,32 @@
+package org.apache.kerberos.kerb.spec.fast;
+
+import org.apache.kerberos.kerb.spec.KrbEnum;
+
+public enum FastOption implements KrbEnum {
+    NONE(-1),
+    RESERVED(0),
+    HIDE_CLIENT_NAMES(1),
+
+    KDC_FOLLOW_REFERRALS(16);
+
+    private final int value;
+
+    private FastOption(int value) {
+        this.value = value;
+    }
+
+    @Override
+    public int getValue() {
+        return value;
+    }
+
+    public static FastOption fromValue(int value) {
+        for (KrbEnum e : values()) {
+            if (e.getValue() == value) {
+                return (FastOption) e;
+            }
+        }
+
+        return NONE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/fast/FastOptions.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/fast/FastOptions.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/fast/FastOptions.java
new file mode 100644
index 0000000..65e0d0d
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/fast/FastOptions.java
@@ -0,0 +1,14 @@
+package org.apache.kerberos.kerb.spec.fast;
+
+import org.apache.kerberos.kerb.spec.common.KrbFlags;
+
+public class FastOptions extends KrbFlags {
+
+    public FastOptions() {
+        this(0);
+    }
+
+    public FastOptions(int value) {
+        setFlags(value);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/fast/KrbFastArmor.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/fast/KrbFastArmor.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/fast/KrbFastArmor.java
new file mode 100644
index 0000000..0e1de88
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/fast/KrbFastArmor.java
@@ -0,0 +1,45 @@
+package org.apache.kerberos.kerb.spec.fast;
+
+import org.apache.haox.asn1.type.Asn1FieldInfo;
+import org.apache.haox.asn1.type.Asn1Integer;
+import org.apache.haox.asn1.type.Asn1OctetString;
+import org.apache.kerberos.kerb.spec.KrbSequenceType;
+
+/**
+ KrbFastArmor ::= SEQUENCE {
+     armor-type   [0] Int32,
+     -- Type of the armor.
+     armor-value  [1] OCTET STRING,
+     -- Value of the armor.
+ }
+ */
+public class KrbFastArmor extends KrbSequenceType {
+    private static int ARMOR_TYPE = 0;
+    private static int ARMOR_VALUE = 1;
+
+    static Asn1FieldInfo[] fieldInfos = new Asn1FieldInfo[] {
+            new Asn1FieldInfo(ARMOR_TYPE, Asn1Integer.class),
+            new Asn1FieldInfo(ARMOR_VALUE, Asn1OctetString.class)
+    };
+
+    public KrbFastArmor() {
+        super(fieldInfos);
+    }
+
+    public ArmorType getArmorType() {
+        Integer value = getFieldAsInteger(ARMOR_TYPE);
+        return ArmorType.fromValue(value);
+    }
+
+    public void setArmorType(ArmorType armorType) {
+        setFieldAsInt(ARMOR_TYPE, armorType.getValue());
+    }
+
+    public byte[] getArmorValue() {
+        return getFieldAsOctets(ARMOR_VALUE);
+    }
+
+    public void setArmorValue(byte[] armorValue) {
+        setFieldAsOctets(ARMOR_VALUE, armorValue);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/fast/KrbFastArmoredRep.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/fast/KrbFastArmoredRep.java b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/fast/KrbFastArmoredRep.java
new file mode 100644
index 0000000..73b22e8
--- /dev/null
+++ b/haox-kerb/kerb-core/src/main/java/org/apache/kerberos/kerb/spec/fast/KrbFastArmoredRep.java
@@ -0,0 +1,33 @@
+package org.apache.kerberos.kerb.spec.fast;
+
+import org.apache.haox.asn1.type.Asn1FieldInfo;
+import org.apache.kerberos.kerb.spec.KrbSequenceType;
+import org.apache.kerberos.kerb.spec.common.EncryptedData;
+
+/**
+ KrbFastArmoredRep ::= SEQUENCE {
+    enc-fast-rep      [0] EncryptedData, -- KrbFastResponse --
+    -- The encryption key is the armor key in the request, and
+    -- the key usage number is KEY_USAGE_FAST_REP.
+ }
+ */
+public class KrbFastArmoredRep extends KrbSequenceType {
+    private static int ENC_FAST_REP = 0;
+
+    //private
+    static Asn1FieldInfo[] fieldInfos = new Asn1FieldInfo[] {
+            new Asn1FieldInfo(ENC_FAST_REP, EncryptedData.class)
+    };
+
+    public KrbFastArmoredRep() {
+        super(fieldInfos);
+    }
+
+    public EncryptedData getEncFastRep() {
+        return getFieldAs(ENC_FAST_REP, EncryptedData.class);
+    }
+
+    public void setEncFastRep(EncryptedData encFastRep) {
+        setFieldAs(ENC_FAST_REP, encFastRep);
+    }
+}


Mime
View raw message