directory-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From dran...@apache.org
Subject [05/45] directory-kerberos git commit: DIRKRB-149 New layout structure with the new name "Apache Kerby"
Date Thu, 22 Jan 2015 21:47:44 GMT
http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/ceacb982/kerby-kerb/kerb-util/src/main/java/org/apache/kerby/kerberos/kerb/keytab/Keytab.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-util/src/main/java/org/apache/kerby/kerberos/kerb/keytab/Keytab.java b/kerby-kerb/kerb-util/src/main/java/org/apache/kerby/kerberos/kerb/keytab/Keytab.java
new file mode 100644
index 0000000..46891d0
--- /dev/null
+++ b/kerby-kerb/kerb-util/src/main/java/org/apache/kerby/kerberos/kerb/keytab/Keytab.java
@@ -0,0 +1,197 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.kerby.kerberos.kerb.keytab;
+
+import org.apache.kerby.kerberos.kerb.spec.common.EncryptionKey;
+import org.apache.kerby.kerberos.kerb.spec.common.EncryptionType;
+import org.apache.kerby.kerberos.kerb.spec.common.PrincipalName;
+
+import java.io.*;
+import java.nio.ByteBuffer;
+import java.util.*;
+
+public class Keytab implements KrbKeytab {
+
+    public static final int V501 = 0x0501;
+    public static final int V502 = 0x0502;
+
+    private int version = V502;
+
+    private Map<PrincipalName, List<KeytabEntry>> principalEntries;
+
+    public Keytab() {
+        this.principalEntries = new HashMap<PrincipalName, List<KeytabEntry>>();
+    }
+
+    @Override
+    public List<PrincipalName> getPrincipals() {
+        return new ArrayList<PrincipalName>(principalEntries.keySet());
+    }
+
+    @Override
+    public void addKeytabEntries(List<KeytabEntry> entries) {
+        for (KeytabEntry entry : entries) {
+            addEntry(entry);
+        }
+    }
+
+    @Override
+    public void removeKeytabEntries(PrincipalName principal) {
+        principalEntries.remove(principal);
+    }
+
+    @Override
+    public void removeKeytabEntry(KeytabEntry entry) {
+        PrincipalName principal = entry.getPrincipal();
+        List<KeytabEntry> entries = principalEntries.get(principal);
+        if (entries != null) {
+            Iterator<KeytabEntry> iter = entries.iterator();
+            KeytabEntry tmp;
+            while (iter.hasNext()) {
+                tmp = iter.next();
+                if (entry.equals(tmp)) {
+                    iter.remove();
+                    break;
+                }
+            }
+        }
+    }
+
+    @Override
+    public List<KeytabEntry> getKeytabEntries(PrincipalName principal) {
+        return principalEntries.get(principal);
+    }
+
+    @Override
+    public EncryptionKey getKey(PrincipalName principal, EncryptionType keyType) {
+        List<KeytabEntry> entries = getKeytabEntries(principal);
+        for (KeytabEntry ke : entries) {
+            if (ke.getKey().getKeyType() == keyType) {
+                return ke.getKey();
+            }
+        }
+
+        return null;
+    }
+
+    @Override
+    public void load(File keytabFile) throws IOException {
+        if (! keytabFile.exists() || ! keytabFile.canRead()) {
+            throw new IllegalArgumentException("Invalid keytab file: " + keytabFile.getAbsolutePath());
+        }
+
+        InputStream is = new FileInputStream(keytabFile);
+
+        load(is);
+    }
+
+    @Override
+    public void load(InputStream inputStream) throws IOException {
+        if (inputStream == null) {
+            throw new IllegalArgumentException("Invalid and null input stream");
+        }
+
+        KeytabInputStream kis = new KeytabInputStream(inputStream);
+
+        doLoad(kis);
+    }
+
+    private void doLoad(KeytabInputStream kis) throws IOException {
+        this.version = readVersion(kis);
+
+        List<KeytabEntry> entries = readEntries(kis);
+        addKeytabEntries(entries);
+    }
+
+    @Override
+    public void addEntry(KeytabEntry entry) {
+        PrincipalName principal = entry.getPrincipal();
+        List<KeytabEntry> entries = principalEntries.get(principal);
+        if (entries == null) {
+            entries = new ArrayList<KeytabEntry>();
+            principalEntries.put(principal, entries);
+        }
+        entries.add(entry);
+    }
+
+    private int readVersion(KeytabInputStream kis) throws IOException {
+        return kis.readShort();
+    }
+
+    private List<KeytabEntry> readEntries(KeytabInputStream kis) throws IOException {
+        List<KeytabEntry> entries = new ArrayList<KeytabEntry>();
+
+        int entrySize;
+        ByteBuffer entryData;
+        KeytabEntry entry;
+        while (kis.available() > 0) {
+            entrySize = kis.readInt();
+            if (kis.available() < entrySize) {
+                throw new IOException("Bad input stream with less data than expected: " + entrySize);
+            }
+            entry = readEntry(kis);
+            entries.add(entry);
+        }
+
+        return entries;
+    }
+
+    private KeytabEntry readEntry(KeytabInputStream kis) throws IOException {
+        KeytabEntry entry = new KeytabEntry();
+        entry.load(kis, version);
+        return entry;
+    }
+
+    @Override
+    public void store(File keytabFile) throws IOException {
+        OutputStream outputStream = new FileOutputStream(keytabFile);
+
+        store(outputStream);
+    }
+
+    @Override
+    public void store(OutputStream outputStream) throws IOException {
+        if (outputStream == null) {
+            throw new IllegalArgumentException("Invalid and null output stream");
+        }
+
+        KeytabOutputStream kos = new KeytabOutputStream(outputStream);
+
+        writeVersion(kos);
+        writeEntries(kos);
+    }
+
+    private void writeVersion(KeytabOutputStream kos) throws IOException {
+        byte[] bytes = new byte[2];
+        bytes[0] = (byte) 0x05;
+        bytes[1] = version == V502 ? (byte) 0x02 : (byte) 0x01;
+
+        kos.write(bytes);
+    }
+
+    private void writeEntries(KeytabOutputStream kos) throws IOException {
+        for (PrincipalName principal : principalEntries.keySet()) {
+            for (KeytabEntry entry : principalEntries.get(principal)) {
+                entry.store(kos);
+            }
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/ceacb982/kerby-kerb/kerb-util/src/main/java/org/apache/kerby/kerberos/kerb/keytab/KeytabEntry.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-util/src/main/java/org/apache/kerby/kerberos/kerb/keytab/KeytabEntry.java b/kerby-kerb/kerb-util/src/main/java/org/apache/kerby/kerberos/kerb/keytab/KeytabEntry.java
new file mode 100644
index 0000000..a0b7351
--- /dev/null
+++ b/kerby-kerb/kerb-util/src/main/java/org/apache/kerby/kerberos/kerb/keytab/KeytabEntry.java
@@ -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.kerby.kerberos.kerb.keytab;
+
+import org.apache.kerby.kerberos.kerb.spec.KerberosTime;
+import org.apache.kerby.kerberos.kerb.spec.common.EncryptionKey;
+import org.apache.kerby.kerberos.kerb.spec.common.PrincipalName;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+public class KeytabEntry
+{
+    private PrincipalName principal;
+    private KerberosTime timestamp;
+    private int kvno;
+    private EncryptionKey key;
+
+    public KeytabEntry(PrincipalName principal, KerberosTime timestamp,
+                       int kvno, EncryptionKey key) {
+        this.principal = principal;
+        this.timestamp = timestamp;
+        this.kvno = kvno;
+        this.key = key;
+    }
+
+    public KeytabEntry() {
+
+    }
+
+    public void load(KeytabInputStream kis, int version) throws IOException {
+        this.principal = kis.readPrincipal(version);
+
+        this.timestamp = kis.readTime();
+
+        this.kvno = kis.readByte();
+
+        this.key = kis.readKey();
+    }
+
+    public void store(KeytabOutputStream kos) throws IOException {
+        byte[] body = null;
+
+        // compute entry body content first so that to get and write the size
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        KeytabOutputStream subKos = new KeytabOutputStream(baos);
+        writeBody(subKos, 0); // todo: consider the version
+        subKos.flush();
+        body = baos.toByteArray();
+
+        kos.writeInt(body.length);
+        kos.write(body);
+    }
+
+    public EncryptionKey getKey() {
+        return key;
+    }
+
+    public int getKvno() {
+        return kvno;
+    }
+
+    public PrincipalName getPrincipal() {
+        return principal;
+    }
+
+    public KerberosTime getTimestamp() {
+        return timestamp;
+    }
+
+    public void writeBody(KeytabOutputStream kos, int version) throws IOException {
+        kos.writePrincipal(principal, version);
+
+        kos.writeTime(timestamp);
+
+        kos.writeByte(kvno);
+
+        kos.writeKey(key, version);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        KeytabEntry that = (KeytabEntry) o;
+
+        if (kvno != that.kvno) return false;
+        if (!key.equals(that.key)) return false;
+        if (!principal.equals(that.principal)) return false;
+        if (!timestamp.equals(that.timestamp)) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = principal.hashCode();
+        result = 31 * result + timestamp.hashCode();
+        result = 31 * result + kvno;
+        result = 31 * result + key.hashCode();
+        return result;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/ceacb982/kerby-kerb/kerb-util/src/main/java/org/apache/kerby/kerberos/kerb/keytab/KeytabInputStream.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-util/src/main/java/org/apache/kerby/kerberos/kerb/keytab/KeytabInputStream.java b/kerby-kerb/kerb-util/src/main/java/org/apache/kerby/kerberos/kerb/keytab/KeytabInputStream.java
new file mode 100644
index 0000000..4638080
--- /dev/null
+++ b/kerby-kerb/kerb-util/src/main/java/org/apache/kerby/kerberos/kerb/keytab/KeytabInputStream.java
@@ -0,0 +1,89 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.kerby.kerberos.kerb.keytab;
+
+import org.apache.kerby.kerberos.kerb.KrbInputStream;
+import org.apache.kerby.kerberos.kerb.spec.KerberosTime;
+import org.apache.kerby.kerberos.kerb.spec.common.EncryptionKey;
+import org.apache.kerby.kerberos.kerb.spec.common.EncryptionType;
+import org.apache.kerby.kerberos.kerb.spec.common.NameType;
+import org.apache.kerby.kerberos.kerb.spec.common.PrincipalName;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+public class KeytabInputStream extends KrbInputStream
+{
+    public KeytabInputStream(InputStream in) {
+        super(in);
+    }
+
+    public KerberosTime readTime() throws IOException {
+        long value = readInt();
+        KerberosTime time = new KerberosTime(value * 1000);
+        return time;
+    }
+
+    @Override
+    public PrincipalName readPrincipal(int version) throws IOException {
+        int numComponents = readShort();
+        if (version == Keytab.V501) {
+            numComponents -= 1;
+        }
+
+        String realm = readCountedString();
+
+        List<String> nameStrings = new ArrayList<String>();
+        String component;
+        for (int i = 0; i < numComponents; i++) { // sub 1 if version 0x501
+            component = readCountedString();
+            nameStrings.add(component);
+        }
+        int type = readInt(); // not present if version 0x501
+        NameType nameType = NameType.fromValue(type);
+        PrincipalName principal = new PrincipalName(nameStrings, nameType);
+        principal.setRealm(realm);
+
+        return principal;
+    }
+
+    public EncryptionKey readKey() throws IOException {
+        int eType = readShort();
+        EncryptionType encryptionType = EncryptionType.fromValue(eType);
+
+        byte[] keyData = readCountedOctets();
+        EncryptionKey key = new EncryptionKey(encryptionType, keyData);
+
+        return key;
+    }
+
+    public String readCountedString() throws IOException {
+        byte[] countedOctets = readCountedOctets();
+        // ASCII
+        return new String(countedOctets);
+    }
+
+    @Override
+    public int readOctetsCount() throws IOException {
+        return readShort();
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/ceacb982/kerby-kerb/kerb-util/src/main/java/org/apache/kerby/kerberos/kerb/keytab/KeytabOutputStream.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-util/src/main/java/org/apache/kerby/kerberos/kerb/keytab/KeytabOutputStream.java b/kerby-kerb/kerb-util/src/main/java/org/apache/kerby/kerberos/kerb/keytab/KeytabOutputStream.java
new file mode 100644
index 0000000..d69308f
--- /dev/null
+++ b/kerby-kerb/kerb-util/src/main/java/org/apache/kerby/kerberos/kerb/keytab/KeytabOutputStream.java
@@ -0,0 +1,63 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.kerby.kerberos.kerb.keytab;
+
+import org.apache.kerby.kerberos.kerb.KrbOutputStream;
+import org.apache.kerby.kerberos.kerb.spec.common.EncryptionKey;
+import org.apache.kerby.kerberos.kerb.spec.common.PrincipalName;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.List;
+
+public class KeytabOutputStream extends KrbOutputStream
+{
+	public KeytabOutputStream(OutputStream out) {
+        super(out);
+    }
+
+    public void writePrincipal(PrincipalName principal, int version) throws IOException {
+        List<String> nameStrings = principal.getNameStrings();
+        int numComponents = principal.getNameStrings().size();
+        String realm = principal.getRealm();
+
+        writeShort(numComponents);
+
+        writeCountedString(realm);
+
+        for (String nameCom : nameStrings) {
+            writeCountedString(nameCom);
+        }
+
+        writeInt(principal.getNameType().getValue()); // todo: consider the version
+    }
+
+    @Override
+    public void writeKey(EncryptionKey key, int version) throws IOException {
+    	writeShort(key.getKeyType().getValue());
+        writeCountedOctets(key.getKeyData());
+    }
+
+    @Override
+    public void writeCountedOctets(byte[] data) throws IOException {
+        writeShort(data.length);
+        write(data);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/ceacb982/kerby-kerb/kerb-util/src/main/java/org/apache/kerby/kerberos/kerb/keytab/KrbKeytab.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-util/src/main/java/org/apache/kerby/kerberos/kerb/keytab/KrbKeytab.java b/kerby-kerb/kerb-util/src/main/java/org/apache/kerby/kerberos/kerb/keytab/KrbKeytab.java
new file mode 100644
index 0000000..1b01fc2
--- /dev/null
+++ b/kerby-kerb/kerb-util/src/main/java/org/apache/kerby/kerberos/kerb/keytab/KrbKeytab.java
@@ -0,0 +1,55 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.kerby.kerberos.kerb.keytab;
+
+import org.apache.kerby.kerberos.kerb.spec.common.EncryptionKey;
+import org.apache.kerby.kerberos.kerb.spec.common.EncryptionType;
+import org.apache.kerby.kerberos.kerb.spec.common.PrincipalName;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+
+public interface KrbKeytab {
+
+    public List<PrincipalName> getPrincipals();
+
+    public void addKeytabEntries(List<KeytabEntry> entries);
+
+    public void removeKeytabEntries(PrincipalName principal);
+
+    public void removeKeytabEntry(KeytabEntry entry);
+
+    public List<KeytabEntry> getKeytabEntries(PrincipalName principal);
+
+    public EncryptionKey getKey(PrincipalName principal, EncryptionType keyType);
+
+    public void load(File keytabFile) throws IOException;
+
+    public void load(InputStream inputStream) throws IOException;
+
+    void addEntry(KeytabEntry entry);
+
+    public void store(File keytabFile) throws IOException;
+
+    public void store(OutputStream outputStream) throws IOException;
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/ceacb982/kerby-kerb/kerb-util/src/main/java/org/apache/kerby/kerberos/kerb/keytab/keytab.txt
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-util/src/main/java/org/apache/kerby/kerberos/kerb/keytab/keytab.txt b/kerby-kerb/kerb-util/src/main/java/org/apache/kerby/kerberos/kerb/keytab/keytab.txt
new file mode 100644
index 0000000..88a7b46
--- /dev/null
+++ b/kerby-kerb/kerb-util/src/main/java/org/apache/kerby/kerberos/kerb/keytab/keytab.txt
@@ -0,0 +1,106 @@
+The Kerberos Keytab Binary File Format
+Copyright (C) 2006 Michael B Allen <mba2000 ioplex.com>
+http://www.ioplex.com/utilities/keytab.txt
+Last updated: Fri May  5 13:39:40 EDT 2006
+
+The MIT keytab binary format is not a standard format, nor is it
+documented anywhere in detail. The format has evolved and may continue
+to. It is however understood by several Kerberos implementations including
+Heimdal and of course MIT and keytab files are created by the ktpass.exe
+utility from Windows. So it has established itself as the defacto format
+for storing Kerberos keys.
+
+The following C-like structure definitions illustrate the MIT keytab
+file format. All values are in network byte order. All text is ASCII.
+
+  keytab {
+      uint16_t file_format_version;                    /* 0x502 */
+      keytab_entry entries[*];
+  };
+
+  keytab_entry {
+      int32_t size;
+      uint16_t num_components;    /* sub 1 if version 0x501 */
+      counted_octet_string realm;
+      counted_octet_string components[num_components];
+      uint32_t name_type;   /* not present if version 0x501 */
+      uint32_t timestamp;
+      uint8_t vno8;
+      keyblock key;
+      uint32_t vno; /* only present if >= 4 bytes left in entry */
+  };
+
+  counted_octet_string {
+      uint16_t length;
+      uint8_t data[length];
+  };
+
+  keyblock {
+      uint16_t type;
+      counted_octet_string;
+  };
+
+The keytab file format begins with the 16 bit file_format_version which
+at the time this document was authored is 0x502. The format of older
+keytabs is described at the end of this document.
+
+The file_format_version is immediately followed by an array of
+keytab_entry structures which are prefixed with a 32 bit size indicating
+the number of bytes that follow in the entry. Note that the size should be
+evaluated as signed. This is because a negative value indicates that the
+entry is in fact empty (e.g. it has been deleted) and that the negative
+value of that negative value (which is of course a positive value) is
+the offset to the next keytab_entry. Based on these size values alone
+the entire keytab file can be traversed.
+
+The size is followed by a 16 bit num_components field indicating the
+number of counted_octet_string components in the components array.
+
+The num_components field is followed by a counted_octet_string
+representing the realm of the principal.
+
+A counted_octet_string is simply an array of bytes prefixed with a 16
+bit length. For the realm and name components, the counted_octet_string
+bytes are ASCII encoded text with no zero terminator.
+
+Following the realm is the components array that represents the name of
+the principal. The text of these components may be joined with slashs
+to construct the typical SPN representation. For example, the service
+principal HTTP/www.foo.net@FOO.NET would consist of name components
+"HTTP" followed by "www.foo.net".
+
+Following the components array is the 32 bit name_type (e.g. 1 is
+KRB5_NT_PRINCIPAL, 2 is KRB5_NT_SRV_INST, 5 is KRB5_NT_UID, etc). In
+practice the name_type is almost certainly 1 meaning KRB5_NT_PRINCIPAL.
+
+The 32 bit timestamp indicates the time the key was established for that
+principal. The value represents the number of seconds since Jan 1, 1970.
+
+The 8 bit vno8 field is the version number of the key. This value is
+overridden by the 32 bit vno field if it is present.
+
+The keyblock structure consists of a 16 bit value indicating the keytype
+(e.g. 3 is des-cbc-md5, 23 is arcfour-hmac-md5, 16 is des3-cbc-sha1,
+etc). This is followed by a counted_octet_string containing the key.
+
+The last field of the keytab_entry structure is optional. If the size of
+the keytab_entry indicates that there are at least 4 bytes remaining,
+a 32 bit value representing the key version number is present. This
+value supersedes the 8 bit vno8 value preceeding the keyblock.
+
+Older keytabs with a file_format_version of 0x501 are different in
+three ways:
+
+  1) All integers are in host byte order [1].
+  2) The num_components field is 1 too large (i.e. after decoding,
+     decrement by 1).
+  3) The 32 bit name_type field is not present.
+
+[1] The file_format_version field should really be treated as two
+    separate 8 bit quantities representing the major and minor version
+    number respectively.
+
+Permission to copy, modify, and distribute this document, with or
+without modification, for any purpose and without fee or royalty is
+hereby granted, provided that you include this copyright notice in ALL
+copies of the document or portions thereof, including modifications.

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/ceacb982/kerby-kerb/kerb-util/src/test/java/org/apache/kerby/kerberos/kerb/util/CcacheTest.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-util/src/test/java/org/apache/kerby/kerberos/kerb/util/CcacheTest.java b/kerby-kerb/kerb-util/src/test/java/org/apache/kerby/kerberos/kerb/util/CcacheTest.java
new file mode 100644
index 0000000..bd5a685
--- /dev/null
+++ b/kerby-kerb/kerb-util/src/test/java/org/apache/kerby/kerberos/kerb/util/CcacheTest.java
@@ -0,0 +1,57 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.kerby.kerberos.kerb.util;
+
+import org.apache.kerby.kerberos.kerb.ccache.CredentialCache;
+import org.apache.kerby.kerberos.kerb.spec.common.PrincipalName;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+/*
+Default principal: drankye@SH.INTEL.COM
+
+Valid starting       Expires              Service principal
+08/05/2014 00:13:17  08/05/2014 10:13:17  krbtgt/SH.INTEL.COM@SH.INTEL.COM
+        Flags: FIA, Etype (skey, tkt): des3-cbc-sha1, des3-cbc-sha1
+ */
+public class CcacheTest {
+
+    private CredentialCache cc;
+
+    @Before
+    public void setUp() throws IOException {
+        InputStream cis = CcacheTest.class.getResourceAsStream("/test.cc");
+        cc = new CredentialCache();
+        cc.load(cis);
+    }
+
+    @Test
+    public void testCc() {
+        Assert.assertNotNull(cc);
+
+        PrincipalName princ = cc.getPrimaryPrincipal();
+        Assert.assertNotNull(princ);
+        Assert.assertTrue(princ.getName().equals("drankye@SH.INTEL.COM"));
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/ceacb982/kerby-kerb/kerb-util/src/test/java/org/apache/kerby/kerberos/kerb/util/EncryptionTest.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-util/src/test/java/org/apache/kerby/kerberos/kerb/util/EncryptionTest.java b/kerby-kerb/kerb-util/src/test/java/org/apache/kerby/kerberos/kerb/util/EncryptionTest.java
new file mode 100644
index 0000000..e632839
--- /dev/null
+++ b/kerby-kerb/kerb-util/src/test/java/org/apache/kerby/kerberos/kerb/util/EncryptionTest.java
@@ -0,0 +1,148 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.kerby.kerberos.kerb.util;
+
+import org.apache.kerby.kerberos.kerb.KrbException;
+import org.apache.kerby.kerberos.kerb.ccache.CredentialCache;
+import org.apache.kerby.kerberos.kerb.crypto.EncryptionHandler;
+import org.apache.kerby.kerberos.kerb.keytab.Keytab;
+import org.apache.kerby.kerberos.kerb.spec.common.*;
+import org.apache.kerby.kerberos.kerb.spec.ticket.EncTicketPart;
+import org.apache.kerby.kerberos.kerb.spec.ticket.Ticket;
+import org.apache.kerby.kerberos.kerb.codec.KrbCodec;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.List;
+
+/*
+The principal keys for krbtgt/SH.INTEL.COM@SH.INTEL.COM
+
+KVNO Principal
+---- --------------------------------------------------------------------------
+   2 krbtgt/SH.INTEL.COM@SH.INTEL.COM (des-cbc-crc)
+   2 krbtgt/SH.INTEL.COM@SH.INTEL.COM (des3-cbc-raw)
+   2 krbtgt/SH.INTEL.COM@SH.INTEL.COM (des-hmac-sha1)
+   2 krbtgt/SH.INTEL.COM@SH.INTEL.COM (aes256-cts-hmac-sha1-96)
+   2 krbtgt/SH.INTEL.COM@SH.INTEL.COM (aes128-cts-hmac-sha1-96)
+   2 krbtgt/SH.INTEL.COM@SH.INTEL.COM (arcfour-hmac)
+   2 krbtgt/SH.INTEL.COM@SH.INTEL.COM (camellia256-cts-cmac)
+   2 krbtgt/SH.INTEL.COM@SH.INTEL.COM (camellia128-cts-cmac)
+ */
+public class EncryptionTest {
+
+    private Keytab keytab;
+    private CredentialCache cc;
+
+    @Before
+    public void setUp() throws IOException {
+        InputStream kis = EncryptionTest.class.getResourceAsStream("/krbtgt.keytab");
+        keytab = new Keytab();
+        keytab.load(kis);
+    }
+
+    @Test
+    public void testAes128() throws IOException, KrbException {
+        testEncWith("aes128-cts-hmac-sha1-96.cc");
+    }
+
+    @Test
+    public void testAes256() throws IOException, KrbException {
+        testEncWith("aes256-cts-hmac-sha1-96.cc");
+    }
+
+    @Test
+    public void testRc4() throws IOException, KrbException {
+        testEncWith("arcfour-hmac.cc");
+    }
+
+    @Test
+    public void testCamellia128() throws IOException, KrbException {
+        testEncWith("camellia128-cts-cmac.cc");
+    }
+
+    @Test
+    public void testCamellia256() throws IOException, KrbException {
+        testEncWith("camellia256-cts-cmac.cc");
+    }
+
+    @Test
+    public void testDesCbcCrc() throws IOException, KrbException {
+        testEncWith("des-cbc-crc.cc");
+    }
+
+    @Test
+    public void testDes3CbcSha1() throws IOException, KrbException {
+        testEncWith("des3-cbc-sha1.cc");
+    }
+
+    private void testEncWith(String ccFile) throws IOException, KrbException, KrbException {
+        InputStream cis = CcacheTest.class.getResourceAsStream("/" + ccFile);
+        cc = new CredentialCache();
+        cc.load(cis);
+
+        Ticket ticket = getTicket();
+        EncryptionType keyType = ticket.getEncryptedEncPart().getEType();
+        EncryptionKey key = getServerKey(keyType);
+        if (! EncryptionHandler.isImplemented(keyType)) {
+            System.err.println("Key type not supported yet: " + keyType.getName());
+            return;
+        }
+
+        byte[] decrypted = EncryptionHandler.decrypt(
+                ticket.getEncryptedEncPart(), key, KeyUsage.KDC_REP_TICKET);
+        Assert.assertNotNull(decrypted);
+
+        EncTicketPart encPart = KrbCodec.decode(decrypted, EncTicketPart.class);
+        Assert.assertNotNull(encPart);
+        ticket.setEncPart(encPart);
+
+        EncryptedData encrypted = EncryptionHandler.encrypt(
+                decrypted, key, KeyUsage.KDC_REP_TICKET);
+
+        byte[] decrypted2 = EncryptionHandler.decrypt(
+                encrypted, key, KeyUsage.KDC_REP_TICKET);
+        if (! Arrays.equals(decrypted, decrypted2)) {
+            System.err.println("Encryption checking failed after decryption for key type: "
+                    + keyType.getName());
+        }
+    }
+
+    private EncryptionKey getServerKey(EncryptionType keyType) {
+        return keytab.getKey(getServer(), keyType);
+    }
+
+    private PrincipalName getServer() {
+        // only one, krbtgt/SH.INTEL.COM@SH.INTEL.COM
+        List<PrincipalName> principals = keytab.getPrincipals();
+
+        PrincipalName server = principals.get(0);
+
+        return server;
+    }
+
+    private Ticket getTicket() {
+        return cc.getCredentials().get(0).getTicket();
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/ceacb982/kerby-kerb/kerb-util/src/test/java/org/apache/kerby/kerberos/kerb/util/KeysTest.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-util/src/test/java/org/apache/kerby/kerberos/kerb/util/KeysTest.java b/kerby-kerb/kerb-util/src/test/java/org/apache/kerby/kerberos/kerb/util/KeysTest.java
new file mode 100644
index 0000000..c32854f
--- /dev/null
+++ b/kerby-kerb/kerb-util/src/test/java/org/apache/kerby/kerberos/kerb/util/KeysTest.java
@@ -0,0 +1,81 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.kerby.kerberos.kerb.util;
+
+import org.apache.kerby.kerberos.kerb.crypto.EncryptionHandler;
+import org.apache.kerby.kerberos.kerb.keytab.Keytab;
+import org.apache.kerby.kerberos.kerb.keytab.KeytabEntry;
+import org.apache.kerby.kerberos.kerb.KrbException;
+import org.apache.kerby.kerberos.kerb.spec.common.EncryptionKey;
+import org.apache.kerby.kerberos.kerb.spec.common.EncryptionType;
+import org.apache.kerby.kerberos.kerb.spec.common.PrincipalName;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+
+/*
+The principal was created with password '123456'
+KVNO Principal
+---- --------------------------------------------------------------------------
+   1 test@SH.INTEL.COM (des-cbc-crc)
+   1 test@SH.INTEL.COM (des3-cbc-sha1)
+   1 test@SH.INTEL.COM (des-hmac-sha1)
+   1 test@SH.INTEL.COM (aes256-cts-hmac-sha1-96)
+   1 test@SH.INTEL.COM (aes128-cts-hmac-sha1-96)
+   1 test@SH.INTEL.COM (arcfour-hmac)
+   1 test@SH.INTEL.COM (camellia256-cts-cmac)
+   1 test@SH.INTEL.COM (camellia128-cts-cmac)
+ */
+public class KeysTest {
+    private static String TEST_PASSWORD = "123456";
+
+    private Keytab keytab;
+
+    @Before
+    public void setUp() throws IOException {
+        InputStream kis = KeysTest.class.getResourceAsStream("/test.keytab");
+        keytab = new Keytab();
+        keytab.load(kis);
+    }
+
+    @Test
+    public void testString2Key() throws KrbException {
+        List<PrincipalName> principals = keytab.getPrincipals();
+        PrincipalName principal = principals.get(0);
+        List<KeytabEntry> entries = keytab.getKeytabEntries(principal);
+        EncryptionKey genKey;
+        EncryptionType keyType;
+        for (KeytabEntry ke : entries) {
+            keyType = ke.getKey().getKeyType();
+            if (EncryptionHandler.isImplemented(keyType)) {
+                genKey = EncryptionHandler.string2Key(principal.getName(),
+                        TEST_PASSWORD, keyType);
+                if(! ke.getKey().equals(genKey)) {
+                    Assert.fail("str2key failed for key type: " + keyType.getName());
+                    //System.err.println("str2key failed for key type: " + keyType.getName());
+                }
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/ceacb982/kerby-kerb/kerb-util/src/test/java/org/apache/kerby/kerberos/kerb/util/KeytabTest.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-util/src/test/java/org/apache/kerby/kerberos/kerb/util/KeytabTest.java b/kerby-kerb/kerb-util/src/test/java/org/apache/kerby/kerberos/kerb/util/KeytabTest.java
new file mode 100644
index 0000000..01cdaed
--- /dev/null
+++ b/kerby-kerb/kerb-util/src/test/java/org/apache/kerby/kerberos/kerb/util/KeytabTest.java
@@ -0,0 +1,76 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.kerby.kerberos.kerb.util;
+
+import org.apache.kerby.kerberos.kerb.keytab.Keytab;
+import org.apache.kerby.kerberos.kerb.keytab.KeytabEntry;
+import org.apache.kerby.kerberos.kerb.spec.common.PrincipalName;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+
+/*
+The principal was created with password '123456'
+
+KVNO Principal
+---- --------------------------------------------------------------------------
+   1 test@SH.INTEL.COM (des-cbc-crc)
+   1 test@SH.INTEL.COM (des3-cbc-sha1)
+   1 test@SH.INTEL.COM (des-hmac-sha1)
+   1 test@SH.INTEL.COM (aes256-cts-hmac-sha1-96)
+   1 test@SH.INTEL.COM (aes128-cts-hmac-sha1-96)
+   1 test@SH.INTEL.COM (arcfour-hmac)
+   1 test@SH.INTEL.COM (camellia256-cts-cmac)
+   1 test@SH.INTEL.COM (camellia128-cts-cmac)
+ */
+public class KeytabTest {
+
+    private Keytab keytab;
+
+    @Before
+    public void setUp() throws IOException {
+        InputStream kis = KeytabTest.class.getResourceAsStream("/test.keytab");
+        keytab = new Keytab();
+        keytab.load(kis);
+    }
+
+    @Test
+    public void testKeytab() {
+        Assert.assertNotNull(keytab);
+
+        List<PrincipalName> principals = keytab.getPrincipals();
+        PrincipalName principal = principals.get(0);
+        List<KeytabEntry> entries = keytab.getKeytabEntries(principal);
+        for (KeytabEntry ke : entries) {
+            Assert.assertTrue(ke.getKvno() == 1);
+        }
+    }
+
+    public static void main(String[] args) throws IOException {
+        InputStream kis = KeytabTest.class.getResourceAsStream("test.keytab");
+        Keytab keytab = new Keytab();
+        keytab.load(kis);
+        System.out.println("Principals:" + keytab.getPrincipals().size());
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/ceacb982/kerby-kerb/kerb-util/src/test/resources/aes128-cts-hmac-sha1-96.cc
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-util/src/test/resources/aes128-cts-hmac-sha1-96.cc b/kerby-kerb/kerb-util/src/test/resources/aes128-cts-hmac-sha1-96.cc
new file mode 100644
index 0000000..2ae9f6e
Binary files /dev/null and b/kerby-kerb/kerb-util/src/test/resources/aes128-cts-hmac-sha1-96.cc differ

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/ceacb982/kerby-kerb/kerb-util/src/test/resources/aes256-cts-hmac-sha1-96.cc
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-util/src/test/resources/aes256-cts-hmac-sha1-96.cc b/kerby-kerb/kerb-util/src/test/resources/aes256-cts-hmac-sha1-96.cc
new file mode 100644
index 0000000..929c40e
Binary files /dev/null and b/kerby-kerb/kerb-util/src/test/resources/aes256-cts-hmac-sha1-96.cc differ

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/ceacb982/kerby-kerb/kerb-util/src/test/resources/arcfour-hmac.cc
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-util/src/test/resources/arcfour-hmac.cc b/kerby-kerb/kerb-util/src/test/resources/arcfour-hmac.cc
new file mode 100644
index 0000000..f7bb88d
Binary files /dev/null and b/kerby-kerb/kerb-util/src/test/resources/arcfour-hmac.cc differ

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/ceacb982/kerby-kerb/kerb-util/src/test/resources/camellia-expect-vt.txt
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-util/src/test/resources/camellia-expect-vt.txt b/kerby-kerb/kerb-util/src/test/resources/camellia-expect-vt.txt
new file mode 100644
index 0000000..e6ebe8a
--- /dev/null
+++ b/kerby-kerb/kerb-util/src/test/resources/camellia-expect-vt.txt
@@ -0,0 +1,1036 @@
+
+KEYSIZE=128
+
+KEY=00000000000000000000000000000000
+
+I=1
+PT=80000000000000000000000000000000
+CT=07923A39EB0A817D1C4D87BDB82D1F1C
+
+I=2
+PT=40000000000000000000000000000000
+CT=48CD6419809672D2349260D89A08D3D3
+
+I=3
+PT=20000000000000000000000000000000
+CT=D07493CCB2E95CE0B4945A05ACC97D82
+
+I=4
+PT=10000000000000000000000000000000
+CT=5DBE1EAC9F7080A88DBED7F6DA101448
+
+I=5
+PT=08000000000000000000000000000000
+CT=F01EE477D199DF2701027034B229622F
+
+I=6
+PT=04000000000000000000000000000000
+CT=C841587ABD9A912E563774CB569D051E
+
+I=7
+PT=02000000000000000000000000000000
+CT=1D9BC0C04546F0915C8CCD11391A455C
+
+I=8
+PT=01000000000000000000000000000000
+CT=05E6EBB4BA167F5C479CEFF3152F943B
+
+I=9
+PT=00800000000000000000000000000000
+CT=93211E0F788845B9FC0E4551FFE92AC9
+
+I=10
+PT=00400000000000000000000000000000
+CT=B6D35701CD8FADDE383BBE8E6B70BAF7
+
+I=11
+PT=00200000000000000000000000000000
+CT=8358F9F4EBCFEE348CB30551ACB151A0
+
+I=12
+PT=00100000000000000000000000000000
+CT=D57516EB5AD93C523E40521BF447AFCE
+
+I=13
+PT=00080000000000000000000000000000
+CT=66B2534C279C439133F52E5AD8B439A9
+
+I=14
+PT=00040000000000000000000000000000
+CT=A71C69184A9F63C2992A5F18F77C1FE9
+
+I=15
+PT=00020000000000000000000000000000
+CT=1ADCBE49AEACB9ECEBBD492B10E82C7B
+
+I=16
+PT=00010000000000000000000000000000
+CT=27E3BCFB227C5561DB6CF7FC30387036
+
+I=17
+PT=00008000000000000000000000000000
+CT=F4AE20365CC9D06B0CAE6B695ED2CEC1
+
+I=18
+PT=00004000000000000000000000000000
+CT=3DD682F0B641ED32AD3D43EA2A0456E4
+
+I=19
+PT=00002000000000000000000000000000
+CT=6E5D14A95ECC290B509EA6B673652E3A
+
+I=20
+PT=00001000000000000000000000000000
+CT=F1CDF0F8D7B3FFD95422D7CC0CF40B7B
+
+I=21
+PT=00000800000000000000000000000000
+CT=A9253D459A34C385A1F1B2CFFA3935C5
+
+I=22
+PT=00000400000000000000000000000000
+CT=291024D99FF09A47A1DEE45BA700AE52
+
+I=23
+PT=00000200000000000000000000000000
+CT=49241D9459B277187BB10081C60361C0
+
+I=24
+PT=00000100000000000000000000000000
+CT=AD9BA365CC4DD5553D2D9FE303841D88
+
+I=25
+PT=00000080000000000000000000000000
+CT=C2ECA616664A249DC622CC11196B4AE1
+
+I=26
+PT=00000040000000000000000000000000
+CT=6E1A2D4794BB0DC08777A0BC7523E70E
+
+I=27
+PT=00000020000000000000000000000000
+CT=6DB1F0CF59656BDD235E82B8CEF0BE8E
+
+I=28
+PT=00000010000000000000000000000000
+CT=52F239C5EAF401EBDC54D2F011FF4B6A
+
+I=29
+PT=00000008000000000000000000000000
+CT=6B58A08F648414B67FD6847D2AA51CBF
+
+I=30
+PT=00000004000000000000000000000000
+CT=2959DD5367885A75EB48053CF3251A36
+
+I=31
+PT=00000002000000000000000000000000
+CT=630B292E3B88EF641CDFD531E206605E
+
+I=32
+PT=00000001000000000000000000000000
+CT=4BBB88EF82B70593FCC56AFD91540FDB
+
+I=33
+PT=00000000800000000000000000000000
+CT=0A13055B118A45C606999257BD191426
+
+I=34
+PT=00000000400000000000000000000000
+CT=5CF8E5C9F15D7E4F865020224853EB77
+
+I=35
+PT=00000000200000000000000000000000
+CT=3898805042C7A4315C5EE51AF2DE47E2
+
+I=36
+PT=00000000100000000000000000000000
+CT=8D3F96372E87CBB0B375425B3A10B9E7
+
+I=37
+PT=00000000080000000000000000000000
+CT=4D9510A378BD784A70A66BCC75B7D3C8
+
+I=38
+PT=00000000040000000000000000000000
+CT=70DB1902D37CFBDFB98F7C516F79D416
+
+I=39
+PT=00000000020000000000000000000000
+CT=383C6C2AABEF7FDE25CD470BF774A331
+
+I=40
+PT=00000000010000000000000000000000
+CT=47CBCB5288349B1A15DC9F81FBEE6B8F
+
+I=41
+PT=00000000008000000000000000000000
+CT=21DA34D4468EEB13AED95DAE0FF48310
+
+I=42
+PT=00000000004000000000000000000000
+CT=021C9A8E6BD36FBD036411E5D852A80F
+
+I=43
+PT=00000000002000000000000000000000
+CT=6A459E2F839AF60ACDE83774D0BB5574
+
+I=44
+PT=00000000001000000000000000000000
+CT=C19255121F1B933CAE09E58AEC0E9977
+
+I=45
+PT=00000000000800000000000000000000
+CT=7BA949E27B2BE148A6B801F9305F43D5
+
+I=46
+PT=00000000000400000000000000000000
+CT=E8CEB1026BCF7BCEA32E8A380EA76DB7
+
+I=47
+PT=00000000000200000000000000000000
+CT=63F97747ED56A8F521B20CC65F6F9465
+
+I=48
+PT=00000000000100000000000000000000
+CT=2091CFDC629819106188424AC694F75B
+
+I=49
+PT=00000000000080000000000000000000
+CT=A91BDF8E8B88407942423CCE000527C4
+
+I=50
+PT=00000000000040000000000000000000
+CT=73F9B44B9635A3FD683DBF8D49E9825B
+
+I=51
+PT=00000000000020000000000000000000
+CT=9DC64B2133FAD5069FD9A7CC2FFFD1CC
+
+I=52
+PT=00000000000010000000000000000000
+CT=28240F81FEC36B71E13F1FEA7A7641E3
+
+I=53
+PT=00000000000008000000000000000000
+CT=20DD39FEE96CD2EFF972872A692B28FD
+
+I=54
+PT=00000000000004000000000000000000
+CT=47A9E40483EC1925B635E47E964E8E93
+
+I=55
+PT=00000000000002000000000000000000
+CT=9C0EBD822C49FB3D853DF5B315A87BA0
+
+I=56
+PT=00000000000001000000000000000000
+CT=C18D813FDB45A594C6DC24E5A1F6CE32
+
+I=57
+PT=00000000000000800000000000000000
+CT=7E5467FF245ECF80CB55C2D8E91F0711
+
+I=58
+PT=00000000000000400000000000000000
+CT=394D4365B77954FDEA4145FCF7A7A041
+
+I=59
+PT=00000000000000200000000000000000
+CT=B1D8311A492ED11F11E57B29221610C4
+
+I=60
+PT=00000000000000100000000000000000
+CT=E5FBB947A63AEA90163AF04AD6951EF8
+
+I=61
+PT=00000000000000080000000000000000
+CT=CA0627DDF580F0E7D59562825C9D0492
+
+I=62
+PT=00000000000000040000000000000000
+CT=EF98FFD1AED295AAE1860F0274C8F555
+
+I=63
+PT=00000000000000020000000000000000
+CT=8C698E5CFFF08FACE10C2DC5FF1E2A81
+
+I=64
+PT=00000000000000010000000000000000
+CT=35A7767E02032C35B5CE1A6F49C57C28
+
+I=65
+PT=00000000000000008000000000000000
+CT=AB36F8734E76EBA306CF00D6763D90B0
+
+I=66
+PT=00000000000000004000000000000000
+CT=E854EB66D4EC66889B5E6CD4F44A5806
+
+I=67
+PT=00000000000000002000000000000000
+CT=15B66DF1455ACD640B8716BCF5DB2D69
+
+I=68
+PT=00000000000000001000000000000000
+CT=4C57AB5333E5C2D4B7E30A007E449F48
+
+I=69
+PT=00000000000000000800000000000000
+CT=BA3E7FF28EB38EA09D8DB1440A9A3552
+
+I=70
+PT=00000000000000000400000000000000
+CT=64E60227AFD80C40C70186CC94804C1A
+
+I=71
+PT=00000000000000000200000000000000
+CT=CEB4423C20B4C91C2551F6FC227C9514
+
+I=72
+PT=00000000000000000100000000000000
+CT=F736894B843EF32DA28576DE500D448C
+
+I=73
+PT=00000000000000000080000000000000
+CT=58FDA98B678D15053D4B6C060368108C
+
+I=74
+PT=00000000000000000040000000000000
+CT=E28CAE384E578F47657755EBCD97996C
+
+I=75
+PT=00000000000000000020000000000000
+CT=0A64617BD4B5B166668240D105B7B6A2
+
+I=76
+PT=00000000000000000010000000000000
+CT=4BD090C7E3D365B5EA80F19B4798881E
+
+I=77
+PT=00000000000000000008000000000000
+CT=BC7B6CB9BFF4F72973BB2CD20A512C06
+
+I=78
+PT=00000000000000000004000000000000
+CT=4C7ADDC5C867594E9EE75F0AA6AB9C23
+
+I=79
+PT=00000000000000000002000000000000
+CT=1FBD05C71A36691AC6566A5298101D53
+
+I=80
+PT=00000000000000000001000000000000
+CT=42D7D6B1F499D412F8793972BD968DA2
+
+I=81
+PT=00000000000000000000800000000000
+CT=260EC86E2786FC68824576B934F32814
+
+I=82
+PT=00000000000000000000400000000000
+CT=576C26DFD7046F9357F34BEA7DFB26A0
+
+I=83
+PT=00000000000000000000200000000000
+CT=6D55E54BFB6F927174A02294C95E0F8F
+
+I=84
+PT=00000000000000000000100000000000
+CT=1A6CE91DD458229C7675A34950D10E23
+
+I=85
+PT=00000000000000000000080000000000
+CT=DAD0D5E7E000652825AA34D228EA8D8F
+
+I=86
+PT=00000000000000000000040000000000
+CT=E68013F48D75EAD2BBC0B0BDA5E690BF
+
+I=87
+PT=00000000000000000000020000000000
+CT=A07D92312FBAE37BFE8A834210AE4F9C
+
+I=88
+PT=00000000000000000000010000000000
+CT=6EEE5F8544CD7D456366EB448813989A
+
+I=89
+PT=00000000000000000000008000000000
+CT=F8E5C7FF4B79D7ABE8BFA2DD148820A8
+
+I=90
+PT=00000000000000000000004000000000
+CT=C6349D75C7472BBD66F95B3A07C79C91
+
+I=91
+PT=00000000000000000000002000000000
+CT=B85713C12D8658951CD1AD21C74D2CD2
+
+I=92
+PT=00000000000000000000001000000000
+CT=907AA00B9F7D47A97623FB55BA911F29
+
+I=93
+PT=00000000000000000000000800000000
+CT=DC3CD0ED23D11776FAB43A2A6A8F3557
+
+I=94
+PT=00000000000000000000000400000000
+CT=4BFE58A8FD69179C14765B09AB70B705
+
+I=95
+PT=00000000000000000000000200000000
+CT=A23996E0EA67EC280356E5F77130A551
+
+I=96
+PT=00000000000000000000000100000000
+CT=CDEADE859B3AACD273CCA85A3E2E45F2
+
+I=97
+PT=00000000000000000000000080000000
+CT=E0FC78489857D84DA03F40CE97147174
+
+I=98
+PT=00000000000000000000000040000000
+CT=7615EA6351F6BB12855E8579C6995D8E
+
+I=99
+PT=00000000000000000000000020000000
+CT=13E184344FE28C2E70ED0E4D0A8037F9
+
+I=100
+PT=00000000000000000000000010000000
+CT=A5FE395F568482B87BC3EB208C81C942
+
+I=101
+PT=00000000000000000000000008000000
+CT=B3103E11AF06C85565823F8CAA3159F6
+
+I=102
+PT=00000000000000000000000004000000
+CT=7EBC2234D271B89C519C396985300030
+
+I=103
+PT=00000000000000000000000002000000
+CT=0661D338F2E0C939BA1687820A768467
+
+I=104
+PT=00000000000000000000000001000000
+CT=EC2B42667C0195A90715499617884DA5
+
+I=105
+PT=00000000000000000000000000800000
+CT=AE077BA19D24E7188DDD3682FF196892
+
+I=106
+PT=00000000000000000000000000400000
+CT=98823C24B9C65A66073C7952DC2B4B5E
+
+I=107
+PT=00000000000000000000000000200000
+CT=6AB58432CBB3C2F503DA2D16796CC297
+
+I=108
+PT=00000000000000000000000000100000
+CT=EEB5EBB3A53E4196C2F22BC1A4DDF5E8
+
+I=109
+PT=00000000000000000000000000080000
+CT=33DC40AC5FDC126D38878416AF6C0FA6
+
+I=110
+PT=00000000000000000000000000040000
+CT=38EDDC08E18B4AD982CEA921D2765A9A
+
+I=111
+PT=00000000000000000000000000020000
+CT=7D6BEA038E9347C642E18631660A9558
+
+I=112
+PT=00000000000000000000000000010000
+CT=FDA57921A473B5EE3700AD5ADF035019
+
+I=113
+PT=00000000000000000000000000008000
+CT=699B4812E200337E9C1D2C397F0DFE4E
+
+I=114
+PT=00000000000000000000000000004000
+CT=7A1EADF68B0807145D6C414852DECFC8
+
+I=115
+PT=00000000000000000000000000002000
+CT=1645FFAA8AD76689C01DA8C40882781F
+
+I=116
+PT=00000000000000000000000000001000
+CT=BA0C053BE702FA62FC66D8FEB12FC97E
+
+I=117
+PT=00000000000000000000000000000800
+CT=841FD8AF69CF2C31F7D4D7B6959662B5
+
+I=118
+PT=00000000000000000000000000000400
+CT=F675D59BDB33231861268F539829DA0B
+
+I=119
+PT=00000000000000000000000000000200
+CT=A4967F45ABB4E8C7DC5E3806680F35E0
+
+I=120
+PT=00000000000000000000000000000100
+CT=4D7E08081CC82F92ABA7C58C99F8343F
+
+I=121
+PT=00000000000000000000000000000080
+CT=9AEFDB287C119B82353612B60ECCBFD8
+
+I=122
+PT=00000000000000000000000000000040
+CT=979BB6A1553A17592A86E78DF144A699
+
+I=123
+PT=00000000000000000000000000000020
+CT=A6FA8CAB06FD2E5BF3A858983C01757A
+
+I=124
+PT=00000000000000000000000000000010
+CT=BE8511254C31E25420B91D6FEF1710ED
+
+I=125
+PT=00000000000000000000000000000008
+CT=F589A908D18A21894971C0433581E1A5
+
+I=126
+PT=00000000000000000000000000000004
+CT=4237585130E7C9F715235EB1D8C94DE7
+
+I=127
+PT=00000000000000000000000000000002
+CT=DEFE3E0B5C54C94B4F2A0F5A46F6210D
+
+I=128
+PT=00000000000000000000000000000001
+CT=F5574ACC3148DFCB9015200631024DF9
+
+==========
+
+KEYSIZE=256
+
+KEY=0000000000000000000000000000000000000000000000000000000000000000
+
+I=1
+PT=80000000000000000000000000000000
+CT=B0C6B88AEA518AB09E847248E91B1B9D
+
+I=2
+PT=40000000000000000000000000000000
+CT=B8D7684E35FA1DB15BDCEE7A48659858
+
+I=3
+PT=20000000000000000000000000000000
+CT=F0CAD59AF92FBB79F36951E697492750
+
+I=4
+PT=10000000000000000000000000000000
+CT=117100F6635389560DC4A2DA24EBA70F
+
+I=5
+PT=08000000000000000000000000000000
+CT=DBDD62355553019ED84C35886421E532
+
+I=6
+PT=04000000000000000000000000000000
+CT=9CB8D04FA506F19848F7B9110518BFC8
+
+I=7
+PT=02000000000000000000000000000000
+CT=E4308E253BC3444D293500701BA82C6A
+
+I=8
+PT=01000000000000000000000000000000
+CT=EA2FAE53F7F30C0170A20E95A068503E
+
+I=9
+PT=00800000000000000000000000000000
+CT=14B14839EA221880B2C64D1FE000B93D
+
+I=10
+PT=00400000000000000000000000000000
+CT=A5CFC075B342D5101AACC334E73058BB
+
+I=11
+PT=00200000000000000000000000000000
+CT=477EA56B2EBAD0F8AC5E1936866560FF
+
+I=12
+PT=00100000000000000000000000000000
+CT=107E8598418404196EC59F63E45B7F6D
+
+I=13
+PT=00080000000000000000000000000000
+CT=FF6A891E7C1C074A68FEC291928FDD8D
+
+I=14
+PT=00040000000000000000000000000000
+CT=F64C250A13F45D377ADB7545B2B157A9
+
+I=15
+PT=00020000000000000000000000000000
+CT=FAD0F252086F11C830C65B63197CBC38
+
+I=16
+PT=00010000000000000000000000000000
+CT=9DCB89B209441F02AD0D25C6AB826629
+
+I=17
+PT=00008000000000000000000000000000
+CT=E62E4ED4E4F34EDC563710D960E09D4C
+
+I=18
+PT=00004000000000000000000000000000
+CT=98A1B926BA06895C3F2E84CCBACBC356
+
+I=19
+PT=00002000000000000000000000000000
+CT=29BE0BE4DB7F4D196718AEA38F3B0BFD
+
+I=20
+PT=00001000000000000000000000000000
+CT=F670C4EBECBA0B43E71F6D752BFD4854
+
+I=21
+PT=00000800000000000000000000000000
+CT=7D7666B4484CDB7E3605468E093A787C
+
+I=22
+PT=00000400000000000000000000000000
+CT=562D06B181C091DA6C43642AE99460C6
+
+I=23
+PT=00000200000000000000000000000000
+CT=AB0EFB5975E6186B7D76BC9672453488
+
+I=24
+PT=00000100000000000000000000000000
+CT=10C0756538E7BFF88D19AE2B1F7B859A
+
+I=25
+PT=00000080000000000000000000000000
+CT=AF7FCD5248F8C72F1695AA05DD1CADE0
+
+I=26
+PT=00000040000000000000000000000000
+CT=9841E555655609A75D7BE20B8A90EF1E
+
+I=27
+PT=00000020000000000000000000000000
+CT=27F9546E6A1B7464780000561783569C
+
+I=28
+PT=00000010000000000000000000000000
+CT=8671D935D7A8354EECB7288803D42D7A
+
+I=29
+PT=00000008000000000000000000000000
+CT=0DA44F508DEBC6F044394624FCEB8EBE
+
+I=30
+PT=00000004000000000000000000000000
+CT=AB137369BE6D93FBB18006BDB236EC09
+
+I=31
+PT=00000002000000000000000000000000
+CT=EB90C4E597A7E1779FFA260886E26F75
+
+I=32
+PT=00000001000000000000000000000000
+CT=618CF3588D5C128EAF252616230E08F7
+
+I=33
+PT=00000000800000000000000000000000
+CT=98DC4DB49D197AB9152D12B9DE2D73CA
+
+I=34
+PT=00000000400000000000000000000000
+CT=5BDDE24B15702A35E1F140C57D206443
+
+I=35
+PT=00000000200000000000000000000000
+CT=CF755809882BED8BA2F9F1A4ED296A2B
+
+I=36
+PT=00000000100000000000000000000000
+CT=F1A8DBB999538AE89D16F92A7F4D1DF1
+
+I=37
+PT=00000000080000000000000000000000
+CT=775222FDDAAECB81CF675C4E0B98179E
+
+I=38
+PT=00000000040000000000000000000000
+CT=12A648CADCD153C760A965826683119A
+
+I=39
+PT=00000000020000000000000000000000
+CT=0503FB10AB241E7CF45D8CDEEE474335
+
+I=40
+PT=00000000010000000000000000000000
+CT=3D299C0070CBBD831B802690B8E7CA24
+
+I=41
+PT=00000000008000000000000000000000
+CT=33105BD4D11D66753DC34D128BEFE3F4
+
+I=42
+PT=00000000004000000000000000000000
+CT=5EFCE2B4B987C0F77D27B44836881682
+
+I=43
+PT=00000000002000000000000000000000
+CT=7835449454128035D7F0EA99E327577B
+
+I=44
+PT=00000000001000000000000000000000
+CT=27BEDDA0601BE35122FB1D272D73AB3E
+
+I=45
+PT=00000000000800000000000000000000
+CT=54C3F99FF48E318CC515EDE75800C4B3
+
+I=46
+PT=00000000000400000000000000000000
+CT=C627C329F8E48299F6FDB23B9DBEA0BB
+
+I=47
+PT=00000000000200000000000000000000
+CT=1B6578F9E23BD8C1845A02431C5F9AA3
+
+I=48
+PT=00000000000100000000000000000000
+CT=6DB2FB8C0B9344D0547C0FF1292020C6
+
+I=49
+PT=00000000000080000000000000000000
+CT=4FAD9B2C37C131493FBEF53581FA4F83
+
+I=50
+PT=00000000000040000000000000000000
+CT=47502A01E93D2C87BD5584F6AFD3D99D
+
+I=51
+PT=00000000000020000000000000000000
+CT=056E1C6F651BFE50271B3B7A18E76D84
+
+I=52
+PT=00000000000010000000000000000000
+CT=5632BAF6627B3D96AD4E06FA6A561F55
+
+I=53
+PT=00000000000008000000000000000000
+CT=E29807CAACDFA2D41A7D9E91FA7FD8EB
+
+I=54
+PT=00000000000004000000000000000000
+CT=81DD44BB5D1822DEE605F9E6FF01D7B3
+
+I=55
+PT=00000000000002000000000000000000
+CT=5C3649925E47D7FF96482A8FBD9666FD
+
+I=56
+PT=00000000000001000000000000000000
+CT=695415A836E66E737887845EC08A1ADB
+
+I=57
+PT=00000000000000800000000000000000
+CT=F5416BCE292D9E2CEA5D1CC70BBAEED1
+
+I=58
+PT=00000000000000400000000000000000
+CT=7AEC4F1388FC29C47F7FED74ADDE8485
+
+I=59
+PT=00000000000000200000000000000000
+CT=82A9F1A6CE08BC4876E649D8A8EA7EB6
+
+I=60
+PT=00000000000000100000000000000000
+CT=B6296C88ADF1A792908B065EEB04BFC2
+
+I=61
+PT=00000000000000080000000000000000
+CT=E766A39AECCA40BDBFBE6FF3FA292913
+
+I=62
+PT=00000000000000040000000000000000
+CT=C6D081454EA00D83C23B5A62C84359E1
+
+I=63
+PT=00000000000000020000000000000000
+CT=85D259A79CCA80484504D1603F7A8F53
+
+I=64
+PT=00000000000000010000000000000000
+CT=D8291FA1C6DC250078824B2D0A20883F
+
+I=65
+PT=00000000000000008000000000000000
+CT=95387CB74C48FFBD1F8D64A6CC45E074
+
+I=66
+PT=00000000000000004000000000000000
+CT=A17F975F538F56CDF629B516011DE837
+
+I=67
+PT=00000000000000002000000000000000
+CT=B50B615A1654C6E1CB6AB33716C097FE
+
+I=68
+PT=00000000000000001000000000000000
+CT=7BBB2CBB874DF6C8B821DA7FB0F9011B
+
+I=69
+PT=00000000000000000800000000000000
+CT=E9EFE074D096A275E47CD2E6206DF6A1
+
+I=70
+PT=00000000000000000400000000000000
+CT=88F2F8D5A836406AE8BBB98C65BBDA55
+
+I=71
+PT=00000000000000000200000000000000
+CT=F64620D8D87585A3EF038B9AD58F5EA0
+
+I=72
+PT=00000000000000000100000000000000
+CT=694438EC141C8ED5F2F898B4554A298F
+
+I=73
+PT=00000000000000000080000000000000
+CT=3E6226EC7726A1EE5F5FA9B18CCE8C44
+
+I=74
+PT=00000000000000000040000000000000
+CT=8AB6949E79911647800B9E87362AB97A
+
+I=75
+PT=00000000000000000020000000000000
+CT=093C5CF24EDAF7F9F1C8A80DE4FF50A9
+
+I=76
+PT=00000000000000000010000000000000
+CT=28A36E50061F19E240351ED0E378CBF4
+
+I=77
+PT=00000000000000000008000000000000
+CT=B93BB36CB88BF26EA79198652AA51D3C
+
+I=78
+PT=00000000000000000004000000000000
+CT=DE4948083D044FAC9BCA6DA8CD67B8A6
+
+I=79
+PT=00000000000000000002000000000000
+CT=6E778B5BDA6CA118117E47470D080D3C
+
+I=80
+PT=00000000000000000001000000000000
+CT=0A9107324DA32B4281D032A3487EF875
+
+I=81
+PT=00000000000000000000800000000000
+CT=18ED5635312D71ABD123CCE779D4D68A
+
+I=82
+PT=00000000000000000000400000000000
+CT=2E3C63F95C4BC1F944BAB06DEDC9AA8E
+
+I=83
+PT=00000000000000000000200000000000
+CT=ACCC869EF07004C8C3C709083BE7BA2F
+
+I=84
+PT=00000000000000000000100000000000
+CT=DF60B34FB1A59147CC1FB049C1578206
+
+I=85
+PT=00000000000000000000080000000000
+CT=4228DC636C08E41021054AA0E1E2227A
+
+I=86
+PT=00000000000000000000040000000000
+CT=7CE27F66EFD735FFD6B3E1738C50495B
+
+I=87
+PT=00000000000000000000020000000000
+CT=F8E74B33A9CDE351DA0BBC06D69093D7
+
+I=88
+PT=00000000000000000000010000000000
+CT=AE0D22A5B37B8DC5D81CC641EED334D0
+
+I=89
+PT=00000000000000000000008000000000
+CT=C181C6CA5E163743458B9167A0B6A16A
+
+I=90
+PT=00000000000000000000004000000000
+CT=5171F4F6095E4B276CFBA1F07223FBE6
+
+I=91
+PT=00000000000000000000002000000000
+CT=2732F4D3A8C9D1D8D493840D6E0B864F
+
+I=92
+PT=00000000000000000000001000000000
+CT=3EF04E0059A061D973532CA5C1DFBE7B
+
+I=93
+PT=00000000000000000000000800000000
+CT=6D9A8F23579E4978EBAA87B5ADEB77E5
+
+I=94
+PT=00000000000000000000000400000000
+CT=BBD08873CC44BA4253C0C41FEEB7F124
+
+I=95
+PT=00000000000000000000000200000000
+CT=72E4B2437CBD283F3809CE686F6A591E
+
+I=96
+PT=00000000000000000000000100000000
+CT=6E5580514B92512B1BF4B1B987B9AA1B
+
+I=97
+PT=00000000000000000000000080000000
+CT=5EF5D0C5BCBDCB604D3A083B68CE0FA3
+
+I=98
+PT=00000000000000000000000040000000
+CT=9D991FDD723AD2182777A15CA0E0F665
+
+I=99
+PT=00000000000000000000000020000000
+CT=24440626EFC8F86BEA7DE78085AB8A22
+
+I=100
+PT=00000000000000000000000010000000
+CT=17C3630D62D13C1E826C0FCCBD74A864
+
+I=101
+PT=00000000000000000000000008000000
+CT=4CF5AB86A56AB134A7FE46CCE3F9FCE9
+
+I=102
+PT=00000000000000000000000004000000
+CT=3E6B9C0388F6D9B8F458F30221907607
+
+I=103
+PT=00000000000000000000000002000000
+CT=AD9C926B8A5CD98EEE88200617E59958
+
+I=104
+PT=00000000000000000000000001000000
+CT=AFF8AED5E075E02AF720CA4BF0028B3B
+
+I=105
+PT=00000000000000000000000000800000
+CT=D90EAFF909202BB209BB3BB8C7F9A954
+
+I=106
+PT=00000000000000000000000000400000
+CT=2C709B00E6A22F00F64A7D8EE341853F
+
+I=107
+PT=00000000000000000000000000200000
+CT=CCEC598F0D9F0BF201B2F487136D54A4
+
+I=108
+PT=00000000000000000000000000100000
+CT=73B2883A0A166AAE1BF14E60A5195FA3
+
+I=109
+PT=00000000000000000000000000080000
+CT=E676867BD9AD5EF915143388496779D7
+
+I=110
+PT=00000000000000000000000000040000
+CT=CDCB73D1BFCFD4BE7F1DAA9B1C6A4055
+
+I=111
+PT=00000000000000000000000000020000
+CT=02A3A5C89DAA24CD2C517F7A73286A89
+
+I=112
+PT=00000000000000000000000000010000
+CT=C0FA2AC9E92EE58C2DD12D6D43AB7035
+
+I=113
+PT=00000000000000000000000000008000
+CT=EDC2CB1F7291353BDBF2385519E6AE16
+
+I=114
+PT=00000000000000000000000000004000
+CT=B4B62D16D197A98CD3B978812B9D9884
+
+I=115
+PT=00000000000000000000000000002000
+CT=5CDFC95A529A905101CEA26BC1B891ED
+
+I=116
+PT=00000000000000000000000000001000
+CT=CC7150CD3650B98363296C7C4ED368D1
+
+I=117
+PT=00000000000000000000000000000800
+CT=CC57706B0C6526B8E25A5DBD32EACBDB
+
+I=118
+PT=00000000000000000000000000000400
+CT=30D30456AD98B182D64C649648F6AEC9
+
+I=119
+PT=00000000000000000000000000000200
+CT=D7E9DA7F631938EB649A08AF82FBD75F
+
+I=120
+PT=00000000000000000000000000000100
+CT=B8DA2AF6600B07895B5D0FFAF4991469
+
+I=121
+PT=00000000000000000000000000000080
+CT=0F6F64F930BA6C178943322B98114599
+
+I=122
+PT=00000000000000000000000000000040
+CT=8B1F247802E47C91BEE2AA34ECFD7A01
+
+I=123
+PT=00000000000000000000000000000020
+CT=7A6985778D3A66E97F23E01F0D0E45E7
+
+I=124
+PT=00000000000000000000000000000010
+CT=BA664AC39855518DFDEE10D1B3111FAE
+
+I=125
+PT=00000000000000000000000000000008
+CT=7C92854D801A1648F65CA81813DDBF83
+
+I=126
+PT=00000000000000000000000000000004
+CT=6A3F25AAB7E92D9CF378E5D9C040F26B
+
+I=127
+PT=00000000000000000000000000000002
+CT=3D4B2CDE666761BA5DFB305178E667FB
+
+I=128
+PT=00000000000000000000000000000001
+CT=9CDB269B5D293BC5DB9C55B057D9B591
+
+==========

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/ceacb982/kerby-kerb/kerb-util/src/test/resources/camellia128-cts-cmac.cc
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-util/src/test/resources/camellia128-cts-cmac.cc b/kerby-kerb/kerb-util/src/test/resources/camellia128-cts-cmac.cc
new file mode 100644
index 0000000..5d6f8a5
Binary files /dev/null and b/kerby-kerb/kerb-util/src/test/resources/camellia128-cts-cmac.cc differ

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/ceacb982/kerby-kerb/kerb-util/src/test/resources/camellia256-cts-cmac.cc
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-util/src/test/resources/camellia256-cts-cmac.cc b/kerby-kerb/kerb-util/src/test/resources/camellia256-cts-cmac.cc
new file mode 100644
index 0000000..c9a6ecd
Binary files /dev/null and b/kerby-kerb/kerb-util/src/test/resources/camellia256-cts-cmac.cc differ

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/ceacb982/kerby-kerb/kerb-util/src/test/resources/des-cbc-crc.cc
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-util/src/test/resources/des-cbc-crc.cc b/kerby-kerb/kerb-util/src/test/resources/des-cbc-crc.cc
new file mode 100644
index 0000000..b43fe30
Binary files /dev/null and b/kerby-kerb/kerb-util/src/test/resources/des-cbc-crc.cc differ

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/ceacb982/kerby-kerb/kerb-util/src/test/resources/des3-cbc-sha1.cc
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-util/src/test/resources/des3-cbc-sha1.cc b/kerby-kerb/kerb-util/src/test/resources/des3-cbc-sha1.cc
new file mode 100644
index 0000000..ba2f6ea
Binary files /dev/null and b/kerby-kerb/kerb-util/src/test/resources/des3-cbc-sha1.cc differ

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/ceacb982/kerby-kerb/kerb-util/src/test/resources/krbtgt.keytab
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-util/src/test/resources/krbtgt.keytab b/kerby-kerb/kerb-util/src/test/resources/krbtgt.keytab
new file mode 100644
index 0000000..08bd0c1
Binary files /dev/null and b/kerby-kerb/kerb-util/src/test/resources/krbtgt.keytab differ

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/ceacb982/kerby-kerb/kerb-util/src/test/resources/test.cc
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-util/src/test/resources/test.cc b/kerby-kerb/kerb-util/src/test/resources/test.cc
new file mode 100644
index 0000000..22a27e8
Binary files /dev/null and b/kerby-kerb/kerb-util/src/test/resources/test.cc differ

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/ceacb982/kerby-kerb/kerb-util/src/test/resources/test.keytab
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-util/src/test/resources/test.keytab b/kerby-kerb/kerb-util/src/test/resources/test.keytab
new file mode 100644
index 0000000..5a9c733
Binary files /dev/null and b/kerby-kerb/kerb-util/src/test/resources/test.keytab differ

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/ceacb982/kerby-kerb/pom.xml
----------------------------------------------------------------------
diff --git a/kerby-kerb/pom.xml b/kerby-kerb/pom.xml
new file mode 100644
index 0000000..048736b
--- /dev/null
+++ b/kerby-kerb/pom.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed 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. See accompanying LICENSE file.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.kerby</groupId>
+    <artifactId>kerby-all</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  
+  <artifactId>kerby-kerb</artifactId>
+  <name>Kerby-kerb Project</name>
+  <version>1.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+
+  <modules>
+    <module>kerb-core</module>
+    <module>kerb-core-test</module>
+    <module>kerb-common</module>
+    <module>kerb-util</module>
+    <module>kerb-crypto</module>
+    <module>kerb-identity</module>
+    <module>kerb-client</module>
+    <module>kerb-server</module>
+    <module>kerb-kdc-test</module>
+  </modules>
+
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/ceacb982/lib/kerby-config/README
----------------------------------------------------------------------
diff --git a/lib/kerby-config/README b/lib/kerby-config/README
new file mode 100644
index 0000000..37eb019
--- /dev/null
+++ b/lib/kerby-config/README
@@ -0,0 +1 @@
+An unified configuration API that crosses various popular configuration formats like XML, JSON, INI and etc.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/ceacb982/lib/kerby-config/pom.xml
----------------------------------------------------------------------
diff --git a/lib/kerby-config/pom.xml b/lib/kerby-config/pom.xml
new file mode 100644
index 0000000..1499d09
--- /dev/null
+++ b/lib/kerby-config/pom.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed 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. See accompanying LICENSE file.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+  <parent>
+    <groupId>org.apache.kerby</groupId>
+    <artifactId>lib</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>kerby-config</artifactId>
+  <name>Kerby Config</name>
+  <description>Kerby config library</description>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+  </dependencies>
+</project>

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/ceacb982/lib/kerby-config/src/main/java/org/apache/kerby/config/Conf.java
----------------------------------------------------------------------
diff --git a/lib/kerby-config/src/main/java/org/apache/kerby/config/Conf.java b/lib/kerby-config/src/main/java/org/apache/kerby/config/Conf.java
new file mode 100644
index 0000000..3327fa3
--- /dev/null
+++ b/lib/kerby-config/src/main/java/org/apache/kerby/config/Conf.java
@@ -0,0 +1,285 @@
+/**
+ *  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.config;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.*;
+
+public class Conf implements Config {
+    private static final Logger logger = LoggerFactory.getLogger(Conf.class);
+
+	private List<ConfigLoader> resourceConfigs;
+    private final ConfigImpl config;
+    private boolean needReload;
+
+	public Conf() {
+        this.resourceConfigs = new ArrayList<ConfigLoader>(1);
+        this.config = new ConfigImpl("Conf");
+        this.needReload = true;
+	}
+
+	public void addXmlConfig(File xmlFile) throws IOException {
+        addResource(Resource.createXmlResource(xmlFile));
+	}
+
+    public void addIniConfig(File iniFile) throws IOException {
+        addResource(Resource.createIniResource(iniFile));
+    }
+
+    public void addJsonConfig(File jsonFile) throws IOException {
+        addResource(Resource.createJsonResource(jsonFile));
+    }
+
+    public void addPropertiesConfig(File propertiesFile) throws IOException {
+        addResource(Resource.createPropertiesFileResource(propertiesFile));
+    }
+
+    public void addPropertiesConfig(Properties propertiesConfig) {
+        addResource(Resource.createPropertiesResource(propertiesConfig));
+    }
+
+    public void addMapConfig(Map<String, String> mapConfig) {
+        addResource(Resource.createMapResource(mapConfig));
+    }
+
+    public void addResource(Resource resource) {
+        ConfigLoader loader = getLoader(resource);
+        resourceConfigs.add(loader);
+        needReload = true;
+    }
+
+    private static ConfigLoader getLoader(Resource resource) {
+        ConfigLoader loader = null;
+
+        Class<? extends ConfigLoader> loaderClass = resource.getFormat().getLoaderClass();
+        try {
+            loader = loaderClass.newInstance();
+        } catch (Exception e) {
+            throw new RuntimeException("Failed to create org.haox.config loader for " + loaderClass.getName(), e);
+        }
+        loader.setResource(resource);
+        return loader;
+    }
+
+    private void checkAndLoad() {
+        if (needReload) {
+            reload();
+            needReload = false;
+        }
+    }
+
+    public void reload() {
+        config.reset();
+        if (resourceConfigs.size() == 1) {
+            ConfigLoader loader = resourceConfigs.get(0);
+            loader.setConfig(config);
+            loader.load();
+        } else {
+            for (ConfigLoader loader : resourceConfigs) {
+                Config loaded = loader.load();
+                config.add(loaded);
+            }
+        }
+    }
+
+    @Override
+    public String getResource() {
+        checkAndLoad();
+        return config.getResource();
+    }
+
+    @Override
+    public Set<String> getNames() {
+        checkAndLoad();
+        return config.getNames();
+    }
+
+    @Override
+    public String getString(String name) {
+        checkAndLoad();
+        return config.getString(name);
+    }
+
+    @Override
+    public String getString(ConfigKey name) {
+        checkAndLoad();
+        return config.getString(name);
+    }
+
+    @Override
+    public String getString(String name, String defaultValue) {
+        checkAndLoad();
+        return config.getString(name, defaultValue);
+    }
+
+    @Override
+    public String getTrimmed(String name) {
+        checkAndLoad();
+        return config.getTrimmed(name);
+    }
+
+    @Override
+    public String getTrimmed(ConfigKey name) {
+        checkAndLoad();
+        return config.getTrimmed(name);
+    }
+
+    @Override
+    public Boolean getBoolean(String name) {
+        checkAndLoad();
+        return config.getBoolean(name);
+    }
+
+    @Override
+    public Boolean getBoolean(ConfigKey name) {
+        checkAndLoad();
+        return config.getBoolean(name);
+    }
+
+    @Override
+    public Boolean getBoolean(String name, boolean defaultValue) {
+        checkAndLoad();
+        return config.getBoolean(name, defaultValue);
+    }
+
+    @Override
+    public Integer getInt(String name) {
+        checkAndLoad();
+        return config.getInt(name);
+    }
+
+    @Override
+    public Integer getInt(ConfigKey name) {
+        checkAndLoad();
+        return config.getInt(name);
+    }
+
+    @Override
+    public Integer getInt(String name, int defaultValue) {
+        checkAndLoad();
+        return config.getInt(name, defaultValue);
+    }
+
+    @Override
+    public Long getLong(String name) {
+        checkAndLoad();
+        return config.getLong(name);
+    }
+
+    @Override
+    public Long getLong(ConfigKey name) {
+        checkAndLoad();
+        return config.getLong(name);
+    }
+
+    @Override
+    public Long getLong(String name, long defaultValue) {
+        checkAndLoad();
+        return config.getLong(name, defaultValue);
+    }
+
+    @Override
+    public Float getFloat(String name) {
+        checkAndLoad();
+        return config.getFloat(name);
+    }
+
+    @Override
+    public Float getFloat(ConfigKey name) {
+        checkAndLoad();
+        return config.getFloat(name);
+    }
+
+    @Override
+    public Float getFloat(String name, float defaultValue) {
+        checkAndLoad();
+        return config.getFloat(name, defaultValue);
+    }
+
+    @Override
+    public List<String> getList(String name) {
+        checkAndLoad();
+        return config.getList(name);
+    }
+
+    @Override
+    public List<String> getList(String name, String[] defaultValue) {
+        checkAndLoad();
+        return config.getList(name, defaultValue);
+    }
+
+    @Override
+    public List<String> getList(ConfigKey name) {
+        checkAndLoad();
+        return config.getList(name);
+    }
+
+    @Override
+    public Config getConfig(String name) {
+        checkAndLoad();
+        return config.getConfig(name);
+    }
+
+    @Override
+    public Config getConfig(ConfigKey name) {
+        checkAndLoad();
+        return config.getConfig(name);
+    }
+
+    @Override
+    public Class<?> getClass(String name) throws ClassNotFoundException {
+        checkAndLoad();
+        return config.getClass(name);
+    }
+
+    @Override
+    public Class<?> getClass(String name, Class<?> defaultValue) throws ClassNotFoundException {
+        checkAndLoad();
+        return config.getClass(name, defaultValue);
+    }
+
+    @Override
+    public Class<?> getClass(ConfigKey name) throws ClassNotFoundException {
+        checkAndLoad();
+        return config.getClass(name);
+    }
+
+    @Override
+    public <T> T getInstance(String name) throws ClassNotFoundException {
+        checkAndLoad();
+        return config.getInstance(name);
+    }
+
+    @Override
+    public <T> T getInstance(ConfigKey name) throws ClassNotFoundException {
+        checkAndLoad();
+        return config.getInstance(name);
+    }
+
+    @Override
+    public <T> T getInstance(String name, Class<T> xface) throws ClassNotFoundException {
+        checkAndLoad();
+        return config.getInstance(name, xface);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/ceacb982/lib/kerby-config/src/main/java/org/apache/kerby/config/Config.java
----------------------------------------------------------------------
diff --git a/lib/kerby-config/src/main/java/org/apache/kerby/config/Config.java b/lib/kerby-config/src/main/java/org/apache/kerby/config/Config.java
new file mode 100644
index 0000000..14bfb16
--- /dev/null
+++ b/lib/kerby-config/src/main/java/org/apache/kerby/config/Config.java
@@ -0,0 +1,58 @@
+/**
+ *  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.config;
+
+import java.util.List;
+import java.util.Set;
+
+public interface Config {
+    public String getResource();
+    public Set<String> getNames();
+
+    public String getString(String name);
+    public String getString(ConfigKey name);
+    public String getString(String name, String defaultValue);
+    public String getTrimmed(String name);
+    public String getTrimmed(ConfigKey name);
+    public Boolean getBoolean(String name);
+    public Boolean getBoolean(ConfigKey name);
+    public Boolean getBoolean(String name, boolean defaultValue);
+    public Integer getInt(String name);
+    public Integer getInt(ConfigKey name);
+    public Integer getInt(String name, int defaultValue);
+    public Long getLong(String name);
+    public Long getLong(ConfigKey name);
+    public Long getLong(String name, long defaultValue);
+    public Float getFloat(String name);
+    public Float getFloat(ConfigKey name);
+    public Float getFloat(String name, float defaultValue);
+    public List<String> getList(String name);
+    public List<String> getList(String name, String[] defaultValue);
+    public List<String> getList(ConfigKey name);
+    public Config getConfig(String name);
+    public Config getConfig(ConfigKey name);
+
+    public Class<?> getClass(String name) throws ClassNotFoundException;
+    public Class<?> getClass(String name, Class<?> defaultValue) throws ClassNotFoundException;
+    public Class<?> getClass(ConfigKey name) throws ClassNotFoundException;
+    public <T> T getInstance(String name) throws ClassNotFoundException;
+    public <T> T getInstance(ConfigKey name) throws ClassNotFoundException;
+    public <T> T getInstance(String name, Class<T> xface) throws ClassNotFoundException;
+}


Mime
View raw message