You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by dr...@apache.org on 2015/11/29 01:57:40 UTC

[13/13] directory-kerby git commit: Synced with latest master branch

Synced with latest master branch


Project: http://git-wip-us.apache.org/repos/asf/directory-kerby/repo
Commit: http://git-wip-us.apache.org/repos/asf/directory-kerby/commit/800e02fd
Tree: http://git-wip-us.apache.org/repos/asf/directory-kerby/tree/800e02fd
Diff: http://git-wip-us.apache.org/repos/asf/directory-kerby/diff/800e02fd

Branch: refs/heads/pkinit-support
Commit: 800e02fd5b22d3b6187b61c2a034d6191a56f371
Parents: 67c2bb6
Author: Kai Zheng <ka...@intel.com>
Authored: Sun Nov 29 08:56:41 2015 +0800
Committer: Kai Zheng <ka...@intel.com>
Committed: Sun Nov 29 08:56:41 2015 +0800

----------------------------------------------------------------------
 .../kerby/benchmark/KrbCodecBenchmark.java      |   2 +-
 .../org/apache/kerby/asn1/Asn1FieldInfo.java    |  97 ++++
 .../org/apache/kerby/asn1/Asn1InputBuffer.java  |   6 +-
 .../org/apache/kerby/asn1/Asn1OutputBuffer.java |   4 +-
 .../org/apache/kerby/asn1/ExplicitField.java    |  46 ++
 .../org/apache/kerby/asn1/ImplicitField.java    |  46 ++
 .../kerby/asn1/type/AbstractAsn1Type.java       | 440 +----------------
 .../org/apache/kerby/asn1/type/Asn1Choice.java  |   1 +
 .../kerby/asn1/type/Asn1CollectionType.java     |   1 +
 .../apache/kerby/asn1/type/Asn1FieldInfo.java   |  97 ----
 .../org/apache/kerby/asn1/type/Asn1Object.java  | 484 +++++++++++++++++++
 .../kerby/asn1/type/Asn1SequenceType.java       |   1 +
 .../org/apache/kerby/asn1/type/Asn1SetType.java |   1 +
 .../apache/kerby/asn1/type/ExplicitField.java   |  44 --
 .../apache/kerby/asn1/type/ImplicitField.java   |  44 --
 .../kerby/asn1/type/TaggingCollection.java      |   1 +
 .../apache/kerby/asn1/type/TaggingSequence.java |   2 +
 .../org/apache/kerby/asn1/type/TaggingSet.java  |   2 +
 .../org/apache/kerby/asn1/PersonnelRecord.java  |   3 -
 .../identitybackend/JsonIdentityBackend.java    |   6 +-
 .../typeAdapter/EncryptionKeyAdapter.java       |   2 +-
 .../typeAdapter/KerberosTimeAdapter.java        |   2 +-
 .../typeAdapter/PrincipalNameAdapter.java       |   2 +-
 .../identitybackend/LdapIdentityBackend.java    |   6 +-
 .../identitybackend/LdapIdentityGetHelper.java  |   6 +-
 .../org/apache/kerby/KrbIdentitySerializer.java |   6 +-
 .../apache/kerby/KrbIdentitySerializerTest.java |   6 +-
 .../kdc/identitybackend/IdentityZNode.java      |   8 +-
 .../apache/kerby/kerberos/kdc/KerbyKdcTest.java |  12 +-
 .../kerberos/kdc/WithAccessTokenKdcTest.java    |   8 +-
 .../kerby/kerberos/kdc/WithCertKdcTest.java     |  19 +-
 .../kerberos/kdc/WithIdentityTokenKdcTest.java  |  16 +-
 .../kerberos/kdc/WithTokenKdcTestBase.java      |  12 +-
 .../test/jaas/TokenAuthLoginModule.java         |  15 +-
 .../integration/test/TokenLoginTestBase.java    |   8 +-
 .../kerby/kerberos/kerb/admin/AdminHelper.java  |   8 +-
 .../kerby/kerberos/kerb/admin/Kadmin.java       |   4 +-
 .../kerby/kerberos/kerb/client/KrbClient.java   |  94 +---
 .../kerby/kerberos/kerb/client/KrbConfig.java   |   2 +-
 .../kerby/kerberos/kerb/client/KrbHandler.java  |  22 +-
 .../kerberos/kerb/client/KrbPkinitClient.java   |  78 +++
 .../kerberos/kerb/client/KrbTokenClient.java    |  89 ++++
 .../client/impl/AbstractInternalKrbClient.java  |  24 +-
 .../client/impl/DefaultInternalKrbClient.java   |  10 +-
 .../kerb/client/impl/InternalKrbClient.java     |  10 +-
 .../client/preauth/AbstractPreauthPlugin.java   |   8 +-
 .../client/preauth/KrbFastRequestState.java     |   8 +-
 .../kerb/client/preauth/KrbPreauth.java         |   8 +-
 .../kerb/client/preauth/PreauthContext.java     |   4 +-
 .../kerb/client/preauth/PreauthHandle.java      |   6 +-
 .../kerb/client/preauth/PreauthHandler.java     |   6 +-
 .../client/preauth/builtin/EncTsPreauth.java    |  12 +-
 .../kerb/client/preauth/builtin/TgtPreauth.java |   6 +-
 .../client/preauth/pkinit/PkinitPreauth.java    |  34 +-
 .../preauth/pkinit/PkinitRequestContext.java    |   2 +-
 .../preauth/pkinit/ServerConfiguration.java     |   2 +-
 .../client/preauth/pkinit/SignedDataEngine.java |   6 +-
 .../kerb/client/preauth/token/TokenContext.java |   2 +-
 .../kerb/client/preauth/token/TokenPreauth.java |  20 +-
 .../preauth/token/TokenRequestContext.java      |   2 +-
 .../kerb/client/request/ArmoredAsRequest.java   |   2 +-
 .../kerb/client/request/ArmoredRequest.java     |  40 +-
 .../kerb/client/request/ArmoredTgsRequest.java  |   2 +-
 .../kerberos/kerb/client/request/AsRequest.java |  22 +-
 .../kerb/client/request/AsRequestWithCert.java  |  26 +-
 .../client/request/AsRequestWithKeytab.java     |   4 +-
 .../client/request/AsRequestWithPasswd.java     |   4 +-
 .../kerb/client/request/AsRequestWithToken.java |   2 +-
 .../kerb/client/request/KdcRequest.java         |  28 +-
 .../kerb/client/request/TgsRequest.java         |  22 +-
 .../kerb/client/request/TgsRequestWithTgt.java  |  24 +-
 .../client/request/TgsRequestWithToken.java     |   6 +-
 .../kerberos/kerb/client/TestKrbConfigLoad.java |   2 +-
 .../kerby/kerberos/kerb/auth/AuthContext.java   |   8 +-
 .../kerberos/kerb/common/CheckSumUtil.java      |  14 +-
 .../kerberos/kerb/common/EncryptionUtil.java    |  16 +-
 .../kerby/kerberos/kerb/common/Krb5Conf.java    |   2 +-
 .../kerberos/kerb/common/KrbErrorUtil.java      |  18 +-
 .../kerby/kerberos/kerb/common/KrbUtil.java     |   4 +-
 .../kerb/preauth/PreauthPluginMeta.java         |   2 +-
 .../kerb/preauth/builtin/EncTsPreauthMeta.java  |   2 +-
 .../kerb/preauth/builtin/TgtPreauthMeta.java    |   2 +-
 .../kerb/preauth/pkinit/PkinitCrypto.java       |  12 +-
 .../kerb/preauth/pkinit/PkinitIdenity.java      |   2 +-
 .../kerb/preauth/pkinit/PkinitPreauthMeta.java  |   2 +-
 .../kerb/preauth/pkinit/PluginOpts.java         |   4 +-
 .../kerb/preauth/token/TokenPreauthMeta.java    |   2 +-
 .../kerby/kerberos/kerb/codec/CodecTest.java    |  20 +-
 .../kerberos/kerb/codec/TestAsRepCodec.java     |  10 +-
 .../kerberos/kerb/codec/TestAsReqCodec.java     |  22 +-
 .../kerberos/kerb/codec/TestTgsRepCodec.java    |  10 +-
 .../kerberos/kerb/codec/TestTgsReqCodec.java    |  18 +-
 .../apache/kerby/kerberos/kerb/KrbCodec.java    |  24 +-
 .../kerby/kerberos/kerb/KrbErrorException.java  |   2 +-
 .../kerberos/kerb/provider/TokenDecoder.java    |   2 +-
 .../kerberos/kerb/provider/TokenEncoder.java    |   2 +-
 .../kerberos/kerb/provider/TokenFactory.java    |   2 +-
 .../kerberos/kerb/spec/KerberosString.java      |  35 --
 .../kerberos/kerb/spec/KerberosStrings.java     |  43 --
 .../kerby/kerberos/kerb/spec/KerberosTime.java  | 160 ------
 .../kerberos/kerb/spec/KrbAppSequenceType.java  |  57 ---
 .../kerby/kerberos/kerb/spec/KrbIntegers.java   |  54 ---
 .../kerberos/kerb/spec/KrbSequenceOfType.java   |  43 --
 .../kerberos/kerb/spec/KrbSequenceType.java     |  55 ---
 .../kerby/kerberos/kerb/spec/ad/AdToken.java    |  51 --
 .../kerb/spec/ad/AuthorizationData.java         |  32 --
 .../kerb/spec/ad/AuthorizationDataEntry.java    |  63 ---
 .../kerb/spec/ad/AuthorizationType.java         | 143 ------
 .../kerby/kerberos/kerb/spec/ap/ApOption.java   |  58 ---
 .../kerby/kerberos/kerb/spec/ap/ApOptions.java  |  33 --
 .../kerby/kerberos/kerb/spec/ap/ApRep.java      |  66 ---
 .../kerby/kerberos/kerb/spec/ap/ApReq.java      |  90 ----
 .../kerberos/kerb/spec/ap/Authenticator.java    | 145 ------
 .../kerberos/kerb/spec/ap/EncAPRepPart.java     |  86 ----
 .../kerberos/kerb/spec/base/AuthToken.java      | 144 ------
 .../kerby/kerberos/kerb/spec/base/CheckSum.java | 114 -----
 .../kerberos/kerb/spec/base/CheckSumType.java   | 123 -----
 .../kerberos/kerb/spec/base/EncryptedData.java  | 115 -----
 .../kerberos/kerb/spec/base/EncryptionKey.java  | 128 -----
 .../kerberos/kerb/spec/base/EncryptionType.java | 140 ------
 .../kerberos/kerb/spec/base/EtypeInfo.java      |  29 --
 .../kerberos/kerb/spec/base/EtypeInfo2.java     |  29 --
 .../kerb/spec/base/EtypeInfo2Entry.java         |  74 ---
 .../kerberos/kerb/spec/base/EtypeInfoEntry.java |  62 ---
 .../kerberos/kerb/spec/base/HostAddrType.java   | 100 ----
 .../kerberos/kerb/spec/base/HostAddress.java    | 110 -----
 .../kerberos/kerb/spec/base/HostAddresses.java  |  43 --
 .../kerby/kerberos/kerb/spec/base/KeyUsage.java | 129 -----
 .../kerby/kerberos/kerb/spec/base/KrbError.java | 167 -------
 .../kerberos/kerb/spec/base/KrbMessage.java     |  54 ---
 .../kerberos/kerb/spec/base/KrbMessageType.java |  59 ---
 .../kerby/kerberos/kerb/spec/base/KrbToken.java | 335 -------------
 .../kerby/kerberos/kerb/spec/base/LastReq.java  |  32 --
 .../kerberos/kerb/spec/base/LastReqEntry.java   |  63 ---
 .../kerberos/kerb/spec/base/LastReqType.java    |  62 ---
 .../kerberos/kerb/spec/base/MethodData.java     |  30 --
 .../kerby/kerberos/kerb/spec/base/NameType.java |  55 ---
 .../kerberos/kerb/spec/base/PrincipalName.java  | 202 --------
 .../kerby/kerberos/kerb/spec/base/Realm.java    |  34 --
 .../kerby/kerberos/kerb/spec/base/SamType.java  |  65 ---
 .../kerberos/kerb/spec/base/TokenFormat.java    |  50 --
 .../kerb/spec/base/TransitedEncoding.java       |  63 ---
 .../kerb/spec/base/TransitedEncodingType.java   |  51 --
 .../kerberos/kerb/spec/fast/ArmorType.java      |  50 --
 .../kerberos/kerb/spec/fast/FastOption.java     |  51 --
 .../kerberos/kerb/spec/fast/FastOptions.java    |  33 --
 .../kerberos/kerb/spec/fast/KrbFastArmor.java   |  65 ---
 .../kerb/spec/fast/KrbFastArmoredRep.java       |  53 --
 .../kerb/spec/fast/KrbFastArmoredReq.java       |  96 ----
 .../kerb/spec/fast/KrbFastFinished.java         |  83 ----
 .../kerberos/kerb/spec/fast/KrbFastReq.java     |  79 ---
 .../kerb/spec/fast/KrbFastResponse.java         |  91 ----
 .../kerberos/kerb/spec/fast/PaAuthnEntry.java   |  81 ----
 .../kerberos/kerb/spec/fast/PaAuthnSet.java     |  29 --
 .../kerberos/kerb/spec/fast/PaFxFastReply.java  |  49 --
 .../kerb/spec/fast/PaFxFastRequest.java         |  49 --
 .../kerby/kerberos/kerb/spec/kdc/AsRep.java     |  32 --
 .../kerby/kerberos/kerb/spec/kdc/AsReq.java     |  31 --
 .../kerberos/kerb/spec/kdc/EncAsRepPart.java    |  31 --
 .../kerberos/kerb/spec/kdc/EncKdcRepPart.java   | 178 -------
 .../kerberos/kerb/spec/kdc/EncTgsRepPart.java   |  31 --
 .../kerby/kerberos/kerb/spec/kdc/KdcOption.java |  79 ---
 .../kerberos/kerb/spec/kdc/KdcOptions.java      |  33 --
 .../kerby/kerberos/kerb/spec/kdc/KdcRep.java    | 117 -----
 .../kerby/kerberos/kerb/spec/kdc/KdcReq.java    |  77 ---
 .../kerberos/kerb/spec/kdc/KdcReqBody.java      | 214 --------
 .../kerby/kerberos/kerb/spec/kdc/TgsRep.java    |  31 --
 .../kerby/kerberos/kerb/spec/kdc/TgsReq.java    |  32 --
 .../kerb/spec/pa/PaAuthenticationSet.java       |  29 --
 .../kerb/spec/pa/PaAuthenticationSetElem.java   |  75 ---
 .../kerby/kerberos/kerb/spec/pa/PaData.java     |  41 --
 .../kerberos/kerb/spec/pa/PaDataEntry.java      |  70 ---
 .../kerby/kerberos/kerb/spec/pa/PaDataType.java |  92 ----
 .../kerby/kerberos/kerb/spec/pa/PaEncTsEnc.java |  67 ---
 .../kerberos/kerb/spec/pa/otp/OtpTokenInfo.java |  70 ---
 .../kerb/spec/pa/otp/PaOtpChallenge.java        |  56 ---
 .../spec/pa/pkinit/AdInitialVerifiedCas.java    |  28 --
 .../spec/pa/pkinit/AlgorithmIdentifiers.java    |  30 --
 .../kerberos/kerb/spec/pa/pkinit/AuthPack.java  |  83 ----
 .../kerberos/kerb/spec/pa/pkinit/DHNonce.java   |  28 --
 .../kerb/spec/pa/pkinit/DHParameter.java        |  51 --
 .../kerberos/kerb/spec/pa/pkinit/DHRepInfo.java |  62 ---
 .../pa/pkinit/ExternalPrincipalIdentifier.java  |  72 ---
 .../kerb/spec/pa/pkinit/KdcDHKeyInfo.java       |  74 ---
 .../kerb/spec/pa/pkinit/Krb5PrincipalName.java  |  62 ---
 .../kerberos/kerb/spec/pa/pkinit/PaPkAsRep.java |  62 ---
 .../kerberos/kerb/spec/pa/pkinit/PaPkAsReq.java |  73 ---
 .../kerb/spec/pa/pkinit/PkAuthenticator.java    |  92 ----
 .../kerb/spec/pa/pkinit/ReplyKeyPack.java       |  62 ---
 .../kerb/spec/pa/pkinit/TdDhParameters.java     |  26 -
 .../kerb/spec/pa/pkinit/TrustedCertifiers.java  |  29 --
 .../kerb/spec/pa/token/PaTokenChallenge.java    |  41 --
 .../kerb/spec/pa/token/PaTokenRequest.java      |  62 ---
 .../kerberos/kerb/spec/pa/token/TokenFlag.java  |  51 --
 .../kerberos/kerb/spec/pa/token/TokenFlags.java |  39 --
 .../kerberos/kerb/spec/pa/token/TokenInfo.java  |  63 ---
 .../kerberos/kerb/spec/pa/token/TokenInfos.java |  29 --
 .../kerb/spec/ticket/EncTicketPart.java         | 169 -------
 .../kerberos/kerb/spec/ticket/KrbTicket.java    |  49 --
 .../kerb/spec/ticket/ServiceTicket.java         |  28 --
 .../kerberos/kerb/spec/ticket/TgtTicket.java    |  36 --
 .../kerby/kerberos/kerb/spec/ticket/Ticket.java | 100 ----
 .../kerberos/kerb/spec/ticket/TicketFlag.java   |  62 ---
 .../kerberos/kerb/spec/ticket/TicketFlags.java  |  39 --
 .../kerberos/kerb/spec/ticket/Tickets.java      |  29 --
 .../kerberos/kerb/type/KerberosString.java      |  35 ++
 .../kerberos/kerb/type/KerberosStrings.java     |  43 ++
 .../kerby/kerberos/kerb/type/KerberosTime.java  | 160 ++++++
 .../kerberos/kerb/type/KrbAppSequenceType.java  |  57 +++
 .../kerby/kerberos/kerb/type/KrbIntegers.java   |  54 +++
 .../kerberos/kerb/type/KrbSequenceOfType.java   |  43 ++
 .../kerberos/kerb/type/KrbSequenceType.java     |  55 +++
 .../kerby/kerberos/kerb/type/ad/AdToken.java    |  51 ++
 .../kerb/type/ad/AuthorizationData.java         |  32 ++
 .../kerb/type/ad/AuthorizationDataEntry.java    |  63 +++
 .../kerb/type/ad/AuthorizationType.java         | 143 ++++++
 .../kerby/kerberos/kerb/type/ap/ApOption.java   |  58 +++
 .../kerby/kerberos/kerb/type/ap/ApOptions.java  |  33 ++
 .../kerby/kerberos/kerb/type/ap/ApRep.java      |  66 +++
 .../kerby/kerberos/kerb/type/ap/ApReq.java      |  90 ++++
 .../kerberos/kerb/type/ap/Authenticator.java    | 145 ++++++
 .../kerberos/kerb/type/ap/EncAPRepPart.java     |  86 ++++
 .../kerberos/kerb/type/base/AuthToken.java      | 144 ++++++
 .../kerby/kerberos/kerb/type/base/CheckSum.java | 114 +++++
 .../kerberos/kerb/type/base/CheckSumType.java   | 123 +++++
 .../kerberos/kerb/type/base/EncryptedData.java  | 115 +++++
 .../kerberos/kerb/type/base/EncryptionKey.java  | 128 +++++
 .../kerberos/kerb/type/base/EncryptionType.java | 140 ++++++
 .../kerberos/kerb/type/base/EtypeInfo.java      |  29 ++
 .../kerberos/kerb/type/base/EtypeInfo2.java     |  29 ++
 .../kerb/type/base/EtypeInfo2Entry.java         |  74 +++
 .../kerberos/kerb/type/base/EtypeInfoEntry.java |  62 +++
 .../kerberos/kerb/type/base/HostAddrType.java   | 100 ++++
 .../kerberos/kerb/type/base/HostAddress.java    | 110 +++++
 .../kerberos/kerb/type/base/HostAddresses.java  |  43 ++
 .../kerby/kerberos/kerb/type/base/KeyUsage.java | 129 +++++
 .../kerby/kerberos/kerb/type/base/KrbError.java | 167 +++++++
 .../kerberos/kerb/type/base/KrbMessage.java     |  54 +++
 .../kerberos/kerb/type/base/KrbMessageType.java |  59 +++
 .../kerby/kerberos/kerb/type/base/KrbToken.java | 335 +++++++++++++
 .../kerby/kerberos/kerb/type/base/LastReq.java  |  32 ++
 .../kerberos/kerb/type/base/LastReqEntry.java   |  63 +++
 .../kerberos/kerb/type/base/LastReqType.java    |  62 +++
 .../kerberos/kerb/type/base/MethodData.java     |  30 ++
 .../kerby/kerberos/kerb/type/base/NameType.java |  55 +++
 .../kerberos/kerb/type/base/PrincipalName.java  | 202 ++++++++
 .../kerby/kerberos/kerb/type/base/Realm.java    |  34 ++
 .../kerby/kerberos/kerb/type/base/SamType.java  |  65 +++
 .../kerberos/kerb/type/base/TokenFormat.java    |  50 ++
 .../kerb/type/base/TransitedEncoding.java       |  63 +++
 .../kerb/type/base/TransitedEncodingType.java   |  51 ++
 .../kerberos/kerb/type/fast/ArmorType.java      |  50 ++
 .../kerberos/kerb/type/fast/FastOption.java     |  51 ++
 .../kerberos/kerb/type/fast/FastOptions.java    |  33 ++
 .../kerberos/kerb/type/fast/KrbFastArmor.java   |  65 +++
 .../kerb/type/fast/KrbFastArmoredRep.java       |  53 ++
 .../kerb/type/fast/KrbFastArmoredReq.java       |  96 ++++
 .../kerb/type/fast/KrbFastFinished.java         |  83 ++++
 .../kerberos/kerb/type/fast/KrbFastReq.java     |  79 +++
 .../kerb/type/fast/KrbFastResponse.java         |  91 ++++
 .../kerberos/kerb/type/fast/PaAuthnEntry.java   |  81 ++++
 .../kerberos/kerb/type/fast/PaAuthnSet.java     |  29 ++
 .../kerberos/kerb/type/fast/PaFxFastReply.java  |  49 ++
 .../kerb/type/fast/PaFxFastRequest.java         |  49 ++
 .../kerby/kerberos/kerb/type/kdc/AsRep.java     |  32 ++
 .../kerby/kerberos/kerb/type/kdc/AsReq.java     |  31 ++
 .../kerberos/kerb/type/kdc/EncAsRepPart.java    |  31 ++
 .../kerberos/kerb/type/kdc/EncKdcRepPart.java   | 178 +++++++
 .../kerberos/kerb/type/kdc/EncTgsRepPart.java   |  31 ++
 .../kerby/kerberos/kerb/type/kdc/KdcOption.java |  79 +++
 .../kerberos/kerb/type/kdc/KdcOptions.java      |  33 ++
 .../kerby/kerberos/kerb/type/kdc/KdcRep.java    | 117 +++++
 .../kerby/kerberos/kerb/type/kdc/KdcReq.java    |  77 +++
 .../kerberos/kerb/type/kdc/KdcReqBody.java      | 214 ++++++++
 .../kerby/kerberos/kerb/type/kdc/TgsRep.java    |  31 ++
 .../kerby/kerberos/kerb/type/kdc/TgsReq.java    |  32 ++
 .../kerb/type/pa/PaAuthenticationSet.java       |  29 ++
 .../kerb/type/pa/PaAuthenticationSetElem.java   |  75 +++
 .../kerby/kerberos/kerb/type/pa/PaData.java     |  41 ++
 .../kerberos/kerb/type/pa/PaDataEntry.java      |  70 +++
 .../kerby/kerberos/kerb/type/pa/PaDataType.java |  92 ++++
 .../kerby/kerberos/kerb/type/pa/PaEncTsEnc.java |  67 +++
 .../kerberos/kerb/type/pa/otp/OtpTokenInfo.java |  70 +++
 .../kerb/type/pa/otp/PaOtpChallenge.java        |  56 +++
 .../type/pa/pkinit/AdInitialVerifiedCas.java    |  28 ++
 .../type/pa/pkinit/AlgorithmIdentifiers.java    |  30 ++
 .../kerberos/kerb/type/pa/pkinit/AuthPack.java  |  83 ++++
 .../kerberos/kerb/type/pa/pkinit/DHNonce.java   |  28 ++
 .../kerb/type/pa/pkinit/DHParameter.java        |  51 ++
 .../kerberos/kerb/type/pa/pkinit/DHRepInfo.java |  62 +++
 .../pa/pkinit/ExternalPrincipalIdentifier.java  |  72 +++
 .../kerb/type/pa/pkinit/KdcDHKeyInfo.java       |  74 +++
 .../kerb/type/pa/pkinit/Krb5PrincipalName.java  |  62 +++
 .../kerberos/kerb/type/pa/pkinit/PaPkAsRep.java |  62 +++
 .../kerberos/kerb/type/pa/pkinit/PaPkAsReq.java |  73 +++
 .../kerb/type/pa/pkinit/PkAuthenticator.java    |  92 ++++
 .../kerb/type/pa/pkinit/ReplyKeyPack.java       |  62 +++
 .../kerb/type/pa/pkinit/TdDhParameters.java     |  26 +
 .../kerb/type/pa/pkinit/TrustedCertifiers.java  |  29 ++
 .../kerb/type/pa/token/PaTokenChallenge.java    |  41 ++
 .../kerb/type/pa/token/PaTokenRequest.java      |  62 +++
 .../kerberos/kerb/type/pa/token/TokenFlag.java  |  51 ++
 .../kerberos/kerb/type/pa/token/TokenFlags.java |  39 ++
 .../kerberos/kerb/type/pa/token/TokenInfo.java  |  63 +++
 .../kerberos/kerb/type/pa/token/TokenInfos.java |  29 ++
 .../kerb/type/ticket/EncTicketPart.java         | 169 +++++++
 .../kerberos/kerb/type/ticket/KrbTicket.java    |  49 ++
 .../kerberos/kerb/type/ticket/SgtTicket.java    |  31 ++
 .../kerberos/kerb/type/ticket/TgtTicket.java    |  39 ++
 .../kerby/kerberos/kerb/type/ticket/Ticket.java | 100 ++++
 .../kerberos/kerb/type/ticket/TicketFlag.java   |  62 +++
 .../kerberos/kerb/type/ticket/TicketFlags.java  |  39 ++
 .../kerberos/kerb/type/ticket/Tickets.java      |  29 ++
 .../kerberos/kerb/crypto/CheckSumHandler.java   |   6 +-
 .../kerb/crypto/CheckSumTypeHandler.java        |   2 +-
 .../kerberos/kerb/crypto/EncTypeHandler.java    |   4 +-
 .../kerberos/kerb/crypto/EncryptionHandler.java |  10 +-
 .../crypto/cksum/CmacCamellia128CheckSum.java   |   2 +-
 .../crypto/cksum/CmacCamellia256CheckSum.java   |   2 +-
 .../kerb/crypto/cksum/Crc32CheckSum.java        |   2 +-
 .../kerb/crypto/cksum/DesCbcCheckSum.java       |   2 +-
 .../kerb/crypto/cksum/HmacMd5Rc4CheckSum.java   |   2 +-
 .../crypto/cksum/HmacSha1Aes128CheckSum.java    |   2 +-
 .../crypto/cksum/HmacSha1Aes256CheckSum.java    |   2 +-
 .../kerb/crypto/cksum/HmacSha1Des3CheckSum.java |   2 +-
 .../kerb/crypto/cksum/Md5HmacRc4CheckSum.java   |   2 +-
 .../kerb/crypto/cksum/RsaMd4CheckSum.java       |   2 +-
 .../kerb/crypto/cksum/RsaMd4DesCheckSum.java    |   2 +-
 .../kerb/crypto/cksum/RsaMd5CheckSum.java       |   2 +-
 .../kerb/crypto/cksum/RsaMd5DesCheckSum.java    |   2 +-
 .../kerb/crypto/cksum/Sha1CheckSum.java         |   2 +-
 .../kerby/kerberos/kerb/crypto/dh/DhClient.java |   8 +-
 .../kerby/kerberos/kerb/crypto/dh/DhServer.java |   8 +-
 .../kerb/crypto/enc/Aes128CtsHmacSha1Enc.java   |   4 +-
 .../kerb/crypto/enc/Aes256CtsHmacSha1Enc.java   |   4 +-
 .../kerb/crypto/enc/Camellia128CtsCmacEnc.java  |   4 +-
 .../kerb/crypto/enc/Camellia256CtsCmacEnc.java  |   4 +-
 .../kerb/crypto/enc/Des3CbcSha1Enc.java         |   4 +-
 .../kerberos/kerb/crypto/enc/DesCbcCrcEnc.java  |   4 +-
 .../kerberos/kerb/crypto/enc/DesCbcMd4Enc.java  |   4 +-
 .../kerberos/kerb/crypto/enc/DesCbcMd5Enc.java  |   4 +-
 .../kerberos/kerb/crypto/enc/KeKiCmacEnc.java   |   2 +-
 .../kerberos/kerb/crypto/enc/Rc4HmacEnc.java    |   4 +-
 .../kerberos/kerb/crypto/enc/Rc4HmacExpEnc.java |   2 +-
 .../kerberos/kerb/crypto/fast/FastUtil.java     |   2 +-
 .../kerberos/kerb/crypto/CheckSumTest.java      |  10 +-
 .../kerberos/kerb/crypto/CheckSumsTest.java     |   8 +-
 .../kerberos/kerb/crypto/DecryptionTest.java    |   6 +-
 .../kerberos/kerb/crypto/FastUtilTest.java      |   4 +-
 .../kerberos/kerb/crypto/KeyDeriveTest.java     |   2 +-
 .../kerby/kerberos/kerb/crypto/PrfTest.java     |   2 +-
 .../kerberos/kerb/crypto/String2keyTest.java    |   4 +-
 .../kerberos/kerb/crypto/dh/DhGroupTest.java    |   1 -
 .../kerb/crypto/dh/DhKeyAgreementTest.java      |   7 +-
 .../kerb/identity/backend/BackendTest.java      |   4 +-
 .../kerb/identity/backend/BackendTestUtil.java  |   6 +-
 .../kerberos/kerb/identity/KrbIdentity.java     |   8 +-
 .../kerby/kerberos/kerb/server/KdcTest.java     |  12 +-
 .../kerberos/kerb/server/LoginTestBase.java     |   4 +-
 .../kerb/server/MultiRequestsKdcTest.java       |  16 +-
 .../kerby/kerberos/kerb/server/KdcConfig.java   |   2 +-
 .../kerby/kerberos/kerb/server/KdcHandler.java  |  16 +-
 .../kerb/server/KdcRecoverableException.java    |   2 +-
 .../server/preauth/AbstractPreauthPlugin.java   |   6 +-
 .../kerb/server/preauth/KdcFastContext.java     |   6 +-
 .../kerb/server/preauth/KdcPreauth.java         |   6 +-
 .../kerb/server/preauth/PreauthContext.java     |   2 +-
 .../kerb/server/preauth/PreauthHandle.java      |   4 +-
 .../kerb/server/preauth/PreauthHandler.java     |   6 +-
 .../server/preauth/builtin/EncTsPreauth.java    |  10 +-
 .../kerb/server/preauth/builtin/TgtPreauth.java |   2 +-
 .../server/preauth/pkinit/PkinitPreauth.java    |  36 +-
 .../preauth/pkinit/PkinitRequestContext.java    |   4 +-
 .../kerb/server/preauth/token/TokenPreauth.java |  20 +-
 .../preauth/token/TokenRequestContext.java      |   2 +-
 .../kerberos/kerb/server/request/AsRequest.java |  34 +-
 .../kerb/server/request/KdcRequest.java         |  58 +--
 .../server/request/ServiceTicketIssuer.java     |   8 +-
 .../kerb/server/request/TgsRequest.java         |  46 +-
 .../kerb/server/request/TgtTicketIssuer.java    |   4 +-
 .../kerb/server/request/TicketIssuer.java       |  34 +-
 .../kerby/kerberos/kerb/KrbInputStream.java     |   8 +-
 .../kerby/kerberos/kerb/KrbOutputStream.java    |   6 +-
 .../kerb/ccache/CredCacheInputStream.java       |  24 +-
 .../kerb/ccache/CredCacheOutputStream.java      |  18 +-
 .../kerby/kerberos/kerb/ccache/Credential.java  |  20 +-
 .../kerberos/kerb/ccache/CredentialCache.java   |   6 +-
 .../kerb/ccache/KrbCredentialCache.java         |   2 +-
 .../kerby/kerberos/kerb/keytab/Keytab.java      |   6 +-
 .../kerby/kerberos/kerb/keytab/KeytabEntry.java |   6 +-
 .../kerberos/kerb/keytab/KeytabInputStream.java |  10 +-
 .../kerb/keytab/KeytabOutputStream.java         |   4 +-
 .../kerby/kerberos/kerb/keytab/KrbKeytab.java   |   6 +-
 .../kerby/kerberos/kerb/util/CcacheTest.java    |   2 +-
 .../kerberos/kerb/util/EncryptionTest.java      |  14 +-
 .../kerby/kerberos/kerb/util/KeysTest.java      |   6 +-
 .../kerby/kerberos/kerb/util/KeytabTest.java    |   2 +-
 .../kerberos/kerb/util/NewEncryptionTest.java   |   8 +-
 .../org/apache/kerby/cms/type/Attribute.java    |   2 +-
 .../cms/type/AttributeCertificateInfoV1.java    |   2 +-
 .../kerby/cms/type/AttributeCertificateV1.java  |   2 +-
 .../org/apache/kerby/cms/type/Certificate.java  |   2 +-
 .../kerby/cms/type/CertificateChoices.java      |   4 +-
 .../apache/kerby/cms/type/CertificateList.java  |   2 +-
 .../apache/kerby/cms/type/CompressedData.java   |   2 +-
 .../org/apache/kerby/cms/type/ContentInfo.java  |   4 +-
 .../kerby/cms/type/EncapsulatedContentInfo.java |   4 +-
 .../kerby/cms/type/ExtendedCertificate.java     |   2 +-
 .../kerby/cms/type/ExtendedCertificateInfo.java |   2 +-
 .../kerby/cms/type/IssuerAndSerialNumber.java   |   2 +-
 .../kerby/cms/type/OtherCertificateFormat.java  |   2 +-
 .../cms/type/OtherRevocationInfoFormat.java     |   2 +-
 .../kerby/cms/type/RevocationInfoChoice.java    |   4 +-
 .../org/apache/kerby/cms/type/SignedData.java   |   4 +-
 .../apache/kerby/cms/type/SignerIdentifier.java |   4 +-
 .../org/apache/kerby/cms/type/SignerInfo.java   |   4 +-
 .../java/org/apache/kerby/cms/type/Subject.java |   4 +-
 .../kerby/x500/type/AttributeTypeAndValue.java  |   2 +-
 .../java/org/apache/kerby/x500/type/Name.java   |   2 +-
 .../kerby/x509/type/AccessDescription.java      |   2 +-
 .../kerby/x509/type/AlgorithmIdentifier.java    |   2 +-
 .../apache/kerby/x509/type/AttCertIssuer.java   |   4 +-
 .../kerby/x509/type/AttCertValidityPeriod.java  |   2 +-
 .../org/apache/kerby/x509/type/Attribute.java   |   2 +-
 .../kerby/x509/type/AttributeCertificate.java   |   2 +-
 .../x509/type/AttributeCertificateInfo.java     |   2 +-
 .../kerby/x509/type/AuthorityKeyIdentifier.java |   4 +-
 .../kerby/x509/type/BasicConstraints.java       |   2 +-
 .../org/apache/kerby/x509/type/Certificate.java |   2 +-
 .../apache/kerby/x509/type/CertificateList.java |   2 +-
 .../apache/kerby/x509/type/CertificatePair.java |   4 +-
 .../apache/kerby/x509/type/DSAParameter.java    |   2 +-
 .../org/apache/kerby/x509/type/DigestInfo.java  |   2 +-
 .../apache/kerby/x509/type/DirectoryString.java |   2 +-
 .../org/apache/kerby/x509/type/DisplayText.java |   2 +-
 .../kerby/x509/type/DistributionPoint.java      |   4 +-
 .../kerby/x509/type/DistributionPointName.java  |   4 +-
 .../apache/kerby/x509/type/EDIPartyName.java    |   4 +-
 .../org/apache/kerby/x509/type/Extension.java   |   2 +-
 .../org/apache/kerby/x509/type/GeneralName.java |   4 +-
 .../apache/kerby/x509/type/GeneralSubtree.java  |   4 +-
 .../java/org/apache/kerby/x509/type/Holder.java |   4 +-
 .../apache/kerby/x509/type/IetfAttrSyntax.java  |   4 +-
 .../kerby/x509/type/IetfAttrSyntaxChoice.java   |   2 +-
 .../apache/kerby/x509/type/IssuerSerial.java    |   2 +-
 .../x509/type/IssuingDistributionPoint.java     |   4 +-
 .../apache/kerby/x509/type/NameConstraints.java |   4 +-
 .../apache/kerby/x509/type/NoticeReference.java |   2 +-
 .../kerby/x509/type/ObjectDigestInfo.java       |   2 +-
 .../org/apache/kerby/x509/type/OtherName.java   |   4 +-
 .../kerby/x509/type/PolicyConstraints.java      |   4 +-
 .../kerby/x509/type/PolicyInformation.java      |   2 +-
 .../apache/kerby/x509/type/PolicyMapping.java   |   2 +-
 .../kerby/x509/type/PolicyQualifierInfo.java    |   2 +-
 .../kerby/x509/type/PrivateKeyUsagePeriod.java  |   4 +-
 .../kerby/x509/type/RevokedCertificate.java     |   2 +-
 .../org/apache/kerby/x509/type/RoleSyntax.java  |   4 +-
 .../kerby/x509/type/SubjectPublicKeyInfo.java   |   2 +-
 .../org/apache/kerby/x509/type/TBSCertList.java |   4 +-
 .../apache/kerby/x509/type/TBSCertificate.java  |   6 +-
 .../java/org/apache/kerby/x509/type/Target.java |   4 +-
 .../org/apache/kerby/x509/type/TargetCert.java  |   2 +-
 .../java/org/apache/kerby/x509/type/Time.java   |   2 +-
 .../org/apache/kerby/x509/type/UserNotice.java  |   2 +-
 .../java/org/apache/kerby/x509/type/V2Form.java |   4 +-
 .../kerberos/provider/token/JwtAuthToken.java   |   2 +-
 .../provider/token/JwtTokenDecoder.java         |   2 +-
 .../provider/token/JwtTokenEncoder.java         |   2 +-
 .../provider/token/JwtTokenProvider.java        |   2 +-
 .../kerberos/provider/token/TokenTest.java      |   2 +-
 .../kerby/kerberos/tool/kinit/KinitTool.java    |  14 +-
 .../kerby/kerberos/tool/klist/KlistTool.java    |   2 +-
 .../kerby/kerberos/tool/token/TokenInit.java    |   2 +-
 .../kadmin/command/GetPrincipalCommand.java     |   4 +-
 474 files changed, 9382 insertions(+), 9219 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/800e02fd/benchmark/src/main/java/org/apache/kerby/benchmark/KrbCodecBenchmark.java
----------------------------------------------------------------------
diff --git a/benchmark/src/main/java/org/apache/kerby/benchmark/KrbCodecBenchmark.java b/benchmark/src/main/java/org/apache/kerby/benchmark/KrbCodecBenchmark.java
index 48c2703..1be8bbf 100644
--- a/benchmark/src/main/java/org/apache/kerby/benchmark/KrbCodecBenchmark.java
+++ b/benchmark/src/main/java/org/apache/kerby/benchmark/KrbCodecBenchmark.java
@@ -21,7 +21,7 @@ package org.apache.kerby.benchmark;
 
 import org.apache.directory.api.asn1.ber.Asn1Decoder;
 import org.apache.directory.shared.kerberos.codec.apReq.ApReqContainer;
-import org.apache.kerby.kerberos.kerb.spec.ap.ApReq;
+import org.apache.kerby.kerberos.kerb.type.ap.ApReq;
 import org.openjdk.jmh.annotations.Benchmark;
 import org.openjdk.jmh.annotations.BenchmarkMode;
 import org.openjdk.jmh.annotations.Fork;

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/800e02fd/kerby-asn1/src/main/java/org/apache/kerby/asn1/Asn1FieldInfo.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/Asn1FieldInfo.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/Asn1FieldInfo.java
new file mode 100644
index 0000000..9efa6a5
--- /dev/null
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/Asn1FieldInfo.java
@@ -0,0 +1,97 @@
+/**
+ *  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.asn1;
+
+import org.apache.kerby.asn1.type.Asn1Type;
+
+/**
+ * Representing a field in a ASN1 collection or choice.
+ */
+public class Asn1FieldInfo {
+    private int index;
+    private int tagNo = -1; // Indicate a non-tagged field
+    private boolean isImplicit;
+    private Class<? extends Asn1Type> type;
+
+    /**
+     * Constructor for a tagged field, the tagNo being the same of index.
+     * @param index
+     * @param type
+     * @param isImplicit
+     */
+    public Asn1FieldInfo(int index, Class<? extends Asn1Type> type,
+                         boolean isImplicit) {
+        this(index, index, type, isImplicit);
+    }
+
+    /**
+     * Constructor for a tagged field.
+     * @param index
+     * @param tagNo
+     * @param type
+     * @param isImplicit
+     */
+    public Asn1FieldInfo(int index, int tagNo, Class<? extends Asn1Type> type,
+                         boolean isImplicit) {
+        this.index = index;
+        this.tagNo = tagNo;
+        this.type = type;
+        this.isImplicit = isImplicit;
+    }
+
+    /**
+     * Constructor for a non-tagged field.
+     * @param index
+     * @param type
+     */
+    public Asn1FieldInfo(int index, Class<? extends Asn1Type> type) {
+        this.index = index;
+        this.type = type;
+        this.tagNo = -1; // Indicate a non-tagged field
+    }
+
+    public boolean isTagged() {
+        return tagNo != -1;
+    }
+
+    public TaggingOption getTaggingOption() {
+        if (isImplicit) {
+            return TaggingOption.newImplicitContextSpecific(tagNo);
+        } else {
+            return TaggingOption.newExplicitContextSpecific(tagNo);
+        }
+    }
+
+    public int getTagNo() {
+        return tagNo;
+    }
+
+    public int getIndex() {
+        return index;
+    }
+
+    public boolean isImplicit() {
+        return isImplicit;
+    }
+
+    public Class<? extends Asn1Type> getType() {
+        return type;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/800e02fd/kerby-asn1/src/main/java/org/apache/kerby/asn1/Asn1InputBuffer.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/Asn1InputBuffer.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/Asn1InputBuffer.java
index aeb5864..9d90319 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/Asn1InputBuffer.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/Asn1InputBuffer.java
@@ -19,8 +19,8 @@
  */
 package org.apache.kerby.asn1;
 
-import org.apache.kerby.asn1.type.AbstractAsn1Type;
 import org.apache.kerby.asn1.type.Asn1Item;
+import org.apache.kerby.asn1.type.Asn1Object;
 import org.apache.kerby.asn1.type.Asn1Type;
 
 import java.io.IOException;
@@ -68,7 +68,7 @@ public class Asn1InputBuffer {
         if (!limitedBuffer.available()) {
             return null;
         }
-        Asn1Item one = AbstractAsn1Type.decodeOne(limitedBuffer);
+        Asn1Item one = Asn1Object.decodeOne(limitedBuffer);
         if (one.isSimple()) {
             one.decodeValueAsSimple();
         } else if (one.isCollection()) {
@@ -96,7 +96,7 @@ public class Asn1InputBuffer {
 
     public void skipNext() throws IOException {
         if (limitedBuffer.available()) {
-            AbstractAsn1Type.skipOne(limitedBuffer);
+            Asn1Object.skipOne(limitedBuffer);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/800e02fd/kerby-asn1/src/main/java/org/apache/kerby/asn1/Asn1OutputBuffer.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/Asn1OutputBuffer.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/Asn1OutputBuffer.java
index f50d092..729e042 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/Asn1OutputBuffer.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/Asn1OutputBuffer.java
@@ -19,7 +19,7 @@
  */
 package org.apache.kerby.asn1;
 
-import org.apache.kerby.asn1.type.AbstractAsn1Type;
+import org.apache.kerby.asn1.type.Asn1Object;
 import org.apache.kerby.asn1.type.Asn1Type;
 
 import java.nio.ByteBuffer;
@@ -51,7 +51,7 @@ public class Asn1OutputBuffer {
         int allLen = 0;
         for (Asn1Type item : objects) {
             if (item != null) {
-                allLen += ((AbstractAsn1Type<?>) item).encodingLength();
+                allLen += ((Asn1Object) item).encodingLength();
             }
         }
         return allLen;

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/800e02fd/kerby-asn1/src/main/java/org/apache/kerby/asn1/ExplicitField.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/ExplicitField.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/ExplicitField.java
new file mode 100644
index 0000000..85fded1
--- /dev/null
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/ExplicitField.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.asn1;
+
+import org.apache.kerby.asn1.type.Asn1Type;
+
+/**
+ * Representing an explicitly tagged field in a ASN1 collection or choice.
+ */
+public class ExplicitField extends Asn1FieldInfo {
+
+    /**
+     * Constructor for an explicitly tagged field.
+     * @param index
+     * @param type
+     */
+    public ExplicitField(int index, int tagNo, Class<? extends Asn1Type> type) {
+        super(index, tagNo, type, false);
+    }
+
+    /**
+     * Constructor for an explicitly tagged field, the tagNo being the same of index.
+     * @param index
+     * @param type
+     */
+    public ExplicitField(int index, Class<? extends Asn1Type> type) {
+        super(index, index, type, false);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/800e02fd/kerby-asn1/src/main/java/org/apache/kerby/asn1/ImplicitField.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/ImplicitField.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/ImplicitField.java
new file mode 100644
index 0000000..a0e7acb
--- /dev/null
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/ImplicitField.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.asn1;
+
+import org.apache.kerby.asn1.type.Asn1Type;
+
+/**
+ * Representing an implicitly tagged field in a ASN1 collection or choice.
+ */
+public class ImplicitField extends Asn1FieldInfo {
+
+    /**
+     * Constructor for an implicitly tagged field.
+     * @param index
+     * @param type
+     */
+    public ImplicitField(int index, int tagNo, Class<? extends Asn1Type> type) {
+        super(index, tagNo, type, true);
+    }
+
+    /**
+     * Constructor for an implicitly tagged field, the tagNo being the same of index.
+     * @param index
+     * @param type
+     */
+    public ImplicitField(int index, Class<? extends Asn1Type> type) {
+        super(index, index, type, true);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/800e02fd/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/AbstractAsn1Type.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/AbstractAsn1Type.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/AbstractAsn1Type.java
index 7446c7c..4dc2c28 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/AbstractAsn1Type.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/AbstractAsn1Type.java
@@ -19,12 +19,7 @@
  */
 package org.apache.kerby.asn1.type;
 
-import org.apache.kerby.asn1.LimitedByteBuffer;
 import org.apache.kerby.asn1.TagClass;
-import org.apache.kerby.asn1.TaggingOption;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
 
 /**
  * The abstract ASN1 type for all the ASN1 types. It provides basic
@@ -32,20 +27,10 @@ import java.nio.ByteBuffer;
  *
  * @param <T> the type of the value encoded/decoded or wrapped by this
  */
-public abstract class AbstractAsn1Type<T> implements Asn1Type {
-
-    private TagClass tagClass = TagClass.UNKNOWN;
-    private int tagNo = -1;
-    private int tagFlags = 0;
-    private int encodingLen = -1;
+public abstract class AbstractAsn1Type<T> extends Asn1Object {
     // The wrapped real value.
     private T value;
 
-    // encoding options
-    private EncodingType encodingType = EncodingType.BER;
-    private boolean isImplicit = true;
-    private boolean isDefinitiveLength = false;
-
     /**
      * Default constructor, generally for decoding as a value container
      * @param tagClass The tag class
@@ -82,11 +67,8 @@ public abstract class AbstractAsn1Type<T> implements Asn1Type {
      * @param value The value
      */
     public AbstractAsn1Type(TagClass tagClass, int tagNo, T value) {
-        this.tagClass = tagClass;
-        this.tagNo = tagNo;
+        super(tagClass, tagNo);
         this.value = value;
-
-        this.tagFlags |= tagClass.getValue();
     }
 
     public T getValue() {
@@ -96,422 +78,4 @@ public abstract class AbstractAsn1Type<T> implements Asn1Type {
     public void setValue(T value) {
         this.value = value;
     }
-
-    @Override
-    public TagClass tagClass() {
-        return tagClass;
-    }
-
-    protected void setTagClass(TagClass tagClass) {
-        this.tagClass = tagClass;
-    }
-
-    @Override
-    public int tagFlags() {
-        return tagFlags;
-    }
-
-    @Override
-    public int tagNo() {
-        return tagNo;
-    }
-
-    protected void setTagFlags(int tagFlags) {
-        this.tagFlags = tagFlags & 0xe0;
-    }
-
-    protected void setTagNo(int tagNo) {
-        this.tagNo = tagNo;
-    }
-
-    @Override
-    public void usePrimitive(boolean isPrimitive) {
-        if (isPrimitive) {
-            tagFlags &= ~CONSTRUCTED_FLAG;
-        } else {
-            tagFlags |= CONSTRUCTED_FLAG;
-        }
-    }
-
-    @Override
-    public boolean isPrimitive() {
-        return (tagFlags & CONSTRUCTED_FLAG) == 0;
-    }
-
-    @Override
-    public void useDefinitiveLength(boolean isDefinitiveLength) {
-        this.isDefinitiveLength = isDefinitiveLength;
-    }
-
-    @Override
-    public boolean isDefinitiveLength() {
-        return isDefinitiveLength;
-    }
-
-    @Override
-    public void useImplicit(boolean isImplicit) {
-        this.isImplicit = isImplicit;
-    }
-
-    @Override
-    public boolean isImplicit() {
-        return isImplicit;
-    }
-
-    @Override
-    public void useDER() {
-        this.encodingType = EncodingType.DER;
-    }
-
-    @Override
-    public boolean isDER() {
-        return encodingType == EncodingType.DER;
-    }
-
-    @Override
-    public void useBER() {
-        this.encodingType = EncodingType.BER;
-    }
-
-    @Override
-    public boolean isBER() {
-        return encodingType == EncodingType.BER;
-    }
-
-    @Override
-    public void useCER() {
-        this.encodingType = EncodingType.CER;
-    }
-
-    @Override
-    public boolean isCER() {
-        return encodingType == EncodingType.CER;
-    }
-
-    @Override
-    public byte[] encode() {
-        ByteBuffer byteBuffer = ByteBuffer.allocate(encodingLength());
-        encode(byteBuffer);
-        byteBuffer.flip();
-        return byteBuffer.array();
-    }
-
-    @Override
-    public void encode(ByteBuffer buffer) {
-        encodeTag(buffer, tagFlags(), tagNo());
-        encodeLength(buffer, encodingBodyLength());
-        encodeBody(buffer);
-    }
-
-    protected void encodeBody(ByteBuffer buffer) { }
-
-    @Override
-    public void decode(byte[] content) throws IOException {
-        decode(new LimitedByteBuffer(content));
-    }
-
-    @Override
-    public void decode(ByteBuffer content) throws IOException {
-        decode(new LimitedByteBuffer(content));
-    }
-
-    @Override
-    public int encodingLength() {
-        if (encodingLen == -1) {
-            int bodyLen = encodingBodyLength();
-            encodingLen = lengthOfTagLength(tagNo()) + lengthOfBodyLength(bodyLen) + bodyLen;
-        }
-        return encodingLen;
-    }
-
-    public boolean isUniversal() {
-        return tagClass.isUniversal();
-    }
-
-    public boolean isAppSpecific() {
-        return tagClass.isAppSpecific();
-    }
-
-    public boolean isContextSpecific() {
-        return tagClass.isContextSpecific();
-    }
-
-    public boolean isTagged() {
-        return tagClass.isTagged();
-    }
-
-    public boolean isSimple() {
-        return isUniversal() && Asn1Simple.isSimple(tagNo);
-    }
-
-    public boolean isCollection() {
-        return isUniversal() && Asn1Collection.isCollection(tagNo);
-    }
-
-    protected abstract int encodingBodyLength();
-
-    protected void decode(LimitedByteBuffer content) throws IOException {
-        int tag = readTag(content);
-        int tagNo = readTagNo(content, tag);
-        int tmpTagFlags = tag & 0xe0;
-        int length = readLength(content);
-
-        decode(tmpTagFlags, tagNo, new LimitedByteBuffer(content, length));
-    }
-
-    public void decode(int tagFlags, int tagNo,
-                       LimitedByteBuffer content) throws IOException {
-        if (tagClass() != TagClass.UNKNOWN && tagClass()
-                != TagClass.fromTagFlags(tagFlags)) {
-            throw new IOException("Unexpected tagFlags " + tagFlags
-                    + ", expecting " + tagClass());
-        }
-        if (tagNo() != -1 && tagNo() != tagNo) {
-            throw new IOException("Unexpected tagNo " + tagNo + ", "
-                    + "expecting " + tagNo());
-        }
-
-        setTagClass(TagClass.fromTagFlags(tagFlags));
-        setTagFlags(tagFlags);
-        setTagNo(tagNo);
-
-        decodeBody(content);
-    }
-
-    protected abstract void decodeBody(LimitedByteBuffer content) throws IOException;
-
-    protected int taggedEncodingLength(TaggingOption taggingOption) {
-        int taggingTagNo = taggingOption.getTagNo();
-        int taggingBodyLen = taggingOption.isImplicit() ? encodingBodyLength()
-                : encodingLength();
-        int taggingEncodingLen = lengthOfTagLength(taggingTagNo)
-                + lengthOfBodyLength(taggingBodyLen) + taggingBodyLen;
-        return taggingEncodingLen;
-    }
-
-    public byte[] taggedEncode(TaggingOption taggingOption) {
-        ByteBuffer byteBuffer = ByteBuffer.allocate(taggedEncodingLength(taggingOption));
-        taggedEncode(byteBuffer, taggingOption);
-        byteBuffer.flip();
-        return byteBuffer.array();
-    }
-
-    @Override
-    public void taggedEncode(ByteBuffer buffer, TaggingOption taggingOption) {
-        int taggingTagFlags = taggingOption.tagFlags(!isPrimitive());
-        encodeTag(buffer, taggingTagFlags, taggingOption.getTagNo());
-        int taggingBodyLen = taggingOption.isImplicit() ? encodingBodyLength()
-                : encodingLength();
-        encodeLength(buffer, taggingBodyLen);
-        if (taggingOption.isImplicit()) {
-            encodeBody(buffer);
-        } else {
-            encode(buffer);
-        }
-    }
-
-    public void taggedDecode(byte[] content,
-                             TaggingOption taggingOption) throws IOException {
-        taggedDecode(ByteBuffer.wrap(content), taggingOption);
-    }
-
-    @Override
-    public void taggedDecode(ByteBuffer content,
-                             TaggingOption taggingOption) throws IOException {
-        LimitedByteBuffer limitedBuffer = new LimitedByteBuffer(content);
-        taggedDecode(limitedBuffer, taggingOption);
-    }
-
-    protected void taggedDecode(LimitedByteBuffer content,
-                                TaggingOption taggingOption) throws IOException {
-        int taggingTag = readTag(content);
-        int taggingTagNo = readTagNo(content, taggingTag);
-        int taggingLength = readLength(content);
-        LimitedByteBuffer newContent = new LimitedByteBuffer(content, taggingLength);
-
-        int tmpTagFlags = taggingTag & 0xe0;
-        taggedDecode(tmpTagFlags, taggingTagNo, newContent, taggingOption);
-    }
-
-    protected void taggedDecode(int taggingTagFlags, int taggingTagNo,
-                                LimitedByteBuffer content,
-                                TaggingOption taggingOption) throws IOException {
-        int expectedTaggingTagFlags = taggingOption.tagFlags(!isPrimitive());
-        if (expectedTaggingTagFlags != taggingTagFlags) {
-            throw new IOException("Unexpected tag flags " + taggingTagFlags
-                    + ", expecting " + expectedTaggingTagFlags);
-        }
-        if (taggingOption.getTagNo() != taggingTagNo) {
-            throw new IOException("Unexpected tagNo " + taggingTagNo + ", "
-                    + "expecting " + taggingOption.getTagNo());
-        }
-
-        if (taggingOption.isImplicit()) {
-            decodeBody(content);
-        } else {
-            decode(content);
-        }
-    }
-
-    public static Asn1Item decodeOne(LimitedByteBuffer content) throws IOException {
-        int tag = readTag(content);
-        int tagNo = readTagNo(content, tag);
-        int length = readLength(content);
-        if (length < 0) {
-            throw new IOException("Unexpected length");
-        }
-        LimitedByteBuffer valueContent = new LimitedByteBuffer(content, length);
-        content.skip(length);
-
-        Asn1Item result = new Asn1Item(tag, tagNo, valueContent);
-        if (result.isSimple()) {
-            result.decodeValueAsSimple();
-        }
-        return result;
-    }
-
-    public static void skipOne(LimitedByteBuffer content) throws IOException {
-        int tag = readTag(content);
-        readTagNo(content, tag);
-        int length = readLength(content);
-        if (length < 0) {
-            throw new IOException("Unexpected length");
-        }
-        content.skip(length);
-    }
-
-    public static int lengthOfBodyLength(int bodyLength) {
-        int length = 1;
-
-        if (bodyLength > 127) {
-            int payload = bodyLength;
-            while (payload != 0) {
-                payload >>= 8;
-                length++;
-            }
-        }
-
-        return length;
-    }
-
-    public static int lengthOfTagLength(int tagNo) {
-        int length = 1;
-
-        if (tagNo >= 31) {
-            if (tagNo < 128) {
-                length++;
-            } else {
-                length++;
-
-                do {
-                    tagNo >>= 7;
-                    length++;
-                } while (tagNo > 127);
-            }
-        }
-
-        return length;
-    }
-
-    public static void encodeTag(ByteBuffer buffer, int flags, int tagNo) {
-        if (tagNo < 31) {
-            buffer.put((byte) (flags | tagNo));
-        } else {
-            buffer.put((byte) (flags | 0x1f));
-            if (tagNo < 128) {
-                buffer.put((byte) tagNo);
-            } else {
-                byte[] tmpBytes = new byte[5]; // 5 * 7 > 32
-                int iPut = tmpBytes.length;
-
-                tmpBytes[--iPut] = (byte) (tagNo & 0x7f);
-                do {
-                    tagNo >>= 7;
-                    tmpBytes[--iPut] = (byte) (tagNo & 0x7f | 0x80);
-                } while (tagNo > 127);
-
-                buffer.put(tmpBytes, iPut, tmpBytes.length - iPut);
-            }
-        }
-    }
-
-    public static void encodeLength(ByteBuffer buffer, int bodyLength) {
-        if (bodyLength < 128) {
-            buffer.put((byte) bodyLength);
-        } else {
-            int length = 0;
-            int payload = bodyLength;
-
-            while (payload != 0) {
-                payload >>= 8;
-                length++;
-            }
-
-            buffer.put((byte) (length | 0x80));
-
-            payload = bodyLength;
-            for (int i = length - 1; i >= 0; i--) {
-                buffer.put((byte) (payload >> (i * 8)));
-            }
-        }
-    }
-
-    public static int readTag(LimitedByteBuffer buffer) throws IOException {
-        int tag = buffer.readByte() & 0xff;
-        if (tag == 0) {
-            throw new IOException("Bad tag 0 found");
-        }
-        return tag;
-    }
-
-    public static int readTagNo(LimitedByteBuffer buffer, int tag) throws IOException {
-        int tagNo = tag & 0x1f;
-
-        if (tagNo == 0x1f) {
-            tagNo = 0;
-
-            int b = buffer.readByte() & 0xff;
-            if ((b & 0x7f) == 0) {
-                throw new IOException("Invalid high tag number found");
-            }
-
-            while (b >= 0 && (b & 0x80) != 0) {
-                tagNo |= b & 0x7f;
-                tagNo <<= 7;
-                b = buffer.readByte();
-            }
-
-            tagNo |= b & 0x7f;
-        }
-
-        return tagNo;
-    }
-
-    public static int readLength(LimitedByteBuffer buffer) throws IOException {
-        int bodyLength = buffer.readByte() & 0xff;
-
-        if (bodyLength > 127) {
-            int length = bodyLength & 0x7f;
-            if (length > 4) {
-                throw new IOException("Bad bodyLength of more than 4 bytes: " + length);
-            }
-
-            bodyLength = 0;
-            int tmp;
-            for (int i = 0; i < length; i++) {
-                tmp = buffer.readByte() & 0xff;
-                bodyLength = (bodyLength << 8) + tmp;
-            }
-
-            if (bodyLength < 0) {
-                throw new IOException("Invalid bodyLength " + bodyLength);
-            }
-            if (bodyLength > buffer.hasLeft()) {
-                throw new IOException("Corrupt stream - less data "
-                        + buffer.hasLeft() + " than expected " + bodyLength);
-            }
-        }
-
-        return bodyLength;
-    }
 }

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/800e02fd/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Choice.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Choice.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Choice.java
index e251e11..3641070 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Choice.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Choice.java
@@ -19,6 +19,7 @@
  */
 package org.apache.kerby.asn1.type;
 
+import org.apache.kerby.asn1.Asn1FieldInfo;
 import org.apache.kerby.asn1.LimitedByteBuffer;
 import org.apache.kerby.asn1.TagClass;
 import org.apache.kerby.asn1.TaggingOption;

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/800e02fd/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1CollectionType.java
----------------------------------------------------------------------
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 395e838..bb4f622 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
@@ -19,6 +19,7 @@
  */
 package org.apache.kerby.asn1.type;
 
+import org.apache.kerby.asn1.Asn1FieldInfo;
 import org.apache.kerby.asn1.LimitedByteBuffer;
 import org.apache.kerby.asn1.TagClass;
 import org.apache.kerby.asn1.TaggingOption;

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/800e02fd/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1FieldInfo.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1FieldInfo.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1FieldInfo.java
deleted file mode 100644
index fb3c885..0000000
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1FieldInfo.java
+++ /dev/null
@@ -1,97 +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.asn1.type;
-
-import org.apache.kerby.asn1.TaggingOption;
-
-/**
- * Representing a field in a ASN1 collection or choice.
- */
-public class Asn1FieldInfo {
-    private int index;
-    private int tagNo = -1; // Indicate a non-tagged field
-    private boolean isImplicit;
-    private Class<? extends Asn1Type> type;
-
-    /**
-     * Constructor for a tagged field, the tagNo being the same of index.
-     * @param index
-     * @param type
-     * @param isImplicit
-     */
-    public Asn1FieldInfo(int index, Class<? extends Asn1Type> type,
-                         boolean isImplicit) {
-        this(index, index, type, isImplicit);
-    }
-
-    /**
-     * Constructor for a tagged field.
-     * @param index
-     * @param tagNo
-     * @param type
-     * @param isImplicit
-     */
-    public Asn1FieldInfo(int index, int tagNo, Class<? extends Asn1Type> type,
-                         boolean isImplicit) {
-        this.index = index;
-        this.tagNo = tagNo;
-        this.type = type;
-        this.isImplicit = isImplicit;
-    }
-
-    /**
-     * Constructor for a non-tagged field.
-     * @param index
-     * @param type
-     */
-    public Asn1FieldInfo(int index, Class<? extends Asn1Type> type) {
-        this.index = index;
-        this.type = type;
-        this.tagNo = -1; // Indicate a non-tagged field
-    }
-
-    public boolean isTagged() {
-        return tagNo != -1;
-    }
-
-    public TaggingOption getTaggingOption() {
-        if (isImplicit) {
-            return TaggingOption.newImplicitContextSpecific(tagNo);
-        } else {
-            return TaggingOption.newExplicitContextSpecific(tagNo);
-        }
-    }
-
-    public int getTagNo() {
-        return tagNo;
-    }
-
-    public int getIndex() {
-        return index;
-    }
-
-    public boolean isImplicit() {
-        return isImplicit;
-    }
-
-    public Class<? extends Asn1Type> getType() {
-        return type;
-    }
-}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/800e02fd/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Object.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Object.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Object.java
new file mode 100644
index 0000000..95da847
--- /dev/null
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1Object.java
@@ -0,0 +1,484 @@
+/**
+ *  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.asn1.type;
+
+import org.apache.kerby.asn1.LimitedByteBuffer;
+import org.apache.kerby.asn1.TagClass;
+import org.apache.kerby.asn1.TaggingOption;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+/**
+ * The abstract ASN1 object for all the ASN1 types. It provides basic
+ * encoding and decoding utilities.
+ */
+public abstract class Asn1Object implements Asn1Type {
+
+    private TagClass tagClass = TagClass.UNKNOWN;
+    private int tagNo = -1;
+    private int tagFlags = 0;
+    private int encodingLen = -1;
+
+    // encoding options
+    private EncodingType encodingType = EncodingType.BER;
+    private boolean isImplicit = true;
+    private boolean isDefinitiveLength = false;
+
+    /**
+     * Constructor with a value, generally for encoding of the value
+     * @param tagFlags The tag flags
+     * @param tagNo The tag number
+     */
+    public Asn1Object(int tagFlags, int tagNo) {
+        this(TagClass.fromTagFlags(tagFlags), tagNo);
+        setTagFlags(tagFlags);
+    }
+
+    /**
+     * Constructor with a value, generally for encoding of the value
+     * @param tagClass The tag class
+     * @param tagNo The tag number
+     */
+    public Asn1Object(TagClass tagClass, int tagNo) {
+        this.tagClass = tagClass;
+        this.tagNo = tagNo;
+
+        this.tagFlags |= tagClass.getValue();
+    }
+
+    @Override
+    public TagClass tagClass() {
+        return tagClass;
+    }
+
+    protected void setTagClass(TagClass tagClass) {
+        this.tagClass = tagClass;
+    }
+
+    @Override
+    public int tagFlags() {
+        return tagFlags;
+    }
+
+    @Override
+    public int tagNo() {
+        return tagNo;
+    }
+
+    protected void setTagFlags(int tagFlags) {
+        this.tagFlags = tagFlags & 0xe0;
+    }
+
+    protected void setTagNo(int tagNo) {
+        this.tagNo = tagNo;
+    }
+
+    @Override
+    public void usePrimitive(boolean isPrimitive) {
+        if (isPrimitive) {
+            tagFlags &= ~CONSTRUCTED_FLAG;
+        } else {
+            tagFlags |= CONSTRUCTED_FLAG;
+        }
+    }
+
+    @Override
+    public boolean isPrimitive() {
+        return (tagFlags & CONSTRUCTED_FLAG) == 0;
+    }
+
+    @Override
+    public void useDefinitiveLength(boolean isDefinitiveLength) {
+        this.isDefinitiveLength = isDefinitiveLength;
+    }
+
+    @Override
+    public boolean isDefinitiveLength() {
+        return isDefinitiveLength;
+    }
+
+    @Override
+    public void useImplicit(boolean isImplicit) {
+        this.isImplicit = isImplicit;
+    }
+
+    @Override
+    public boolean isImplicit() {
+        return isImplicit;
+    }
+
+    @Override
+    public void useDER() {
+        this.encodingType = EncodingType.DER;
+    }
+
+    @Override
+    public boolean isDER() {
+        return encodingType == EncodingType.DER;
+    }
+
+    @Override
+    public void useBER() {
+        this.encodingType = EncodingType.BER;
+    }
+
+    @Override
+    public boolean isBER() {
+        return encodingType == EncodingType.BER;
+    }
+
+    @Override
+    public void useCER() {
+        this.encodingType = EncodingType.CER;
+    }
+
+    @Override
+    public boolean isCER() {
+        return encodingType == EncodingType.CER;
+    }
+
+    @Override
+    public byte[] encode() {
+        ByteBuffer byteBuffer = ByteBuffer.allocate(encodingLength());
+        encode(byteBuffer);
+        byteBuffer.flip();
+        return byteBuffer.array();
+    }
+
+    @Override
+    public void encode(ByteBuffer buffer) {
+        encodeTag(buffer, tagFlags(), tagNo());
+        encodeLength(buffer, encodingBodyLength());
+        encodeBody(buffer);
+    }
+
+    protected void encodeBody(ByteBuffer buffer) { }
+
+    @Override
+    public void decode(byte[] content) throws IOException {
+        decode(new LimitedByteBuffer(content));
+    }
+
+    @Override
+    public void decode(ByteBuffer content) throws IOException {
+        decode(new LimitedByteBuffer(content));
+    }
+
+    @Override
+    public int encodingLength() {
+        if (encodingLen == -1) {
+            int bodyLen = encodingBodyLength();
+            encodingLen = lengthOfTagLength(tagNo()) + lengthOfBodyLength(bodyLen) + bodyLen;
+        }
+        return encodingLen;
+    }
+
+    public boolean isUniversal() {
+        return tagClass.isUniversal();
+    }
+
+    public boolean isAppSpecific() {
+        return tagClass.isAppSpecific();
+    }
+
+    public boolean isContextSpecific() {
+        return tagClass.isContextSpecific();
+    }
+
+    public boolean isTagged() {
+        return tagClass.isTagged();
+    }
+
+    public boolean isSimple() {
+        return isUniversal() && Asn1Simple.isSimple(tagNo);
+    }
+
+    public boolean isCollection() {
+        return isUniversal() && Asn1Collection.isCollection(tagNo);
+    }
+
+    protected abstract int encodingBodyLength();
+
+    protected void decode(LimitedByteBuffer content) throws IOException {
+        int tag = readTag(content);
+        int tagNo = readTagNo(content, tag);
+        int tmpTagFlags = tag & 0xe0;
+        int length = readLength(content);
+
+        decode(tmpTagFlags, tagNo, new LimitedByteBuffer(content, length));
+    }
+
+    public void decode(int tagFlags, int tagNo,
+                       LimitedByteBuffer content) throws IOException {
+        if (tagClass() != TagClass.UNKNOWN && tagClass()
+                != TagClass.fromTagFlags(tagFlags)) {
+            throw new IOException("Unexpected tagFlags " + tagFlags
+                    + ", expecting " + tagClass());
+        }
+        if (tagNo() != -1 && tagNo() != tagNo) {
+            throw new IOException("Unexpected tagNo " + tagNo + ", "
+                    + "expecting " + tagNo());
+        }
+
+        setTagClass(TagClass.fromTagFlags(tagFlags));
+        setTagFlags(tagFlags);
+        setTagNo(tagNo);
+
+        decodeBody(content);
+    }
+
+    protected abstract void decodeBody(LimitedByteBuffer content) throws IOException;
+
+    protected int taggedEncodingLength(TaggingOption taggingOption) {
+        int taggingTagNo = taggingOption.getTagNo();
+        int taggingBodyLen = taggingOption.isImplicit() ? encodingBodyLength()
+                : encodingLength();
+        int taggingEncodingLen = lengthOfTagLength(taggingTagNo)
+                + lengthOfBodyLength(taggingBodyLen) + taggingBodyLen;
+        return taggingEncodingLen;
+    }
+
+    public byte[] taggedEncode(TaggingOption taggingOption) {
+        ByteBuffer byteBuffer = ByteBuffer.allocate(taggedEncodingLength(taggingOption));
+        taggedEncode(byteBuffer, taggingOption);
+        byteBuffer.flip();
+        return byteBuffer.array();
+    }
+
+    @Override
+    public void taggedEncode(ByteBuffer buffer, TaggingOption taggingOption) {
+        int taggingTagFlags = taggingOption.tagFlags(!isPrimitive());
+        encodeTag(buffer, taggingTagFlags, taggingOption.getTagNo());
+        int taggingBodyLen = taggingOption.isImplicit() ? encodingBodyLength()
+                : encodingLength();
+        encodeLength(buffer, taggingBodyLen);
+        if (taggingOption.isImplicit()) {
+            encodeBody(buffer);
+        } else {
+            encode(buffer);
+        }
+    }
+
+    public void taggedDecode(byte[] content,
+                             TaggingOption taggingOption) throws IOException {
+        taggedDecode(ByteBuffer.wrap(content), taggingOption);
+    }
+
+    @Override
+    public void taggedDecode(ByteBuffer content,
+                             TaggingOption taggingOption) throws IOException {
+        LimitedByteBuffer limitedBuffer = new LimitedByteBuffer(content);
+        taggedDecode(limitedBuffer, taggingOption);
+    }
+
+    protected void taggedDecode(LimitedByteBuffer content,
+                                TaggingOption taggingOption) throws IOException {
+        int taggingTag = readTag(content);
+        int taggingTagNo = readTagNo(content, taggingTag);
+        int taggingLength = readLength(content);
+        LimitedByteBuffer newContent = new LimitedByteBuffer(content, taggingLength);
+
+        int tmpTagFlags = taggingTag & 0xe0;
+        taggedDecode(tmpTagFlags, taggingTagNo, newContent, taggingOption);
+    }
+
+    protected void taggedDecode(int taggingTagFlags, int taggingTagNo,
+                                LimitedByteBuffer content,
+                                TaggingOption taggingOption) throws IOException {
+        int expectedTaggingTagFlags = taggingOption.tagFlags(!isPrimitive());
+        if (expectedTaggingTagFlags != taggingTagFlags) {
+            throw new IOException("Unexpected tag flags " + taggingTagFlags
+                    + ", expecting " + expectedTaggingTagFlags);
+        }
+        if (taggingOption.getTagNo() != taggingTagNo) {
+            throw new IOException("Unexpected tagNo " + taggingTagNo + ", "
+                    + "expecting " + taggingOption.getTagNo());
+        }
+
+        if (taggingOption.isImplicit()) {
+            decodeBody(content);
+        } else {
+            decode(content);
+        }
+    }
+
+    public static Asn1Item decodeOne(LimitedByteBuffer content) throws IOException {
+        int tag = readTag(content);
+        int tagNo = readTagNo(content, tag);
+        int length = readLength(content);
+        if (length < 0) {
+            throw new IOException("Unexpected length");
+        }
+        LimitedByteBuffer valueContent = new LimitedByteBuffer(content, length);
+        content.skip(length);
+
+        Asn1Item result = new Asn1Item(tag, tagNo, valueContent);
+        if (result.isSimple()) {
+            result.decodeValueAsSimple();
+        }
+        return result;
+    }
+
+    public static void skipOne(LimitedByteBuffer content) throws IOException {
+        int tag = readTag(content);
+        readTagNo(content, tag);
+        int length = readLength(content);
+        if (length < 0) {
+            throw new IOException("Unexpected length");
+        }
+        content.skip(length);
+    }
+
+    public static int lengthOfBodyLength(int bodyLength) {
+        int length = 1;
+
+        if (bodyLength > 127) {
+            int payload = bodyLength;
+            while (payload != 0) {
+                payload >>= 8;
+                length++;
+            }
+        }
+
+        return length;
+    }
+
+    public static int lengthOfTagLength(int tagNo) {
+        int length = 1;
+
+        if (tagNo >= 31) {
+            if (tagNo < 128) {
+                length++;
+            } else {
+                length++;
+
+                do {
+                    tagNo >>= 7;
+                    length++;
+                } while (tagNo > 127);
+            }
+        }
+
+        return length;
+    }
+
+    public static void encodeTag(ByteBuffer buffer, int flags, int tagNo) {
+        if (tagNo < 31) {
+            buffer.put((byte) (flags | tagNo));
+        } else {
+            buffer.put((byte) (flags | 0x1f));
+            if (tagNo < 128) {
+                buffer.put((byte) tagNo);
+            } else {
+                byte[] tmpBytes = new byte[5]; // 5 * 7 > 32
+                int iPut = tmpBytes.length;
+
+                tmpBytes[--iPut] = (byte) (tagNo & 0x7f);
+                do {
+                    tagNo >>= 7;
+                    tmpBytes[--iPut] = (byte) (tagNo & 0x7f | 0x80);
+                } while (tagNo > 127);
+
+                buffer.put(tmpBytes, iPut, tmpBytes.length - iPut);
+            }
+        }
+    }
+
+    public static void encodeLength(ByteBuffer buffer, int bodyLength) {
+        if (bodyLength < 128) {
+            buffer.put((byte) bodyLength);
+        } else {
+            int length = 0;
+            int payload = bodyLength;
+
+            while (payload != 0) {
+                payload >>= 8;
+                length++;
+            }
+
+            buffer.put((byte) (length | 0x80));
+
+            payload = bodyLength;
+            for (int i = length - 1; i >= 0; i--) {
+                buffer.put((byte) (payload >> (i * 8)));
+            }
+        }
+    }
+
+    public static int readTag(LimitedByteBuffer buffer) throws IOException {
+        int tag = buffer.readByte() & 0xff;
+        if (tag == 0) {
+            throw new IOException("Bad tag 0 found");
+        }
+        return tag;
+    }
+
+    public static int readTagNo(LimitedByteBuffer buffer, int tag) throws IOException {
+        int tagNo = tag & 0x1f;
+
+        if (tagNo == 0x1f) {
+            tagNo = 0;
+
+            int b = buffer.readByte() & 0xff;
+            if ((b & 0x7f) == 0) {
+                throw new IOException("Invalid high tag number found");
+            }
+
+            while (b >= 0 && (b & 0x80) != 0) {
+                tagNo |= b & 0x7f;
+                tagNo <<= 7;
+                b = buffer.readByte();
+            }
+
+            tagNo |= b & 0x7f;
+        }
+
+        return tagNo;
+    }
+
+    public static int readLength(LimitedByteBuffer buffer) throws IOException {
+        int bodyLength = buffer.readByte() & 0xff;
+
+        if (bodyLength > 127) {
+            int length = bodyLength & 0x7f;
+            if (length > 4) {
+                throw new IOException("Bad bodyLength of more than 4 bytes: " + length);
+            }
+
+            bodyLength = 0;
+            int tmp;
+            for (int i = 0; i < length; i++) {
+                tmp = buffer.readByte() & 0xff;
+                bodyLength = (bodyLength << 8) + tmp;
+            }
+
+            if (bodyLength < 0) {
+                throw new IOException("Invalid bodyLength " + bodyLength);
+            }
+            if (bodyLength > buffer.hasLeft()) {
+                throw new IOException("Corrupt stream - less data "
+                        + buffer.hasLeft() + " than expected " + bodyLength);
+            }
+        }
+
+        return bodyLength;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/800e02fd/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1SequenceType.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1SequenceType.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1SequenceType.java
index bcbf715..4733838 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1SequenceType.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1SequenceType.java
@@ -19,6 +19,7 @@
  */
 package org.apache.kerby.asn1.type;
 
+import org.apache.kerby.asn1.Asn1FieldInfo;
 import org.apache.kerby.asn1.UniversalTag;
 
 /**

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/800e02fd/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1SetType.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1SetType.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1SetType.java
index 4f13369..b320224 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1SetType.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/Asn1SetType.java
@@ -19,6 +19,7 @@
  */
 package org.apache.kerby.asn1.type;
 
+import org.apache.kerby.asn1.Asn1FieldInfo;
 import org.apache.kerby.asn1.UniversalTag;
 
 /**

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/800e02fd/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/ExplicitField.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/ExplicitField.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/ExplicitField.java
deleted file mode 100644
index abb42ce..0000000
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/ExplicitField.java
+++ /dev/null
@@ -1,44 +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.asn1.type;
-
-/**
- * Representing an explicitly tagged field in a ASN1 collection or choice.
- */
-public class ExplicitField extends Asn1FieldInfo {
-
-    /**
-     * Constructor for an explicitly tagged field.
-     * @param index
-     * @param type
-     */
-    public ExplicitField(int index, int tagNo, Class<? extends Asn1Type> type) {
-        super(index, tagNo, type, false);
-    }
-
-    /**
-     * Constructor for an explicitly tagged field, the tagNo being the same of index.
-     * @param index
-     * @param type
-     */
-    public ExplicitField(int index, Class<? extends Asn1Type> type) {
-        super(index, index, type, false);
-    }
-}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/800e02fd/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/ImplicitField.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/ImplicitField.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/ImplicitField.java
deleted file mode 100644
index b64bc4f..0000000
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/ImplicitField.java
+++ /dev/null
@@ -1,44 +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.asn1.type;
-
-/**
- * Representing an implicitly tagged field in a ASN1 collection or choice.
- */
-public class ImplicitField extends Asn1FieldInfo {
-
-    /**
-     * Constructor for an implicitly tagged field.
-     * @param index
-     * @param type
-     */
-    public ImplicitField(int index, int tagNo, Class<? extends Asn1Type> type) {
-        super(index, tagNo, type, true);
-    }
-
-    /**
-     * Constructor for an implicitly tagged field, the tagNo being the same of index.
-     * @param index
-     * @param type
-     */
-    public ImplicitField(int index, Class<? extends Asn1Type> type) {
-        super(index, index, type, true);
-    }
-}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/800e02fd/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/TaggingCollection.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/TaggingCollection.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/TaggingCollection.java
index 1d810a3..bac51b0 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/TaggingCollection.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/TaggingCollection.java
@@ -19,6 +19,7 @@
  */
 package org.apache.kerby.asn1.type;
 
+import org.apache.kerby.asn1.Asn1FieldInfo;
 import org.apache.kerby.asn1.LimitedByteBuffer;
 import org.apache.kerby.asn1.TagClass;
 

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/800e02fd/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/TaggingSequence.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/TaggingSequence.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/TaggingSequence.java
index eab2aaf..0bd9fbb 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/TaggingSequence.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/TaggingSequence.java
@@ -19,6 +19,8 @@
  */
 package org.apache.kerby.asn1.type;
 
+import org.apache.kerby.asn1.Asn1FieldInfo;
+
 /**
  * For tagging a sequence type with tagNo, either application specific or context specific class
  */

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/800e02fd/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/TaggingSet.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/TaggingSet.java b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/TaggingSet.java
index 444102b..52158cb 100644
--- a/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/TaggingSet.java
+++ b/kerby-asn1/src/main/java/org/apache/kerby/asn1/type/TaggingSet.java
@@ -19,6 +19,8 @@
  */
 package org.apache.kerby.asn1.type;
 
+import org.apache.kerby.asn1.Asn1FieldInfo;
+
 /**
  * For tagging a sequence type with tagNo, either application specific or context specific class
  */

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/800e02fd/kerby-asn1/src/test/java/org/apache/kerby/asn1/PersonnelRecord.java
----------------------------------------------------------------------
diff --git a/kerby-asn1/src/test/java/org/apache/kerby/asn1/PersonnelRecord.java b/kerby-asn1/src/test/java/org/apache/kerby/asn1/PersonnelRecord.java
index 72da457..ee4c96e 100644
--- a/kerby-asn1/src/test/java/org/apache/kerby/asn1/PersonnelRecord.java
+++ b/kerby-asn1/src/test/java/org/apache/kerby/asn1/PersonnelRecord.java
@@ -19,14 +19,11 @@
  */
 package org.apache.kerby.asn1;
 
-import org.apache.kerby.asn1.type.Asn1FieldInfo;
 import org.apache.kerby.asn1.type.Asn1Integer;
 import org.apache.kerby.asn1.type.Asn1SequenceOf;
 import org.apache.kerby.asn1.type.Asn1SetType;
 import org.apache.kerby.asn1.type.Asn1Tagging;
 import org.apache.kerby.asn1.type.Asn1VisibleString;
-import org.apache.kerby.asn1.type.ExplicitField;
-import org.apache.kerby.asn1.type.ImplicitField;
 import org.apache.kerby.asn1.type.TaggingSequence;
 import org.apache.kerby.asn1.type.TaggingSet;
 

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/800e02fd/kerby-backend/json-backend/src/main/java/org/apache/kerby/kerberos/kdc/identitybackend/JsonIdentityBackend.java
----------------------------------------------------------------------
diff --git a/kerby-backend/json-backend/src/main/java/org/apache/kerby/kerberos/kdc/identitybackend/JsonIdentityBackend.java b/kerby-backend/json-backend/src/main/java/org/apache/kerby/kerberos/kdc/identitybackend/JsonIdentityBackend.java
index cc1da07..b65ec0b 100644
--- a/kerby-backend/json-backend/src/main/java/org/apache/kerby/kerberos/kdc/identitybackend/JsonIdentityBackend.java
+++ b/kerby-backend/json-backend/src/main/java/org/apache/kerby/kerberos/kdc/identitybackend/JsonIdentityBackend.java
@@ -30,9 +30,9 @@ import org.apache.kerby.kerberos.kerb.KrbException;
 import org.apache.kerby.kerberos.kerb.identity.BatchTrans;
 import org.apache.kerby.kerberos.kerb.identity.KrbIdentity;
 import org.apache.kerby.kerberos.kerb.identity.backend.AbstractIdentityBackend;
-import org.apache.kerby.kerberos.kerb.spec.KerberosTime;
-import org.apache.kerby.kerberos.kerb.spec.base.EncryptionKey;
-import org.apache.kerby.kerberos.kerb.spec.base.PrincipalName;
+import org.apache.kerby.kerberos.kerb.type.KerberosTime;
+import org.apache.kerby.kerberos.kerb.type.base.EncryptionKey;
+import org.apache.kerby.kerberos.kerb.type.base.PrincipalName;
 import org.apache.kerby.util.IOUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/800e02fd/kerby-backend/json-backend/src/main/java/org/apache/kerby/kerberos/kdc/identitybackend/typeAdapter/EncryptionKeyAdapter.java
----------------------------------------------------------------------
diff --git a/kerby-backend/json-backend/src/main/java/org/apache/kerby/kerberos/kdc/identitybackend/typeAdapter/EncryptionKeyAdapter.java b/kerby-backend/json-backend/src/main/java/org/apache/kerby/kerberos/kdc/identitybackend/typeAdapter/EncryptionKeyAdapter.java
index ff0dfdd..fd3fd20 100644
--- a/kerby-backend/json-backend/src/main/java/org/apache/kerby/kerberos/kdc/identitybackend/typeAdapter/EncryptionKeyAdapter.java
+++ b/kerby-backend/json-backend/src/main/java/org/apache/kerby/kerberos/kdc/identitybackend/typeAdapter/EncryptionKeyAdapter.java
@@ -26,7 +26,7 @@ import com.google.gson.JsonObject;
 import com.google.gson.JsonParseException;
 import com.google.gson.JsonSerializationContext;
 import com.google.gson.JsonSerializer;
-import org.apache.kerby.kerberos.kerb.spec.base.EncryptionKey;
+import org.apache.kerby.kerberos.kerb.type.base.EncryptionKey;
 import org.apache.kerby.util.HexUtil;
 
 import java.io.IOException;

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/800e02fd/kerby-backend/json-backend/src/main/java/org/apache/kerby/kerberos/kdc/identitybackend/typeAdapter/KerberosTimeAdapter.java
----------------------------------------------------------------------
diff --git a/kerby-backend/json-backend/src/main/java/org/apache/kerby/kerberos/kdc/identitybackend/typeAdapter/KerberosTimeAdapter.java b/kerby-backend/json-backend/src/main/java/org/apache/kerby/kerberos/kdc/identitybackend/typeAdapter/KerberosTimeAdapter.java
index 7c4b6eb..7a499d5 100644
--- a/kerby-backend/json-backend/src/main/java/org/apache/kerby/kerberos/kdc/identitybackend/typeAdapter/KerberosTimeAdapter.java
+++ b/kerby-backend/json-backend/src/main/java/org/apache/kerby/kerberos/kdc/identitybackend/typeAdapter/KerberosTimeAdapter.java
@@ -26,7 +26,7 @@ import com.google.gson.JsonParseException;
 import com.google.gson.JsonPrimitive;
 import com.google.gson.JsonSerializationContext;
 import com.google.gson.JsonSerializer;
-import org.apache.kerby.kerberos.kerb.spec.KerberosTime;
+import org.apache.kerby.kerberos.kerb.type.KerberosTime;
 
 import java.lang.reflect.Type;
 

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/800e02fd/kerby-backend/json-backend/src/main/java/org/apache/kerby/kerberos/kdc/identitybackend/typeAdapter/PrincipalNameAdapter.java
----------------------------------------------------------------------
diff --git a/kerby-backend/json-backend/src/main/java/org/apache/kerby/kerberos/kdc/identitybackend/typeAdapter/PrincipalNameAdapter.java b/kerby-backend/json-backend/src/main/java/org/apache/kerby/kerberos/kdc/identitybackend/typeAdapter/PrincipalNameAdapter.java
index d9d61a4..6946193 100644
--- a/kerby-backend/json-backend/src/main/java/org/apache/kerby/kerberos/kdc/identitybackend/typeAdapter/PrincipalNameAdapter.java
+++ b/kerby-backend/json-backend/src/main/java/org/apache/kerby/kerberos/kdc/identitybackend/typeAdapter/PrincipalNameAdapter.java
@@ -26,7 +26,7 @@ import com.google.gson.JsonParseException;
 import com.google.gson.JsonPrimitive;
 import com.google.gson.JsonSerializationContext;
 import com.google.gson.JsonSerializer;
-import org.apache.kerby.kerberos.kerb.spec.base.PrincipalName;
+import org.apache.kerby.kerberos.kerb.type.base.PrincipalName;
 
 import java.lang.reflect.Type;