You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2010/11/05 00:48:50 UTC

svn commit: r1031354 [3/4] - in /directory/apacheds/trunk/kerberos-codec: ./ .settings/ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/directory/ src/main/java/org/apache/directory/shared/ src/main/j...

Added: directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/codec/KerberosStatesEnum.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/codec/KerberosStatesEnum.java?rev=1031354&view=auto
==============================================================================
--- directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/codec/KerberosStatesEnum.java (added)
+++ directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/codec/KerberosStatesEnum.java Thu Nov  4 23:48:49 2010
@@ -0,0 +1,121 @@
+/*
+ *  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.directory.shared.kerberos.codec;
+
+
+import org.apache.directory.shared.asn1.ber.grammar.Grammar;
+import org.apache.directory.shared.asn1.ber.grammar.States;
+
+
+/**
+ * This class store the Kerberos grammar's constants. It is also used for debugging
+ * purpose
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public enum KerberosStatesEnum implements States
+{
+    // ~ Static fields/initializers
+    // -----------------------------------------------------------------
+
+    /** The END_STATE */
+    END_STATE,
+
+    // Start
+    START_STATE,
+    
+    // ----- Ticket message --------------------------------------------
+    TICKET_STATE,
+    TICKET_SEQ_STATE,
+    
+    TICKET_VNO_TAG_STATE,
+    TICKET_VNO_STATE,
+    
+    TICKET_REALM_TAG_STATE,
+    TICKET_REALM_STATE,
+    
+    TICKET_SNAME_TAG_STATE,
+
+    TICKET_ENC_PART_TAG_STATE,
+    
+    // End
+    LAST_KERBEROS_STATE;
+
+    
+    /**
+     * Get the grammar name
+     * 
+     * @param grammar The grammar code
+     * @return The grammar name
+     */
+    public String getGrammarName( int grammar )
+    {
+        return "KERBEROS_MESSAGE_GRAMMAR";
+    }
+
+
+    /**
+     * Get the grammar name
+     * 
+     * @param grammar The grammar class
+     * @return The grammar name
+     */
+    public String getGrammarName( Grammar grammar )
+    {
+        if ( grammar instanceof KerberosMessageGrammar )
+        {
+            return "KERBEROS_MESSAGE_GRAMMAR";
+        }
+        else
+        {
+            return "UNKNOWN GRAMMAR";
+        }
+    }
+
+
+    /**
+     * Get the string representing the state
+     * 
+     * @param state The state number
+     * @return The String representing the state
+     */
+    public String getState( int state )
+    {
+        return ( ( state == END_STATE.ordinal() ) ? "KERBEROS_MESSAGE_END_STATE" : name() );
+    }
+
+    
+    /**
+     * {@inheritDoc}
+     */
+    public boolean isEndState()
+    {
+        return this == END_STATE;
+    }
+    
+    
+    /**
+     * {@inheritDoc}
+     */
+    public KerberosStatesEnum getStartState()
+    {
+        return START_STATE;
+    }
+}

Added: directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/components/EncryptedData.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/components/EncryptedData.java?rev=1031354&view=auto
==============================================================================
--- directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/components/EncryptedData.java (added)
+++ directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/components/EncryptedData.java Thu Nov  4 23:48:49 2010
@@ -0,0 +1,331 @@
+/*
+ *  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.directory.shared.kerberos.components;
+
+
+import java.nio.BufferOverflowException;
+import java.nio.ByteBuffer;
+
+import org.apache.directory.server.i18n.I18n;
+import org.apache.directory.shared.asn1.AbstractAsn1Object;
+import org.apache.directory.shared.asn1.ber.tlv.TLV;
+import org.apache.directory.shared.asn1.ber.tlv.UniversalTag;
+import org.apache.directory.shared.asn1.ber.tlv.Value;
+import org.apache.directory.shared.asn1.codec.EncoderException;
+import org.apache.directory.shared.ldap.util.StringTools;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * A structure storing an encrypted data element. The ASN.1 grammar is :
+ * 
+ * EncryptedData   ::= SEQUENCE {
+ *        etype   [0] Int32 -- EncryptionType --,
+ *        kvno    [1] UInt32 OPTIONAL,
+ *        cipher  [2] OCTET STRING -- ciphertext
+ * }
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class EncryptedData extends AbstractAsn1Object
+{
+    /** The logger */
+    private static final Logger log = LoggerFactory.getLogger( EncryptedData.class );
+
+    /** Speedup for logs */
+    private static final boolean IS_DEBUG = log.isDebugEnabled();
+
+    /** The used encryption algorithm */
+    private EncryptionType eType;
+
+    /** Version number of the key under which data is encrypted */
+    private int kvno;
+
+    /** A flag used to tell if a kvno has been added, as the kvno is optional. */
+    private boolean hasKvno;
+
+    /** The field containing the enciphered text */
+    private byte[] cipher;
+
+    /** A constant used when the key is not present */
+    public static final boolean HAS_KVNO = true;
+
+    // Storage for computed lengths
+    private transient int eTypeTagLength;
+    private transient int kvnoTagLength;
+    private transient int cipherTagLength;
+    private transient int encryptedDataSeqLength;
+
+
+    /**
+     * Creates a new instance of EncryptedData.
+     */
+    public EncryptedData()
+    {
+        hasKvno = !HAS_KVNO;
+    }
+    
+    /**
+     * Creates a new instance of EncryptedData.
+     *
+     * @param eType The encription algorithm
+     * @param kvno The key version
+     * @param cipher the encrypted text
+     */
+    public EncryptedData( EncryptionType eType, int kvno, byte[] cipher )
+    {
+        this.eType = eType;
+        this.hasKvno = kvno > 0;
+        this.kvno = kvno;
+        this.cipher = cipher;
+    }
+
+
+    /**
+     * Creates a new instance of EncryptedData.
+     *
+     * @param eType The encription algorithm
+     * @param cipher the encrypted text
+     */
+    public EncryptedData( EncryptionType eType, byte[] cipher )
+    {
+        this.eType = eType;
+        this.hasKvno = !HAS_KVNO;
+        kvno = -1;
+        this.cipher = cipher;
+    }
+
+
+    /**
+     * Returns the {@link EncryptionType}.
+     *
+     * @return The {@link EncryptionType}.
+     */
+    public EncryptionType getEType()
+    {
+        return eType;
+    }
+
+
+    /**
+     * Set the EncryptionType
+     * @param eType the EncryptionType
+     */
+    public void setEType( EncryptionType eType )
+    {
+        this.eType = eType;
+    }
+
+    /**
+     * Returns the key version.
+     *
+     * @return The key version.
+     */
+    public int getKvno()
+    {
+        return hasKvno ? kvno : -1;
+    }
+
+    /**
+     * Set the key version
+     * @param kvno The key version
+     */
+    public void setKvno( int kvno )
+    {
+        this.kvno = kvno;
+    }
+
+    /**
+     * Tells if there is a key version.
+     *
+     * @return <code>true</code> if there is a key version.
+     */
+    public boolean hasKvno()
+    {
+        return hasKvno;
+    }
+
+
+    /**
+     * Returns the raw cipher text.
+     *
+     * @return The raw cipher text.
+     */
+    public byte[] getCipher()
+    {
+        return cipher;
+    }
+
+    /**
+     * Set the cipher text
+     * @param cipher The cipher text
+     */
+    public void setCipher( byte[] cipher )
+    {
+        this.cipher = cipher;
+    }
+    
+
+    /**
+     * Compute the EncryptedData length
+     * 
+     * EncryptedData :
+     * 
+     * 0x30 L1 EncryptedData sequence
+     *  |
+     *  +--> 0xA1 L2 etype tag
+     *  |     |
+     *  |     +--> 0x02 L2-1 etype (int)
+     *  |
+     *  +--> [0xA2 L3 kvno tag
+     *  |     |
+     *  |     +--> 0x30 L3-1 kvno (int)] (optional)
+     *  |
+     *  +--> 0xA2 L4 cipher tag
+     *        |
+     *        +--> 0x04 L4-1 cipher (OCTET STRING)
+     */
+    public int computeLength()
+    {
+        encryptedDataSeqLength = 0;
+
+        // Compute the encryption Type length
+        int eTypeLength = Value.getNbBytes( eType.getOrdinal() );
+        eTypeTagLength = 1 + TLV.getNbBytes( eTypeLength ) + eTypeLength;
+        encryptedDataSeqLength = 1 + TLV.getNbBytes( eTypeTagLength ) + eTypeTagLength; 
+
+
+        // Compute the kvno length if any
+        if ( hasKvno )
+        {
+            int kvnoLength = Value.getNbBytes( kvno );
+            kvnoTagLength = 1 + TLV.getNbBytes( kvnoLength ) + kvnoLength;
+            encryptedDataSeqLength += 1 + TLV.getNbBytes( kvnoTagLength ) + kvnoTagLength;
+        }
+        else
+        {
+            kvnoTagLength = 0;
+        }
+
+        // Compute the cipher
+        if ( ( cipher == null ) || ( cipher.length == 0 ) )
+        {
+            cipherTagLength = 1 + 1;
+        }
+        else
+        {
+            cipherTagLength = 1 + TLV.getNbBytes( cipher.length ) + cipher.length;
+        }
+
+        encryptedDataSeqLength += 1 + TLV.getNbBytes( cipherTagLength ) + cipherTagLength;
+
+        // Compute the whole sequence length
+        return 1 + TLV.getNbBytes( encryptedDataSeqLength ) + encryptedDataSeqLength;
+    }
+
+
+    /**
+     * Encode the EncryptedData message to a PDU. 
+     * 
+     * EncryptedData :
+     * 
+     * 0x30 LL
+     *   0xA0 LL 
+     *     0x02 0x01 etype (integer)
+     *   [0xA1 LL 
+     *     0x02 0x01 kvno (integer)] (optional)
+     *   0xA2 LL 
+     *     0x04 LL cipher (OCTET STRING)
+     * 
+     * @param buffer The buffer where to put the PDU. It should have been allocated
+     * before, with the right size.
+     * @return The constructed PDU.
+     */
+    public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException
+    {
+        if ( buffer == null )
+        {
+            throw new EncoderException( I18n.err( I18n.ERR_148 ) );
+        }
+
+        try
+        {
+            // The EncryptedData SEQ Tag
+            buffer.put( UniversalTag.SEQUENCE.getValue() );
+            buffer.put( TLV.getBytes( encryptedDataSeqLength ) );
+
+            // The etype, first the tag, then the value
+            buffer.put( ( byte ) 0xA0 );
+            buffer.put( TLV.getBytes( eTypeTagLength ) );
+
+            Value.encode( buffer, eType.getOrdinal() );
+
+            // The kvno, if any, first the tag, then the value
+            if ( hasKvno )
+            {
+                buffer.put( ( byte ) 0xA1 );
+                buffer.put( TLV.getBytes( kvnoTagLength ) );
+
+                Value.encode( buffer, kvno );
+            }
+
+            // The cipher tag
+            buffer.put( ( byte ) 0xA2 );
+            buffer.put( TLV.getBytes( cipherTagLength ) );
+            Value.encode( buffer, cipher );
+        }
+        catch ( BufferOverflowException boe )
+        {
+            log.error( I18n.err( I18n.ERR_141, 1 + TLV.getNbBytes( encryptedDataSeqLength ) 
+                + encryptedDataSeqLength, buffer.capacity() ) );
+            throw new EncoderException( I18n.err( I18n.ERR_138 ) );
+        }
+
+        if ( IS_DEBUG )
+        {
+            log.debug( "EncryptedData encoding : {}", StringTools.dumpBytes( buffer.array() ) );
+            log.debug( "EncryptedData initial value : {}", toString() );
+        }
+
+        return buffer;
+    }
+
+
+    /**
+     * @see Object#toString()
+     */
+    public String toString()
+    {
+        StringBuilder sb = new StringBuilder();
+
+        sb.append( "EncryptedData : {\n" );
+        sb.append( "    etype: " ).append( eType ).append( '\n' );
+
+        if ( hasKvno )
+        {
+            sb.append( "    kvno: " ).append( kvno ).append( '\n' );
+        }
+
+        sb.append( "    cipher: " ).append( StringTools.dumpBytes( cipher ) ).append( "\n}\n" );
+
+        return sb.toString();
+    }
+}

Added: directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/components/EncryptionType.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/components/EncryptionType.java?rev=1031354&view=auto
==============================================================================
--- directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/components/EncryptionType.java (added)
+++ directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/components/EncryptionType.java Thu Nov  4 23:48:49 2010
@@ -0,0 +1,278 @@
+/*
+ *  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.directory.shared.kerberos.components;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * A type-safe enumeration of Kerberos encryption types.
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public enum EncryptionType
+{
+    /**
+     * The "unknown" encryption type.
+     */
+    UNKNOWN( -1, "UNKNOWN" ),
+
+    /**
+     * The "null" encryption type.
+     */
+    NULL( 0, "null" ),
+
+    /**
+     * The des-cbc-crc encryption type.
+     */
+    DES_CBC_CRC( 1, "des-cbc-crc" ),
+
+    /**
+     * The des-cbc-md4 encryption type.
+     */
+    DES_CBC_MD4( 2, "des-cbc-md4" ),
+
+    /**
+     * The des-cbc-md5 encryption type.
+     */
+    DES_CBC_MD5( 3, "des-cbc-md5" ),
+
+    /**
+     * The reserved (4) encryption type.
+     */
+    RESERVED4( 4, "[reserved]" ),
+
+    /**
+     * The des3-cbc-md5 encryption type.
+     */
+    DES3_CBC_MD5( 5, "des3-cbc-md5" ),
+
+    /**
+     * The reserved (6) encryption type.
+     */
+    RESERVED6( 6, "[reserved]" ),
+
+    /**
+     * The des3-cbc-sha1 encryption type.
+     */
+    DES3_CBC_SHA1( 7, "des3-cbc-sha1" ),
+
+    /**
+     * The dsaWithSHA1-CmsOID encryption type.
+     */
+    DSAWITHSHA1_CMSOID( 9, "dsaWithSHA1-CmsOID" ),
+
+    /**
+     * The md5WithRSAEncryption-CmsOID encryption type.
+     */
+    MD5WITHRSAENCRYPTION_CMSOID( 10, "md5WithRSAEncryption-CmsOID" ),
+
+    /**
+     * The sha1WithRSAEncryption-CmsOID encryption type.
+     */
+    SHA1WITHRSAENCRYPTION_CMSOID( 11, "sha1WithRSAEncryption-CmsOID" ),
+
+    /**
+     * The rc2CBC-EnvOID encryption type.
+     */
+    RC2CBC_ENVOID( 12, "rc2CBC-EnvOID" ),
+
+    /**
+     * The rsaEncryption-EnvOID encryption type.
+     */
+    RSAENCRYPTION_ENVOID( 13, "rsaEncryption-EnvOID" ),
+
+    /**
+     * The rsaES-OAEP-ENV-OID encryption type.
+     */
+    RSAES_OAEP_ENV_OID( 14, "rsaES-OAEP-ENV-OID" ),
+
+    /**
+     * The des-ede3-cbc-Env-OID encryption type.
+     */
+    DES_EDE3_CBC_ENV_OID( 15, "des-ede3-cbc-Env-OID" ),
+
+    /**
+     * The des3-cbc-sha1-kd encryption type.
+     */
+    DES3_CBC_SHA1_KD( 16, "des3-cbc-sha1-kd" ),
+
+    /**
+     * The aes128-cts-hmac-sha1-96 encryption type.
+     */
+    AES128_CTS_HMAC_SHA1_96( 17, "aes128-cts-hmac-sha1-96" ),
+
+    /**
+     * The aes256-cts-hmac-sha1-96 encryption type.
+     */
+    AES256_CTS_HMAC_SHA1_96( 18, "aes256-cts-hmac-sha1-96" ),
+
+    /**
+     * The rc4-hmac encryption type.
+     */
+    RC4_HMAC( 23, "rc4-hmac" ),
+
+    /**
+     * The rc4-hmac-exp encryption type.
+     */
+    RC4_HMAC_EXP( 24, "rc4-hmac-exp" ),
+
+    /**
+     * The subkey-keymaterial encryption type.
+     */
+    SUBKEY_KEYMATERIAL( 65, "subkey-keymaterial" ),
+
+    /**
+     * The rc4-md4 encryption type.
+     */
+    RC4_MD4( -128, "rc4-md4" ),
+
+    /**
+     * The c4-hmac-old encryption type.
+     */
+    RC4_HMAC_OLD( -133, "rc4-hmac-old" ),
+
+    /**
+     * The rc4-hmac-old-exp encryption type.
+     */
+    RC4_HMAC_OLD_EXP( -135, "rc4-hmac-old-exp" );
+
+    /**
+     * The value/code for the encryption type.
+     */
+    private final int ordinal;
+
+    /**
+     * The name
+     */
+    private final String name;
+
+    /** A map containing all the values */
+    private static Map<String, EncryptionType> encryptionTypesByName = new HashMap<String, EncryptionType>();
+
+    /** A map containing all the values */
+    private static Map<Integer, EncryptionType> encryptionTypesByOrdinal = new HashMap<Integer, EncryptionType>();
+
+    /** Initialization of the previous map */
+    static
+    {
+        for ( EncryptionType type : EncryptionType.values() )
+        {
+            encryptionTypesByName.put( type.getName().toLowerCase(), type );
+            encryptionTypesByOrdinal.put( type.getOrdinal(), type );
+        }
+    }
+
+
+    /**
+     * Private constructor prevents construction outside of this class.
+     */
+    private EncryptionType( int ordinal, String name )
+    {
+        this.ordinal = ordinal;
+        this.name = name;
+    }
+
+    
+    /**
+     * Get all the encryption types
+     *
+     * @return A set of encryption types.
+     */
+    public static Collection<EncryptionType> getEncryptionTypes()
+    {
+        return encryptionTypesByName.values();
+    }
+
+    /**
+     * Returns the encryption type when specified by its ordinal.
+     *
+     * @param type
+     * @return The encryption type.
+     */
+    public static EncryptionType getTypeByOrdinal( int type )
+    {
+        if ( encryptionTypesByOrdinal.containsKey( type ) )
+        {
+            return encryptionTypesByOrdinal.get( type );
+        }
+        else
+        {
+            return UNKNOWN;
+        }
+    }
+
+
+    /**
+     * Returns the number associated with this encryption type.
+     *
+     * @return The encryption type number.
+     */
+    public int getOrdinal()
+    {
+        return ordinal;
+    }
+
+
+    /**
+     * Returns the name associated with this encryption type.
+     *
+     * @return The name.
+     */
+    public String getName()
+    {
+        return name;
+    }
+
+    /**
+     * Get the EncryptionType given a String.
+     * @param type The encryption string we want to find
+     * @return The found EncryptionType, or UNKNOWN
+     */
+    public static EncryptionType getByName( String type )
+    {
+        if ( type == null )
+        {
+            return UNKNOWN;
+        }
+        
+        String lcType = type.toLowerCase();
+        
+        if ( encryptionTypesByName.containsKey( lcType ) )
+        {
+            return encryptionTypesByName.get( lcType );
+        }
+        else
+        {
+            return UNKNOWN;
+        }
+    }
+    
+    
+    /**
+     * @see Object#toString()
+     */
+    public String toString()
+    {
+        return getName() + " (" + ordinal + ")";
+    }
+}

Added: directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/components/PrincipalName.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/components/PrincipalName.java?rev=1031354&view=auto
==============================================================================
--- directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/components/PrincipalName.java (added)
+++ directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/components/PrincipalName.java Thu Nov  4 23:48:49 2010
@@ -0,0 +1,478 @@
+/*
+ *  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.directory.server.kerberos.shared.messages.value;
+
+
+/**
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ *
+public class PrincipalName
+{
+    private String nameComponent;
+    private int nameType;
+
+
+    /**
+     * Creates a new instance of PrincipalName.
+     *
+     * @param nameComponent
+     * @param nameType
+     *
+    public PrincipalName( String nameComponent, int nameType )
+    {
+        this.nameComponent = nameComponent;
+        this.nameType = nameType;
+    }
+
+
+    /**
+     * Returns the type of the {@link PrincipalName}.
+     *
+     * @return The type of the {@link PrincipalName}.
+     *
+    public int getNameType()
+    {
+        return nameType;
+    }
+
+
+    /**
+     * Returns the name component.
+     *
+     * @return The name component.
+     *
+    public String getNameComponent()
+    {
+        return nameComponent;
+    }
+}*/
+
+/*
+ *  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.directory.shared.kerberos.components;
+
+
+import java.nio.BufferOverflowException;
+import java.nio.ByteBuffer;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.security.auth.kerberos.KerberosPrincipal;
+
+import org.apache.directory.server.i18n.I18n;
+import org.apache.directory.shared.asn1.AbstractAsn1Object;
+import org.apache.directory.shared.asn1.ber.tlv.TLV;
+import org.apache.directory.shared.asn1.ber.tlv.UniversalTag;
+import org.apache.directory.shared.asn1.ber.tlv.Value;
+import org.apache.directory.shared.asn1.codec.EncoderException;
+import org.apache.directory.shared.kerberos.KerberosUtils;
+import org.apache.directory.shared.ldap.util.StringTools;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * A principal Name, composed of a type and N names.
+ * 
+ * PrincipalName   ::= SEQUENCE {
+ *        name-type       [0] Int32,
+ *        name-string     [1] SEQUENCE OF KerberosString
+ * }
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class PrincipalName extends AbstractAsn1Object
+{
+    /** The logger */
+    private static final Logger LOG = LoggerFactory.getLogger( PrincipalName.class );
+
+    /** Speedup for logs */
+    private static final boolean IS_DEBUG = LOG.isDebugEnabled();
+
+    /** The type for this principal */
+    private PrincipalNameType nameType;
+
+    /** The principal name - we may have more than one - */
+    private List<String> nameString;
+    
+    /** The principal name as a byte[], for encoding purpose */
+    private transient List<byte[]> nameBytes;
+    
+    // Storage for computed lengths
+    private transient int principalNameSeqLength;
+    private transient int principalTypeTagLength;
+    private transient int principalTypeLength;
+    private transient int principalStringsTagLength;
+    private transient int principalStringsSeqLength;
+
+    /**
+     * Creates a new empty instance of PrincipalName.
+     */
+    public PrincipalName()
+    {
+    }
+
+    /**
+     * Creates a new instance of PrincipalName, given a KerberosPrincipal.
+     * 
+     * We assume that a principal has only one type, even if there are
+     * more than one name component.
+     *
+     * @param principal A Sun kerberosPrincipal instance
+     */
+    public PrincipalName( KerberosPrincipal principal )
+    {
+        try
+        {
+            nameString = KerberosUtils.getNames( principal );
+        }
+        catch ( ParseException pe )
+        {
+            nameString = KerberosUtils.EMPTY_PRINCIPAL_NAME;
+        }
+
+        this.nameType = PrincipalNameType.getTypeByOrdinal( principal.getNameType() );
+    }
+    
+    /**
+     * Creates a new instance of PrincipalName given a String and an 
+     * prinipal type.
+     * 
+     * @param nameString The name string, which can contains more than one nameComponent
+     * @param nameType The principal name
+     */
+    public PrincipalName( String nameString, PrincipalNameType nameType )  throws ParseException
+    {
+        this.nameString = KerberosUtils.getNames( nameString );
+        
+        this.nameType = nameType;
+    }
+
+
+    /**
+     * Creates a new instance of PrincipalName.
+     *
+     * @param nameString
+     * @param nameType
+     */
+    public PrincipalName( String nameString, int nameType ) throws ParseException
+    {
+        this.nameString = KerberosUtils.getNames( nameString );
+        
+        this.nameType = PrincipalNameType.getTypeByOrdinal( nameType );
+    }
+
+
+    /**
+     * Returns the type of the {@link PrincipalName}.
+     *
+     * @return The type of the {@link PrincipalName}.
+     */
+    public PrincipalNameType getNameType()
+    {
+        return nameType;
+    }
+                    
+    /** 
+     * Set the Principal name Type
+     * @param nameType the Principal name Type
+     */
+    public void setNameType( PrincipalNameType nameType )
+    {
+        this.nameType = nameType;
+    }
+
+    /** 
+     * Set the Principal name Type
+     * @param nameType the Principal name Type
+     */
+    public void setNameType( int nameType )
+    {
+        this.nameType = PrincipalNameType.getTypeByOrdinal( nameType );
+    }
+
+    /**
+     * Returns the name components.
+     *
+     * @return The name components.
+     */
+    public List<String> getNames()
+    {
+        return nameString;
+    }
+
+
+    /**
+     * @return A String representing the principal names as a String 
+     */
+    public String getNameString()
+    {
+        if ( ( nameString == null ) || ( nameString.size() == 0 ) )
+        {
+            return "";
+        }
+        else
+        {
+            StringBuilder sb = new StringBuilder();
+            boolean isFirst = true;
+
+            for ( String name : nameString )
+            {
+                if ( isFirst )
+                {
+                    isFirst = false;
+                }
+                else
+                {
+                    sb.append( '/' );
+                }
+
+                sb.append( name );
+            }
+
+            return sb.toString();
+        }
+    }
+
+
+    /**
+     * Add a new name to the PrincipalName
+     * @param name The name to add
+     */
+    public void addName( String name )
+    {
+        if ( nameString == null )
+        {
+            nameString = new ArrayList<String>();
+        }
+
+        nameString.add( name );
+    }
+
+
+    /**
+     * Compute the PrincipalName length
+     * 
+     * PrincipalName :
+     * 
+     * 0x30 L1 PrincipalName sequence
+     *  |
+     *  +--> 0xA1 L2 name-type tag
+     *  |     |
+     *  |     +--> 0x02 L2-1 addressType (int)
+     *  |
+     *  +--> 0xA2 L3 name-string tag
+     *        |
+     *        +--> 0x30 L3-1 name-string (SEQUENCE OF KerberosString)
+     *              |
+     *              +--> 0x1B L4[1] value (KerberosString)
+     *              |
+     *              +--> 0x1B L4[2] value (KerberosString)
+     *              |
+     *              ...
+     *              |
+     *              +--> 0x1B L4[n] value (KerberosString)
+     */
+    public int computeLength()
+    {
+        // The principalName can't be empty.
+        principalTypeLength = Value.getNbBytes( nameType.getOrdinal() );
+        principalTypeTagLength = 1 + TLV.getNbBytes( principalTypeLength ) + principalTypeLength;
+        
+        principalNameSeqLength = 1 + TLV.getNbBytes( principalTypeTagLength ) + principalTypeTagLength;
+
+        // Compute the keyValue
+        if ( ( nameString == null ) || ( nameString.size() == 0 ) )
+        {
+            principalStringsSeqLength = 0;
+        }
+        else
+        {
+            principalStringsSeqLength = 0;
+            nameBytes = new ArrayList<byte[]>( nameString.size() );
+
+            for ( String name : nameString )
+            {
+                if ( name != null )
+                {
+                    byte[] bytes = StringTools.getBytesUtf8( name );
+                    nameBytes.add( bytes );
+                    principalStringsSeqLength += 1 + TLV.getNbBytes( bytes.length ) + bytes.length;
+                }
+                else
+                {
+                    nameBytes.add( StringTools.EMPTY_BYTES );
+                    principalStringsSeqLength += 1 + 1;
+                }
+            }
+        }
+
+        principalStringsTagLength = 1 + TLV.getNbBytes( principalStringsSeqLength ) + principalStringsSeqLength;
+        principalNameSeqLength += 1 + TLV.getNbBytes( principalStringsTagLength ) + principalStringsTagLength;
+
+        // Compute the whole sequence length
+        return 1 + TLV.getNbBytes( principalNameSeqLength ) + principalNameSeqLength;
+    }
+
+
+    /**
+     * Encode the PrincipalName message to a PDU. 
+     * 
+     * PrincipalName :
+     * 
+     * 0x30 LL
+     *   0xA0 LL 
+     *     0x02 0x01 name-type (integer)
+     *   0xA1 LL 
+     *     0x30 LL name-string (SEQUENCE OF KerberosString)
+     *       0x1B LL name-string[1]
+     *       0x1B LL name-string[2]
+     *       ...
+     *       0x1B LL name-string[n]
+     * 
+     * @param buffer The buffer where to put the PDU. It should have been allocated
+     * before, with the right size.
+     * @return The constructed PDU.
+     */
+    public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException
+    {
+        if ( buffer == null )
+        {
+            throw new EncoderException( I18n.err( I18n.ERR_148 ) );
+        }
+
+        try
+        {
+            // The PrincipalName SEQ Tag
+            buffer.put( UniversalTag.SEQUENCE.getValue() );
+            buffer.put( TLV.getBytes( principalNameSeqLength ) );
+
+            // The name-type, first the tag, then the value
+            buffer.put( ( byte ) 0xA0 );
+            buffer.put( TLV.getBytes( principalTypeTagLength ) );
+            Value.encode( buffer, nameType.getOrdinal() );
+
+            // The name-string tag
+            buffer.put( ( byte ) 0xA1 );
+            buffer.put( TLV.getBytes( principalStringsTagLength ) );
+
+            // The name-string sequence
+            buffer.put( UniversalTag.SEQUENCE.getValue() );
+
+            if ( ( nameString == null ) || ( nameString.size() == 0 ) )
+            {
+                buffer.put( ( byte ) 0x00 );
+            }
+            else
+            {
+                buffer.put( TLV.getBytes( principalStringsSeqLength ) );
+
+                // The kerberosStrings
+                for ( byte[] name : nameBytes )
+                {
+                    buffer.put( UniversalTag.GENERAL_STRING.getValue() );
+
+                    if ( ( name == null ) || ( name.length == 0 ) )
+                    {
+                        buffer.put( ( byte ) 0x00 );
+                    }
+                    else
+                    {
+                        buffer.put( TLV.getBytes( name.length ) );
+                        buffer.put( name );
+                    }
+                }
+            }
+        }
+        catch ( BufferOverflowException boe )
+        {
+            LOG.error( I18n.err( I18n.ERR_146, 1 + TLV.getNbBytes( principalNameSeqLength )
+                + principalNameSeqLength, buffer.capacity() ) );
+            throw new EncoderException( I18n.err( I18n.ERR_138 ) );
+        }
+
+        if ( IS_DEBUG )
+        {
+            LOG.debug( "PrinipalName encoding : {}", StringTools.dumpBytes( buffer.array() ) );
+            LOG.debug( "PrinipalName initial value : {}", toString() );
+        }
+
+        return buffer;
+    }
+
+
+    /**
+     * @see Object#toString()
+     */
+    public String toString()
+    {
+        StringBuilder sb = new StringBuilder();
+
+        sb.append( "PincipalName : {\n" );
+
+        sb.append( "    name-type: " ).append( nameType ).append( '\n' );
+
+        if ( ( nameString != null ) && ( nameString.size() != 0 ) )
+        {
+            sb.append( "    name-string : <" );
+            boolean isFirst = true;
+
+            for ( String name : nameString )
+            {
+                if ( isFirst )
+                {
+                    isFirst = false;
+                }
+                else
+                {
+                    sb.append( ", " );
+                }
+
+                sb.append( '\'' ).append( name ).append( '\'' );
+            }
+
+            sb.append( ">\n}" );
+        }
+        else
+        {
+            sb.append( "    no name-string\n}" );
+        }
+
+        return sb.toString();
+    }
+}

Added: directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/components/PrincipalNameType.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/components/PrincipalNameType.java?rev=1031354&view=auto
==============================================================================
--- directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/components/PrincipalNameType.java (added)
+++ directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/components/PrincipalNameType.java Thu Nov  4 23:48:49 2010
@@ -0,0 +1,177 @@
+/*
+ *  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.directory.shared.kerberos.components;
+
+
+/**
+ * An enum describing the differnet types of Principal.
+ * 
+ * Here is the list, taken from RFC 4120 :
+ *  NT-UNKNOWN        0    Name type not known
+ *  NT-PRINCIPAL      1    Just the name of the principal as in DCE,
+ *                           or for users
+ *  NT-SRV-INST       2    Service and other unique instance (krbtgt)
+ *  NT-SRV-HST        3    Service with host name as instance
+ *                           (telnet, rcommands)
+ *  NT-SRV-XHST       4    Service with host as remaining components
+ *  NT-UID            5    Unique ID
+ *  NT-X500-PRINCIPAL 6    Encoded X.509 Distinguished name [RFC2253]
+ *  NT-SMTP-NAME      7    Name in form of SMTP email name
+ *                           (e.g., user@example.com)
+ *  NT-ENTERPRISE    10    Enterprise name - may be mapped to principal
+ *                           name
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public enum PrincipalNameType
+{
+    /**
+     * Constant for the "Name type not known" principal name type.
+     */
+    KRB_NT_UNKNOWN( 0 ),
+
+    /**
+     * Constant for the "Just the name of the principal as in DCE, or for users" principal name type.
+     */
+    KRB_NT_PRINCIPAL( 1 ),
+
+    /**
+     * Constant for the "Service and other unique instance (krbtgt)" principal name type.
+     */
+    KRB_NT_SRV_INST( 2 ),
+
+    /**
+     * Constant for the "Service with host name as instance (telnet, rcommands)" principal name type.
+     */
+    KRB_NT_SRV_HST( 3 ),
+
+    /**
+     * Constant for the "Service with host as remaining components" principal name type.
+     */
+    KRB_NT_SRV_XHST( 4 ),
+
+    /**
+     * Constant for the "Unique ID" principal name type.
+     */
+    KRB_NT_UID( 5 ),
+
+    /**
+     * Constant for the "Encoded X.509 Distinguished name [RFC2253]" principal name type.
+     */
+    KRB_NT_X500_PRINCIPAL( 6 ),
+
+    /**
+     * Constant for the "Name in form of SMTP email name (e.g., user@example.com)" principal name type.
+     */
+    KRB_NT_SMTP_NAME( 7 ),
+
+    /**
+     * Constant for the "Enterprise name; may be mapped to principal name" principal name type.
+     */
+    KRB_NT_ENTERPRISE( 10 );
+
+    /**
+     * The value/code for the principal name type.
+     */
+    private final int ordinal;
+
+
+    /**
+     * Private constructor prevents construction outside of this class.
+     */
+    private PrincipalNameType( int ordinal )
+    {
+        this.ordinal = ordinal;
+    }
+
+
+    /**
+     * Returns the principal name type when specified by its ordinal.
+     *
+     * @param type
+     * @return The principal name type.
+     */
+    public static PrincipalNameType getTypeByOrdinal( int type )
+    {
+        switch ( type )
+        {
+            case 0 : return KRB_NT_UNKNOWN;
+            case 1 : return KRB_NT_PRINCIPAL;
+            case 2 : return KRB_NT_SRV_INST;
+            case 3 : return KRB_NT_SRV_HST;
+            case 4 : return KRB_NT_SRV_XHST;
+            case 5 : return KRB_NT_UID;
+            case 6 : return KRB_NT_X500_PRINCIPAL;
+            case 7 : return KRB_NT_SMTP_NAME;
+            case 10 : return KRB_NT_ENTERPRISE;
+            default : return KRB_NT_UNKNOWN;
+        }
+    }
+
+
+    /**
+     * Returns the number associated with this principal name type.
+     *
+     * @return The principal name type ordinal.
+     */
+    public int getOrdinal()
+    {
+        return ordinal;
+    }
+
+    /**
+     * @see Object#toString()
+     */
+    public String toString()
+    {
+        switch ( this )
+        {
+            case KRB_NT_UNKNOWN         : 
+                return "Name type not known" + "(" + ordinal + ")";
+                
+            case KRB_NT_PRINCIPAL       : 
+                return "Just the name of the principal as in DCE, or for users" + "(" + ordinal + ")";
+                
+            case KRB_NT_SRV_INST        : 
+                return "Service and other unique instance (krbtgt)" + "(" + ordinal + ")";
+            
+            case KRB_NT_SRV_HST         : 
+                return "Service with host name as instance (telnet, rcommands)" + "(" + ordinal + ")";
+            
+            case KRB_NT_SRV_XHST        : 
+                return "Service with host as remaining components" + "(" + ordinal + ")";
+            
+            case KRB_NT_UID             : 
+                return "Unique ID" + "(" + ordinal + ")";
+            
+            case KRB_NT_X500_PRINCIPAL  : 
+                return "Encoded X.509 Distinguished name [RFC2253]" + "(" + ordinal + ")";
+            
+            case KRB_NT_SMTP_NAME       : 
+                return "Name in form of SMTP email name (e.g., user@example.com)" + "(" + ordinal + ")";
+            
+            case KRB_NT_ENTERPRISE      : 
+                return "Enterprise name; may be mapped to principal name" + "(" + ordinal + ")";
+            
+            default                     : 
+                return "unknown name type" + "(" + ordinal + ")";
+        }
+    }
+}

Added: directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/exceptions/ErrorType.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/exceptions/ErrorType.java?rev=1031354&view=auto
==============================================================================
--- directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/exceptions/ErrorType.java (added)
+++ directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/exceptions/ErrorType.java Thu Nov  4 23:48:49 2010
@@ -0,0 +1,541 @@
+/*
+ *  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.directory.shared.kerberos.exceptions;
+
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+
+/**
+ * A type-safe enumeration of Kerberos error types.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public final class ErrorType implements Comparable<ErrorType>
+{
+ 
+    // TODO Add i18n. Don't no if these error messages are also a response to the client.
+    // If so shall they really be i18n?
+    
+    /**
+     * No error.
+     */
+    public static final ErrorType KDC_ERR_NONE = new ErrorType( 0, "No error" );
+
+    /**
+     * Client's entry in database has expired.
+     */
+    public static final ErrorType KDC_ERR_NAME_EXP = new ErrorType( 1, "Client's entry in database has expired" );
+
+    /**
+     * Server's entry in database has expired.
+     */
+    public static final ErrorType KDC_ERR_SERVICE_EXP = new ErrorType( 2, "Server's entry in database has expired" );
+
+    /**
+     * Requested protocol version number not supported.
+     */
+    public static final ErrorType KDC_ERR_BAD_PVNO = new ErrorType( 3,
+        "Requested protocol version number not supported" );
+
+    /**
+     * Client's key encrypted in old master key.
+     */
+    public static final ErrorType KDC_ERR_C_OLD_MAST_KVNO = new ErrorType( 4,
+        "Client's key encrypted in old master key" );
+
+    /**
+     * Server's key encrypted in old master key.
+     */
+    public static final ErrorType KDC_ERR_S_OLD_MAST_KVNO = new ErrorType( 5,
+        "Server's key encrypted in old master key" );
+
+    /**
+     * Client not found in Kerberos database.
+     */
+    public static final ErrorType KDC_ERR_C_PRINCIPAL_UNKNOWN = new ErrorType( 6,
+        "Client not found in Kerberos database" );
+
+    /**
+     * Server not found in Kerberos database.
+     */
+    public static final ErrorType KDC_ERR_S_PRINCIPAL_UNKNOWN = new ErrorType( 7,
+        "Server not found in Kerberos database" );
+
+    /**
+     * Multiple principal entries in database.
+     */
+    public static final ErrorType KDC_ERR_PRINCIPAL_NOT_UNIQUE = new ErrorType( 8,
+        "Multiple principal entries in database" );
+
+    /**
+     * The client or server has a null key.
+     */
+    public static final ErrorType KDC_ERR_NULL_KEY = new ErrorType( 9, "The client or server has a null key" );
+
+    /**
+     * Ticket not eligible for postdating.
+     */
+    public static final ErrorType KDC_ERR_CANNOT_POSTDATE = new ErrorType( 10, "Ticket not eligible for postdating" );
+
+    /**
+     * Requested start time is later than end time.
+     */
+    public static final ErrorType KDC_ERR_NEVER_VALID = new ErrorType( 11,
+        "Requested start time is later than end time" );
+
+    /**
+     * KDC policy rejects request.
+     */
+    public static final ErrorType KDC_ERR_POLICY = new ErrorType( 12, "KDC policy rejects request" );
+
+    /**
+     * KDC cannot accommodate requested option.
+     */
+    public static final ErrorType KDC_ERR_BADOPTION = new ErrorType( 13, "KDC cannot accommodate requested option" );
+
+    /**
+     * KDC has no support for encryption type.
+     */
+    public static final ErrorType KDC_ERR_ETYPE_NOSUPP = new ErrorType( 14, "KDC has no support for encryption type" );
+
+    /**
+     * KDC has no support for checksum type.
+     */
+    public static final ErrorType KDC_ERR_SUMTYPE_NOSUPP = new ErrorType( 15, "KDC has no support for checksum type" );
+
+    /**
+     * KDC has no support for padata type.
+     */
+    public static final ErrorType KDC_ERR_PADATA_TYPE_NOSUPP = new ErrorType( 16, "KDC has no support for padata type" );
+
+    /**
+     * KDC has no support for transited type.
+     */
+    public static final ErrorType KDC_ERR_TRTYPE_NOSUPP = new ErrorType( 17, "KDC has no support for transited type" );
+
+    /**
+     * Clients credentials have been revoked.
+     */
+    public static final ErrorType KDC_ERR_CLIENT_REVOKED = new ErrorType( 18, "Clients credentials have been revoked" );
+
+    /**
+     * Credentials for server have been revoked.
+     */
+    public static final ErrorType KDC_ERR_SERVICE_REVOKED = new ErrorType( 19,
+        "Credentials for server have been revoked" );
+
+    /**
+     * TGT has been revoked.
+     */
+    public static final ErrorType KDC_ERR_TGT_REVOKED = new ErrorType( 20, "TGT has been revoked" );
+
+    /**
+     * Client not yet valid; try again later.
+     */
+    public static final ErrorType KDC_ERR_CLIENT_NOTYET = new ErrorType( 21, "Client not yet valid; try again later" );
+
+    /**
+     * Server not yet valid; try again later.
+     */
+    public static final ErrorType KDC_ERR_SERVICE_NOTYET = new ErrorType( 22, "Server not yet valid; try again later" );
+
+    /**
+     * Password has expired; change password to reset.
+     */
+    public static final ErrorType KDC_ERR_KEY_EXPIRED = new ErrorType( 23,
+        "Password has expired; change password to reset" );
+
+    /**
+     * Pre-authentication information was invalid.
+     */
+    public static final ErrorType KDC_ERR_PREAUTH_FAILED = new ErrorType( 24,
+        "Pre-authentication information was invalid" );
+
+    /**
+     * Additional pre-authentication required.
+     */
+    public static final ErrorType KDC_ERR_PREAUTH_REQUIRED = new ErrorType( 25,
+        "Additional pre-authentication required" );
+
+    /**
+     * Requested server and ticket don't match.
+     */
+    public static final ErrorType KDC_ERR_SERVER_NOMATCH = new ErrorType( 26, "Requested server and ticket don't match" );
+
+    /**
+     * Server valid for user2user only.
+     */
+    public static final ErrorType KDC_ERR_MUST_USE_USER2USER = new ErrorType( 27, "Server valid for user2user only" );
+
+    /**
+     * KDC Policy rejects transited path.
+     */
+    public static final ErrorType KDC_ERR_PATH_NOT_ACCEPTED = new ErrorType( 28, "KDC Policy rejects transited path" );
+
+    /**
+     * A service is not available.
+     */
+    public static final ErrorType KDC_ERR_SVC_UNAVAILABLE = new ErrorType( 29, "A service is not available" );
+
+    /**
+     * Integrity check on decrypted field failed.
+     */
+    public static final ErrorType KRB_AP_ERR_BAD_INTEGRITY = new ErrorType( 31,
+        "Integrity check on decrypted field failed" );
+
+    /**
+     * Ticket expired.
+     */
+    public static final ErrorType KRB_AP_ERR_TKT_EXPIRED = new ErrorType( 32, "Ticket expired" );
+
+    /**
+     * Ticket not yet valid.
+     */
+    public static final ErrorType KRB_AP_ERR_TKT_NYV = new ErrorType( 33, "Ticket not yet valid" );
+
+    /**
+     * Request is a replay.
+     */
+    public static final ErrorType KRB_AP_ERR_REPEAT = new ErrorType( 34, "Request is a replay" );
+
+    /**
+     * The ticket isn't for us.
+     */
+    public static final ErrorType KRB_AP_ERR_NOT_US = new ErrorType( 35, "The ticket isn't for us" );
+
+    /**
+     * Ticket and authenticator don't match.
+     */
+    public static final ErrorType KRB_AP_ERR_BADMATCH = new ErrorType( 36, "Ticket and authenticator don't match" );
+
+    /**
+     * Clock skew too great.
+     */
+    public static final ErrorType KRB_AP_ERR_SKEW = new ErrorType( 37, "Clock skew too great" );
+
+    /**
+     * Incorrect net address.
+     */
+    public static final ErrorType KRB_AP_ERR_BADADDR = new ErrorType( 38, "Incorrect net address" );
+
+    /**
+     * Protocol version mismatch.
+     */
+    public static final ErrorType KRB_AP_ERR_BADVERSION = new ErrorType( 39, "Protocol version mismatch" );
+
+    /**
+     * Invalid msg type.
+     */
+    public static final ErrorType KRB_AP_ERR_MSG_TYPE = new ErrorType( 40, "Invalid msg type" );
+
+    /**
+     * Message stream modified.
+     */
+    public static final ErrorType KRB_AP_ERR_MODIFIED = new ErrorType( 41, "Message stream modified" );
+
+    /**
+     * Message out of order.
+     */
+    public static final ErrorType KRB_AP_ERR_BADORDER = new ErrorType( 42, "Message out of order" );
+
+    /**
+     * Specified version of key is not available.
+     */
+    public static final ErrorType KRB_AP_ERR_BADKEYVER = new ErrorType( 44, "Specified version of key is not available" );
+
+    /**
+     * Service key not available.
+     */
+    public static final ErrorType KRB_AP_ERR_NOKEY = new ErrorType( 45, "Service key not available" );
+
+    /**
+     * Mutual authentication failed.
+     */
+    public static final ErrorType KRB_AP_ERR_MUT_FAIL = new ErrorType( 46, "Mutual authentication failed" );
+
+    /**
+     * Incorrect message direction.
+     */
+    public static final ErrorType KRB_AP_ERR_BADDIRECTION = new ErrorType( 47, "Incorrect message direction" );
+
+    /**
+     * Alternative authentication method required.
+     */
+    public static final ErrorType KRB_AP_ERR_METHOD = new ErrorType( 48, "Alternative authentication method required" );
+
+    /**
+     * Incorrect sequence number in message.
+     */
+    public static final ErrorType KRB_AP_ERR_BADSEQ = new ErrorType( 49, "Incorrect sequence number in message" );
+
+    /**
+     * Inappropriate type of checksum in message.
+     */
+    public static final ErrorType KRB_AP_ERR_INAPP_CKSUM = new ErrorType( 50,
+        "Inappropriate type of checksum in message" );
+
+    /**
+     * Policy rejects transited path.
+     */
+    public static final ErrorType KRB_AP_PATH_NOT_ACCEPTED = new ErrorType( 51, "Policy rejects transited path" );
+
+    /**
+     * Response too big for UDP; retry with TCP.
+     */
+    public static final ErrorType KRB_ERR_RESPONSE_TOO_BIG = new ErrorType( 52,
+        "Response too big for UDP; retry with TCP" );
+
+    /**
+     * Generic error (description in e-text).
+     */
+    public static final ErrorType KRB_ERR_GENERIC = new ErrorType( 60, "Generic error (description in e-text)" );
+
+    /**
+     * Field is too long for this implementation.
+     */
+    public static final ErrorType KRB_ERR_FIELD_TOOLONG = new ErrorType( 61,
+        "Field is too long for this implementation" );
+
+    /**
+     * Client is not trusted.
+     */
+    public static final ErrorType KDC_ERR_CLIENT_NOT_TRUSTED = new ErrorType( 62, "Client is not trusted" );
+
+    /**
+     * KDC is not trusted.
+     */
+    public static final ErrorType KRB_ERR_KDC_NOT_TRUSTED = new ErrorType( 63, "KDC is not trusted" );
+
+    /**
+     * Signature is invalid.
+     */
+    public static final ErrorType KDC_ERR_INVALID_SIG = new ErrorType( 64, "Signature is invalid" );
+
+    /**
+     * Diffie-Hellman (DH) key parameters not accepted.
+     */
+    public static final ErrorType KDC_ERR_DH_KEY_PARAMETERS_NOT_ACCEPTED = new ErrorType( 65,
+        "Diffie-Hellman (DH) key parameters not accepted." );
+
+    /**
+     * Certificates do not match.
+     */
+    public static final ErrorType KRB_ERR_CERTIFICATE_MISMATCH = new ErrorType( 66, "Certificates do not match" );
+
+    /**
+     * No TGT available to validate USER-TO-USER.
+     */
+    public static final ErrorType KRB_AP_ERR_NO_TGT = new ErrorType( 67, "No TGT available to validate USER-TO-USER" );
+
+    /**
+     * Wrong realm.
+     */
+    public static final ErrorType KRB_ERR_WRONG_REALM = new ErrorType( 68, "Wrong realm" );
+
+    /**
+     * Ticket must be for USER-TO-USER.
+     */
+    public static final ErrorType KRB_AP_ERR_USER_TO_USER_REQUIRED = new ErrorType( 69,
+        "Ticket must be for USER-TO-USER" );
+
+    /**
+     * Can't verify certificate.
+     */
+    public static final ErrorType KDC_ERR_CANT_VERIFY_CERTIFICATE = new ErrorType( 70, "Can't verify certificate" );
+
+    /**
+     * Invalid certificate.
+     */
+    public static final ErrorType KDC_ERR_INVALID_CERTIFICATE = new ErrorType( 71, "Invalid certificate" );
+
+    /**
+     * Revoked certificate.
+     */
+    public static final ErrorType KDC_ERR_REVOKED_CERTIFICATE = new ErrorType( 72, "Revoked certificate" );
+
+    /**
+     * Revocation status unknown.
+     */
+    public static final ErrorType KDC_ERR_REVOCATION_STATUS_UNKNOWN = new ErrorType( 73, "Revocation status unknown" );
+
+    /**
+     * Revocation status unavailable.
+     */
+    public static final ErrorType KRB_ERR_REVOCATION_STATUS_UNAVAILABLE = new ErrorType( 74,
+        "Revocation status unavailable" );
+
+    /**
+     * Client names do not match.
+     */
+    public static final ErrorType KDC_ERR_CLIENT_NAME_MISMATCH = new ErrorType( 75, "Client names do not match" );
+
+    /**
+     * KDC names do not match.
+     */
+    public static final ErrorType KRB_ERR_KDC_NAME_MISMATCH = new ErrorType( 76, "KDC names do not match" );
+
+    /**
+     * Inconsistent key purpose.
+     */
+    public static final ErrorType KDC_ERR_INCONSISTENT_KEY_PURPOSE = new ErrorType( 77, "Inconsistent key purpose" );
+
+    /**
+     * Digest in certificate not accepted.
+     */
+    public static final ErrorType KDC_ERR_DIGEST_IN_CERT_NOT_ACCEPTED = new ErrorType( 78,
+        "Digest in certificate not accepted" );
+
+    /**
+     * PA checksum must be included.
+     */
+    public static final ErrorType KDC_ERR_PA_CHECKSUM_MUST_BE_INCLUDED = new ErrorType( 79,
+        "PA checksum must be included" );
+
+    /**
+     * Digest in signed data not accepted.
+     */
+    public static final ErrorType KDC_ERR_DIGEST_IN_SIGNED_DATA_NOT_ACCEPTED = new ErrorType( 80,
+        "Digest in signed data not accepted" );
+
+    /**
+     * Public key encryption not supported.
+     */
+    public static final ErrorType KDC_ERR_PUBLIC_KEY_ENCRYPTION_NOT_SUPPORTED = new ErrorType( 81,
+        "Public key encryption not supported" );
+
+    /**
+     * Array for building a List of VALUES.
+     */
+    private static final ErrorType[] values =
+        { KDC_ERR_NONE, KDC_ERR_NAME_EXP, KDC_ERR_SERVICE_EXP, KDC_ERR_BAD_PVNO, KDC_ERR_C_OLD_MAST_KVNO,
+            KDC_ERR_S_OLD_MAST_KVNO, KDC_ERR_C_PRINCIPAL_UNKNOWN, KDC_ERR_S_PRINCIPAL_UNKNOWN,
+            KDC_ERR_PRINCIPAL_NOT_UNIQUE, KDC_ERR_NULL_KEY, KDC_ERR_CANNOT_POSTDATE, KDC_ERR_NEVER_VALID,
+            KDC_ERR_POLICY, KDC_ERR_BADOPTION, KDC_ERR_ETYPE_NOSUPP, KDC_ERR_SUMTYPE_NOSUPP,
+            KDC_ERR_PADATA_TYPE_NOSUPP, KDC_ERR_TRTYPE_NOSUPP, KDC_ERR_CLIENT_REVOKED, KDC_ERR_SERVICE_REVOKED,
+            KDC_ERR_TGT_REVOKED, KDC_ERR_CLIENT_NOTYET, KDC_ERR_SERVICE_NOTYET, KDC_ERR_KEY_EXPIRED,
+            KDC_ERR_PREAUTH_FAILED, KDC_ERR_PREAUTH_REQUIRED, KDC_ERR_SERVER_NOMATCH, KDC_ERR_MUST_USE_USER2USER,
+            KDC_ERR_PATH_NOT_ACCEPTED, KDC_ERR_SVC_UNAVAILABLE, KRB_AP_ERR_BAD_INTEGRITY, KRB_AP_ERR_TKT_EXPIRED,
+            KRB_AP_ERR_TKT_NYV, KRB_AP_ERR_REPEAT, KRB_AP_ERR_NOT_US, KRB_AP_ERR_BADMATCH, KRB_AP_ERR_SKEW,
+            KRB_AP_ERR_BADADDR, KRB_AP_ERR_BADVERSION, KRB_AP_ERR_MSG_TYPE, KRB_AP_ERR_MODIFIED, KRB_AP_ERR_BADORDER,
+            KRB_AP_ERR_BADKEYVER, KRB_AP_ERR_NOKEY, KRB_AP_ERR_MUT_FAIL, KRB_AP_ERR_BADDIRECTION, KRB_AP_ERR_METHOD,
+            KRB_AP_ERR_BADSEQ, KRB_AP_ERR_INAPP_CKSUM, KRB_AP_PATH_NOT_ACCEPTED, KRB_ERR_RESPONSE_TOO_BIG,
+            KRB_ERR_GENERIC, KRB_ERR_FIELD_TOOLONG, KDC_ERR_CLIENT_NOT_TRUSTED, KRB_ERR_KDC_NOT_TRUSTED,
+            KDC_ERR_INVALID_SIG, KDC_ERR_DH_KEY_PARAMETERS_NOT_ACCEPTED, KRB_ERR_CERTIFICATE_MISMATCH,
+            KRB_AP_ERR_NO_TGT, KRB_ERR_WRONG_REALM, KRB_AP_ERR_USER_TO_USER_REQUIRED, KDC_ERR_CANT_VERIFY_CERTIFICATE,
+            KDC_ERR_INVALID_CERTIFICATE, KDC_ERR_REVOKED_CERTIFICATE, KDC_ERR_REVOCATION_STATUS_UNKNOWN,
+            KRB_ERR_REVOCATION_STATUS_UNAVAILABLE, KDC_ERR_CLIENT_NAME_MISMATCH, KRB_ERR_KDC_NAME_MISMATCH,
+            KDC_ERR_INCONSISTENT_KEY_PURPOSE, KDC_ERR_DIGEST_IN_CERT_NOT_ACCEPTED,
+            KDC_ERR_PA_CHECKSUM_MUST_BE_INCLUDED, KDC_ERR_DIGEST_IN_SIGNED_DATA_NOT_ACCEPTED,
+            KDC_ERR_PUBLIC_KEY_ENCRYPTION_NOT_SUPPORTED };
+
+    /**
+     * A List of all the error type constants.
+     */
+    public static final List<ErrorType> VALUES = Collections.unmodifiableList( Arrays.asList( values ) );
+
+    /**
+     * The name of the error type.
+     */
+    private final String name;
+
+    /**
+     * The value/code for the error type.
+     */
+    private final int ordinal;
+
+
+    /**
+     * Private constructor prevents construction outside of this class.
+     */
+    private ErrorType( int ordinal, String name )
+    {
+        this.ordinal = ordinal;
+        this.name = name;
+    }
+
+
+    /**
+     * Returns the message for this Kerberos error.
+     *
+     * @return the message for this Kerberos error.
+     */
+    public String getMessage()
+    {
+        return name;
+    }
+
+
+    /**
+     * Returns the message for this Kerberos error.
+     *
+     * @return the message for this Kerberos error.
+     */
+    public String toString()
+    {
+        return name;
+    }
+
+
+    /**
+     * Compares this type to another object hopefully one that is of the same
+     * type.
+     *
+     * @param that the object to compare this KerberosError to
+     * @return ordinal - ( ( KerberosError ) that ).ordinal;
+     */
+    public int compareTo( ErrorType that )
+    {
+        return ordinal - that.ordinal;
+    }
+
+
+    /**
+     * Gets the ordinal by its ordinal value.
+     *
+     * @param ordinal the ordinal value of the ordinal
+     * @return the type corresponding to the ordinal value
+     */
+    public static ErrorType getTypeByOrdinal( int ordinal )
+    {
+        for ( int ii = 0; ii < values.length; ii++ )
+        {
+            if ( values[ii].ordinal == ordinal )
+            {
+                return values[ii];
+            }
+        }
+
+        return KRB_ERR_GENERIC;
+    }
+
+
+    /**
+     * Gets the ordinal value associated with this Kerberos error.
+     *
+     * @return the ordinal value associated with this Kerberos error
+     */
+    public int getOrdinal()
+    {
+        return ordinal;
+    }
+}

Added: directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/exceptions/InvalidTicketException.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/exceptions/InvalidTicketException.java?rev=1031354&view=auto
==============================================================================
--- directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/exceptions/InvalidTicketException.java (added)
+++ directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/exceptions/InvalidTicketException.java Thu Nov  4 23:48:49 2010
@@ -0,0 +1,43 @@
+/*
+ *  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.directory.shared.kerberos.exceptions;
+
+
+/**
+ * A exception used when there was an error while creating a Ticket
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */ 
+public class InvalidTicketException extends KerberosException
+{
+    static final long serialVersionUID = 1L;
+
+
+    public InvalidTicketException( ErrorType errorType )
+    {
+        super( errorType );
+    }
+
+
+    public InvalidTicketException( ErrorType errorType, String explanation )
+    {
+        super( errorType, explanation );
+    }
+
+}

Added: directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/exceptions/KerberosException.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/exceptions/KerberosException.java?rev=1031354&view=auto
==============================================================================
--- directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/exceptions/KerberosException.java (added)
+++ directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/exceptions/KerberosException.java Thu Nov  4 23:48:49 2010
@@ -0,0 +1,220 @@
+/*
+ *  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.directory.shared.kerberos.exceptions;
+
+
+/**
+ * The root of the Kerberos exception hierarchy.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class KerberosException extends Exception
+{
+    private static final long serialVersionUID = 2968072183596955597L;
+
+    /**
+     * The Kerberos error code associated with this exception.
+     */
+    private final int errorCode;
+
+    /**
+     * Additional data about the error for use by the application
+     * to help it recover from or handle the error.
+     */
+    private byte[] explanatoryData;
+
+
+    /**
+     * Creates a KerberosException with an {@link ErrorType}.
+     *
+     * @param errorType The error type associated with this KerberosException.
+     */
+    public KerberosException( ErrorType errorType )
+    {
+        super( errorType.getMessage() );
+
+        this.errorCode = errorType.getOrdinal();
+    }
+
+
+    /**
+     * Creates a KerberosException with an {@link ErrorType} and an
+     * underlying {@link Throwable} that caused this fault.
+     *
+     * @param errorType The error type associated with this KerberosException.
+     * @param cause The underlying failure, if any.
+     */
+    public KerberosException( ErrorType errorType, Throwable cause )
+    {
+        super( errorType.getMessage(), cause );
+
+        this.errorCode = errorType.getOrdinal();
+    }
+
+
+    /**
+     * Creates a KerberosException with an {@link ErrorType} and a custom error message.
+     *
+     * @param errorType The {@link ErrorType} associated with this KerberosException.
+     * @param msg A custom error message for this KerberosException.
+     */
+    public KerberosException( ErrorType errorType, String msg )
+    {
+        super( msg );
+
+        this.errorCode = errorType.getOrdinal();
+    }
+
+
+    /**
+     * Creates a KerberosException with an {@link ErrorType}, a custom error message, and an
+     * underlying {@link Throwable} that caused this fault.
+     *
+     * @param errorType The error type associated with this KerberosException.
+     * @param msg A custom error message for this KerberosException.
+     * @param cause The underlying failure, if any.
+     */
+    public KerberosException( ErrorType errorType, String msg, Throwable cause )
+    {
+        super( msg, cause );
+
+        this.errorCode = errorType.getOrdinal();
+    }
+
+
+    /**
+     * Creates a KerberosException with an {@link ErrorType} and data helping to
+     * explain what caused this fault.
+     *
+     * @param errorType The error type associated with this KerberosException.
+     * @param explanatoryData Data helping to explain this fault, if any.
+     */
+    public KerberosException( ErrorType errorType, byte[] explanatoryData )
+    {
+        super( errorType.getMessage() );
+
+        this.errorCode = errorType.getOrdinal();
+        this.explanatoryData = explanatoryData;
+    }
+
+
+    /**
+     * Creates a KerberosException with an {@link ErrorType}, data helping to
+     * explain what caused this fault, and an underlying {@link Throwable} that caused this fault.
+     *
+     * @param errorType The error type associated with this KerberosException.
+     * @param explanatoryData Data helping to explain this fault, if any.
+     * @param cause The underlying failure, if any.
+     */
+    public KerberosException( ErrorType errorType, byte[] explanatoryData, Throwable cause )
+    {
+        super( errorType.getMessage(), cause );
+
+        this.errorCode = errorType.getOrdinal();
+        this.explanatoryData = explanatoryData;
+    }
+
+
+    /**
+     * Gets the protocol error code associated with this KerberosException.
+     *
+     * @return The error code associated with this KerberosException.
+     */
+    public int getErrorCode()
+    {
+        return this.errorCode;
+    }
+
+
+    /**
+     * Gets the explanatory data associated with this KerberosException.
+     *
+     * @return The explanatory data associated with this KerberosException.
+     */
+    public byte[] getExplanatoryData()
+    {
+        return explanatoryData;
+    }
+
+
+    /**
+     * Creates a KerberosException with an error code and a message.
+     *
+     * @param errorCode The error code associated with this KerberosException.
+     * @param msg The standard Kerberos error message for this KerberosException.
+     */
+    protected KerberosException( int errorCode, String msg )
+    {
+        super( msg );
+
+        this.errorCode = errorCode;
+    }
+
+
+    /**
+     * Creates a KerberosException with an error code, a message and an
+     * underlying {@link Throwable} that caused this fault.
+     *
+     * @param errorCode The error code associated with this KerberosException.
+     * @param msg The standard Kerberos error message for this KerberosException.
+     * @param cause The underlying failure, if any.
+     */
+    protected KerberosException( int errorCode, String msg, Throwable cause )
+    {
+        super( msg, cause );
+
+        this.errorCode = errorCode;
+    }
+
+
+    /**
+     * Creates a KerberosException with an error code, a message, and data
+     * helping to explain what caused this fault.
+     *
+     * @param errorCode The error code associated with this KerberosException.
+     * @param msg The standard Kerberos error message for this KerberosException.
+     * @param explanatoryData Data helping to explain this fault, if any.
+     */
+    protected KerberosException( int errorCode, String msg, byte[] explanatoryData )
+    {
+        super( msg );
+
+        this.errorCode = errorCode;
+        this.explanatoryData = explanatoryData;
+    }
+
+
+    /**
+     * Creates a KerberosException with an error code, a message, and data
+     * helping to explain what caused this fault.
+     *
+     * @param errorCode The error code associated with this KerberosException.
+     * @param msg The standard Kerberos error message for this KerberosException.
+     * @param explanatoryData Data helping to explain this fault, if any.
+     * @param cause The underlying failure, if any.
+     */
+    protected KerberosException( int errorCode, String msg, byte[] explanatoryData, Throwable cause )
+    {
+        super( msg, cause );
+
+        this.errorCode = errorCode;
+        this.explanatoryData = explanatoryData;
+    }
+}

Added: directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/messages/KerberosMessage.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/messages/KerberosMessage.java?rev=1031354&view=auto
==============================================================================
--- directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/messages/KerberosMessage.java (added)
+++ directory/apacheds/trunk/kerberos-codec/src/main/java/org/apache/directory/shared/kerberos/messages/KerberosMessage.java Thu Nov  4 23:48:49 2010
@@ -0,0 +1,108 @@
+/*
+ *  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.directory.shared.kerberos.messages;
+
+import org.apache.directory.shared.kerberos.KerberosConstants;
+import org.apache.directory.shared.kerberos.KerberosMessageType;
+
+
+
+/**
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class KerberosMessage
+{
+    /** The Kerberos protocol version number (5). */
+    public static final int PVNO = KerberosConstants.KERBEROS_V5;
+
+    /** The protocol version (should be 5) */
+    private int protocolVersionNumber = PVNO;
+    
+    /** The message type */
+    private KerberosMessageType messageType;
+
+
+    /**
+     * Creates a new instance of KerberosMessage.
+     *
+     * @param type The message type
+     */
+    public KerberosMessage( KerberosMessageType type )
+    {
+        this( PVNO, type );
+    }
+
+
+    /**
+     * Creates a new instance of KerberosMessage.
+     *
+     * @param versionNumber
+     * @param type
+     */
+    public KerberosMessage( int versionNumber, KerberosMessageType type )
+    {
+        protocolVersionNumber = versionNumber;
+        messageType = type;
+    }
+
+
+    /**
+     * Returns the {@link org.apache.directory.server.kerberos.shared.KerberosMessageType}.
+     *
+     * @return The {@link org.apache.directory.server.kerberos.shared.KerberosMessageType}.
+     */
+    public KerberosMessageType getMessageType()
+    {
+        return messageType;
+    }
+
+
+    /**
+     * Sets the {@link org.apache.directory.server.kerberos.shared.KerberosMessageType}.
+     *
+     * @param type
+     */
+    public void setMessageType( KerberosMessageType type )
+    {
+        messageType = type;
+    }
+
+
+    /**
+     * Returns the protocol version number.
+     *
+     * @return The protocol version number.
+     */
+    public int getProtocolVersionNumber()
+    {
+        return protocolVersionNumber;
+    }
+
+
+    /**
+     * Sets the protocol version number.
+     *
+     * @param versionNumber
+     */
+    public void setProtocolVersionNumber( int versionNumber )
+    {
+        protocolVersionNumber = versionNumber;
+    }
+}