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

[20/42] directory-kerberos git commit: Initially import Haox codebase (https://github.com/drankye/haox)

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1InputStream.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1InputStream.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1InputStream.java
new file mode 100644
index 0000000..e68c231
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1InputStream.java
@@ -0,0 +1,420 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.EOFException;
+import java.io.FilterInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Vector;
+
+/**
+ * a general purpose ASN.1 decoder - note: this class differs from the
+ * others in that it returns null after it has read the last object in
+ * the stream. If an ASN.1 NULL is encountered a DER/BER Null object is
+ * returned.
+ */
+public class ASN1InputStream
+    extends FilterInputStream
+    implements DERTags {
+    private static final DERObject END_OF_STREAM = new DERObject() {
+        void encode(
+            DEROutputStream out)
+            throws IOException {
+            throw new IOException("Eeek!");
+        }
+        public int hashCode() {
+            return 0;
+        }
+        public boolean equals(
+            Object o) {
+            return o == this;
+        }
+    };
+
+    boolean eofFound = false;
+    int limit = Integer.MAX_VALUE;
+
+    public ASN1InputStream(
+        InputStream is) {
+        super(is);
+    }
+
+    /**
+     * Create an ASN1InputStream based on the input byte array. The length of DER objects in
+     * the stream is automatically limited to the length of the input array.
+     *
+     * @param input array containing ASN.1 encoded data.
+     */
+    public ASN1InputStream(
+        byte[] input) {
+        this(new ByteArrayInputStream(input), input.length);
+    }
+
+    /**
+     * Create an ASN1InputStream where no DER object will be longer than limit.
+     *
+     * @param input stream containing ASN.1 encoded data.
+     * @param limit maximum size of a DER encoded object.
+     */
+    public ASN1InputStream(
+        InputStream input,
+        int limit) {
+        super(input);
+        this.limit = limit;
+    }
+
+    protected int readLength()
+        throws IOException {
+        int length = read();
+        if (length < 0) {
+            throw new IOException("EOF found when length expected");
+        }
+
+        if (length == 0x80) {
+            return -1;      // indefinite-length encoding
+        }
+
+        if (length > 127) {
+            int size = length & 0x7f;
+
+            if (size > 4) {
+                throw new IOException("DER length more than 4 bytes");
+            }
+
+            length = 0;
+            for (int i = 0; i < size; i++) {
+                int next = read();
+
+                if (next < 0) {
+                    throw new IOException("EOF found reading length");
+                }
+
+                length = (length << 8) + next;
+            }
+
+            if (length < 0) {
+                throw new IOException("corrupted stream - negative length found");
+            }
+
+            if (length >= limit)   // after all we must have read at least 1 byte
+            {
+                throw new IOException("corrupted stream - out of bounds length found");
+            }
+        }
+
+        return length;
+    }
+
+    protected void readFully(
+        byte[] bytes)
+        throws IOException {
+        int left = bytes.length;
+        int len;
+
+        if (left == 0) {
+            return;
+        }
+
+        while ((len = read(bytes, bytes.length - left, left)) > 0) {
+            if ((left -= len) == 0) {
+                return;
+            }
+        }
+
+        if (left != 0) {
+            throw new EOFException("EOF encountered in middle of object");
+        }
+    }
+
+    /** build an object given its tag and the number of bytes to construct it from. */
+    protected DERObject buildObject(
+        int tag,
+        int tagNo,
+        int length)
+        throws IOException {
+        if ((tag & APPLICATION) != 0) {
+            return new DERApplicationSpecific(tagNo, readDefiniteLengthFully(length));
+        }
+
+        boolean isConstructed = (tag & CONSTRUCTED) != 0;
+
+        if (isConstructed) {
+            switch (tag) {
+                case SEQUENCE | CONSTRUCTED:
+                    return new DERSequence(buildDerEncodableVector(length));
+                case SET | CONSTRUCTED:
+                    return new DERSet(buildDerEncodableVector(length), false);
+                case OCTET_STRING | CONSTRUCTED:
+                    return buildDerConstructedOctetString(length);
+                default: {
+                    //
+                    // with tagged object tag number is bottom 5 bits
+                    //
+                    if ((tag & TAGGED) != 0) {
+                        if (length == 0)     // empty tag!
+                        {
+                            return new DERTaggedObject(false, tagNo, new DERSequence());
+                        }
+
+                        ASN1EncodableVector v = buildDerEncodableVector(length);
+
+                        if (v.size() == 1) {
+                            //
+                            // explicitly tagged (probably!) - if it isn't we'd have to
+                            // tell from the context
+                            //
+                            return new DERTaggedObject(tagNo, v.get(0));
+                        }
+
+                        return new DERTaggedObject(false, tagNo, new DERSequence(v));
+                    }
+
+                    return new DERUnknownTag(tag, readDefiniteLengthFully(length));
+                }
+            }
+        }
+
+        byte[] bytes = readDefiniteLengthFully(length);
+
+        switch (tag) {
+            case NULL:
+                return DERNull.INSTANCE;
+            case BOOLEAN:
+                return new DERBoolean(bytes);
+            case INTEGER:
+                return new DERInteger(bytes);
+            case ENUMERATED:
+                return new DEREnumerated(bytes);
+            case OBJECT_IDENTIFIER:
+                return new DERObjectIdentifier(bytes);
+            case BIT_STRING: {
+                int padBits = bytes[0];
+                byte[] data = new byte[bytes.length - 1];
+
+                System.arraycopy(bytes, 1, data, 0, bytes.length - 1);
+
+                return new DERBitString(data, padBits);
+            }
+            case NUMERIC_STRING:
+                return new DERNumericString(bytes);
+            case UTF8_STRING:
+                return new DERUTF8String(bytes);
+            case PRINTABLE_STRING:
+                return new DERPrintableString(bytes);
+            case IA5_STRING:
+                return new DERIA5String(bytes);
+            case T61_STRING:
+                return new DERT61String(bytes);
+            case VISIBLE_STRING:
+                return new DERVisibleString(bytes);
+            case GENERAL_STRING:
+                return new DERGeneralString(bytes);
+            case UNIVERSAL_STRING:
+                return new DERUniversalString(bytes);
+            case BMP_STRING:
+                return new DERBMPString(bytes);
+            case OCTET_STRING:
+                return new DEROctetString(bytes);
+            case UTC_TIME:
+                return new DERUTCTime(bytes);
+            case GENERALIZED_TIME:
+                return new DERGeneralizedTime(bytes);
+            default: {
+                //
+                // with tagged object tag number is bottom 5 bits
+                //
+                if ((tag & TAGGED) != 0) {
+                    if (bytes.length == 0)     // empty tag!
+                    {
+                        return new DERTaggedObject(false, tagNo, DERNull.INSTANCE);
+                    }
+
+                    //
+                    // simple type - implicit... return an octet string
+                    //
+                    return new DERTaggedObject(false, tagNo, new DEROctetString(bytes));
+                }
+
+                return new DERUnknownTag(tag, bytes);
+            }
+        }
+    }
+
+    private byte[] readDefiniteLengthFully(int length)
+        throws IOException {
+        byte[] bytes = new byte[length];
+        readFully(bytes);
+        return bytes;
+    }
+
+    /** read a string of bytes representing an indefinite length object. */
+    private byte[] readIndefiniteLengthFully()
+        throws IOException {
+        ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+        int b, b1;
+
+        b1 = read();
+
+        while ((b = read()) >= 0) {
+            if (b1 == 0 && b == 0) {
+                break;
+            }
+
+            bOut.write(b1);
+            b1 = b;
+        }
+
+        return bOut.toByteArray();
+    }
+
+    private BERConstructedOctetString buildConstructedOctetString(DERObject sentinel)
+        throws IOException {
+        Vector octs = new Vector();
+        DERObject o;
+
+        while ((o = readObject()) != sentinel) {
+            octs.addElement(o);
+        }
+
+        return new BERConstructedOctetString(octs);
+    }
+
+    //
+    // yes, people actually do this...
+    //
+    private BERConstructedOctetString buildDerConstructedOctetString(int length)
+        throws IOException {
+        DefiniteLengthInputStream dIn = new DefiniteLengthInputStream(this, length);
+        ASN1InputStream aIn = new ASN1InputStream(dIn, length);
+
+        return aIn.buildConstructedOctetString(null);
+    }
+
+    private ASN1EncodableVector buildEncodableVector(DERObject sentinel)
+        throws IOException {
+        ASN1EncodableVector v = new ASN1EncodableVector();
+        DERObject o;
+
+        while ((o = readObject()) != sentinel) {
+            v.add(o);
+        }
+
+        return v;
+    }
+
+    private ASN1EncodableVector buildDerEncodableVector(int length)
+        throws IOException {
+        DefiniteLengthInputStream dIn = new DefiniteLengthInputStream(this, length);
+        ASN1InputStream aIn = new ASN1InputStream(dIn, length);
+
+        return aIn.buildEncodableVector(null);
+    }
+
+    public DERObject readObject()
+        throws IOException {
+        int tag = read();
+        if (tag == -1) {
+            if (eofFound) {
+                throw new EOFException("attempt to read past end of file.");
+            }
+
+            eofFound = true;
+
+            return null;
+        }
+
+        int tagNo = 0;
+
+        if ((tag & TAGGED) != 0 || (tag & APPLICATION) != 0) {
+            tagNo = readTagNumber(tag);
+        }
+
+        int length = readLength();
+
+        if (length < 0)    // indefinite length method
+        {
+            switch (tag) {
+                case NULL:
+                    return BERNull.INSTANCE;
+                case SEQUENCE | CONSTRUCTED:
+                    return new BERSequence(buildEncodableVector(END_OF_STREAM));
+                case SET | CONSTRUCTED:
+                    return new BERSet(buildEncodableVector(END_OF_STREAM), false);
+                case OCTET_STRING | CONSTRUCTED:
+                    return buildConstructedOctetString(END_OF_STREAM);
+                default: {
+                    //
+                    // with tagged object tag number is bottom 5 bits
+                    //
+                    if ((tag & TAGGED) != 0) {
+                        //
+                        // simple type - implicit... return an octet string
+                        //
+                        if ((tag & CONSTRUCTED) == 0) {
+                            byte[] bytes = readIndefiniteLengthFully();
+
+                            return new BERTaggedObject(false, tagNo, new DEROctetString(bytes));
+                        }
+
+                        //
+                        // either constructed or explicitly tagged
+                        //
+                        ASN1EncodableVector v = buildEncodableVector(END_OF_STREAM);
+
+                        if (v.size() == 0)     // empty tag!
+                        {
+                            return new DERTaggedObject(tagNo);
+                        }
+
+                        if (v.size() == 1) {
+                            //
+                            // explicitly tagged (probably!) - if it isn't we'd have to
+                            // tell from the context
+                            //
+                            return new BERTaggedObject(tagNo, v.get(0));
+                        }
+
+                        return new BERTaggedObject(false, tagNo, new BERSequence(v));
+                    }
+
+                    throw new IOException("unknown BER object encountered");
+                }
+            }
+        } else {
+            if (tag == 0 && length == 0)    // end of contents marker.
+            {
+                return END_OF_STREAM;
+            }
+
+            return buildObject(tag, tagNo, length);
+        }
+    }
+
+    private int readTagNumber(int tag)
+        throws IOException {
+        int tagNo = tag & 0x1f;
+
+        if (tagNo == 0x1f) {
+            int b = read();
+
+            tagNo = 0;
+
+            while ((b >= 0) && ((b & 0x80) != 0)) {
+                tagNo |= (b & 0x7f);
+                tagNo <<= 7;
+                b = read();
+            }
+
+            if (b < 0) {
+                eofFound = true;
+                throw new EOFException("EOF found inside tag value.");
+            }
+
+            tagNo |= (b & 0x7f);
+        }
+
+        return tagNo;
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1Null.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1Null.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1Null.java
new file mode 100644
index 0000000..7f56bbd
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1Null.java
@@ -0,0 +1,30 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.IOException;
+
+/** A NULL object. */
+public abstract class ASN1Null
+    extends ASN1Object {
+    public ASN1Null() {
+    }
+
+    public int hashCode() {
+        return 0;
+    }
+
+    boolean asn1Equals(
+        DERObject o) {
+        if (!(o instanceof ASN1Null)) {
+            return false;
+        }
+
+        return true;
+    }
+
+    abstract void encode(DEROutputStream out)
+        throws IOException;
+
+    public String toString() {
+        return "NULL";
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1Object.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1Object.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1Object.java
new file mode 100644
index 0000000..a2ec57a
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1Object.java
@@ -0,0 +1,34 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.IOException;
+
+public abstract class ASN1Object
+    extends DERObject {
+    /**
+     * Create a base ASN.1 object from a byte stream.
+     *
+     * @param data the byte stream to parse.
+     * @return the base ASN.1 object represented by the byte stream.
+     * @throws java.io.IOException if there is a problem parsing the data.
+     */
+    public static ASN1Object fromByteArray(byte[] data)
+        throws IOException {
+        ASN1InputStream aIn = new ASN1InputStream(data);
+
+        return (ASN1Object) aIn.readObject();
+    }
+
+    public final boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+
+        return (o instanceof DEREncodable) && asn1Equals(((DEREncodable) o).getDERObject());
+    }
+
+    public abstract int hashCode();
+
+    abstract void encode(DEROutputStream out) throws IOException;
+
+    abstract boolean asn1Equals(DERObject o);
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1ObjectParser.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1ObjectParser.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1ObjectParser.java
new file mode 100644
index 0000000..ca2a576
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1ObjectParser.java
@@ -0,0 +1,55 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+public class ASN1ObjectParser {
+    private int _baseTag;
+    private int _tagNumber;
+
+    private ASN1StreamParser _aIn;
+
+    protected ASN1ObjectParser(
+        int baseTag,
+        int tagNumber,
+        InputStream contentStream) {
+        _baseTag = baseTag;
+        _tagNumber = tagNumber;
+        _aIn = new ASN1StreamParser(contentStream);
+    }
+
+    /**
+     * Return the tag number for this object.
+     *
+     * @return the tag number.
+     */
+    int getTagNumber() {
+        return _tagNumber;
+    }
+
+    int getBaseTag() {
+        return _baseTag;
+    }
+
+    DEREncodable readObject()
+        throws IOException {
+        return _aIn.readObject();
+    }
+
+    ASN1EncodableVector readVector()
+        throws IllegalStateException {
+        ASN1EncodableVector v = new ASN1EncodableVector();
+        DEREncodable obj;
+
+        try {
+            while ((obj = readObject()) != null) {
+                v.add(obj.getDERObject());
+            }
+        }
+        catch (IOException e) {
+            throw new IllegalStateException(e.getMessage());
+        }
+
+        return v;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1OctetString.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1OctetString.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1OctetString.java
new file mode 100644
index 0000000..10ab72e
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1OctetString.java
@@ -0,0 +1,137 @@
+package org.apache.commons.ssl.asn1;
+
+import org.apache.commons.ssl.util.Hex;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Enumeration;
+import java.util.Vector;
+
+public abstract class ASN1OctetString
+    extends ASN1Object
+    implements ASN1OctetStringParser {
+    byte[] string;
+
+    /**
+     * return an Octet String from a tagged object.
+     *
+     * @param obj      the tagged object holding the object we want.
+     * @param explicit true if the object is meant to be explicitly
+     *                 tagged false otherwise.
+     * @throws IllegalArgumentException if the tagged object cannot
+     *                                  be converted.
+     */
+    public static ASN1OctetString getInstance(
+        ASN1TaggedObject obj,
+        boolean explicit) {
+        return getInstance(obj.getObject());
+    }
+
+    /**
+     * return an Octet String from the given object.
+     *
+     * @param obj the object we want converted.
+     * @throws IllegalArgumentException if the object cannot be converted.
+     */
+    public static ASN1OctetString getInstance(
+        Object obj) {
+        if (obj == null || obj instanceof ASN1OctetString) {
+            return (ASN1OctetString) obj;
+        }
+
+        if (obj instanceof ASN1TaggedObject) {
+            return getInstance(((ASN1TaggedObject) obj).getObject());
+        }
+
+        if (obj instanceof ASN1Sequence) {
+            Vector v = new Vector();
+            Enumeration e = ((ASN1Sequence) obj).getObjects();
+
+            while (e.hasMoreElements()) {
+                v.addElement(e.nextElement());
+            }
+
+            return new BERConstructedOctetString(v);
+        }
+
+        throw new IllegalArgumentException("illegal object in getInstance: " + obj.getClass().getName());
+    }
+
+    /** @param string the octets making up the octet string. */
+    public ASN1OctetString(
+        byte[] string) {
+        this.string = string;
+    }
+
+    public ASN1OctetString(
+        DEREncodable obj) {
+        try {
+            ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+            DEROutputStream dOut = new DEROutputStream(bOut);
+
+            dOut.writeObject(obj);
+            dOut.close();
+
+            this.string = bOut.toByteArray();
+        }
+        catch (IOException e) {
+            throw new IllegalArgumentException("Error processing object : " + e.toString());
+        }
+    }
+
+    public InputStream getOctetStream() {
+        return new ByteArrayInputStream(string);
+    }
+
+    public ASN1OctetStringParser parser() {
+        return this;
+    }
+
+    public byte[] getOctets() {
+        return string;
+    }
+
+    public int hashCode() {
+        byte[] b = this.getOctets();
+        int value = 0;
+
+        for (int i = 0; i != b.length; i++) {
+            value ^= (b[i] & 0xff) << (i % 4);
+        }
+
+        return value;
+    }
+
+    boolean asn1Equals(
+        DERObject o) {
+        if (!(o instanceof ASN1OctetString)) {
+            return false;
+        }
+
+        ASN1OctetString other = (ASN1OctetString) o;
+
+        byte[] b1 = other.string;
+        byte[] b2 = this.string;
+
+        if (b1.length != b2.length) {
+            return false;
+        }
+
+        for (int i = 0; i != b1.length; i++) {
+            if (b1[i] != b2[i]) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    abstract void encode(DEROutputStream out)
+        throws IOException;
+
+    public String toString() {
+        return "#" + Hex.encode(string);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1OctetStringParser.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1OctetStringParser.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1OctetStringParser.java
new file mode 100644
index 0000000..b958534
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1OctetStringParser.java
@@ -0,0 +1,8 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.InputStream;
+
+public interface ASN1OctetStringParser
+    extends DEREncodable {
+    public InputStream getOctetStream();
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1OutputStream.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1OutputStream.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1OutputStream.java
new file mode 100644
index 0000000..2cac08d
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1OutputStream.java
@@ -0,0 +1,26 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+public class ASN1OutputStream
+    extends DEROutputStream {
+    public ASN1OutputStream(
+        OutputStream os) {
+        super(os);
+    }
+
+    public void writeObject(
+        Object obj)
+        throws IOException {
+        if (obj == null) {
+            writeNull();
+        } else if (obj instanceof DERObject) {
+            ((DERObject) obj).encode(this);
+        } else if (obj instanceof DEREncodable) {
+            ((DEREncodable) obj).getDERObject().encode(this);
+        } else {
+            throw new IOException("object not ASN1Encodable");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1Sequence.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1Sequence.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1Sequence.java
new file mode 100644
index 0000000..699edd1
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1Sequence.java
@@ -0,0 +1,183 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Vector;
+
+public abstract class ASN1Sequence
+    extends ASN1Object {
+    private Vector seq = new Vector();
+
+    /**
+     * return an ASN1Sequence from the given object.
+     *
+     * @param obj the object we want converted.
+     * @throws IllegalArgumentException if the object cannot be converted.
+     */
+    public static ASN1Sequence getInstance(
+        Object obj) {
+        if (obj == null || obj instanceof ASN1Sequence) {
+            return (ASN1Sequence) obj;
+        }
+
+        throw new IllegalArgumentException("unknown object in getInstance");
+    }
+
+    /**
+     * Return an ASN1 sequence from a tagged object. There is a special
+     * case here, if an object appears to have been explicitly tagged on
+     * reading but we were expecting it to be implictly tagged in the
+     * normal course of events it indicates that we lost the surrounding
+     * sequence - so we need to add it back (this will happen if the tagged
+     * object is a sequence that contains other sequences). If you are
+     * dealing with implicitly tagged sequences you really <b>should</b>
+     * be using this method.
+     *
+     * @param obj      the tagged object.
+     * @param explicit true if the object is meant to be explicitly tagged,
+     *                 false otherwise.
+     * @throws IllegalArgumentException if the tagged object cannot
+     *                                  be converted.
+     */
+    public static ASN1Sequence getInstance(
+        ASN1TaggedObject obj,
+        boolean explicit) {
+        if (explicit) {
+            if (!obj.isExplicit()) {
+                throw new IllegalArgumentException("object implicit - explicit expected.");
+            }
+
+            return (ASN1Sequence) obj.getObject();
+        } else {
+            //
+            // constructed object which appears to be explicitly tagged
+            // when it should be implicit means we have to add the
+            // surrounding sequence.
+            //
+            if (obj.isExplicit()) {
+                if (obj instanceof BERTaggedObject) {
+                    return new BERSequence(obj.getObject());
+                } else {
+                    return new DERSequence(obj.getObject());
+                }
+            } else {
+                if (obj.getObject() instanceof ASN1Sequence) {
+                    return (ASN1Sequence) obj.getObject();
+                }
+            }
+        }
+
+        throw new IllegalArgumentException(
+            "unknown object in getInstanceFromTagged");
+    }
+
+    public Enumeration getObjects() {
+        return seq.elements();
+    }
+
+    public ASN1SequenceParser parser() {
+        final ASN1Sequence outer = this;
+
+        return new ASN1SequenceParser() {
+            private final int max = size();
+
+            private int index;
+
+            public DEREncodable readObject() throws IOException {
+                if (index == max) {
+                    return null;
+                }
+
+                DEREncodable obj = getObjectAt(index++);
+                if (obj instanceof ASN1Sequence) {
+                    return ((ASN1Sequence) obj).parser();
+                }
+                if (obj instanceof ASN1Set) {
+                    return ((ASN1Set) obj).parser();
+                }
+
+                return obj;
+            }
+
+            public DERObject getDERObject() {
+                return outer;
+            }
+        };
+    }
+
+    /**
+     * return the object at the sequence postion indicated by index.
+     *
+     * @param index the sequence number (starting at zero) of the object
+     * @return the object at the sequence postion indicated by index.
+     */
+    public DEREncodable getObjectAt(
+        int index) {
+        return (DEREncodable) seq.elementAt(index);
+    }
+
+    /**
+     * return the number of objects in this sequence.
+     *
+     * @return the number of objects in this sequence.
+     */
+    public int size() {
+        return seq.size();
+    }
+
+    public int hashCode() {
+        Enumeration e = this.getObjects();
+        int hashCode = 0;
+
+        while (e.hasMoreElements()) {
+            Object o = e.nextElement();
+
+            if (o != null) {
+                hashCode ^= o.hashCode();
+            }
+        }
+
+        return hashCode;
+    }
+
+    boolean asn1Equals(
+        DERObject o) {
+        if (!(o instanceof ASN1Sequence)) {
+            return false;
+        }
+
+        ASN1Sequence other = (ASN1Sequence) o;
+
+        if (this.size() != other.size()) {
+            return false;
+        }
+
+        Enumeration s1 = this.getObjects();
+        Enumeration s2 = other.getObjects();
+
+        while (s1.hasMoreElements()) {
+            DERObject o1 = ((DEREncodable) s1.nextElement()).getDERObject();
+            DERObject o2 = ((DEREncodable) s2.nextElement()).getDERObject();
+
+            if (o1 == o2 || (o1 != null && o1.equals(o2))) {
+                continue;
+            }
+
+            return false;
+        }
+
+        return true;
+    }
+
+    protected void addObject(
+        DEREncodable obj) {
+        seq.addElement(obj);
+    }
+
+    abstract void encode(DEROutputStream out)
+        throws IOException;
+
+    public String toString() {
+        return seq.toString();
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1SequenceParser.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1SequenceParser.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1SequenceParser.java
new file mode 100644
index 0000000..c64c93e
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1SequenceParser.java
@@ -0,0 +1,9 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.IOException;
+
+public interface ASN1SequenceParser
+    extends DEREncodable {
+    DEREncodable readObject()
+        throws IOException;
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1Set.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1Set.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1Set.java
new file mode 100644
index 0000000..549fc57
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1Set.java
@@ -0,0 +1,281 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Vector;
+
+abstract public class ASN1Set
+    extends ASN1Object {
+    protected Vector set = new Vector();
+
+    /**
+     * return an ASN1Set from the given object.
+     *
+     * @param obj the object we want converted.
+     * @throws IllegalArgumentException if the object cannot be converted.
+     */
+    public static ASN1Set getInstance(
+        Object obj) {
+        if (obj == null || obj instanceof ASN1Set) {
+            return (ASN1Set) obj;
+        }
+
+        throw new IllegalArgumentException("unknown object in getInstance");
+    }
+
+    /**
+     * Return an ASN1 set from a tagged object. There is a special
+     * case here, if an object appears to have been explicitly tagged on
+     * reading but we were expecting it to be implictly tagged in the
+     * normal course of events it indicates that we lost the surrounding
+     * set - so we need to add it back (this will happen if the tagged
+     * object is a sequence that contains other sequences). If you are
+     * dealing with implicitly tagged sets you really <b>should</b>
+     * be using this method.
+     *
+     * @param obj      the tagged object.
+     * @param explicit true if the object is meant to be explicitly tagged
+     *                 false otherwise.
+     * @throws IllegalArgumentException if the tagged object cannot
+     *                                  be converted.
+     */
+    public static ASN1Set getInstance(
+        ASN1TaggedObject obj,
+        boolean explicit) {
+        if (explicit) {
+            if (!obj.isExplicit()) {
+                throw new IllegalArgumentException("object implicit - explicit expected.");
+            }
+
+            return (ASN1Set) obj.getObject();
+        } else {
+            //
+            // constructed object which appears to be explicitly tagged
+            // and it's really implicit means we have to add the
+            // surrounding sequence.
+            //
+            if (obj.isExplicit()) {
+                ASN1Set set = new DERSet(obj.getObject());
+
+                return set;
+            } else {
+                if (obj.getObject() instanceof ASN1Set) {
+                    return (ASN1Set) obj.getObject();
+                }
+
+                //
+                // in this case the parser returns a sequence, convert it
+                // into a set.
+                //
+                ASN1EncodableVector v = new ASN1EncodableVector();
+
+                if (obj.getObject() instanceof ASN1Sequence) {
+                    ASN1Sequence s = (ASN1Sequence) obj.getObject();
+                    Enumeration e = s.getObjects();
+
+                    while (e.hasMoreElements()) {
+                        v.add((DEREncodable) e.nextElement());
+                    }
+
+                    return new DERSet(v, false);
+                }
+            }
+        }
+
+        throw new IllegalArgumentException(
+            "unknown object in getInstanceFromTagged");
+    }
+
+    public ASN1Set() {
+    }
+
+    public Enumeration getObjects() {
+        return set.elements();
+    }
+
+    /**
+     * return the object at the set postion indicated by index.
+     *
+     * @param index the set number (starting at zero) of the object
+     * @return the object at the set postion indicated by index.
+     */
+    public DEREncodable getObjectAt(
+        int index) {
+        return (DEREncodable) set.elementAt(index);
+    }
+
+    /**
+     * return the number of objects in this set.
+     *
+     * @return the number of objects in this set.
+     */
+    public int size() {
+        return set.size();
+    }
+
+    public ASN1SetParser parser() {
+        final ASN1Set outer = this;
+
+        return new ASN1SetParser() {
+            private final int max = size();
+
+            private int index;
+
+            public DEREncodable readObject() throws IOException {
+                if (index == max) {
+                    return null;
+                }
+
+                DEREncodable obj = getObjectAt(index++);
+                if (obj instanceof ASN1Sequence) {
+                    return ((ASN1Sequence) obj).parser();
+                }
+                if (obj instanceof ASN1Set) {
+                    return ((ASN1Set) obj).parser();
+                }
+
+                return obj;
+            }
+
+            public DERObject getDERObject() {
+                return outer;
+            }
+        };
+    }
+
+    public int hashCode() {
+        Enumeration e = this.getObjects();
+        int hashCode = 0;
+
+        while (e.hasMoreElements()) {
+            hashCode ^= e.nextElement().hashCode();
+        }
+
+        return hashCode;
+    }
+
+    boolean asn1Equals(
+        DERObject o) {
+        if (!(o instanceof ASN1Set)) {
+            return false;
+        }
+
+        ASN1Set other = (ASN1Set) o;
+
+        if (this.size() != other.size()) {
+            return false;
+        }
+
+        Enumeration s1 = this.getObjects();
+        Enumeration s2 = other.getObjects();
+
+        while (s1.hasMoreElements()) {
+            DERObject o1 = ((DEREncodable) s1.nextElement()).getDERObject();
+            DERObject o2 = ((DEREncodable) s2.nextElement()).getDERObject();
+
+            if (o1 == o2 || (o1 != null && o1.equals(o2))) {
+                continue;
+            }
+
+            return false;
+        }
+
+        return true;
+    }
+
+    /** return true if a <= b (arrays are assumed padded with zeros). */
+    private boolean lessThanOrEqual(
+        byte[] a,
+        byte[] b) {
+        if (a.length <= b.length) {
+            for (int i = 0; i != a.length; i++) {
+                int l = a[i] & 0xff;
+                int r = b[i] & 0xff;
+
+                if (r > l) {
+                    return true;
+                } else if (l > r) {
+                    return false;
+                }
+            }
+
+            return true;
+        } else {
+            for (int i = 0; i != b.length; i++) {
+                int l = a[i] & 0xff;
+                int r = b[i] & 0xff;
+
+                if (r > l) {
+                    return true;
+                } else if (l > r) {
+                    return false;
+                }
+            }
+
+            return false;
+        }
+    }
+
+    private byte[] getEncoded(
+        DEREncodable obj) {
+        ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+        ASN1OutputStream aOut = new ASN1OutputStream(bOut);
+
+        try {
+            aOut.writeObject(obj);
+        }
+        catch (IOException e) {
+            throw new IllegalArgumentException("cannot encode object added to SET");
+        }
+
+        return bOut.toByteArray();
+    }
+
+    protected void sort() {
+        if (set.size() > 1) {
+            boolean swapped = true;
+            int lastSwap = set.size() - 1;
+
+            while (swapped) {
+                int index = 0;
+                int swapIndex = 0;
+                byte[] a = getEncoded((DEREncodable) set.elementAt(0));
+
+                swapped = false;
+
+                while (index != lastSwap) {
+                    byte[] b = getEncoded((DEREncodable) set.elementAt(index + 1));
+
+                    if (lessThanOrEqual(a, b)) {
+                        a = b;
+                    } else {
+                        Object o = set.elementAt(index);
+
+                        set.setElementAt(set.elementAt(index + 1), index);
+                        set.setElementAt(o, index + 1);
+
+                        swapped = true;
+                        swapIndex = index;
+                    }
+
+                    index++;
+                }
+
+                lastSwap = swapIndex;
+            }
+        }
+    }
+
+    protected void addObject(
+        DEREncodable obj) {
+        set.addElement(obj);
+    }
+
+    abstract void encode(DEROutputStream out)
+        throws IOException;
+
+    public String toString() {
+        return set.toString();
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1SetParser.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1SetParser.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1SetParser.java
new file mode 100644
index 0000000..00ffbd0
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1SetParser.java
@@ -0,0 +1,9 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.IOException;
+
+public interface ASN1SetParser
+    extends DEREncodable {
+    public DEREncodable readObject()
+        throws IOException;
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1StreamParser.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1StreamParser.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1StreamParser.java
new file mode 100644
index 0000000..b1cd940
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1StreamParser.java
@@ -0,0 +1,193 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.ByteArrayInputStream;
+import java.io.EOFException;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class ASN1StreamParser {
+    InputStream _in;
+
+    private int _limit;
+    private boolean _eofFound;
+
+    public ASN1StreamParser(
+        InputStream in) {
+        this(in, Integer.MAX_VALUE);
+    }
+
+    public ASN1StreamParser(
+        InputStream in,
+        int limit) {
+        this._in = in;
+        this._limit = limit;
+    }
+
+    public ASN1StreamParser(
+        byte[] encoding) {
+        this(new ByteArrayInputStream(encoding), encoding.length);
+    }
+
+    InputStream getParentStream() {
+        return _in;
+    }
+
+    private int readLength()
+        throws IOException {
+        int length = _in.read();
+        if (length < 0) {
+            throw new EOFException("EOF found when length expected");
+        }
+
+        if (length == 0x80) {
+            return -1;      // indefinite-length encoding
+        }
+
+        if (length > 127) {
+            int size = length & 0x7f;
+
+            if (size > 4) {
+                throw new IOException("DER length more than 4 bytes");
+            }
+
+            length = 0;
+            for (int i = 0; i < size; i++) {
+                int next = _in.read();
+
+                if (next < 0) {
+                    throw new EOFException("EOF found reading length");
+                }
+
+                length = (length << 8) + next;
+            }
+
+            if (length < 0) {
+                throw new IOException("corrupted stream - negative length found");
+            }
+
+            if (length >= _limit)   // after all we must have read at least 1 byte
+            {
+                throw new IOException("corrupted stream - out of bounds length found");
+            }
+        }
+
+        return length;
+    }
+
+    public DEREncodable readObject()
+        throws IOException {
+        int tag = _in.read();
+        if (tag == -1) {
+            if (_eofFound) {
+                throw new EOFException("attempt to read past end of file.");
+            }
+
+            _eofFound = true;
+
+            return null;
+        }
+
+        //
+        // turn of looking for "00" while we resolve the tag
+        //
+        set00Check(false);
+
+        //
+        // calculate tag number
+        //
+        int baseTagNo = tag & ~DERTags.CONSTRUCTED;
+        int tagNo = baseTagNo;
+
+        if ((tag & DERTags.TAGGED) != 0) {
+            tagNo = tag & 0x1f;
+
+            //
+            // with tagged object tag number is bottom 5 bits, or stored at the start of the content
+            //
+            if (tagNo == 0x1f) {
+                tagNo = 0;
+
+                int b = _in.read();
+
+                while ((b >= 0) && ((b & 0x80) != 0)) {
+                    tagNo |= (b & 0x7f);
+                    tagNo <<= 7;
+                    b = _in.read();
+                }
+
+                if (b < 0) {
+                    _eofFound = true;
+
+                    throw new EOFException("EOF encountered inside tag value.");
+                }
+
+                tagNo |= (b & 0x7f);
+            }
+        }
+
+        //
+        // calculate length
+        //
+        int length = readLength();
+
+        if (length < 0)  // indefinite length
+        {
+            IndefiniteLengthInputStream indIn = new IndefiniteLengthInputStream(_in);
+
+            switch (baseTagNo) {
+                case DERTags.NULL:
+                    while (indIn.read() >= 0) {
+                        // make sure we skip to end of object
+                    }
+                    return BERNull.INSTANCE;
+                case DERTags.OCTET_STRING:
+                    return new BEROctetStringParser(new ASN1ObjectParser(tag, tagNo, indIn));
+                case DERTags.SEQUENCE:
+                    return new BERSequenceParser(new ASN1ObjectParser(tag, tagNo, indIn));
+                case DERTags.SET:
+                    return new BERSetParser(new ASN1ObjectParser(tag, tagNo, indIn));
+                default:
+                    return new BERTaggedObjectParser(tag, tagNo, indIn);
+            }
+        } else {
+            DefiniteLengthInputStream defIn = new DefiniteLengthInputStream(_in, length);
+
+            switch (baseTagNo) {
+                case DERTags.INTEGER:
+                    return new DERInteger(defIn.toByteArray());
+                case DERTags.NULL:
+                    defIn.toByteArray(); // make sure we read to end of object bytes.
+                    return DERNull.INSTANCE;
+                case DERTags.OBJECT_IDENTIFIER:
+                    return new DERObjectIdentifier(defIn.toByteArray());
+                case DERTags.OCTET_STRING:
+                    return new DEROctetString(defIn.toByteArray());
+                case DERTags.SEQUENCE:
+                    return new DERSequence(loadVector(defIn, length)).parser();
+                case DERTags.SET:
+                    return new DERSet(loadVector(defIn, length)).parser();
+                default:
+                    return new BERTaggedObjectParser(tag, tagNo, defIn);
+            }
+        }
+    }
+
+    private void set00Check(boolean enabled) {
+        if (_in instanceof IndefiniteLengthInputStream) {
+            ((IndefiniteLengthInputStream) _in).setEofOn00(enabled);
+        }
+    }
+
+    private ASN1EncodableVector loadVector(InputStream in, int length)
+        throws IOException {
+        ASN1InputStream aIn = new ASN1InputStream(in, length);
+        ASN1EncodableVector v = new ASN1EncodableVector();
+
+        DERObject obj;
+        while ((obj = aIn.readObject()) != null) {
+            v.add(obj);
+        }
+
+        return v;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1TaggedObject.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1TaggedObject.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1TaggedObject.java
new file mode 100644
index 0000000..063569b
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1TaggedObject.java
@@ -0,0 +1,177 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.IOException;
+
+/**
+ * ASN.1 TaggedObject - in ASN.1 nottation this is any object proceeded by
+ * a [n] where n is some number - these are assume to follow the construction
+ * rules (as with sequences).
+ */
+public abstract class ASN1TaggedObject
+    extends ASN1Object
+    implements ASN1TaggedObjectParser {
+    int tagNo;
+    boolean empty = false;
+    boolean explicit = true;
+    DEREncodable obj = null;
+
+    static public ASN1TaggedObject getInstance(
+        ASN1TaggedObject obj,
+        boolean explicit) {
+        if (explicit) {
+            return (ASN1TaggedObject) obj.getObject();
+        }
+
+        throw new IllegalArgumentException("implicitly tagged tagged object");
+    }
+
+    static public ASN1TaggedObject getInstance(
+        Object obj) {
+        if (obj == null || obj instanceof ASN1TaggedObject) {
+            return (ASN1TaggedObject) obj;
+        }
+
+        throw new IllegalArgumentException("unknown object in getInstance");
+    }
+
+    /**
+     * Create a tagged object in the explicit style.
+     *
+     * @param tagNo the tag number for this object.
+     * @param obj   the tagged object.
+     */
+    public ASN1TaggedObject(
+        int tagNo,
+        DEREncodable obj) {
+        this.explicit = true;
+        this.tagNo = tagNo;
+        this.obj = obj;
+    }
+
+    /**
+     * Create a tagged object with the style given by the value of explicit.
+     * <p>
+     * If the object implements ASN1Choice the tag style will always be changed
+     * to explicit in accordance with the ASN.1 encoding rules.
+     * </p>
+     *
+     * @param explicit true if the object is explicitly tagged.
+     * @param tagNo    the tag number for this object.
+     * @param obj      the tagged object.
+     */
+    public ASN1TaggedObject(
+        boolean explicit,
+        int tagNo,
+        DEREncodable obj) {
+        if (obj instanceof ASN1Choice) {
+            this.explicit = true;
+        } else {
+            this.explicit = explicit;
+        }
+
+        this.tagNo = tagNo;
+        this.obj = obj;
+    }
+
+    boolean asn1Equals(
+        DERObject o) {
+        if (!(o instanceof ASN1TaggedObject)) {
+            return false;
+        }
+
+        ASN1TaggedObject other = (ASN1TaggedObject) o;
+
+        if (tagNo != other.tagNo || empty != other.empty || explicit != other.explicit) {
+            return false;
+        }
+
+        if (obj == null) {
+            if (other.obj != null) {
+                return false;
+            }
+        } else {
+            if (!(obj.getDERObject().equals(other.obj.getDERObject()))) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    public int hashCode() {
+        int code = tagNo;
+
+        if (obj != null) {
+            code ^= obj.hashCode();
+        }
+
+        return code;
+    }
+
+    public int getTagNo() {
+        return tagNo;
+    }
+
+    /**
+     * return whether or not the object may be explicitly tagged.
+     * <p/>
+     * Note: if the object has been read from an input stream, the only
+     * time you can be sure if isExplicit is returning the true state of
+     * affairs is if it returns false. An implicitly tagged object may appear
+     * to be explicitly tagged, so you need to understand the context under
+     * which the reading was done as well, see getObject below.
+     */
+    public boolean isExplicit() {
+        return explicit;
+    }
+
+    public boolean isEmpty() {
+        return empty;
+    }
+
+    /**
+     * return whatever was following the tag.
+     * <p/>
+     * Note: tagged objects are generally context dependent if you're
+     * trying to extract a tagged object you should be going via the
+     * appropriate getInstance method.
+     */
+    public DERObject getObject() {
+        if (obj != null) {
+            return obj.getDERObject();
+        }
+
+        return null;
+    }
+
+    /**
+     * Return the object held in this tagged object as a parser assuming it has
+     * the type of the passed in tag. If the object doesn't have a parser
+     * associated with it, the base object is returned.
+     */
+    public DEREncodable getObjectParser(
+        int tag,
+        boolean isExplicit) {
+        switch (tag) {
+            case DERTags.SET:
+                return ASN1Set.getInstance(this, isExplicit).parser();
+            case DERTags.SEQUENCE:
+                return ASN1Sequence.getInstance(this, isExplicit).parser();
+            case DERTags.OCTET_STRING:
+                return ASN1OctetString.getInstance(this, isExplicit).parser();
+        }
+
+        if (isExplicit) {
+            return getObject();
+        }
+
+        throw new RuntimeException("implicit tagging not implemented for tag: " + tag);
+    }
+
+    abstract void encode(DEROutputStream out)
+        throws IOException;
+
+    public String toString() {
+        return "[" + tagNo + "]" + obj;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1TaggedObjectParser.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1TaggedObjectParser.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1TaggedObjectParser.java
new file mode 100644
index 0000000..7d24c6d
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/ASN1TaggedObjectParser.java
@@ -0,0 +1,11 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.IOException;
+
+public interface ASN1TaggedObjectParser
+    extends DEREncodable {
+    public int getTagNo();
+
+    public DEREncodable getObjectParser(int tag, boolean isExplicit)
+        throws IOException;
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERConstructedOctetString.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERConstructedOctetString.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERConstructedOctetString.java
new file mode 100644
index 0000000..750de3b
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERConstructedOctetString.java
@@ -0,0 +1,137 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.Vector;
+
+public class BERConstructedOctetString
+    extends DEROctetString {
+    private static final int MAX_LENGTH = 1000;
+
+    /** convert a vector of octet strings into a single byte string */
+    static private byte[] toBytes(
+        Vector octs) {
+        ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+
+        for (int i = 0; i != octs.size(); i++) {
+            try {
+                DEROctetString o = (DEROctetString) octs.elementAt(i);
+
+                bOut.write(o.getOctets());
+            }
+            catch (ClassCastException e) {
+                throw new IllegalArgumentException(octs.elementAt(i).getClass().getName() + " found in input should only contain DEROctetString");
+            }
+            catch (IOException e) {
+                throw new IllegalArgumentException("exception converting octets " + e.toString());
+            }
+        }
+
+        return bOut.toByteArray();
+    }
+
+    private Vector octs;
+
+    /** @param string the octets making up the octet string. */
+    public BERConstructedOctetString(
+        byte[] string) {
+        super(string);
+    }
+
+    public BERConstructedOctetString(
+        Vector octs) {
+        super(toBytes(octs));
+
+        this.octs = octs;
+    }
+
+    public BERConstructedOctetString(
+        DERObject obj) {
+        super(obj);
+    }
+
+    public BERConstructedOctetString(
+        DEREncodable obj) {
+        super(obj.getDERObject());
+    }
+
+    public byte[] getOctets() {
+        return string;
+    }
+
+    /** return the DER octets that make up this string. */
+    public Enumeration getObjects() {
+        if (octs == null) {
+            return generateOcts().elements();
+        }
+
+        return octs.elements();
+    }
+
+    private Vector generateOcts() {
+        int start = 0;
+        int end = 0;
+        Vector vec = new Vector();
+
+        while ((end + 1) < string.length) {
+            if (string[end] == 0 && string[end + 1] == 0) {
+                byte[] nStr = new byte[end - start + 1];
+
+                System.arraycopy(string, start, nStr, 0, nStr.length);
+
+                vec.addElement(new DEROctetString(nStr));
+                start = end + 1;
+            }
+            end++;
+        }
+
+        byte[] nStr = new byte[string.length - start];
+
+        System.arraycopy(string, start, nStr, 0, nStr.length);
+
+        vec.addElement(new DEROctetString(nStr));
+
+        return vec;
+    }
+
+    public void encode(
+        DEROutputStream out)
+        throws IOException {
+        if (out instanceof ASN1OutputStream || out instanceof BEROutputStream) {
+            out.write(CONSTRUCTED | OCTET_STRING);
+
+            out.write(0x80);
+
+            //
+            // write out the octet array
+            //
+            if (octs != null) {
+                for (int i = 0; i != octs.size(); i++) {
+                    out.writeObject(octs.elementAt(i));
+                }
+            } else {
+                for (int i = 0; i < string.length; i += MAX_LENGTH) {
+                    int end;
+
+                    if (i + MAX_LENGTH > string.length) {
+                        end = string.length;
+                    } else {
+                        end = i + MAX_LENGTH;
+                    }
+
+                    byte[] nStr = new byte[end - i];
+
+                    System.arraycopy(string, i, nStr, 0, nStr.length);
+
+                    out.writeObject(new DEROctetString(nStr));
+                }
+            }
+
+            out.write(0x00);
+            out.write(0x00);
+        } else {
+            super.encode(out);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERConstructedSequence.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERConstructedSequence.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERConstructedSequence.java
new file mode 100644
index 0000000..5cccfb6
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERConstructedSequence.java
@@ -0,0 +1,29 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.IOException;
+import java.util.Enumeration;
+
+/** @deprecated use BERSequence */
+public class BERConstructedSequence
+    extends DERConstructedSequence {
+    /*
+     */
+    void encode(
+        DEROutputStream out)
+        throws IOException {
+        if (out instanceof ASN1OutputStream || out instanceof BEROutputStream) {
+            out.write(SEQUENCE | CONSTRUCTED);
+            out.write(0x80);
+
+            Enumeration e = getObjects();
+            while (e.hasMoreElements()) {
+                out.writeObject(e.nextElement());
+            }
+
+            out.write(0x00);
+            out.write(0x00);
+        } else {
+            super.encode(out);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERGenerator.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERGenerator.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERGenerator.java
new file mode 100644
index 0000000..a81859b
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERGenerator.java
@@ -0,0 +1,82 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+public class BERGenerator
+    extends ASN1Generator {
+    private boolean _tagged = false;
+    private boolean _isExplicit;
+    private int _tagNo;
+
+    protected BERGenerator(
+        OutputStream out) {
+        super(out);
+    }
+
+    public BERGenerator(
+        OutputStream out,
+        int tagNo,
+        boolean isExplicit) {
+        super(out);
+
+        _tagged = true;
+        _isExplicit = isExplicit;
+        _tagNo = tagNo;
+    }
+
+    public OutputStream getRawOutputStream() {
+        return _out;
+    }
+
+    private void writeHdr(
+        int tag)
+        throws IOException {
+        _out.write(tag);
+        _out.write(0x80);
+    }
+
+    protected void writeBERHeader(
+        int tag)
+        throws IOException {
+        if (_tagged) {
+            int tagNum = _tagNo | DERTags.TAGGED;
+
+            if (_isExplicit) {
+                writeHdr(tagNum | DERTags.CONSTRUCTED);
+                writeHdr(tag);
+            } else {
+                if ((tag & DERTags.CONSTRUCTED) != 0) {
+                    writeHdr(tagNum | DERTags.CONSTRUCTED);
+                } else {
+                    writeHdr(tagNum);
+                }
+            }
+        } else {
+            writeHdr(tag);
+        }
+    }
+
+    protected void writeBERBody(
+        InputStream contentStream)
+        throws IOException {
+        int ch;
+
+        while ((ch = contentStream.read()) >= 0) {
+            _out.write(ch);
+        }
+    }
+
+    protected void writeBEREnd()
+        throws IOException {
+        _out.write(0x00);
+        _out.write(0x00);
+
+        if (_tagged && _isExplicit)  // write extra end for tag header
+        {
+            _out.write(0x00);
+            _out.write(0x00);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERInputStream.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERInputStream.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERInputStream.java
new file mode 100644
index 0000000..403b2ce
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERInputStream.java
@@ -0,0 +1,179 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.ByteArrayOutputStream;
+import java.io.EOFException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Vector;
+
+/** @deprecated use ASN1InputStream */
+public class BERInputStream
+    extends DERInputStream {
+    private static final DERObject END_OF_STREAM = new DERObject() {
+        void encode(
+            DEROutputStream out)
+            throws IOException {
+            throw new IOException("Eeek!");
+        }
+        public int hashCode() {
+            return 0;
+        }
+        public boolean equals(
+            Object o) {
+            return o == this;
+        }
+    };
+    public BERInputStream(
+        InputStream is) {
+        super(is);
+    }
+
+    /** read a string of bytes representing an indefinite length object. */
+    private byte[] readIndefiniteLengthFully()
+        throws IOException {
+        ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+        int b, b1;
+
+        b1 = read();
+
+        while ((b = read()) >= 0) {
+            if (b1 == 0 && b == 0) {
+                break;
+            }
+
+            bOut.write(b1);
+            b1 = b;
+        }
+
+        return bOut.toByteArray();
+    }
+
+    private BERConstructedOctetString buildConstructedOctetString()
+        throws IOException {
+        Vector octs = new Vector();
+
+        for (; ;) {
+            DERObject o = readObject();
+
+            if (o == END_OF_STREAM) {
+                break;
+            }
+
+            octs.addElement(o);
+        }
+
+        return new BERConstructedOctetString(octs);
+    }
+
+    public DERObject readObject()
+        throws IOException {
+        int tag = read();
+        if (tag == -1) {
+            throw new EOFException();
+        }
+
+        int length = readLength();
+
+        if (length < 0)    // indefinite length method
+        {
+            switch (tag) {
+                case NULL:
+                    return null;
+                case SEQUENCE | CONSTRUCTED:
+                    BERConstructedSequence seq = new BERConstructedSequence();
+
+                    for (; ;) {
+                        DERObject obj = readObject();
+
+                        if (obj == END_OF_STREAM) {
+                            break;
+                        }
+
+                        seq.addObject(obj);
+                    }
+                    return seq;
+                case OCTET_STRING | CONSTRUCTED:
+                    return buildConstructedOctetString();
+                case SET | CONSTRUCTED:
+                    ASN1EncodableVector v = new ASN1EncodableVector();
+
+                    for (; ;) {
+                        DERObject obj = readObject();
+
+                        if (obj == END_OF_STREAM) {
+                            break;
+                        }
+
+                        v.add(obj);
+                    }
+                    return new BERSet(v);
+                default:
+                    //
+                    // with tagged object tag number is bottom 5 bits
+                    //
+                    if ((tag & TAGGED) != 0) {
+                        if ((tag & 0x1f) == 0x1f) {
+                            throw new IOException("unsupported high tag encountered");
+                        }
+
+                        //
+                        // simple type - implicit... return an octet string
+                        //
+                        if ((tag & CONSTRUCTED) == 0) {
+                            byte[] bytes = readIndefiniteLengthFully();
+
+                            return new BERTaggedObject(false, tag & 0x1f, new DEROctetString(bytes));
+                        }
+
+                        //
+                        // either constructed or explicitly tagged
+                        //
+                        DERObject dObj = readObject();
+
+                        if (dObj == END_OF_STREAM)     // empty tag!
+                        {
+                            return new DERTaggedObject(tag & 0x1f);
+                        }
+
+                        DERObject next = readObject();
+
+                        //
+                        // explicitly tagged (probably!) - if it isn't we'd have to
+                        // tell from the context
+                        //
+                        if (next == END_OF_STREAM) {
+                            return new BERTaggedObject(tag & 0x1f, dObj);
+                        }
+
+                        //
+                        // another implicit object, we'll create a sequence...
+                        //
+                        seq = new BERConstructedSequence();
+
+                        seq.addObject(dObj);
+
+                        do {
+                            seq.addObject(next);
+                            next = readObject();
+                        }
+                        while (next != END_OF_STREAM);
+
+                        return new BERTaggedObject(false, tag & 0x1f, seq);
+                    }
+
+                    throw new IOException("unknown BER object encountered");
+            }
+        } else {
+            if (tag == 0 && length == 0)    // end of contents marker.
+            {
+                return END_OF_STREAM;
+            }
+
+            byte[] bytes = new byte[length];
+
+            readFully(bytes);
+
+            return buildObject(tag, bytes);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERNull.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERNull.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERNull.java
new file mode 100644
index 0000000..e5c1626
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERNull.java
@@ -0,0 +1,22 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.IOException;
+
+/** A BER NULL object. */
+public class BERNull
+    extends DERNull {
+    public static final BERNull INSTANCE = new BERNull();
+
+    public BERNull() {
+    }
+
+    void encode(
+        DEROutputStream out)
+        throws IOException {
+        if (out instanceof ASN1OutputStream || out instanceof BEROutputStream) {
+            out.write(NULL);
+        } else {
+            super.encode(out);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BEROctetStringGenerator.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BEROctetStringGenerator.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BEROctetStringGenerator.java
new file mode 100644
index 0000000..b21fade
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BEROctetStringGenerator.java
@@ -0,0 +1,86 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+public class BEROctetStringGenerator
+    extends BERGenerator {
+    public BEROctetStringGenerator(OutputStream out)
+        throws IOException {
+        super(out);
+
+        writeBERHeader(DERTags.CONSTRUCTED | DERTags.OCTET_STRING);
+    }
+
+    public BEROctetStringGenerator(
+        OutputStream out,
+        int tagNo,
+        boolean isExplicit)
+        throws IOException {
+        super(out, tagNo, isExplicit);
+
+        writeBERHeader(DERTags.CONSTRUCTED | DERTags.OCTET_STRING);
+    }
+
+    public OutputStream getOctetOutputStream() {
+        return getOctetOutputStream(new byte[1000]); // limit for CER encoding.
+    }
+
+    public OutputStream getOctetOutputStream(
+        byte[] buf) {
+        return new BufferedBEROctetStream(buf);
+    }
+
+    private class BufferedBEROctetStream
+        extends OutputStream {
+        private byte[] _buf;
+        private int _off;
+
+        BufferedBEROctetStream(
+            byte[] buf) {
+            _buf = buf;
+            _off = 0;
+        }
+
+        public void write(
+            int b)
+            throws IOException {
+            _buf[_off++] = (byte) b;
+
+            if (_off == _buf.length) {
+                _out.write(new DEROctetString(_buf).getEncoded());
+                _off = 0;
+            }
+        }
+
+        public void write(byte[] b, int off, int len) throws IOException {
+            while (len > 0) {
+                int numToCopy = Math.min(len, _buf.length - _off);
+                System.arraycopy(b, off, _buf, _off, numToCopy);
+
+                _off += numToCopy;
+                if (_off < _buf.length) {
+                    break;
+                }
+
+                _out.write(new DEROctetString(_buf).getEncoded());
+                _off = 0;
+
+                off += numToCopy;
+                len -= numToCopy;
+            }
+        }
+
+        public void close()
+            throws IOException {
+            if (_off != 0) {
+                byte[] bytes = new byte[_off];
+                System.arraycopy(_buf, 0, bytes, 0, _off);
+
+                _out.write(new DEROctetString(bytes).getEncoded());
+            }
+
+            writeBEREnd();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BEROctetStringParser.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BEROctetStringParser.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BEROctetStringParser.java
new file mode 100644
index 0000000..2123c2b
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BEROctetStringParser.java
@@ -0,0 +1,36 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class BEROctetStringParser
+    implements ASN1OctetStringParser {
+    private ASN1ObjectParser _parser;
+
+    protected BEROctetStringParser(
+        ASN1ObjectParser parser) {
+        _parser = parser;
+    }
+
+    public InputStream getOctetStream() {
+        return new ConstructedOctetStream(_parser);
+    }
+
+    public DERObject getDERObject() {
+        ByteArrayOutputStream bOut = new ByteArrayOutputStream();
+        InputStream in = this.getOctetStream();
+        int ch;
+
+        try {
+            while ((ch = in.read()) >= 0) {
+                bOut.write(ch);
+            }
+        }
+        catch (IOException e) {
+            throw new IllegalStateException("IOException converting stream to byte array: " + e.getMessage());
+        }
+
+        return new BERConstructedOctetString(bOut.toByteArray());
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BEROutputStream.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BEROutputStream.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BEROutputStream.java
new file mode 100644
index 0000000..36f99ee
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BEROutputStream.java
@@ -0,0 +1,26 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+public class BEROutputStream
+    extends DEROutputStream {
+    public BEROutputStream(
+        OutputStream os) {
+        super(os);
+    }
+
+    public void writeObject(
+        Object obj)
+        throws IOException {
+        if (obj == null) {
+            writeNull();
+        } else if (obj instanceof DERObject) {
+            ((DERObject) obj).encode(this);
+        } else if (obj instanceof DEREncodable) {
+            ((DEREncodable) obj).getDERObject().encode(this);
+        } else {
+            throw new IOException("object not BEREncodable");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERSequence.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERSequence.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERSequence.java
new file mode 100644
index 0000000..cc7667e
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERSequence.java
@@ -0,0 +1,44 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.IOException;
+import java.util.Enumeration;
+
+public class BERSequence
+    extends DERSequence {
+    /** create an empty sequence */
+    public BERSequence() {
+    }
+
+    /** create a sequence containing one object */
+    public BERSequence(
+        DEREncodable obj) {
+        super(obj);
+    }
+
+    /** create a sequence containing a vector of objects. */
+    public BERSequence(
+        DEREncodableVector v) {
+        super(v);
+    }
+
+    /*
+     */
+    void encode(
+        DEROutputStream out)
+        throws IOException {
+        if (out instanceof ASN1OutputStream || out instanceof BEROutputStream) {
+            out.write(SEQUENCE | CONSTRUCTED);
+            out.write(0x80);
+
+            Enumeration e = getObjects();
+            while (e.hasMoreElements()) {
+                out.writeObject(e.nextElement());
+            }
+
+            out.write(0x00);
+            out.write(0x00);
+        } else {
+            super.encode(out);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERSequenceGenerator.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERSequenceGenerator.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERSequenceGenerator.java
new file mode 100644
index 0000000..0e821ce
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERSequenceGenerator.java
@@ -0,0 +1,36 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+public class BERSequenceGenerator
+    extends BERGenerator {
+    public BERSequenceGenerator(
+        OutputStream out)
+        throws IOException {
+        super(out);
+
+        writeBERHeader(DERTags.CONSTRUCTED | DERTags.SEQUENCE);
+    }
+
+    public BERSequenceGenerator(
+        OutputStream out,
+        int tagNo,
+        boolean isExplicit)
+        throws IOException {
+        super(out, tagNo, isExplicit);
+
+        writeBERHeader(DERTags.CONSTRUCTED | DERTags.SEQUENCE);
+    }
+
+    public void addObject(
+        DEREncodable object)
+        throws IOException {
+        object.getDERObject().encode(new DEROutputStream(_out));
+    }
+
+    public void close()
+        throws IOException {
+        writeBEREnd();
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERSequenceParser.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERSequenceParser.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERSequenceParser.java
new file mode 100644
index 0000000..fb7dad3
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERSequenceParser.java
@@ -0,0 +1,21 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.IOException;
+
+public class BERSequenceParser
+    implements ASN1SequenceParser {
+    private ASN1ObjectParser _parser;
+
+    BERSequenceParser(ASN1ObjectParser parser) {
+        this._parser = parser;
+    }
+
+    public DEREncodable readObject()
+        throws IOException {
+        return _parser.readObject();
+    }
+
+    public DERObject getDERObject() {
+        return new BERSequence(_parser.readVector());
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERSet.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERSet.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERSet.java
new file mode 100644
index 0000000..db80cf4
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERSet.java
@@ -0,0 +1,51 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.IOException;
+import java.util.Enumeration;
+
+public class BERSet
+    extends DERSet {
+    /** create an empty sequence */
+    public BERSet() {
+    }
+
+    /** create a set containing one object */
+    public BERSet(
+        DEREncodable obj) {
+        super(obj);
+    }
+
+    /** @param v - a vector of objects making up the set. */
+    public BERSet(
+        DEREncodableVector v) {
+        super(v, false);
+    }
+
+    /** @param v - a vector of objects making up the set. */
+    BERSet(
+        DEREncodableVector v,
+        boolean needsSorting) {
+        super(v, needsSorting);
+    }
+
+    /*
+     */
+    void encode(
+        DEROutputStream out)
+        throws IOException {
+        if (out instanceof ASN1OutputStream || out instanceof BEROutputStream) {
+            out.write(SET | CONSTRUCTED);
+            out.write(0x80);
+
+            Enumeration e = getObjects();
+            while (e.hasMoreElements()) {
+                out.writeObject(e.nextElement());
+            }
+
+            out.write(0x00);
+            out.write(0x00);
+        } else {
+            super.encode(out);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERSetParser.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERSetParser.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERSetParser.java
new file mode 100644
index 0000000..7f88189
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERSetParser.java
@@ -0,0 +1,21 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.IOException;
+
+public class BERSetParser
+    implements ASN1SetParser {
+    private ASN1ObjectParser _parser;
+
+    BERSetParser(ASN1ObjectParser parser) {
+        this._parser = parser;
+    }
+
+    public DEREncodable readObject()
+        throws IOException {
+        return _parser.readObject();
+    }
+
+    public DERObject getDERObject() {
+        return new BERSet(_parser.readVector());
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/23c1fd12/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERTaggedObject.java
----------------------------------------------------------------------
diff --git a/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERTaggedObject.java b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERTaggedObject.java
new file mode 100644
index 0000000..c0be868
--- /dev/null
+++ b/3rdparty/not-yet-commons-ssl/src/main/java/org/apache/commons/ssl/asn1/BERTaggedObject.java
@@ -0,0 +1,94 @@
+package org.apache.commons.ssl.asn1;
+
+import java.io.IOException;
+import java.util.Enumeration;
+
+/**
+ * BER TaggedObject - in ASN.1 nottation this is any object proceeded by
+ * a [n] where n is some number - these are assume to follow the construction
+ * rules (as with sequences).
+ */
+public class BERTaggedObject
+    extends DERTaggedObject {
+    /**
+     * @param tagNo the tag number for this object.
+     * @param obj   the tagged object.
+     */
+    public BERTaggedObject(
+        int tagNo,
+        DEREncodable obj) {
+        super(tagNo, obj);
+    }
+
+    /**
+     * @param explicit true if an explicitly tagged object.
+     * @param tagNo    the tag number for this object.
+     * @param obj      the tagged object.
+     */
+    public BERTaggedObject(
+        boolean explicit,
+        int tagNo,
+        DEREncodable obj) {
+        super(explicit, tagNo, obj);
+    }
+
+    /**
+     * create an implicitly tagged object that contains a zero
+     * length sequence.
+     */
+    public BERTaggedObject(
+        int tagNo) {
+        super(false, tagNo, new BERSequence());
+    }
+
+    void encode(
+        DEROutputStream out)
+        throws IOException {
+        if (out instanceof ASN1OutputStream || out instanceof BEROutputStream) {
+            out.write(CONSTRUCTED | TAGGED | tagNo);
+            out.write(0x80);
+
+            if (!empty) {
+                if (!explicit) {
+                    if (obj instanceof ASN1OctetString) {
+                        Enumeration e;
+
+                        if (obj instanceof BERConstructedOctetString) {
+                            e = ((BERConstructedOctetString) obj).getObjects();
+                        } else {
+                            ASN1OctetString octs = (ASN1OctetString) obj;
+                            BERConstructedOctetString berO = new BERConstructedOctetString(octs.getOctets());
+
+                            e = berO.getObjects();
+                        }
+
+                        while (e.hasMoreElements()) {
+                            out.writeObject(e.nextElement());
+                        }
+                    } else if (obj instanceof ASN1Sequence) {
+                        Enumeration e = ((ASN1Sequence) obj).getObjects();
+
+                        while (e.hasMoreElements()) {
+                            out.writeObject(e.nextElement());
+                        }
+                    } else if (obj instanceof ASN1Set) {
+                        Enumeration e = ((ASN1Set) obj).getObjects();
+
+                        while (e.hasMoreElements()) {
+                            out.writeObject(e.nextElement());
+                        }
+                    } else {
+                        throw new RuntimeException("not implemented: " + obj.getClass().getName());
+                    }
+                } else {
+                    out.writeObject(obj);
+                }
+            }
+
+            out.write(0x00);
+            out.write(0x00);
+        } else {
+            super.encode(out);
+        }
+    }
+}