Hi,

I am trying to use the KeytabDecoder class (in 
org.apache.directory.server.kerberos.shared.keytab) to read the content of a 
keytab file generated by a MS Active Directory server. I used the following 
code and got a java.nio.BufferUnderflowException.

+++++ CODE BEGINS +++++
import java.io.*;
import java.util.*;
import java.nio.*;

import org.apache.mina.core.buffer.IoBuffer;
import org.apache.directory.server.kerberos.shared.keytab.*;
import org.apache.directory.server.kerberos.shared.crypto.encryption.*;
import org.apache.directory.shared.kerberos.*;
import org.apache.directory.shared.kerberos.components.*;
import org.apache.directory.shared.kerberos.codec.*;
import org.apache.directory.shared.kerberos.codec.types.*;
import org.apache.directory.shared.util.Strings;

public class SimpleKeytabDecoder {
        public void test (String filename) throws Exception {
                FileInputStream fis = new FileInputStream (filename);
                int length = fis.available ();
                byte[] data = new byte[length];

                fis.read (data);
                
                IoBuffer ioBuf = IoBuffer.wrap (data);

                KeytabDecoder kd = new KeytabDecoder ();
                List<KeytabEntry> list = kd.getKeytabEntries (ioBuf);
                Iterator itr = list.iterator ();
                while (itr.hasNext ()) {
                        KeytabEntry ke = (KeytabEntry) itr.next ();

                        printOut (ke);
                }

                fis.close ();
        }

        private void printOut (KeytabEntry keytab) {
                StringBuffer sb = new StringBuffer ();

                String principalName = keytab.getPrincipalName ();
                long principalType = keytab.getPrincipalType ();

                sb.append ("Principal name = " + principalName + "\r\n");
                sb.append ("Principal type = " + principalType + "\r\n");

                EncryptionKey ek = keytab.getKey ();
                EncryptionType et = ek.getKeyType ();
                sb.append (et.toString() + "\r\n");
                byte[] keyValue = ek.getKeyValue ();
                sb.append ("Key value = " + Strings.toHexString (keyValue));

                int keyVer1 = ek.getKeyVersion ();
                sb.append ("Key version = " + keyVer1 + "\r\n");

                byte keyVer2 = keytab.getKeyVersion ();
                sb.append ("Key version 2 = " + keyVer2 + "\r\n");

                KerberosTime kt = keytab.getTimeStamp ();
                sb.append ("Time = " + kt.getTime () + "\r\n");
                sb.append ("Date = " + kt.toDate ().toString() + "\r\n");

                System.out.println (sb.toString ());
        }

        public static void main (String[] args) {

                try {
                        if (args.length < 1) {
                                System.out.println ("Use java 
SimpleKeytabDecoder filename");
                                return;
                        }
                        
                        SimpleKeytabDecoder skd = new SimpleKeytabDecoder ();

                        System.out.println ("Keytab filename = " + args[0]);

                        skd.test (args[0]);
                } catch (Exception ex) {
                        ex.printStackTrace ();
                }
        }
}
+++++ CODE ENDS +++++

The exact exception is

+++++ Exception Begins +++++
java.nio.BufferUnderflowException
        at java.nio.HeapByteBuffer.get(Unknown Source)
        at 
org.apache.mina.core.buffer.AbstractIoBuffer.get(AbstractIoBuffer.java:617)
        at 
org.apache.mina.core.buffer.AbstractIoBuffer.get(AbstractIoBuffer.java:1324)
        at 
org.apache.directory.server.kerberos.shared.keytab.KeytabDecoder.getKeytabEntries(KeytabDecoder.java:69)
        at SimpleKeytabDecoder.test(SimpleKeytabDecoder.java:25)
        at SimpleKeytabDecoder.main(SimpleKeytabDecoder.java:76)
+++++ Exception Ends +++++

Am I using the wrong class? Is keytab of Apacheds compatible with MS Keytab?

Thank you.

Steve

Reply via email to