You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by lg...@apache.org on 2018/09/06 16:03:25 UTC

[15/51] [abbrv] mina-sshd git commit: [SSHD-842] Split common utilities code from sshd-core into sshd-common (new artifact)

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/10de190e/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/BufferUtils.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/BufferUtils.java b/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/BufferUtils.java
deleted file mode 100644
index c13cd9e..0000000
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/BufferUtils.java
+++ /dev/null
@@ -1,604 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.sshd.common.util.buffer;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.StreamCorruptedException;
-import java.util.function.IntUnaryOperator;
-import java.util.logging.Level;
-
-import org.apache.sshd.common.PropertyResolver;
-import org.apache.sshd.common.util.GenericUtils;
-import org.apache.sshd.common.util.NumberUtils;
-import org.apache.sshd.common.util.ValidateUtils;
-import org.apache.sshd.common.util.io.IoUtils;
-import org.apache.sshd.common.util.logging.SimplifiedLog;
-
-/**
- * TODO Add javadoc
- *
- * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
- */
-public final class BufferUtils {
-    public static final char DEFAULT_HEX_SEPARATOR = ' ';
-    public static final char EMPTY_HEX_SEPARATOR = '\0';
-    public static final String HEX_DIGITS = "0123456789abcdef";
-
-    public static final String HEXDUMP_CHUNK_SIZE = "sshd-hexdump-chunk-size";
-    public static final int DEFAULT_HEXDUMP_CHUNK_SIZE = 64;
-    public static final Level DEFAULT_HEXDUMP_LEVEL = Level.FINEST;
-
-    public static final IntUnaryOperator DEFAULT_BUFFER_GROWTH_FACTOR = BufferUtils::getNextPowerOf2;
-
-    /**
-     * Maximum value of a {@code uint32} field
-     */
-    public static final long MAX_UINT32_VALUE = 0x0FFFFFFFFL;
-
-    /**
-     * Maximum value of a {@code uint8} field
-     */
-    public static final int MAX_UINT8_VALUE = 0x0FF;
-
-    /**
-     * Private Constructor
-     */
-    private BufferUtils() {
-        throw new UnsupportedOperationException("No instance allowed");
-    }
-
-    public static void dumpHex(SimplifiedLog logger, Level level, String prefix, PropertyResolver resolver, char sep, byte... data) {
-        dumpHex(logger, level, prefix, resolver, sep, data, 0, NumberUtils.length(data));
-    }
-
-    public static void dumpHex(SimplifiedLog logger, Level level, String prefix, PropertyResolver resolver, char sep, byte[] data, int offset, int len) {
-        dumpHex(logger, level, prefix, sep, resolver.getIntProperty(HEXDUMP_CHUNK_SIZE, DEFAULT_HEXDUMP_CHUNK_SIZE), data, offset, len);
-    }
-
-    public static void dumpHex(SimplifiedLog logger, Level level, String prefix, char sep, int chunkSize, byte... data) {
-        dumpHex(logger, level, prefix, sep, chunkSize, data, 0, NumberUtils.length(data));
-    }
-
-    public static void dumpHex(SimplifiedLog logger, Level level, String prefix, char sep, int chunkSize, byte[] data, int offset, int len) {
-        if ((logger == null) || (level == null) || (!logger.isEnabled(level))) {
-            return;
-        }
-
-        StringBuilder sb = new StringBuilder(chunkSize * 3 /* HEX */ + prefix.length() + Long.SIZE /* some extra */);
-        sb.append(prefix);
-        for (int remainLen = len, chunkIndex = 1, curOffset = offset, totalLen = 0; remainLen > 0; chunkIndex++) {
-            sb.setLength(prefix.length());    // reset for next chunk
-
-            sb.append(" [chunk #").append(chunkIndex).append(']');
-
-            int dumpSize = Math.min(chunkSize, remainLen);
-            totalLen += dumpSize;
-            sb.append('(').append(totalLen).append('/').append(len).append(')');
-
-            try {
-                appendHex(sb.append(' '), data, curOffset, dumpSize, sep);
-            } catch (IOException e) {   // unexpected
-                sb.append(e.getClass().getSimpleName()).append(": ").append(e.getMessage());
-            }
-
-            // Pad the last (incomplete) line to align its data view
-            for (int index = dumpSize; index < chunkSize; index++) {
-                if (sep != EMPTY_HEX_SEPARATOR) {
-                    sb.append(' ');
-                }
-                sb.append("  ");
-            }
-
-            sb.append("    ");
-            for (int pos = curOffset, l = 0; l < dumpSize; pos++, l++) {
-                int b = data[pos] & 0xFF;
-                if ((b > ' ') && (b < 0x7E)) {
-                    sb.append((char) b);
-                } else {
-                    sb.append('.');
-                }
-            }
-
-            logger.log(level, sb.toString());
-            remainLen -= dumpSize;
-            curOffset += dumpSize;
-        }
-    }
-
-    public static String toHex(byte... array) {
-        return toHex(array, 0, NumberUtils.length(array));
-    }
-
-    public static String toHex(char sep, byte... array) {
-        return toHex(array, 0, NumberUtils.length(array), sep);
-    }
-
-    public static String toHex(byte[] array, int offset, int len) {
-        return toHex(array, offset, len, DEFAULT_HEX_SEPARATOR);
-    }
-
-    public static String toHex(byte[] array, int offset, int len, char sep) {
-        if (len <= 0) {
-            return "";
-        }
-
-        try {
-            return appendHex(new StringBuilder(len * 3 /* 2 HEX + sep */), array, offset, len, sep).toString();
-        } catch (IOException e) {   // unexpected
-            return e.getClass().getSimpleName() + ": " + e.getMessage();
-        }
-    }
-
-    public static <A extends Appendable> A appendHex(A sb, char sep, byte... array) throws IOException {
-        return appendHex(sb, array, 0, NumberUtils.length(array), sep);
-    }
-
-    public static <A extends Appendable> A appendHex(A sb, byte[] array, int offset, int len, char sep) throws IOException {
-        if (len <= 0) {
-            return sb;
-        }
-
-        for (int curOffset = offset, maxOffset = offset + len; curOffset < maxOffset; curOffset++) {
-            byte b = array[curOffset];
-            if ((curOffset > offset) && (sep != EMPTY_HEX_SEPARATOR)) {
-                sb.append(sep);
-            }
-            sb.append(HEX_DIGITS.charAt((b >> 4) & 0x0F));
-            sb.append(HEX_DIGITS.charAt(b & 0x0F));
-        }
-
-        return sb;
-    }
-
-    /**
-     * @param separator The separator between the HEX values - may be {@link #EMPTY_HEX_SEPARATOR}
-     * @param csq The {@link CharSequence} containing the HEX encoded bytes
-     * @return The decoded bytes
-     * @throws IllegalArgumentException If invalid HEX sequence length
-     * @throws NumberFormatException If invalid HEX characters found
-     * @see #decodeHex(char, CharSequence, int, int)
-     */
-    public static byte[] decodeHex(char separator, CharSequence csq) {
-        return decodeHex(separator, csq, 0, GenericUtils.length(csq));
-    }
-
-    /**
-     * @param separator The separator between the HEX values - may be {@link #EMPTY_HEX_SEPARATOR}
-     * @param csq The {@link CharSequence} containing the HEX encoded bytes
-     * @param start Start offset of the HEX sequence (inclusive)
-     * @param end End offset of the HEX sequence (exclusive)
-     * @return The decoded bytes
-     * @throws IllegalArgumentException If invalid HEX sequence length
-     * @throws NumberFormatException If invalid HEX characters found
-     */
-    public static byte[] decodeHex(char separator, CharSequence csq, int start, int end) {
-        int len = end - start;
-        ValidateUtils.checkTrue(len >= 0, "Bad HEX sequence length: %d", len);
-        if (len == 0) {
-            return GenericUtils.EMPTY_BYTE_ARRAY;
-        }
-
-        int delta = 2;
-        byte[] bytes;
-        if (separator != EMPTY_HEX_SEPARATOR) {
-            // last character cannot be the separator
-            ValidateUtils.checkTrue((len % 3) == 2, "Invalid separated HEX sequence length: %d", len);
-            bytes = new byte[(len + 1) / 3];
-            delta++;
-        } else {
-            ValidateUtils.checkTrue((len & 0x01) == 0, "Invalid contiguous HEX sequence length: %d", len);
-            bytes = new byte[len >>> 1];
-        }
-
-        int writeLen = 0;
-        for (int curPos = start; curPos < end; curPos += delta, writeLen++) {
-            bytes[writeLen] = fromHex(csq.charAt(curPos), csq.charAt(curPos + 1));
-        }
-        assert writeLen == bytes.length;
-
-        return bytes;
-    }
-
-    /**
-     * @param <S> The {@link OutputStream} generic type
-     * @param stream The target {@link OutputStream}
-     * @param separator The separator between the HEX values - may be {@link #EMPTY_HEX_SEPARATOR}
-     * @param csq The {@link CharSequence} containing the HEX encoded bytes
-     * @return The number of bytes written to the stream
-     * @throws IOException If failed to write
-     * @throws IllegalArgumentException If invalid HEX sequence length
-     * @throws NumberFormatException If invalid HEX characters found
-     * @see #decodeHex(OutputStream, char, CharSequence, int, int)
-     */
-    public static <S extends OutputStream> int decodeHex(S stream, char separator, CharSequence csq) throws IOException {
-        return decodeHex(stream, separator, csq, 0, GenericUtils.length(csq));
-    }
-
-    /**
-     * @param <S> The {@link OutputStream} generic type
-     * @param stream The target {@link OutputStream}
-     * @param separator The separator between the HEX values - may be {@link #EMPTY_HEX_SEPARATOR}
-     * @param csq The {@link CharSequence} containing the HEX encoded bytes
-     * @param start Start offset of the HEX sequence (inclusive)
-     * @param end End offset of the HEX sequence (exclusive)
-     * @return The number of bytes written to the stream
-     * @throws IOException If failed to write
-     * @throws IllegalArgumentException If invalid HEX sequence length
-     * @throws NumberFormatException If invalid HEX characters found
-     */
-    public static <S extends OutputStream> int decodeHex(S stream, char separator, CharSequence csq, int start, int end) throws IOException {
-        int len = end - start;
-        ValidateUtils.checkTrue(len >= 0, "Bad HEX sequence length: %d", len);
-
-        int delta = 2;
-        if (separator != EMPTY_HEX_SEPARATOR) {
-            // last character cannot be the separator
-            ValidateUtils.checkTrue((len % 3) == 2, "Invalid separated HEX sequence length: %d", len);
-            delta++;
-        } else {
-            ValidateUtils.checkTrue((len & 0x01) == 0, "Invalid contiguous HEX sequence length: %d", len);
-        }
-
-        int writeLen = 0;
-        for (int curPos = start; curPos < end; curPos += delta, writeLen++) {
-            stream.write(fromHex(csq.charAt(curPos), csq.charAt(curPos + 1)) & 0xFF);
-        }
-
-        return writeLen;
-    }
-
-    public static byte fromHex(char hi, char lo) throws NumberFormatException {
-        int hiValue = HEX_DIGITS.indexOf(((hi >= 'A') && (hi <= 'F')) ? ('a' + (hi - 'A')) : hi);
-        int loValue = HEX_DIGITS.indexOf(((lo >= 'A') && (lo <= 'F')) ? ('a' + (lo - 'A')) : lo);
-        if ((hiValue < 0) || (loValue < 0)) {
-            throw new NumberFormatException("fromHex(" + new String(new char[]{hi, lo}) + ") non-HEX characters");
-        }
-
-        return (byte) ((hiValue << 4) + loValue);
-    }
-
-    /**
-     * Read a 32-bit value in network order
-     *
-     * @param input The {@link InputStream}
-     * @param buf   Work buffer to use
-     * @return The read 32-bit value
-     * @throws IOException If failed to read 4 bytes or not enough room in
-     * @see #readInt(InputStream, byte[], int, int)
-     */
-    public static int readInt(InputStream input, byte[] buf) throws IOException {
-        return readInt(input, buf, 0, NumberUtils.length(buf));
-    }
-
-    /**
-     * Read a 32-bit value in network order
-     *
-     * @param input  The {@link InputStream}
-     * @param buf    Work buffer to use
-     * @param offset Offset in buffer to us
-     * @param len    Available length - must have at least 4 bytes available
-     * @return The read 32-bit value
-     * @throws IOException If failed to read 4 bytes or not enough room in
-     *                     work buffer
-     * @see #readUInt(InputStream, byte[], int, int)
-     */
-    public static int readInt(InputStream input, byte[] buf, int offset, int len) throws IOException {
-        return (int) readUInt(input, buf, offset, len);
-    }
-
-    /**
-     * Read a 32-bit value in network order
-     *
-     * @param input The {@link InputStream}
-     * @param buf   Work buffer to use
-     * @return The read 32-bit value
-     * @throws IOException If failed to read 4 bytes or not enough room in
-     * @see #readUInt(InputStream, byte[], int, int)
-     */
-    public static long readUInt(InputStream input, byte[] buf) throws IOException {
-        return readUInt(input, buf, 0, NumberUtils.length(buf));
-    }
-
-    /**
-     * Read a 32-bit value in network order
-     *
-     * @param input  The {@link InputStream}
-     * @param buf    Work buffer to use
-     * @param offset Offset in buffer to us
-     * @param len    Available length - must have at least 4 bytes available
-     * @return The read 32-bit value
-     * @throws IOException If failed to read 4 bytes or not enough room in
-     *                     work buffer
-     * @see #getUInt(byte[], int, int)
-     */
-    public static long readUInt(InputStream input, byte[] buf, int offset, int len) throws IOException {
-        try {
-            if (len < Integer.BYTES) {
-                throw new IllegalArgumentException("Not enough data for a UINT: required=" + Integer.BYTES + ", available=" + len);
-            }
-
-            IoUtils.readFully(input, buf, offset, Integer.BYTES);
-            return getUInt(buf, offset, len);
-        } catch (RuntimeException | Error e) {
-            throw new StreamCorruptedException("Failed (" + e.getClass().getSimpleName() + ")"
-                    + " to read UINT value: " + e.getMessage());
-        }
-    }
-
-    /**
-     * @param buf A buffer holding a 32-bit unsigned integer in <B>big endian</B>
-     *            format. <B>Note:</B> if more than 4 bytes are available, then only the
-     *            <U>first</U> 4 bytes in the buffer will be used
-     * @return The result as a {@code long} whose 32 high-order bits are zero
-     * @see #getUInt(byte[], int, int)
-     */
-    public static long getUInt(byte... buf) {
-        return getUInt(buf, 0, NumberUtils.length(buf));
-    }
-
-    /**
-     * @param buf A buffer holding a 32-bit unsigned integer in <B>big endian</B>
-     *            format.
-     * @param off The offset of the data in the buffer
-     * @param len The available data length. <B>Note:</B> if more than 4 bytes
-     *            are available, then only the <U>first</U> 4 bytes in the buffer will be
-     *            used (starting at the specified <tt>offset</tt>)
-     * @return The result as a {@code long} whose 32 high-order bits are zero
-     */
-    public static long getUInt(byte[] buf, int off, int len) {
-        if (len < Integer.BYTES) {
-            throw new IllegalArgumentException("Not enough data for a UINT: required=" + Integer.BYTES + ", available=" + len);
-        }
-
-        long l = (buf[off] << 24) & 0xff000000L;
-        l |= (buf[off + 1] << 16) & 0x00ff0000L;
-        l |= (buf[off + 2] << 8) & 0x0000ff00L;
-        l |= (buf[off + 3]) & 0x000000ffL;
-        return l;
-    }
-
-    /**
-     * Writes a 32-bit value in network order (i.e., MSB 1st)
-     *
-     * @param output The {@link OutputStream} to write the value
-     * @param value  The 32-bit value
-     * @param buf    A work buffer to use - must have enough space to contain 4 bytes
-     * @throws IOException If failed to write the value or work buffer to small
-     * @see #writeInt(OutputStream, int, byte[], int, int)
-     */
-    public static void writeInt(OutputStream output, int value, byte[] buf) throws IOException {
-        writeUInt(output, value, buf, 0, NumberUtils.length(buf));
-    }
-
-    /**
-     * Writes a 32-bit value in network order (i.e., MSB 1st)
-     *
-     * @param output The {@link OutputStream} to write the value
-     * @param value  The 32-bit value
-     * @param buf    A work buffer to use - must have enough space to contain 4 bytes
-     * @param off    The offset to write the value
-     * @param len    The available space
-     * @throws IOException If failed to write the value or work buffer to small
-     * @see #writeUInt(OutputStream, long, byte[], int, int)
-     */
-    public static void writeInt(OutputStream output, int value, byte[] buf, int off, int len) throws IOException {
-        writeUInt(output, value & 0xFFFFFFFFL, buf, off, len);
-    }
-
-    /**
-     * Writes a 32-bit value in network order (i.e., MSB 1st)
-     *
-     * @param output The {@link OutputStream} to write the value
-     * @param value  The 32-bit value
-     * @param buf    A work buffer to use - must have enough space to contain 4 bytes
-     * @throws IOException If failed to write the value or work buffer to small
-     * @see #writeUInt(OutputStream, long, byte[], int, int)
-     */
-    public static void writeUInt(OutputStream output, long value, byte[] buf) throws IOException {
-        writeUInt(output, value, buf, 0, NumberUtils.length(buf));
-    }
-
-    /**
-     * Writes a 32-bit value in network order (i.e., MSB 1st)
-     *
-     * @param output The {@link OutputStream} to write the value
-     * @param value  The 32-bit value
-     * @param buf    A work buffer to use - must have enough space to contain 4 bytes
-     * @param off    The offset to write the value
-     * @param len    The available space
-     * @throws IOException If failed to write the value or work buffer to small
-     * @see #putUInt(long, byte[], int, int)
-     */
-    public static void writeUInt(OutputStream output, long value, byte[] buf, int off, int len) throws IOException {
-        try {
-            int writeLen = putUInt(value, buf, off, len);
-            output.write(buf, off, writeLen);
-        } catch (RuntimeException | Error e) {
-            throw new StreamCorruptedException("Failed (" + e.getClass().getSimpleName() + ")"
-                    + " to write UINT value=" + value + ": " + e.getMessage());
-        }
-    }
-
-    /**
-     * Writes a 32-bit value in network order (i.e., MSB 1st)
-     *
-     * @param value The 32-bit value
-     * @param buf   The buffer
-     * @return The number of bytes used in the buffer
-     * @throws IllegalArgumentException if not enough space available
-     * @see #putUInt(long, byte[], int, int)
-     */
-    public static int putUInt(long value, byte[] buf) {
-        return putUInt(value, buf, 0, NumberUtils.length(buf));
-    }
-
-    /**
-     * Writes a 32-bit value in network order (i.e., MSB 1st)
-     *
-     * @param value The 32-bit value
-     * @param buf   The buffer
-     * @param off   The offset to write the value
-     * @param len   The available space
-     * @return The number of bytes used in the buffer
-     * @throws IllegalArgumentException if not enough space available
-     */
-    public static int putUInt(long value, byte[] buf, int off, int len) {
-        if (len < Integer.BYTES) {
-            throw new IllegalArgumentException("Not enough data for a UINT: required=" + Integer.BYTES + ", available=" + len);
-        }
-
-        buf[off] = (byte) ((value >> 24) & 0xFF);
-        buf[off + 1] = (byte) ((value >> 16) & 0xFF);
-        buf[off + 2] = (byte) ((value >> 8) & 0xFF);
-        buf[off + 3] = (byte) (value & 0xFF);
-
-        return Integer.BYTES;
-    }
-
-    public static boolean equals(byte[] a1, byte[] a2) {
-        int len1 = NumberUtils.length(a1);
-        int len2 = NumberUtils.length(a2);
-        if (len1 != len2) {
-            return false;
-        } else {
-            return equals(a1, 0, a2, 0, len1);
-        }
-    }
-
-    @SuppressWarnings("PMD.AssignmentInOperand")
-    public static boolean equals(byte[] a1, int a1Offset, byte[] a2, int a2Offset, int length) {
-        int len1 = NumberUtils.length(a1);
-        int len2 = NumberUtils.length(a2);
-        if ((len1 < (a1Offset + length)) || (len2 < (a2Offset + length))) {
-            return false;
-        }
-
-        while (length-- > 0) {
-            if (a1[a1Offset++] != a2[a2Offset++]) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    public static int getNextPowerOf2(int value) {
-        // for 0-7 return 8
-        return (value < Byte.SIZE) ? Byte.SIZE : NumberUtils.getNextPowerOf2(value);
-    }
-
-    /**
-     * Used for encodings where we don't know the data length before adding it
-     * to the buffer. The idea is to place a 32-bit &quot;placeholder&quot;,
-     * encode the data and then return back to the placeholder and update the
-     * length. The method calculates the encoded data length, moves the write
-     * position to the specified placeholder position, updates the length value
-     * and then moves the write position it back to its original value.
-     *
-     * @param buffer The {@link Buffer}
-     * @param lenPos The offset in the buffer where the length placeholder is
-     *               to be update - <B>Note:</B> assumption is that the encoded data starts
-     *               <U>immediately</U> after the placeholder
-     * @return The amount of data that has been encoded
-     */
-    public static int updateLengthPlaceholder(Buffer buffer, int lenPos) {
-        int startPos = lenPos + Integer.BYTES;
-        int endPos = buffer.wpos();
-        int dataLength = endPos - startPos;
-        // NOTE: although data length is defined as UINT32, we do not expected sizes above Integer.MAX_VALUE
-        ValidateUtils.checkTrue(dataLength >= 0, "Illegal data length: %d", dataLength);
-        buffer.wpos(lenPos);
-        buffer.putInt(dataLength);
-        buffer.wpos(endPos);
-        return dataLength;
-    }
-
-    /**
-     * Updates a 32-bit &quot;placeholder&quot; location for data length - moves
-     * the write position to the specified placeholder position, updates the length
-     * value and then moves the write position it back to its original value.
-     *
-     * @param buffer     The {@link Buffer}
-     * @param lenPos     The offset in the buffer where the length placeholder is
-     *                   to be update - <B>Note:</B> assumption is that the encoded data starts
-     *                   <U>immediately</U> after the placeholder
-     * @param dataLength The length to update
-     */
-    public static void updateLengthPlaceholder(Buffer buffer, int lenPos, int dataLength) {
-        int curPos = buffer.wpos();
-        buffer.wpos(lenPos);
-        buffer.putInt(dataLength);
-        buffer.wpos(curPos);
-    }
-
-    /**
-     * Invokes {@link Buffer#clear()}
-     *
-     * @param <B>    The generic buffer type
-     * @param buffer A {@link Buffer} instance - ignored if {@code null}
-     * @return The same as the input instance
-     */
-    public static <B extends Buffer> B clear(B buffer) {
-        if (buffer != null) {
-            buffer.clear();
-        }
-
-        return buffer;
-    }
-
-    public static long validateInt32Value(long value, String message) {
-        ValidateUtils.checkTrue(isValidInt32Value(value), message, value);
-        return value;
-    }
-
-    public static long validateInt32Value(long value, String format, Object arg) {
-        ValidateUtils.checkTrue(isValidInt32Value(value), format, arg);
-        return value;
-    }
-
-    public static long validateInt32Value(long value, String format, Object... args) {
-        ValidateUtils.checkTrue(isValidInt32Value(value), format, args);
-        return value;
-    }
-
-    public static boolean isValidInt32Value(long value) {
-        return (value >= Integer.MIN_VALUE) && (value <= Integer.MAX_VALUE);
-    }
-
-    public static long validateUint32Value(long value, String message) {
-        ValidateUtils.checkTrue(isValidUint32Value(value), message, value);
-        return value;
-    }
-
-    public static long validateUint32Value(long value, String format, Object arg) {
-        ValidateUtils.checkTrue(isValidUint32Value(value), format, arg);
-        return value;
-    }
-
-    public static long validateUint32Value(long value, String format, Object... args) {
-        ValidateUtils.checkTrue(isValidUint32Value(value), format, args);
-        return value;
-    }
-
-    public static boolean isValidUint32Value(long value) {
-        return (value >= 0L) && (value <= MAX_UINT32_VALUE);
-    }
-}

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/10de190e/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/ByteArrayBuffer.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/ByteArrayBuffer.java b/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/ByteArrayBuffer.java
deleted file mode 100644
index 6655ec1..0000000
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/ByteArrayBuffer.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.sshd.common.util.buffer;
-
-import java.nio.ByteBuffer;
-import java.nio.charset.Charset;
-import java.util.Arrays;
-import java.util.Objects;
-import java.util.function.IntUnaryOperator;
-
-import org.apache.sshd.common.util.GenericUtils;
-import org.apache.sshd.common.util.NumberUtils;
-import org.apache.sshd.common.util.Readable;
-import org.apache.sshd.common.util.ValidateUtils;
-
-/**
- * Provides an implementation of {@link Buffer} using a backing byte array
- *
- * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
- */
-public class ByteArrayBuffer extends Buffer {
-    public static final int DEFAULT_SIZE = 256;
-    public static final int MAX_LEN = 65536;
-
-    private byte[] data;
-    private int rpos;
-    private int wpos;
-
-    public ByteArrayBuffer() {
-        this(DEFAULT_SIZE);
-    }
-
-    public ByteArrayBuffer(int size) {
-        this(size, true);
-    }
-
-    public ByteArrayBuffer(int size, boolean roundOff) {
-        this(new byte[roundOff ? BufferUtils.getNextPowerOf2(size) : size], false);
-    }
-
-    public ByteArrayBuffer(byte[] data) {
-        this(data, 0, data.length, true);
-    }
-
-    public ByteArrayBuffer(byte[] data, boolean read) {
-        this(data, 0, data.length, read);
-    }
-
-    public ByteArrayBuffer(byte[] data, int off, int len) {
-        this(data, off, len, true);
-    }
-
-    public ByteArrayBuffer(byte[] data, int off, int len, boolean read) {
-        this.data = data;
-        this.rpos = off;
-        this.wpos = (read ? len : 0) + off;
-    }
-
-    @Override
-    public int rpos() {
-        return rpos;
-    }
-
-    @Override
-    public void rpos(int rpos) {
-        this.rpos = rpos;
-    }
-
-    @Override
-    public int wpos() {
-        return wpos;
-    }
-
-    @Override
-    public void wpos(int wpos) {
-        if (wpos > this.wpos) {
-            ensureCapacity(wpos - this.wpos);
-        }
-        this.wpos = wpos;
-    }
-
-    @Override
-    public int available() {
-        return wpos - rpos;
-    }
-
-    @Override
-    public int capacity() {
-        return data.length - wpos;
-    }
-
-    @Override
-    public byte[] array() {
-        return data;
-    }
-
-    @Override
-    public void compact() {
-        int avail = available();
-        if (avail > 0) {
-            System.arraycopy(data, rpos, data, 0, avail);
-        }
-        wpos -= rpos;
-        rpos = 0;
-    }
-
-    @Override
-    public void clear(boolean wipeData) {
-        rpos = 0;
-        wpos = 0;
-
-        if (wipeData) {
-            Arrays.fill(data, (byte) 0);
-        }
-    }
-
-    @Override
-    public byte getByte() {
-        ensureAvailable(Byte.BYTES);
-        return data[rpos++];
-    }
-
-    @Override
-    public void putByte(byte b) {
-        ensureCapacity(Byte.BYTES);
-        data[wpos++] = b;
-    }
-
-    @Override
-    public int putBuffer(Readable buffer, boolean expand) {
-        int r = expand ? buffer.available() : Math.min(buffer.available(), capacity());
-        ensureCapacity(r);
-        buffer.getRawBytes(data, wpos, r);
-        wpos += r;
-        return r;
-    }
-
-    @Override
-    public void putBuffer(ByteBuffer buffer) {
-        int required = buffer.remaining();
-        ensureCapacity(required + Integer.SIZE);
-        putInt(required);
-        buffer.get(data, wpos, required);
-        wpos += required;
-    }
-
-    @Override
-    public void putRawBytes(byte[] d, int off, int len) {
-        ValidateUtils.checkTrue(len >= 0, "Negative raw bytes length: %d", len);
-        ensureCapacity(len);
-        System.arraycopy(d, off, data, wpos, len);
-        wpos += len;
-    }
-
-    @Override
-    public String getString(Charset charset) {
-        int len = getInt();
-        if (len < 0) {
-            throw new BufferException("Bad item length: " + len);
-        }
-        ensureAvailable(len);
-
-        Objects.requireNonNull(charset, "No charset specified");
-        String s = new String(data, rpos, len, charset);
-        rpos += len;
-        return s;
-    }
-
-    @Override
-    public void getRawBytes(byte[] buf, int off, int len) {
-        ensureAvailable(len);
-        copyRawBytes(0, buf, off, len);
-        rpos += len;
-    }
-
-    @Override
-    protected void copyRawBytes(int offset, byte[] buf, int pos, int len) {
-        System.arraycopy(data, rpos + offset, buf, pos, len);
-    }
-
-    @Override
-    public void ensureCapacity(int capacity, IntUnaryOperator growthFactor) {
-        ValidateUtils.checkTrue(capacity >= 0, "Negative capacity requested: %d", capacity);
-
-        int maxSize = size();
-        int curPos = wpos();
-        int remaining = maxSize - curPos;
-        if (remaining < capacity) {
-            int minimum = curPos + capacity;
-            int actual = growthFactor.applyAsInt(minimum);
-            if (actual < minimum) {
-                throw new IllegalStateException("ensureCapacity(" + capacity + ") actual (" + actual + ") below min. (" + minimum + ")");
-            }
-            byte[] tmp = new byte[actual];
-            System.arraycopy(data, 0, tmp, 0, data.length);
-            data = tmp;
-        }
-    }
-
-    @Override
-    protected int size() {
-        return data.length;
-    }
-
-    /**
-     * Creates a compact buffer (i.e., one that starts at offset zero) containing a <U>copy</U>
-     * of the original data
-     *
-     * @param data   The original data buffer
-     * @return A {@link ByteArrayBuffer} containing a <U>copy</U> of the original data
-     * starting at zero read position
-     * @see #getCompactClone(byte[], int, int)
-     */
-    public static ByteArrayBuffer getCompactClone(byte[] data) {
-        return getCompactClone(data, 0, NumberUtils.length(data));
-    }
-
-    /**
-     * Creates a compact buffer (i.e., one that starts at offset zero) containing a <U>copy</U>
-     * of the original data
-     *
-     * @param data   The original data buffer
-     * @param offset The offset of the valid data in the buffer
-     * @param len    The size (in bytes) of of the valid data in the buffer
-     * @return A {@link ByteArrayBuffer} containing a <U>copy</U> of the original data
-     * starting at zero read position
-     */
-    public static ByteArrayBuffer getCompactClone(byte[] data, int offset, int len) {
-        byte[] clone = (len > 0) ? new byte[len] : GenericUtils.EMPTY_BYTE_ARRAY;
-        if (len > 0) {
-            System.arraycopy(data, offset, clone, 0, len);
-        }
-
-        return new ByteArrayBuffer(clone, true);
-    }
-}

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/10de190e/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/keys/AbstractBufferPublicKeyParser.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/keys/AbstractBufferPublicKeyParser.java b/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/keys/AbstractBufferPublicKeyParser.java
deleted file mode 100644
index aaf9641..0000000
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/keys/AbstractBufferPublicKeyParser.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.sshd.common.util.buffer.keys;
-
-import java.security.GeneralSecurityException;
-import java.security.KeyFactory;
-import java.security.PublicKey;
-import java.security.spec.InvalidKeySpecException;
-import java.security.spec.KeySpec;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Objects;
-
-import org.apache.sshd.common.util.GenericUtils;
-import org.apache.sshd.common.util.ValidateUtils;
-import org.apache.sshd.common.util.security.SecurityUtils;
-
-/**
- * @param <PUB> Type of {@link PublicKey} being extracted
- * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
- */
-public abstract class AbstractBufferPublicKeyParser<PUB extends PublicKey> implements BufferPublicKeyParser<PUB> {
-    private final Class<PUB> keyClass;
-    private final Collection<String> supported;
-
-    protected AbstractBufferPublicKeyParser(Class<PUB> keyClass, String... supported) {
-        this(keyClass, GenericUtils.isEmpty(supported) ? Collections.emptyList() : Arrays.asList(supported));
-    }
-
-    protected AbstractBufferPublicKeyParser(Class<PUB> keyClass, Collection<String> supported) {
-        this.keyClass = Objects.requireNonNull(keyClass, "No key class");
-        this.supported = ValidateUtils.checkNotNullAndNotEmpty(supported, "No supported types for %s", keyClass.getSimpleName());
-    }
-
-    public Collection<String> getSupportedKeyTypes() {
-        return supported;
-    }
-
-    public final Class<PUB> getKeyClass() {
-        return keyClass;
-    }
-
-    @Override
-    public boolean isKeyTypeSupported(String keyType) {
-        Collection<String> keys = getSupportedKeyTypes();
-        return (GenericUtils.length(keyType) > 0)
-            && (GenericUtils.size(keys) > 0)
-            && keys.contains(keyType);
-    }
-
-    protected <S extends KeySpec> PUB generatePublicKey(String algorithm, S keySpec) throws GeneralSecurityException {
-        KeyFactory keyFactory = getKeyFactory(algorithm);
-        PublicKey key = keyFactory.generatePublic(keySpec);
-        Class<PUB> kc = getKeyClass();
-        if (!kc.isInstance(key)) {
-            throw new InvalidKeySpecException("Mismatched generated key types: expected=" + kc.getSimpleName() + ", actual=" + key);
-        }
-
-        return kc.cast(key);
-    }
-
-    protected KeyFactory getKeyFactory(String algorithm) throws GeneralSecurityException {
-        return SecurityUtils.getKeyFactory(algorithm);
-    }
-
-    @Override
-    public String toString() {
-        return getClass().getSimpleName() + " - supported=" + getSupportedKeyTypes();
-    }
-}

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/10de190e/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/keys/BufferPublicKeyParser.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/keys/BufferPublicKeyParser.java b/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/keys/BufferPublicKeyParser.java
deleted file mode 100644
index 6f7cde6..0000000
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/keys/BufferPublicKeyParser.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.sshd.common.util.buffer.keys;
-
-import java.security.GeneralSecurityException;
-import java.security.NoSuchAlgorithmException;
-import java.security.PublicKey;
-import java.util.Arrays;
-import java.util.Collection;
-
-import org.apache.sshd.common.util.GenericUtils;
-import org.apache.sshd.common.util.buffer.Buffer;
-
-/**
- * Parses a raw {@link PublicKey} from a {@link Buffer}
- *
- * @param <PUB> Type of {@link PublicKey} being extracted
- * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
- */
-public interface BufferPublicKeyParser<PUB extends PublicKey> {
-
-    BufferPublicKeyParser<PublicKey> EMPTY = new BufferPublicKeyParser<PublicKey>() {
-        @Override
-        public boolean isKeyTypeSupported(String keyType) {
-            return false;
-        }
-
-        @Override
-        public PublicKey getRawPublicKey(String keyType, Buffer buffer) throws GeneralSecurityException {
-            throw new NoSuchAlgorithmException(keyType);
-        }
-
-        @Override
-        public String toString() {
-            return "EMPTY";
-        }
-    };
-
-    BufferPublicKeyParser<PublicKey> DEFAULT = aggregate(
-            Arrays.asList(
-                    RSABufferPublicKeyParser.INSTANCE,
-                    DSSBufferPublicKeyParser.INSTANCE,
-                    ECBufferPublicKeyParser.INSTANCE,
-                    ED25519BufferPublicKeyParser.INSTANCE));
-
-    /**
-     * @param keyType The key type - e.g., &quot;ssh-rsa&quot, &quot;ssh-dss&quot;
-     * @return {@code true} if this key type is supported by the parser
-     */
-    boolean isKeyTypeSupported(String keyType);
-
-    /**
-     * @param keyType The key type - e.g., &quot;ssh-rsa&quot, &quot;ssh-dss&quot;
-     * @param buffer The {@link Buffer} containing the encoded raw public key
-     * @return The decoded {@link PublicKey}
-     * @throws GeneralSecurityException If failed to generate the key
-     */
-    PUB getRawPublicKey(String keyType, Buffer buffer) throws GeneralSecurityException;
-
-    static BufferPublicKeyParser<PublicKey> aggregate(Collection<? extends BufferPublicKeyParser<? extends PublicKey>> parsers) {
-        if (GenericUtils.isEmpty(parsers)) {
-            return EMPTY;
-        }
-
-        return new BufferPublicKeyParser<PublicKey>() {
-            @Override
-            public boolean isKeyTypeSupported(String keyType) {
-                for (BufferPublicKeyParser<? extends PublicKey> p : parsers) {
-                    if (p.isKeyTypeSupported(keyType)) {
-                        return true;
-                    }
-                }
-
-                return false;
-            }
-
-            @Override
-            public PublicKey getRawPublicKey(String keyType, Buffer buffer) throws GeneralSecurityException {
-                for (BufferPublicKeyParser<? extends PublicKey> p : parsers) {
-                    if (p.isKeyTypeSupported(keyType)) {
-                        return p.getRawPublicKey(keyType, buffer);
-                    }
-                }
-
-                throw new NoSuchAlgorithmException("No aggregate matcher for " + keyType);
-            }
-
-            @Override
-            public String toString() {
-                return String.valueOf(parsers);
-            }
-        };
-    }
-}

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/10de190e/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/keys/DSSBufferPublicKeyParser.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/keys/DSSBufferPublicKeyParser.java b/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/keys/DSSBufferPublicKeyParser.java
deleted file mode 100644
index 4eec49a..0000000
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/keys/DSSBufferPublicKeyParser.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.sshd.common.util.buffer.keys;
-
-import java.math.BigInteger;
-import java.security.GeneralSecurityException;
-import java.security.interfaces.DSAPublicKey;
-import java.security.spec.DSAPublicKeySpec;
-
-import org.apache.sshd.common.config.keys.KeyUtils;
-import org.apache.sshd.common.keyprovider.KeyPairProvider;
-import org.apache.sshd.common.util.ValidateUtils;
-import org.apache.sshd.common.util.buffer.Buffer;
-
-/**
- * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
- */
-public class DSSBufferPublicKeyParser extends AbstractBufferPublicKeyParser<DSAPublicKey> {
-    public static final DSSBufferPublicKeyParser INSTANCE = new DSSBufferPublicKeyParser();
-
-    public DSSBufferPublicKeyParser() {
-        super(DSAPublicKey.class, KeyPairProvider.SSH_DSS);
-    }
-
-    @Override
-    public DSAPublicKey getRawPublicKey(String keyType, Buffer buffer) throws GeneralSecurityException {
-        ValidateUtils.checkTrue(isKeyTypeSupported(keyType), "Unsupported key type: %s", keyType);
-        BigInteger p = buffer.getMPInt();
-        BigInteger q = buffer.getMPInt();
-        BigInteger g = buffer.getMPInt();
-        BigInteger y = buffer.getMPInt();
-
-        return generatePublicKey(KeyUtils.DSS_ALGORITHM, new DSAPublicKeySpec(y, p, q, g));
-    }
-}

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/10de190e/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/keys/ECBufferPublicKeyParser.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/keys/ECBufferPublicKeyParser.java b/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/keys/ECBufferPublicKeyParser.java
deleted file mode 100644
index df0115a..0000000
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/keys/ECBufferPublicKeyParser.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.sshd.common.util.buffer.keys;
-
-import java.security.GeneralSecurityException;
-import java.security.NoSuchAlgorithmException;
-import java.security.interfaces.ECPublicKey;
-import java.security.spec.ECParameterSpec;
-import java.security.spec.ECPoint;
-import java.security.spec.ECPublicKeySpec;
-import java.security.spec.InvalidKeySpecException;
-
-import org.apache.sshd.common.cipher.ECCurves;
-import org.apache.sshd.common.config.keys.KeyUtils;
-import org.apache.sshd.common.util.ValidateUtils;
-import org.apache.sshd.common.util.buffer.Buffer;
-
-/**
- * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
- */
-public class ECBufferPublicKeyParser extends AbstractBufferPublicKeyParser<ECPublicKey> {
-    public static final ECBufferPublicKeyParser INSTANCE = new ECBufferPublicKeyParser();
-
-    public ECBufferPublicKeyParser() {
-        super(ECPublicKey.class, ECCurves.KEY_TYPES);
-    }
-
-    @Override
-    public ECPublicKey getRawPublicKey(String keyType, Buffer buffer) throws GeneralSecurityException {
-        ValidateUtils.checkTrue(isKeyTypeSupported(keyType), "Unsupported key type: %s", keyType);
-        ECCurves curve = ECCurves.fromKeyType(keyType);
-        if (curve == null) {
-            throw new NoSuchAlgorithmException("Unsupported raw public algorithm: " + keyType);
-        }
-
-        String curveName = curve.getName();
-        ECParameterSpec params = curve.getParameters();
-        return getRawECKey(curveName, params, buffer);
-    }
-
-    protected ECPublicKey getRawECKey(String expectedCurve, ECParameterSpec spec, Buffer buffer) throws GeneralSecurityException {
-        String curveName = buffer.getString();
-        if (!expectedCurve.equals(curveName)) {
-            throw new InvalidKeySpecException("getRawECKey(" + expectedCurve + ") curve name does not match expected: " + curveName);
-        }
-
-        if (spec == null) {
-            throw new InvalidKeySpecException("getRawECKey(" + expectedCurve + ") missing curve parameters");
-        }
-
-        byte[] octets = buffer.getBytes();
-        ECPoint w;
-        try {
-            w = ECCurves.octetStringToEcPoint(octets);
-        } catch (RuntimeException e) {
-            throw new InvalidKeySpecException("getRawECKey(" + expectedCurve + ")"
-                    + " cannot (" + e.getClass().getSimpleName() + ")"
-                    + " retrieve W value: " + e.getMessage(),
-                    e);
-        }
-
-        return generatePublicKey(KeyUtils.EC_ALGORITHM, new ECPublicKeySpec(w, spec));
-    }
-}

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/10de190e/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/keys/ED25519BufferPublicKeyParser.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/keys/ED25519BufferPublicKeyParser.java b/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/keys/ED25519BufferPublicKeyParser.java
deleted file mode 100644
index 61ce6ab..0000000
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/keys/ED25519BufferPublicKeyParser.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.sshd.common.util.buffer.keys;
-
-import java.security.GeneralSecurityException;
-import java.security.PublicKey;
-
-import org.apache.sshd.common.keyprovider.KeyPairProvider;
-import org.apache.sshd.common.util.ValidateUtils;
-import org.apache.sshd.common.util.buffer.Buffer;
-import org.apache.sshd.common.util.security.SecurityUtils;
-
-/**
- * TODO complete this when SSHD-440 is done
- * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
- */
-public class ED25519BufferPublicKeyParser extends AbstractBufferPublicKeyParser<PublicKey> {
-    public static final ED25519BufferPublicKeyParser INSTANCE = new ED25519BufferPublicKeyParser();
-
-    public ED25519BufferPublicKeyParser() {
-        super(PublicKey.class, KeyPairProvider.SSH_ED25519);
-    }
-
-    @Override
-    public PublicKey getRawPublicKey(String keyType, Buffer buffer) throws GeneralSecurityException {
-        ValidateUtils.checkTrue(isKeyTypeSupported(keyType), "Unsupported key type: %s", keyType);
-        byte[] seed = buffer.getBytes();
-        return SecurityUtils.generateEDDSAPublicKey(keyType, seed);
-    }
-}

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/10de190e/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/keys/RSABufferPublicKeyParser.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/keys/RSABufferPublicKeyParser.java b/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/keys/RSABufferPublicKeyParser.java
deleted file mode 100644
index 363b07e..0000000
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/keys/RSABufferPublicKeyParser.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.sshd.common.util.buffer.keys;
-
-import java.math.BigInteger;
-import java.security.GeneralSecurityException;
-import java.security.interfaces.RSAPublicKey;
-import java.security.spec.RSAPublicKeySpec;
-
-import org.apache.sshd.common.config.keys.KeyUtils;
-import org.apache.sshd.common.keyprovider.KeyPairProvider;
-import org.apache.sshd.common.util.ValidateUtils;
-import org.apache.sshd.common.util.buffer.Buffer;
-
-/**
- * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
- */
-public class RSABufferPublicKeyParser extends AbstractBufferPublicKeyParser<RSAPublicKey> {
-    public static final RSABufferPublicKeyParser INSTANCE = new RSABufferPublicKeyParser();
-
-    public RSABufferPublicKeyParser() {
-        super(RSAPublicKey.class, KeyPairProvider.SSH_RSA);
-    }
-
-    @Override
-    public RSAPublicKey getRawPublicKey(String keyType, Buffer buffer) throws GeneralSecurityException {
-        ValidateUtils.checkTrue(isKeyTypeSupported(keyType), "Unsupported key type: %s", keyType);
-        BigInteger e = buffer.getMPInt();
-        BigInteger n = buffer.getMPInt();
-        return generatePublicKey(KeyUtils.RSA_ALGORITHM, new RSAPublicKeySpec(n, e));
-    }
-}

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/10de190e/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/AbstractCloseable.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/AbstractCloseable.java b/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/AbstractCloseable.java
deleted file mode 100644
index 6413ebb..0000000
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/AbstractCloseable.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.sshd.common.util.closeable;
-
-import java.util.concurrent.atomic.AtomicReference;
-
-import org.apache.sshd.common.future.CloseFuture;
-import org.apache.sshd.common.future.DefaultCloseFuture;
-import org.apache.sshd.common.future.SshFuture;
-import org.apache.sshd.common.future.SshFutureListener;
-
-/**
- * Provides some default implementations
- *
- * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
- */
-public abstract class AbstractCloseable extends IoBaseCloseable {
-
-    public enum State {
-        Opened, Graceful, Immediate, Closed
-    }
-
-    /**
-     * Lock object for this session state
-     */
-    protected final Object lock = new Object();
-
-    /**
-     * State of this object
-     */
-    protected final AtomicReference<AbstractCloseable.State> state = new AtomicReference<>(State.Opened);
-
-    /**
-     * A future that will be set 'closed' when the object is actually closed
-     */
-    protected final CloseFuture closeFuture;
-
-    protected AbstractCloseable() {
-        this("");
-    }
-
-    protected AbstractCloseable(String discriminator) {
-        super(discriminator);
-        closeFuture = new DefaultCloseFuture(discriminator, lock);
-    }
-
-    @Override
-    public void addCloseFutureListener(SshFutureListener<CloseFuture> listener) {
-        closeFuture.addListener(listener);
-    }
-
-    @Override
-    public void removeCloseFutureListener(SshFutureListener<CloseFuture> listener) {
-        closeFuture.removeListener(listener);
-    }
-
-    @Override
-    public final CloseFuture close(boolean immediately) {
-        boolean debugEnabled = log.isDebugEnabled();
-        if (immediately) {
-            if (state.compareAndSet(State.Opened, State.Immediate)
-                    || state.compareAndSet(State.Graceful, State.Immediate)) {
-                if (debugEnabled) {
-                    log.debug("close({}) Closing immediately", this);
-                }
-                preClose();
-                doCloseImmediately();
-                if (debugEnabled) {
-                    log.debug("close({})[Immediately] closed", this);
-                }
-            } else {
-                if (debugEnabled) {
-                    log.debug("close({})[Immediately] state already {}", this, state.get());
-                }
-            }
-        } else {
-            if (state.compareAndSet(State.Opened, State.Graceful)) {
-                if (debugEnabled) {
-                    log.debug("close({}) Closing gracefully", this);
-                }
-                preClose();
-                SshFuture<CloseFuture> grace = doCloseGracefully();
-                if (grace != null) {
-                    grace.addListener(future -> {
-                        if (state.compareAndSet(State.Graceful, State.Immediate)) {
-                            doCloseImmediately();
-                            if (debugEnabled) {
-                                log.debug("close({}][Graceful] - operationComplete() closed", AbstractCloseable.this);
-                            }
-                        }
-                    });
-                } else {
-                    if (state.compareAndSet(State.Graceful, State.Immediate)) {
-                        doCloseImmediately();
-                        if (debugEnabled) {
-                            log.debug("close({})[Graceful] closed", this);
-                        }
-                    }
-                }
-            } else {
-                if (debugEnabled) {
-                    log.debug("close({})[Graceful] state already {}", this, state.get());
-                }
-            }
-        }
-        return closeFuture;
-    }
-
-    @Override
-    public final boolean isClosed() {
-        return state.get() == State.Closed;
-    }
-
-    @Override
-    public final boolean isClosing() {
-        return state.get() != State.Opened;
-    }
-
-    /**
-     * preClose is guaranteed to be called before doCloseGracefully or doCloseImmediately.
-     * When preClose() is called, isClosing() == true
-     */
-    protected void preClose() {
-        // nothing
-    }
-
-    protected CloseFuture doCloseGracefully() {
-        return null;
-    }
-
-    /**
-     * <P>doCloseImmediately is called once and only once
-     * with state == Immediate</P>
-     *
-     * <P>Overriding methods should always call the base implementation.
-     * It may be called concurrently while preClose() or doCloseGracefully is executing</P>
-     */
-    protected void doCloseImmediately() {
-        closeFuture.setClosed();
-        state.set(State.Closed);
-    }
-
-    protected Builder builder() {
-        return new Builder(lock);
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/10de190e/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/AbstractInnerCloseable.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/AbstractInnerCloseable.java b/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/AbstractInnerCloseable.java
deleted file mode 100644
index 6518d23..0000000
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/AbstractInnerCloseable.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.sshd.common.util.closeable;
-
-import org.apache.sshd.common.Closeable;
-import org.apache.sshd.common.future.CloseFuture;
-
-/**
- * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
- */
-public abstract class AbstractInnerCloseable extends AbstractCloseable {
-    protected AbstractInnerCloseable() {
-        this("");
-    }
-
-    protected AbstractInnerCloseable(String discriminator) {
-        super(discriminator);
-    }
-
-    protected abstract Closeable getInnerCloseable();
-
-    @Override
-    protected final CloseFuture doCloseGracefully() {
-        return getInnerCloseable().close(false);
-    }
-
-    @Override
-    @SuppressWarnings("synthetic-access")
-    protected final void doCloseImmediately() {
-        getInnerCloseable().close(true).addListener(future -> AbstractInnerCloseable.super.doCloseImmediately());
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/10de190e/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/Builder.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/Builder.java b/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/Builder.java
deleted file mode 100644
index 847d49c..0000000
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/Builder.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.sshd.common.util.closeable;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-
-import org.apache.sshd.common.Closeable;
-import org.apache.sshd.common.future.SshFuture;
-import org.apache.sshd.common.util.ObjectBuilder;
-
-/**
- * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
- */
-public final class Builder implements ObjectBuilder<Closeable> {
-    private final Object lock;
-    private final List<Closeable> closeables = new ArrayList<>();
-
-    public Builder(Object lock) {
-        this.lock = Objects.requireNonNull(lock, "No lock");
-    }
-
-    public Builder run(Object id, Runnable r) {
-        return close(new SimpleCloseable(id, lock) {
-            @Override
-            protected void doClose(boolean immediately) {
-                try {
-                    r.run();
-                } finally {
-                    super.doClose(immediately);
-                }
-            }
-        });
-    }
-
-    @SuppressWarnings("rawtypes")
-    public <T extends SshFuture> Builder when(SshFuture<T> future) {
-        if (future != null) {
-            when(future.getId(), Collections.singleton(future));
-        }
-        return this;
-    }
-
-    @SuppressWarnings("rawtypes")
-    @SafeVarargs
-    public final <T extends SshFuture> Builder when(SshFuture<T>... futures) {
-        return when(getClass().getSimpleName(), Arrays.asList(futures));
-    }
-
-    @SuppressWarnings("rawtypes")
-    public <T extends SshFuture> Builder when(Object id, Iterable<? extends SshFuture<T>> futures) {
-        return close(new FuturesCloseable<>(id, lock, futures));
-    }
-
-    public Builder sequential(Closeable... closeables) {
-        for (Closeable closeable : closeables) {
-            close(closeable);
-        }
-        return this;
-    }
-
-    public Builder sequential(Object id, Iterable<Closeable> closeables) {
-        return close(new SequentialCloseable(id, lock, closeables));
-    }
-
-    public Builder parallel(Closeable... closeables) {
-        if (closeables.length == 1) {
-            close(closeables[0]);
-        } else if (closeables.length > 0) {
-            parallel(getClass().getSimpleName(), Arrays.asList(closeables));
-        }
-        return this;
-    }
-
-    public Builder parallel(Object id, Iterable<? extends Closeable> closeables) {
-        return close(new ParallelCloseable(id, lock, closeables));
-    }
-
-    public Builder close(Closeable c) {
-        if (c != null) {
-            closeables.add(c);
-        }
-        return this;
-    }
-
-    @Override
-    public Closeable build() {
-        if (closeables.isEmpty()) {
-            return new SimpleCloseable(getClass().getSimpleName(), lock);
-        } else if (closeables.size() == 1) {
-            return closeables.get(0);
-        } else {
-            return new SequentialCloseable(getClass().getSimpleName(), lock, closeables);
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/10de190e/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/FuturesCloseable.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/FuturesCloseable.java b/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/FuturesCloseable.java
deleted file mode 100644
index af765b7..0000000
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/FuturesCloseable.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.sshd.common.util.closeable;
-
-import java.util.Collections;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.sshd.common.SshException;
-import org.apache.sshd.common.future.DefaultSshFuture;
-import org.apache.sshd.common.future.SshFuture;
-import org.apache.sshd.common.future.SshFutureListener;
-
-/**
- * @param <T> Type of future
- * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
- */
-public class FuturesCloseable<T extends SshFuture> extends SimpleCloseable {
-
-    private final Iterable<? extends SshFuture<T>> futures;
-
-    public FuturesCloseable(Object id, Object lock, Iterable<? extends SshFuture<T>> futures) {
-        super(id, lock);
-        this.futures = (futures == null) ? Collections.emptyList() : futures;
-    }
-
-    @Override
-    protected void doClose(boolean immediately) {
-        if (immediately) {
-            for (SshFuture<?> f : futures) {
-                if (f instanceof DefaultSshFuture) {
-                    ((DefaultSshFuture<?>) f).setValue(new SshException("Closed"));
-                }
-            }
-            future.setClosed();
-        } else {
-            AtomicInteger count = new AtomicInteger(1);
-            boolean traceEnabled = log.isTraceEnabled();
-            SshFutureListener<T> listener = f -> {
-                int pendingCount = count.decrementAndGet();
-                if (traceEnabled) {
-                    log.trace("doClose(" + immediately + ") complete pending: " + pendingCount);
-                }
-                if (pendingCount == 0) {
-                    future.setClosed();
-                }
-            };
-
-            for (SshFuture<T> f : futures) {
-                if (f != null) {
-                    int pendingCount = count.incrementAndGet();
-                    if (traceEnabled) {
-                        log.trace("doClose(" + immediately + ") future pending: " + pendingCount);
-                    }
-                    f.addListener(listener);
-                }
-            }
-            listener.operationComplete(null);
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/10de190e/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/IoBaseCloseable.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/IoBaseCloseable.java b/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/IoBaseCloseable.java
deleted file mode 100644
index f4c6d1a..0000000
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/IoBaseCloseable.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.sshd.common.util.closeable;
-
-import org.apache.sshd.common.Closeable;
-import org.apache.sshd.common.util.logging.AbstractLoggingBean;
-
-/**
- * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
- */
-public abstract class IoBaseCloseable extends AbstractLoggingBean implements Closeable {
-    protected IoBaseCloseable() {
-        this("");
-    }
-
-    protected IoBaseCloseable(String discriminator) {
-        super(discriminator);
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/10de190e/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/ParallelCloseable.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/ParallelCloseable.java b/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/ParallelCloseable.java
deleted file mode 100644
index 0900cd7..0000000
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/ParallelCloseable.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.sshd.common.util.closeable;
-
-import java.util.Collections;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.sshd.common.Closeable;
-import org.apache.sshd.common.future.CloseFuture;
-import org.apache.sshd.common.future.SshFutureListener;
-
-/**
- * Waits for a group of {@link Closeable}s to complete in any order, then
- * signals the completion by setting the &quot;parent&quot; future as closed
- *
- * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
- */
-public class ParallelCloseable extends SimpleCloseable {
-    private final Iterable<? extends Closeable> closeables;
-
-    public ParallelCloseable(Object id, Object lock, Iterable<? extends Closeable> closeables) {
-        super(id, lock);
-        this.closeables = (closeables == null) ? Collections.emptyList() : closeables;
-    }
-
-    @Override
-    protected void doClose(boolean immediately) {
-        AtomicInteger count = new AtomicInteger(1);
-        boolean traceEnabled = log.isTraceEnabled();
-        SshFutureListener<CloseFuture> listener = f -> {
-            int pendingCount = count.decrementAndGet();
-            if (traceEnabled) {
-                log.trace("doClose(" + immediately + ") completed pending: " + pendingCount);
-            }
-            if (pendingCount == 0) {
-                future.setClosed();
-            }
-        };
-
-        for (Closeable c : closeables) {
-            if (c == null) {
-                continue;
-            }
-
-            int pendingCount = count.incrementAndGet();
-            if (traceEnabled) {
-                log.trace("doClose(" + immediately + ") pending closeables: " + pendingCount);
-            }
-            c.close(immediately).addListener(listener);
-        }
-        /*
-         * Trigger the last "decrementAndGet" so that the future is marked as closed
-         * when last "operationComplete" is invoked (which could be this call...)
-         */
-        listener.operationComplete(null);
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/10de190e/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/SequentialCloseable.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/SequentialCloseable.java b/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/SequentialCloseable.java
deleted file mode 100644
index 6af51b8..0000000
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/SequentialCloseable.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.sshd.common.util.closeable;
-
-import java.util.Collections;
-import java.util.Iterator;
-
-import org.apache.sshd.common.Closeable;
-import org.apache.sshd.common.future.CloseFuture;
-import org.apache.sshd.common.future.SshFutureListener;
-
-/**
- * Waits for a group of {@link Closeable}s to complete in the given order, then
- * signals the completion by setting the &quot;parent&quot; future as closed
- *
- * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
- */
-public class SequentialCloseable extends SimpleCloseable {
-    private final Iterable<? extends Closeable> closeables;
-
-    public SequentialCloseable(Object id, Object lock, Iterable<? extends Closeable> closeables) {
-        super(id, lock);
-        this.closeables = (closeables == null) ? Collections.emptyList() : closeables;
-    }
-
-    @Override
-    protected void doClose(boolean immediately) {
-        Iterator<? extends Closeable> iterator = closeables.iterator();
-        SshFutureListener<CloseFuture> listener = new SshFutureListener<CloseFuture>() {
-            @SuppressWarnings("synthetic-access")
-            @Override
-            public void operationComplete(CloseFuture previousFuture) {
-                boolean traceEnabled = log.isTraceEnabled();
-                while (iterator.hasNext()) {
-                    Closeable c = iterator.next();
-                    if (c != null) {
-                        if (traceEnabled) {
-                            log.trace("doClose(" + immediately + ") closing " + c);
-                        }
-                        CloseFuture nextFuture = c.close(immediately);
-                        nextFuture.addListener(this);
-                        return;
-                    }
-                }
-                if (!iterator.hasNext()) {
-                    if (log.isDebugEnabled()) {
-                        log.debug("doClose(" + immediately + ") signal close complete");
-                    }
-                    future.setClosed();
-                }
-            }
-        };
-        listener.operationComplete(null);
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/10de190e/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/SimpleCloseable.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/SimpleCloseable.java b/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/SimpleCloseable.java
deleted file mode 100644
index e360f13..0000000
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/closeable/SimpleCloseable.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.sshd.common.util.closeable;
-
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.apache.sshd.common.future.CloseFuture;
-import org.apache.sshd.common.future.DefaultCloseFuture;
-import org.apache.sshd.common.future.SshFutureListener;
-
-/**
- * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
- */
-public class SimpleCloseable extends IoBaseCloseable {
-
-    protected final DefaultCloseFuture future;
-    protected final AtomicBoolean closing;
-
-    public SimpleCloseable(Object id, Object lock) {
-        future = new DefaultCloseFuture(id, lock);
-        closing = new AtomicBoolean(false);
-    }
-
-    @Override
-    public boolean isClosed() {
-        return future.isClosed();
-    }
-
-    @Override
-    public boolean isClosing() {
-        return closing.get();
-    }
-
-    @Override
-    public void addCloseFutureListener(SshFutureListener<CloseFuture> listener) {
-        future.addListener(listener);
-    }
-
-    @Override
-    public void removeCloseFutureListener(SshFutureListener<CloseFuture> listener) {
-        future.removeListener(listener);
-    }
-
-    @Override
-    public CloseFuture close(boolean immediately) {
-        if (closing.compareAndSet(false, true)) {
-            doClose(immediately);
-        }
-        return future;
-    }
-
-    protected void doClose(boolean immediately) {
-        future.setClosed();
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/10de190e/sshd-core/src/main/java/org/apache/sshd/common/util/io/CloseableEmptyInputStream.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/io/CloseableEmptyInputStream.java b/sshd-core/src/main/java/org/apache/sshd/common/util/io/CloseableEmptyInputStream.java
deleted file mode 100644
index c9eca70..0000000
--- a/sshd-core/src/main/java/org/apache/sshd/common/util/io/CloseableEmptyInputStream.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.sshd.common.util.io;
-
-import java.io.IOException;
-import java.nio.channels.Channel;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-/**
- * A {@code /dev/null} stream that can be closed - in which case it will throw
- * {@link IOException}s if invoked after being closed
- *
- * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
- */
-public class CloseableEmptyInputStream extends EmptyInputStream implements Channel {
-    private final AtomicBoolean open = new AtomicBoolean(true);
-
-    public CloseableEmptyInputStream() {
-        super();
-    }
-
-    @Override
-    public boolean isOpen() {
-        return open.get();
-    }
-
-    @Override
-    public int available() throws IOException {
-        if (isOpen()) {
-            return super.available();
-        } else {
-            throw new IOException("available() stream is closed");
-        }
-    }
-
-    @Override
-    public int read() throws IOException {
-        if (isOpen()) {
-            return super.read();
-        } else {
-            throw new IOException("read() stream is closed");
-        }
-    }
-
-    @Override
-    public int read(byte[] b, int off, int len) throws IOException {
-        if (isOpen()) {
-            return super.read(b, off, len);
-        } else {
-            throw new IOException("read([])[" + off + "," + len + "] stream is closed");
-        }
-    }
-
-    @Override
-    public long skip(long n) throws IOException {
-        if (isOpen()) {
-            return super.skip(n);
-        } else {
-            throw new IOException("skip(" + n + ") stream is closed");
-        }
-    }
-
-    @Override
-    public synchronized void reset() throws IOException {
-        if (isOpen()) {
-            super.reset();
-        } else {
-            throw new IOException("reset() stream is closed");
-        }
-    }
-
-    @Override
-    public void close() throws IOException {
-        if (open.getAndSet(false)) {
-            //noinspection UnnecessaryReturnStatement
-            return; // debug breakpoint
-        }
-    }
-}