http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/io/IoWriteFuture.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/IoWriteFuture.java b/sshd-core/src/main/java/org/apache/sshd/common/io/IoWriteFuture.java index 3483dff..a702621 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/io/IoWriteFuture.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/io/IoWriteFuture.java @@ -26,10 +26,13 @@ import org.apache.sshd.common.future.SshFuture; public interface IoWriteFuture extends SshFuture<IoWriteFuture> { /** * Wait and verify that the write succeeded. + * * @throws IOException if the write failed for any reason */ void verify() throws IOException; + void verify(long count, TimeUnit unit) throws IOException; + void verify(long timeout) throws IOException; /**
http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaAcceptor.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaAcceptor.java b/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaAcceptor.java index d26d7ec..955b73f 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaAcceptor.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaAcceptor.java @@ -36,8 +36,8 @@ import org.apache.sshd.common.FactoryManagerUtils; /** */ public class MinaAcceptor extends MinaService implements org.apache.sshd.common.io.IoAcceptor, IoHandler { - public static final int DEFAULT_BACKLOG=0; - public static final boolean DEFAULT_REUSE_ADDRESS=true; + public static final int DEFAULT_BACKLOG = 0; + public static final boolean DEFAULT_REUSE_ADDRESS = true; protected final AtomicReference<IoAcceptor> acceptorHolder = new AtomicReference<>(null); @@ -63,8 +63,9 @@ public class MinaAcceptor extends MinaService implements org.apache.sshd.common. protected IoAcceptor getAcceptor() { IoAcceptor acceptor; - synchronized(acceptorHolder) { - if ((acceptor = acceptorHolder.get()) != null) { + synchronized (acceptorHolder) { + acceptor = acceptorHolder.get(); + if (acceptor != null) { return acceptor; } @@ -72,7 +73,7 @@ public class MinaAcceptor extends MinaService implements org.apache.sshd.common. acceptor.setHandler(this); acceptorHolder.set(acceptor); } - + log.debug("Created IoAcceptor"); return acceptor; } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaConnector.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaConnector.java b/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaConnector.java index 24801b4..95179c3 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaConnector.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaConnector.java @@ -50,8 +50,9 @@ public class MinaConnector extends MinaService implements org.apache.sshd.common protected IoConnector getConnector() { IoConnector connector; - synchronized(connectorHolder) { - if ((connector = connectorHolder.get()) != null) { + synchronized (connectorHolder) { + connector = connectorHolder.get(); + if (connector != null) { return connector; } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaService.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaService.java b/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaService.java index 360c501..952e087 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaService.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaService.java @@ -125,19 +125,24 @@ public abstract class MinaService extends CloseableUtils.AbstractCloseable imple protected void configure(SocketSessionConfig config) { Integer intVal; Boolean boolVal; - if ((boolVal = getBoolean(FactoryManager.SOCKET_KEEPALIVE)) != null) { + boolVal = getBoolean(FactoryManager.SOCKET_KEEPALIVE); + if (boolVal != null) { config.setKeepAlive(boolVal); } - if ((intVal = getInteger(FactoryManager.SOCKET_SNDBUF)) != null) { + intVal = getInteger(FactoryManager.SOCKET_SNDBUF); + if (intVal != null) { config.setSendBufferSize(intVal); } - if ((intVal = getInteger(FactoryManager.SOCKET_RCVBUF)) != null) { + intVal = getInteger(FactoryManager.SOCKET_RCVBUF); + if (intVal != null) { config.setReceiveBufferSize(intVal); } - if ((intVal = getInteger(FactoryManager.SOCKET_LINGER)) != null) { + intVal = getInteger(FactoryManager.SOCKET_LINGER); + if (intVal != null) { config.setSoLinger(intVal); } - if ((boolVal = getBoolean(FactoryManager.SOCKET_LINGER)) != null) { + boolVal = getBoolean(FactoryManager.SOCKET_LINGER); + if (boolVal != null) { config.setTcpNoDelay(boolVal); } if (sessionConfig != null) { http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaServiceFactory.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaServiceFactory.java b/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaServiceFactory.java index 902e902..5a77278 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaServiceFactory.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaServiceFactory.java @@ -39,8 +39,8 @@ public class MinaServiceFactory extends AbstractIoServiceFactory { public MinaServiceFactory(FactoryManager factoryManager, ExecutorService service, boolean shutdownOnExit) { super(factoryManager, - service == null ? ThreadUtils.newCachedThreadPool(factoryManager.toString() + "-mina") : service, - service == null || shutdownOnExit); + service == null ? ThreadUtils.newCachedThreadPool(factoryManager.toString() + "-mina") : service, + service == null || shutdownOnExit); ioProcessor = new SimpleIoProcessorPool<>(NioProcessor.class, getExecutorService(), getNioWorkers(factoryManager), null); } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaServiceFactoryFactory.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaServiceFactoryFactory.java b/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaServiceFactoryFactory.java index e6e913e..bfd9518 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaServiceFactoryFactory.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaServiceFactoryFactory.java @@ -32,13 +32,13 @@ public class MinaServiceFactoryFactory extends AbstractIoServiceFactoryFactory { } /** - * @param executors The {@link ExecutorService} to use for spawning threads. - * If {@code null} then an internal service is allocated - in which case it - * is automatically shutdown regardless of the value of the <tt>shutdownOnExit</tt> - * parameter value + * @param executors The {@link ExecutorService} to use for spawning threads. + * If {@code null} then an internal service is allocated - in which case it + * is automatically shutdown regardless of the value of the <tt>shutdownOnExit</tt> + * parameter value * @param shutdownOnExit If {@code true} then the {@link ExecutorService#shutdownNow()} - * will be called (unless it is an internally allocated service which is always - * closed) + * will be called (unless it is an internally allocated service which is always + * closed) */ public MinaServiceFactoryFactory(ExecutorService executors, boolean shutdownOnExit) { super(executors, shutdownOnExit); http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaSession.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaSession.java b/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaSession.java index 476b425..f04372d 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaSession.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaSession.java @@ -31,7 +31,6 @@ import org.apache.sshd.common.io.IoService; import org.apache.sshd.common.io.IoSession; import org.apache.sshd.common.io.IoWriteFuture; import org.apache.sshd.common.util.CloseableUtils; -import org.apache.sshd.common.util.GenericUtils; import org.apache.sshd.common.util.ValidateUtils; import org.apache.sshd.common.util.buffer.Buffer; @@ -94,11 +93,13 @@ public class MinaSession extends CloseableUtils.AbstractInnerCloseable implement public boolean isClosing() { return session.isClosing(); } + @SuppressWarnings("synthetic-access") @Override public boolean isClosed() { return !session.isConnected(); } + @SuppressWarnings("synthetic-access") @Override public org.apache.sshd.common.future.CloseFuture close(boolean immediately) { http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaSupport.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaSupport.java b/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaSupport.java index 86ace1b..462bebb 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaSupport.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/io/mina/MinaSupport.java @@ -22,7 +22,11 @@ import org.apache.mina.core.buffer.IoBuffer; import org.apache.sshd.common.util.Readable; import org.apache.sshd.common.util.buffer.Buffer; -public class MinaSupport { +public final class MinaSupport { + + private MinaSupport() { + throw new UnsupportedOperationException("No instance allowed"); + } public static Readable asReadable(final IoBuffer buffer) { return new Readable() { http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Acceptor.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Acceptor.java b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Acceptor.java index 5f8e071..71777c7 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Acceptor.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Acceptor.java @@ -40,7 +40,7 @@ import org.apache.sshd.common.io.IoHandler; /** */ public class Nio2Acceptor extends Nio2Service implements IoAcceptor { - public static final int DEFAULT_BACKLOG=0; + public static final int DEFAULT_BACKLOG = 0; private final Map<SocketAddress, AsynchronousServerSocketChannel> channels; private int backlog = DEFAULT_BACKLOG; @@ -127,9 +127,11 @@ public class Nio2Acceptor extends Nio2Service implements IoAcceptor { class AcceptCompletionHandler extends Nio2CompletionHandler<AsynchronousSocketChannel, SocketAddress> { private final AsynchronousServerSocketChannel socket; + AcceptCompletionHandler(AsynchronousServerSocketChannel socket) { this.socket = socket; } + @SuppressWarnings("synthetic-access") @Override protected void onCompleted(AsynchronousSocketChannel result, SocketAddress address) { @@ -138,7 +140,7 @@ public class Nio2Acceptor extends Nio2Service implements IoAcceptor { return; } - Nio2Session session=null; + Nio2Session session = null; try { // Create a session session = new Nio2Session(Nio2Acceptor.this, manager, handler, result); @@ -152,15 +154,15 @@ public class Nio2Acceptor extends Nio2Service implements IoAcceptor { if (session != null) { try { session.close(); - } catch(Throwable t) { + } catch (Throwable t) { log.warn("Failed (" + t.getClass().getSimpleName() + ")" - + " to close accepted connection from " + address - + ": " + t.getMessage(), - t); + + " to close accepted connection from " + address + + ": " + t.getMessage(), + t); } } } - + try { // Accept new connections socket.accept(address, this); @@ -174,9 +176,9 @@ public class Nio2Acceptor extends Nio2Service implements IoAcceptor { protected void onFailed(final Throwable exc, final SocketAddress address) { if (channels.containsKey(address) && !disposing.get()) { log.warn("Caught " + exc.getClass().getSimpleName() - + " while accepting incoming connection from " + address - + ": " + exc.getMessage(), - exc); + + " while accepting incoming connection from " + address + + ": " + exc.getMessage(), + exc); } } } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2CompletionHandler.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2CompletionHandler.java b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2CompletionHandler.java index 80b75da..ece7c24 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2CompletionHandler.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2CompletionHandler.java @@ -24,7 +24,7 @@ import java.security.PrivilegedAction; /** */ -public abstract class Nio2CompletionHandler<V,A> implements CompletionHandler<V,A> { +public abstract class Nio2CompletionHandler<V, A> implements CompletionHandler<V, A> { @Override public void completed(final V result, final A attachment) { http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Connector.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Connector.java b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Connector.java index b809689..bf8b297 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Connector.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Connector.java @@ -69,6 +69,7 @@ public class Nio2Connector extends Nio2Service implements IoConnector { future.setException(e); } } + @Override protected void onFailed(final Throwable exc, final Object attachment) { future.setException(exc); @@ -84,24 +85,29 @@ public class Nio2Connector extends Nio2Service implements IoConnector { DefaultIoConnectFuture(Object lock) { super(lock); } + @Override public IoSession getSession() { Object v = getValue(); return v instanceof IoSession ? (IoSession) v : null; } + @Override public Throwable getException() { Object v = getValue(); return v instanceof Throwable ? (Throwable) v : null; } + @Override public boolean isConnected() { return getValue() instanceof IoSession; } + @Override public void setSession(IoSession session) { setValue(session); } + @Override public void setException(Throwable exception) { setValue(exception); http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2DefaultIoWriteFuture.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2DefaultIoWriteFuture.java b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2DefaultIoWriteFuture.java index 0a384ea..790f7ca 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2DefaultIoWriteFuture.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2DefaultIoWriteFuture.java @@ -21,7 +21,6 @@ package org.apache.sshd.common.io.nio2; import java.nio.ByteBuffer; import org.apache.sshd.common.io.AbstractIoWriteFuture; -import org.apache.sshd.common.util.GenericUtils; import org.apache.sshd.common.util.ValidateUtils; /** http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2ServiceFactory.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2ServiceFactory.java b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2ServiceFactory.java index 6bdd1ba..7f0760d 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2ServiceFactory.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2ServiceFactory.java @@ -39,11 +39,11 @@ public class Nio2ServiceFactory extends AbstractIoServiceFactory { public Nio2ServiceFactory(FactoryManager factoryManager, ExecutorService service, boolean shutdownOnExit) { super(factoryManager, - service == null ? ThreadUtils.newFixedThreadPool(factoryManager.toString() + "-nio2", getNioWorkers(factoryManager)) : service, - service == null || shutdownOnExit); + service == null ? ThreadUtils.newFixedThreadPool(factoryManager.toString() + "-nio2", getNioWorkers(factoryManager)) : service, + service == null || shutdownOnExit); try { group = AsynchronousChannelGroup.withThreadPool(ThreadUtils.protectExecutorServiceShutdown(getExecutorService(), isShutdownOnExit())); - } catch(IOException e) { + } catch (IOException e) { log.warn("Failed (" + e.getClass().getSimpleName() + " to start async. channel group: " + e.getMessage(), e); throw new RuntimeSshException(e); } @@ -65,7 +65,7 @@ public class Nio2ServiceFactory extends AbstractIoServiceFactory { if (!group.isShutdown()) { log.debug("Shutdown group"); group.shutdownNow(); - + // if we protect the executor then the await will fail since we didn't really shut it down... if (isShutdownOnExit()) { if (group.awaitTermination(5, TimeUnit.SECONDS)) { http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2ServiceFactoryFactory.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2ServiceFactoryFactory.java b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2ServiceFactoryFactory.java index 6068b2e..63fac8d 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2ServiceFactoryFactory.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2ServiceFactoryFactory.java @@ -24,7 +24,6 @@ import java.util.concurrent.ExecutorService; import org.apache.sshd.common.FactoryManager; import org.apache.sshd.common.io.AbstractIoServiceFactoryFactory; import org.apache.sshd.common.io.IoServiceFactory; -import org.apache.sshd.common.util.GenericUtils; import org.apache.sshd.common.util.ValidateUtils; /** @@ -36,13 +35,13 @@ public class Nio2ServiceFactoryFactory extends AbstractIoServiceFactoryFactory { } /** - * @param executors The {@link ExecutorService} to use for spawning threads. - * If {@code null} then an internal service is allocated - in which case it - * is automatically shutdown regardless of the value of the <tt>shutdownOnExit</tt> - * parameter value + * @param executors The {@link ExecutorService} to use for spawning threads. + * If {@code null} then an internal service is allocated - in which case it + * is automatically shutdown regardless of the value of the <tt>shutdownOnExit</tt> + * parameter value * @param shutdownOnExit If {@code true} then the {@link ExecutorService#shutdownNow()} - * will be called (unless it is an internally allocated service which is always - * closed) + * will be called (unless it is an internally allocated service which is always + * closed) */ public Nio2ServiceFactoryFactory(ExecutorService executors, boolean shutdownOnExit) { super(executors, shutdownOnExit); http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Session.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Session.java b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Session.java index b53411f..33782ac 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Session.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/io/nio2/Nio2Session.java @@ -47,9 +47,9 @@ public class Nio2Session extends CloseableUtils.AbstractCloseable implements IoS public static final int DEFAULT_READBUF_SIZE = 32 * 1024; - private static final AtomicLong sessionIdGenerator = new AtomicLong(100L); + private static final AtomicLong SESSION_ID_GENERATOR = new AtomicLong(100L); - private final long id = sessionIdGenerator.incrementAndGet(); + private final long id = SESSION_ID_GENERATOR.incrementAndGet(); private final Nio2Service service; private final IoHandler handler; private final AsynchronousSocketChannel socket; @@ -189,22 +189,23 @@ public class Nio2Session extends CloseableUtils.AbstractCloseable implements IoS public void startReading(byte[] buf) { startReading(buf, 0, buf.length); } - + public void startReading(byte[] buf, int offset, int len) { startReading(ByteBuffer.wrap(buf, offset, len)); } public void startReading(final ByteBuffer buffer) { doReadCycle(buffer, new Readable() { - @Override - public int available() { - return buffer.remaining(); - } - @Override - public void getRawBytes(byte[] data, int offset, int len) { - buffer.get(data, offset, len); - } - }); + @Override + public int available() { + return buffer.remaining(); + } + + @Override + public void getRawBytes(byte[] data, int offset, int len) { + buffer.get(data, offset, len); + } + }); } protected void doReadCycle(final ByteBuffer buffer, final Readable bufReader) { http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/kex/AbstractDH.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/kex/AbstractDH.java b/sshd-core/src/main/java/org/apache/sshd/common/kex/AbstractDH.java index d2a3092..37b2f7b 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/kex/AbstractDH.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/kex/AbstractDH.java @@ -28,8 +28,8 @@ import org.apache.sshd.common.util.GenericUtils; */ public abstract class AbstractDH { - protected BigInteger K; // shared secret key - private byte[] K_array; + protected BigInteger k; // shared secret key + private byte[] k_array; protected AbstractDH() { super(); @@ -42,11 +42,11 @@ public abstract class AbstractDH { protected abstract byte[] calculateK() throws Exception; public byte[] getK() throws Exception { - if (K == null) { - K_array = calculateK(); - K = new BigInteger(K_array); + if (k == null) { + k_array = calculateK(); + k = new BigInteger(k_array); } - return K_array; + return k_array; } public abstract Digest getHash() throws Exception; @@ -56,10 +56,11 @@ public abstract class AbstractDH { * is a byte array, which can (by chance, roughly 1 out of 256 times) begin * with zero byte (some JCE providers might strip this, though). In SSH, * the shared secret is an integer, so we need to strip the leading zero(es). + * * @param x The original array - * @return An (possibly) sub-array guaranteed to start with a non-zero byte - * @see <A HREF="https://issues.apache.org/jira/browse/SSHD-330">SSHD-330</A> + * @return An (possibly) sub-array guaranteed to start with a non-zero byte * @throws IllegalArgumentException If all zeroes array + * @see <A HREF="https://issues.apache.org/jira/browse/SSHD-330">SSHD-330</A> */ public static byte[] stripLeadingZeroes(byte[] x) { int length = GenericUtils.length(x); @@ -76,7 +77,7 @@ public abstract class AbstractDH { System.arraycopy(x, i, ret, 0, ret.length); return ret; } - + // all zeroes throw new IllegalArgumentException("No non-zero values in generated secret"); } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/kex/BuiltinDHFactories.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/kex/BuiltinDHFactories.java b/sshd-core/src/main/java/org/apache/sshd/common/kex/BuiltinDHFactories.java index 4f9c5c7..1981c45 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/kex/BuiltinDHFactories.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/kex/BuiltinDHFactories.java @@ -31,7 +31,6 @@ import java.util.Set; import java.util.SortedSet; import java.util.TreeMap; -import org.apache.sshd.common.NamedFactory; import org.apache.sshd.common.NamedResource; import org.apache.sshd.common.cipher.ECCurves; import org.apache.sshd.common.config.NamedResourceListParseResult; @@ -71,8 +70,8 @@ public enum BuiltinDHFactories implements DHFactory { @Override public DHG create(Object... params) throws Exception { if ((GenericUtils.length(params) != 2) - || (!(params[0] instanceof BigInteger)) - || (!(params[1] instanceof BigInteger))) { + || (!(params[0] instanceof BigInteger)) + || (!(params[1] instanceof BigInteger))) { throw new IllegalArgumentException("Bad parameters for " + getName()); } return new DHG(BuiltinDigests.sha1, (BigInteger) params[0], (BigInteger) params[1]); @@ -87,8 +86,8 @@ public enum BuiltinDHFactories implements DHFactory { @Override public AbstractDH create(Object... params) throws Exception { if ((GenericUtils.length(params) != 2) - || (!(params[0] instanceof BigInteger)) - || (!(params[1] instanceof BigInteger))) { + || (!(params[0] instanceof BigInteger)) + || (!(params[1] instanceof BigInteger))) { throw new IllegalArgumentException("Bad parameters for " + getName()); } return new DHG(BuiltinDigests.sha256, (BigInteger) params[0], (BigInteger) params[1]); @@ -147,8 +146,18 @@ public enum BuiltinDHFactories implements DHFactory { } }; + public static final Set<BuiltinDHFactories> VALUES = + Collections.unmodifiableSet(EnumSet.allOf(BuiltinDHFactories.class)); + + private static final Map<String, DHFactory> EXTENSIONS = + new TreeMap<String, DHFactory>(String.CASE_INSENSITIVE_ORDER); + private final String factoryName; + BuiltinDHFactories(String name) { + factoryName = name; + } + @Override public final String getName() { return factoryName; @@ -164,30 +173,22 @@ public enum BuiltinDHFactories implements DHFactory { return getName(); } - BuiltinDHFactories(String name) { - factoryName = name; - } - - public static final Set<BuiltinDHFactories> VALUES = - Collections.unmodifiableSet(EnumSet.allOf(BuiltinDHFactories.class)); - private static final Map<String,DHFactory> extensions = - new TreeMap<String,DHFactory>(String.CASE_INSENSITIVE_ORDER); - /** - * Registered a {@link NamedFactory} to be available besides the built-in + * Registered a {@link org.apache.sshd.common.NamedFactory} to be available besides the built-in * ones when parsing configuration + * * @param extension The factory to register * @throws IllegalArgumentException if factory instance is {@code null}, - * or overrides a built-in one or overrides another registered factory - * with the same name (case <U>insensitive</U>). + * or overrides a built-in one or overrides another registered factory + * with the same name (case <U>insensitive</U>). */ public static void registerExtension(DHFactory extension) { - String name=ValidateUtils.checkNotNull(extension, "No extension provided").getName(); + String name = ValidateUtils.checkNotNull(extension, "No extension provided").getName(); ValidateUtils.checkTrue(fromFactoryName(name) == null, "Extension overrides built-in: %s", name); - synchronized(extensions) { - ValidateUtils.checkTrue(!extensions.containsKey(name), "Extension overrides existinh: %s", name); - extensions.put(name, extension); + synchronized (EXTENSIONS) { + ValidateUtils.checkTrue(!EXTENSIONS.containsKey(name), "Extension overrides existing: %s", name); + EXTENSIONS.put(name, extension); } } @@ -197,13 +198,14 @@ public enum BuiltinDHFactories implements DHFactory { */ public static SortedSet<DHFactory> getRegisteredExtensions() { // TODO for JDK-8 return Collections.emptySortedSet() - synchronized(extensions) { - return GenericUtils.asSortedSet(NamedResource.BY_NAME_COMPARATOR, extensions.values()); + synchronized (EXTENSIONS) { + return GenericUtils.asSortedSet(NamedResource.BY_NAME_COMPARATOR, EXTENSIONS.values()); } } /** * Unregisters specified extension + * * @param name The factory name - ignored if {@code null}/empty * @return The registered extension - {@code null} if not found */ @@ -211,9 +213,9 @@ public enum BuiltinDHFactories implements DHFactory { if (GenericUtils.isEmpty(name)) { return null; } - - synchronized(extensions) { - return extensions.remove(name); + + synchronized (EXTENSIONS) { + return EXTENSIONS.remove(name); } } @@ -233,7 +235,7 @@ public enum BuiltinDHFactories implements DHFactory { /** * @param dhList A comma-separated list of ciphers' names - ignored - * if {@code null}/empty + * if {@code null}/empty * @return A {@link ParseResult} of all the {@link DHFactory}-ies whose * name appears in the string and represent a built-in value. Any * unknown name is <U>ignored</U>. The order of the returned result @@ -245,7 +247,7 @@ public enum BuiltinDHFactories implements DHFactory { return parseDHFactoriesList(GenericUtils.split(dhList, ',')); } - public static ParseResult parseDHFactoriesList(String ... dhList) { + public static ParseResult parseDHFactoriesList(String... dhList) { return parseDHFactoriesList(GenericUtils.isEmpty((Object[]) dhList) ? Collections.<String>emptyList() : Arrays.asList(dhList)); } @@ -253,11 +255,11 @@ public enum BuiltinDHFactories implements DHFactory { if (GenericUtils.isEmpty(dhList)) { return ParseResult.EMPTY; } - - List<DHFactory> factories=new ArrayList<>(dhList.size()); - List<String> unknown=Collections.emptyList(); + + List<DHFactory> factories = new ArrayList<>(dhList.size()); + List<String> unknown = Collections.emptyList(); for (String name : dhList) { - DHFactory f=resolveFactory(name); + DHFactory f = resolveFactory(name); if (f != null) { factories.add(f); } else { @@ -268,44 +270,46 @@ public enum BuiltinDHFactories implements DHFactory { unknown.add(name); } } - + return new ParseResult(factories, unknown); } + /** * @param name The factory name * @return The factory or {@code null} if it is neither a built-in one - * or a registered extension + * or a registered extension */ public static DHFactory resolveFactory(String name) { if (GenericUtils.isEmpty(name)) { return null; } - DHFactory s=fromFactoryName(name); + DHFactory s = fromFactoryName(name); if (s != null) { return s; } - - synchronized(extensions) { - return extensions.get(name); + + synchronized (EXTENSIONS) { + return EXTENSIONS.get(name); } } /** * Represents the result of {@link BuiltinDHFactories#parseDHFactoriesList(String)} + * * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> */ public static final class ParseResult extends NamedResourceListParseResult<DHFactory> { - public static final ParseResult EMPTY=new ParseResult(Collections.<DHFactory>emptyList(), Collections.<String>emptyList()); - + public static final ParseResult EMPTY = new ParseResult(Collections.<DHFactory>emptyList(), Collections.<String>emptyList()); + public ParseResult(List<DHFactory> parsed, List<String> unsupported) { super(parsed, unsupported); } - + public List<DHFactory> getParsedFactories() { return getParsedResources(); } - + public List<String> getUnsupportedFactories() { return getUnsupportedResources(); } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/kex/DHG.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/kex/DHG.java b/sshd-core/src/main/java/org/apache/sshd/common/kex/DHG.java index 951ef77..8a3b27f 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/kex/DHG.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/kex/DHG.java @@ -23,7 +23,6 @@ import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PublicKey; - import javax.crypto.KeyAgreement; import javax.crypto.spec.DHParameterSpec; import javax.crypto.spec.DHPublicKeySpec; http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/kex/DHGroupData.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/kex/DHGroupData.java b/sshd-core/src/main/java/org/apache/sshd/common/kex/DHGroupData.java index 35df435..32c2153 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/kex/DHGroupData.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/kex/DHGroupData.java @@ -25,72 +25,74 @@ package org.apache.sshd.common.kex; */ public final class DHGroupData { + private DHGroupData() { + throw new UnsupportedOperationException("No instance allowed"); + } public static byte[] getG() { - final byte[] G = { 2 }; - return G; + return new byte[] { + (byte) 0x02 + }; } public static byte[] getP1() { - final byte[] P_1 = { - (byte)0x00, - (byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF, - (byte)0xC9,(byte)0x0F,(byte)0xDA,(byte)0xA2,(byte)0x21,(byte)0x68,(byte)0xC2,(byte)0x34, - (byte)0xC4,(byte)0xC6,(byte)0x62,(byte)0x8B,(byte)0x80,(byte)0xDC,(byte)0x1C,(byte)0xD1, - (byte)0x29,(byte)0x02,(byte)0x4E,(byte)0x08,(byte)0x8A,(byte)0x67,(byte)0xCC,(byte)0x74, - (byte)0x02,(byte)0x0B,(byte)0xBE,(byte)0xA6,(byte)0x3B,(byte)0x13,(byte)0x9B,(byte)0x22, - (byte)0x51,(byte)0x4A,(byte)0x08,(byte)0x79,(byte)0x8E,(byte)0x34,(byte)0x04,(byte)0xDD, - (byte)0xEF,(byte)0x95,(byte)0x19,(byte)0xB3,(byte)0xCD,(byte)0x3A,(byte)0x43,(byte)0x1B, - (byte)0x30,(byte)0x2B,(byte)0x0A,(byte)0x6D,(byte)0xF2,(byte)0x5F,(byte)0x14,(byte)0x37, - (byte)0x4F,(byte)0xE1,(byte)0x35,(byte)0x6D,(byte)0x6D,(byte)0x51,(byte)0xC2,(byte)0x45, - (byte)0xE4,(byte)0x85,(byte)0xB5,(byte)0x76,(byte)0x62,(byte)0x5E,(byte)0x7E,(byte)0xC6, - (byte)0xF4,(byte)0x4C,(byte)0x42,(byte)0xE9,(byte)0xA6,(byte)0x37,(byte)0xED,(byte)0x6B, - (byte)0x0B,(byte)0xFF,(byte)0x5C,(byte)0xB6,(byte)0xF4,(byte)0x06,(byte)0xB7,(byte)0xED, - (byte)0xEE,(byte)0x38,(byte)0x6B,(byte)0xFB,(byte)0x5A,(byte)0x89,(byte)0x9F,(byte)0xA5, - (byte)0xAE,(byte)0x9F,(byte)0x24,(byte)0x11,(byte)0x7C,(byte)0x4B,(byte)0x1F,(byte)0xE6, - (byte)0x49,(byte)0x28,(byte)0x66,(byte)0x51,(byte)0xEC,(byte)0xE6,(byte)0x53,(byte)0x81, - (byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF + return new byte[] { + (byte) 0x00, + (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, + (byte) 0xC9, (byte) 0x0F, (byte) 0xDA, (byte) 0xA2, (byte) 0x21, (byte) 0x68, (byte) 0xC2, (byte) 0x34, + (byte) 0xC4, (byte) 0xC6, (byte) 0x62, (byte) 0x8B, (byte) 0x80, (byte) 0xDC, (byte) 0x1C, (byte) 0xD1, + (byte) 0x29, (byte) 0x02, (byte) 0x4E, (byte) 0x08, (byte) 0x8A, (byte) 0x67, (byte) 0xCC, (byte) 0x74, + (byte) 0x02, (byte) 0x0B, (byte) 0xBE, (byte) 0xA6, (byte) 0x3B, (byte) 0x13, (byte) 0x9B, (byte) 0x22, + (byte) 0x51, (byte) 0x4A, (byte) 0x08, (byte) 0x79, (byte) 0x8E, (byte) 0x34, (byte) 0x04, (byte) 0xDD, + (byte) 0xEF, (byte) 0x95, (byte) 0x19, (byte) 0xB3, (byte) 0xCD, (byte) 0x3A, (byte) 0x43, (byte) 0x1B, + (byte) 0x30, (byte) 0x2B, (byte) 0x0A, (byte) 0x6D, (byte) 0xF2, (byte) 0x5F, (byte) 0x14, (byte) 0x37, + (byte) 0x4F, (byte) 0xE1, (byte) 0x35, (byte) 0x6D, (byte) 0x6D, (byte) 0x51, (byte) 0xC2, (byte) 0x45, + (byte) 0xE4, (byte) 0x85, (byte) 0xB5, (byte) 0x76, (byte) 0x62, (byte) 0x5E, (byte) 0x7E, (byte) 0xC6, + (byte) 0xF4, (byte) 0x4C, (byte) 0x42, (byte) 0xE9, (byte) 0xA6, (byte) 0x37, (byte) 0xED, (byte) 0x6B, + (byte) 0x0B, (byte) 0xFF, (byte) 0x5C, (byte) 0xB6, (byte) 0xF4, (byte) 0x06, (byte) 0xB7, (byte) 0xED, + (byte) 0xEE, (byte) 0x38, (byte) 0x6B, (byte) 0xFB, (byte) 0x5A, (byte) 0x89, (byte) 0x9F, (byte) 0xA5, + (byte) 0xAE, (byte) 0x9F, (byte) 0x24, (byte) 0x11, (byte) 0x7C, (byte) 0x4B, (byte) 0x1F, (byte) 0xE6, + (byte) 0x49, (byte) 0x28, (byte) 0x66, (byte) 0x51, (byte) 0xEC, (byte) 0xE6, (byte) 0x53, (byte) 0x81, + (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF }; - return P_1; } public static byte[] getP14() { - final byte[] P_14 = { - (byte)0x00, - (byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF, - (byte)0xC9,(byte)0x0F,(byte)0xDA,(byte)0xA2,(byte)0x21,(byte)0x68,(byte)0xC2,(byte)0x34, - (byte)0xC4,(byte)0xC6,(byte)0x62,(byte)0x8B,(byte)0x80,(byte)0xDC,(byte)0x1C,(byte)0xD1, - (byte)0x29,(byte)0x02,(byte)0x4E,(byte)0x08,(byte)0x8A,(byte)0x67,(byte)0xCC,(byte)0x74, - (byte)0x02,(byte)0x0B,(byte)0xBE,(byte)0xA6,(byte)0x3B,(byte)0x13,(byte)0x9B,(byte)0x22, - (byte)0x51,(byte)0x4A,(byte)0x08,(byte)0x79,(byte)0x8E,(byte)0x34,(byte)0x04,(byte)0xDD, - (byte)0xEF,(byte)0x95,(byte)0x19,(byte)0xB3,(byte)0xCD,(byte)0x3A,(byte)0x43,(byte)0x1B, - (byte)0x30,(byte)0x2B,(byte)0x0A,(byte)0x6D,(byte)0xF2,(byte)0x5F,(byte)0x14,(byte)0x37, - (byte)0x4F,(byte)0xE1,(byte)0x35,(byte)0x6D,(byte)0x6D,(byte)0x51,(byte)0xC2,(byte)0x45, - (byte)0xE4,(byte)0x85,(byte)0xB5,(byte)0x76,(byte)0x62,(byte)0x5E,(byte)0x7E,(byte)0xC6, - (byte)0xF4,(byte)0x4C,(byte)0x42,(byte)0xE9,(byte)0xA6,(byte)0x37,(byte)0xED,(byte)0x6B, - (byte)0x0B,(byte)0xFF,(byte)0x5C,(byte)0xB6,(byte)0xF4,(byte)0x06,(byte)0xB7,(byte)0xED, - (byte)0xEE,(byte)0x38,(byte)0x6B,(byte)0xFB,(byte)0x5A,(byte)0x89,(byte)0x9F,(byte)0xA5, - (byte)0xAE,(byte)0x9F,(byte)0x24,(byte)0x11,(byte)0x7C,(byte)0x4B,(byte)0x1F,(byte)0xE6, - (byte)0x49,(byte)0x28,(byte)0x66,(byte)0x51,(byte)0xEC,(byte)0xE4,(byte)0x5B,(byte)0x3D, - (byte)0xC2,(byte)0x00,(byte)0x7C,(byte)0xB8,(byte)0xA1,(byte)0x63,(byte)0xBF,(byte)0x05, - (byte)0x98,(byte)0xDA,(byte)0x48,(byte)0x36,(byte)0x1C,(byte)0x55,(byte)0xD3,(byte)0x9A, - (byte)0x69,(byte)0x16,(byte)0x3F,(byte)0xA8,(byte)0xFD,(byte)0x24,(byte)0xCF,(byte)0x5F, - (byte)0x83,(byte)0x65,(byte)0x5D,(byte)0x23,(byte)0xDC,(byte)0xA3,(byte)0xAD,(byte)0x96, - (byte)0x1C,(byte)0x62,(byte)0xF3,(byte)0x56,(byte)0x20,(byte)0x85,(byte)0x52,(byte)0xBB, - (byte)0x9E,(byte)0xD5,(byte)0x29,(byte)0x07,(byte)0x70,(byte)0x96,(byte)0x96,(byte)0x6D, - (byte)0x67,(byte)0x0C,(byte)0x35,(byte)0x4E,(byte)0x4A,(byte)0xBC,(byte)0x98,(byte)0x04, - (byte)0xF1,(byte)0x74,(byte)0x6C,(byte)0x08,(byte)0xCA,(byte)0x18,(byte)0x21,(byte)0x7C, - (byte)0x32,(byte)0x90,(byte)0x5E,(byte)0x46,(byte)0x2E,(byte)0x36,(byte)0xCE,(byte)0x3B, - (byte)0xE3,(byte)0x9E,(byte)0x77,(byte)0x2C,(byte)0x18,(byte)0x0E,(byte)0x86,(byte)0x03, - (byte)0x9B,(byte)0x27,(byte)0x83,(byte)0xA2,(byte)0xEC,(byte)0x07,(byte)0xA2,(byte)0x8F, - (byte)0xB5,(byte)0xC5,(byte)0x5D,(byte)0xF0,(byte)0x6F,(byte)0x4C,(byte)0x52,(byte)0xC9, - (byte)0xDE,(byte)0x2B,(byte)0xCB,(byte)0xF6,(byte)0x95,(byte)0x58,(byte)0x17,(byte)0x18, - (byte)0x39,(byte)0x95,(byte)0x49,(byte)0x7C,(byte)0xEA,(byte)0x95,(byte)0x6A,(byte)0xE5, - (byte)0x15,(byte)0xD2,(byte)0x26,(byte)0x18,(byte)0x98,(byte)0xFA,(byte)0x05,(byte)0x10, - (byte)0x15,(byte)0x72,(byte)0x8E,(byte)0x5A,(byte)0x8A,(byte)0xAC,(byte)0xAA,(byte)0x68, - (byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF, + return new byte[] { + (byte) 0x00, + (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, + (byte) 0xC9, (byte) 0x0F, (byte) 0xDA, (byte) 0xA2, (byte) 0x21, (byte) 0x68, (byte) 0xC2, (byte) 0x34, + (byte) 0xC4, (byte) 0xC6, (byte) 0x62, (byte) 0x8B, (byte) 0x80, (byte) 0xDC, (byte) 0x1C, (byte) 0xD1, + (byte) 0x29, (byte) 0x02, (byte) 0x4E, (byte) 0x08, (byte) 0x8A, (byte) 0x67, (byte) 0xCC, (byte) 0x74, + (byte) 0x02, (byte) 0x0B, (byte) 0xBE, (byte) 0xA6, (byte) 0x3B, (byte) 0x13, (byte) 0x9B, (byte) 0x22, + (byte) 0x51, (byte) 0x4A, (byte) 0x08, (byte) 0x79, (byte) 0x8E, (byte) 0x34, (byte) 0x04, (byte) 0xDD, + (byte) 0xEF, (byte) 0x95, (byte) 0x19, (byte) 0xB3, (byte) 0xCD, (byte) 0x3A, (byte) 0x43, (byte) 0x1B, + (byte) 0x30, (byte) 0x2B, (byte) 0x0A, (byte) 0x6D, (byte) 0xF2, (byte) 0x5F, (byte) 0x14, (byte) 0x37, + (byte) 0x4F, (byte) 0xE1, (byte) 0x35, (byte) 0x6D, (byte) 0x6D, (byte) 0x51, (byte) 0xC2, (byte) 0x45, + (byte) 0xE4, (byte) 0x85, (byte) 0xB5, (byte) 0x76, (byte) 0x62, (byte) 0x5E, (byte) 0x7E, (byte) 0xC6, + (byte) 0xF4, (byte) 0x4C, (byte) 0x42, (byte) 0xE9, (byte) 0xA6, (byte) 0x37, (byte) 0xED, (byte) 0x6B, + (byte) 0x0B, (byte) 0xFF, (byte) 0x5C, (byte) 0xB6, (byte) 0xF4, (byte) 0x06, (byte) 0xB7, (byte) 0xED, + (byte) 0xEE, (byte) 0x38, (byte) 0x6B, (byte) 0xFB, (byte) 0x5A, (byte) 0x89, (byte) 0x9F, (byte) 0xA5, + (byte) 0xAE, (byte) 0x9F, (byte) 0x24, (byte) 0x11, (byte) 0x7C, (byte) 0x4B, (byte) 0x1F, (byte) 0xE6, + (byte) 0x49, (byte) 0x28, (byte) 0x66, (byte) 0x51, (byte) 0xEC, (byte) 0xE4, (byte) 0x5B, (byte) 0x3D, + (byte) 0xC2, (byte) 0x00, (byte) 0x7C, (byte) 0xB8, (byte) 0xA1, (byte) 0x63, (byte) 0xBF, (byte) 0x05, + (byte) 0x98, (byte) 0xDA, (byte) 0x48, (byte) 0x36, (byte) 0x1C, (byte) 0x55, (byte) 0xD3, (byte) 0x9A, + (byte) 0x69, (byte) 0x16, (byte) 0x3F, (byte) 0xA8, (byte) 0xFD, (byte) 0x24, (byte) 0xCF, (byte) 0x5F, + (byte) 0x83, (byte) 0x65, (byte) 0x5D, (byte) 0x23, (byte) 0xDC, (byte) 0xA3, (byte) 0xAD, (byte) 0x96, + (byte) 0x1C, (byte) 0x62, (byte) 0xF3, (byte) 0x56, (byte) 0x20, (byte) 0x85, (byte) 0x52, (byte) 0xBB, + (byte) 0x9E, (byte) 0xD5, (byte) 0x29, (byte) 0x07, (byte) 0x70, (byte) 0x96, (byte) 0x96, (byte) 0x6D, + (byte) 0x67, (byte) 0x0C, (byte) 0x35, (byte) 0x4E, (byte) 0x4A, (byte) 0xBC, (byte) 0x98, (byte) 0x04, + (byte) 0xF1, (byte) 0x74, (byte) 0x6C, (byte) 0x08, (byte) 0xCA, (byte) 0x18, (byte) 0x21, (byte) 0x7C, + (byte) 0x32, (byte) 0x90, (byte) 0x5E, (byte) 0x46, (byte) 0x2E, (byte) 0x36, (byte) 0xCE, (byte) 0x3B, + (byte) 0xE3, (byte) 0x9E, (byte) 0x77, (byte) 0x2C, (byte) 0x18, (byte) 0x0E, (byte) 0x86, (byte) 0x03, + (byte) 0x9B, (byte) 0x27, (byte) 0x83, (byte) 0xA2, (byte) 0xEC, (byte) 0x07, (byte) 0xA2, (byte) 0x8F, + (byte) 0xB5, (byte) 0xC5, (byte) 0x5D, (byte) 0xF0, (byte) 0x6F, (byte) 0x4C, (byte) 0x52, (byte) 0xC9, + (byte) 0xDE, (byte) 0x2B, (byte) 0xCB, (byte) 0xF6, (byte) 0x95, (byte) 0x58, (byte) 0x17, (byte) 0x18, + (byte) 0x39, (byte) 0x95, (byte) 0x49, (byte) 0x7C, (byte) 0xEA, (byte) 0x95, (byte) 0x6A, (byte) 0xE5, + (byte) 0x15, (byte) 0xD2, (byte) 0x26, (byte) 0x18, (byte) 0x98, (byte) 0xFA, (byte) 0x05, (byte) 0x10, + (byte) 0x15, (byte) 0x72, (byte) 0x8E, (byte) 0x5A, (byte) 0x8A, (byte) 0xAC, (byte) 0xAA, (byte) 0x68, + (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, }; - return P_14; } } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/kex/ECDH.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/kex/ECDH.java b/sshd-core/src/main/java/org/apache/sshd/common/kex/ECDH.java index 1af4877..b31ea84 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/kex/ECDH.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/kex/ECDH.java @@ -26,13 +26,11 @@ import java.security.interfaces.ECPublicKey; import java.security.spec.ECParameterSpec; import java.security.spec.ECPoint; import java.security.spec.ECPublicKeySpec; - import javax.crypto.KeyAgreement; import org.apache.sshd.common.cipher.ECCurves; import org.apache.sshd.common.config.keys.ECDSAPublicKeyEntryDecoder; import org.apache.sshd.common.digest.Digest; -import org.apache.sshd.common.util.GenericUtils; import org.apache.sshd.common.util.SecurityUtils; import org.apache.sshd.common.util.ValidateUtils; http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/kex/KexProposalOption.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/kex/KexProposalOption.java b/sshd-core/src/main/java/org/apache/sshd/common/kex/KexProposalOption.java index 31fa8c2..2a01e64 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/kex/KexProposalOption.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/kex/KexProposalOption.java @@ -42,22 +42,38 @@ public enum KexProposalOption { C2SLANG(Constants.PROPOSAL_LANG_CTOS, "languages (client to server)"), S2CLANG(Constants.PROPOSAL_LANG_STOC, "languages (server to client)"); - private final int proposalIndex; /** - * @return The proposal option location in the KEX array + * A {@link List} of all the options <U>sorted</U> according to {@link #getProposalIndex(){ + * + * @see #BY_PROPOSAL_INDEX */ - public final int getProposalIndex() { - return proposalIndex; - } + public static final List<KexProposalOption> VALUES = + Collections.unmodifiableList(new ArrayList<KexProposalOption>(EnumSet.allOf(KexProposalOption.class)) { + private static final long serialVersionUID = 1L; // we're not serializing it + + { + Collections.sort(this, BY_PROPOSAL_INDEX); + } + }); + + public static final int PROPOSAL_MAX = VALUES.size(); - private final String description; /** - * @return User-friendly name for the KEX negotiation item - * @see <A HREF="http://tools.ietf.org/html/rfc4253#section-7.1">RFC-4253 - section 7.1</A> + * Compares values according to {@link KexProposalOption#getProposalIndex()} */ - public final String getDescription() { - return description; - } + public static final Comparator<KexProposalOption> BY_PROPOSAL_INDEX = + new Comparator<KexProposalOption>() { + @Override + public int compare(KexProposalOption o1, KexProposalOption o2) { + int i1 = (o1 == null) ? (-1) : o1.getProposalIndex(); + int i2 = (o2 == null) ? (-1) : o2.getProposalIndex(); + return Integer.compare(i1, i2); + } + }; + + private final int proposalIndex; + + private final String description; KexProposalOption(int index, String desc) { proposalIndex = index; @@ -65,31 +81,19 @@ public enum KexProposalOption { } /** - * Compares values according to {@link KexProposalOption#getProposalIndex()} + * @return The proposal option location in the KEX array */ - public static final Comparator<KexProposalOption> BY_PROPOSAL_INDEX = - new Comparator<KexProposalOption>() { - @Override - public int compare(KexProposalOption o1, KexProposalOption o2) { - int i1 = (o1 == null) ? (-1) : o1.getProposalIndex(); - int i2 = (o2 == null) ? (-1) : o2.getProposalIndex(); - return Integer.compare(i1, i2); - } - }; - + public final int getProposalIndex() { + return proposalIndex; + } + /** - * A {@link List} of all the options <U>sorted</U> according to {@link #getProposalIndex(){ - * @see #BY_PROPOSAL_INDEX + * @return User-friendly name for the KEX negotiation item + * @see <A HREF="http://tools.ietf.org/html/rfc4253#section-7.1">RFC-4253 - section 7.1</A> */ - public static final List<KexProposalOption> VALUES = - Collections.unmodifiableList(new ArrayList<KexProposalOption>(EnumSet.allOf(KexProposalOption.class)) { - private static final long serialVersionUID = 1L; // we're not serializing it - - { - Collections.sort(this, BY_PROPOSAL_INDEX); - } - }); - public static final int PROPOSAL_MAX = VALUES.size(); + public final String getDescription() { + return description; + } /** * @param n The option name - ignored if {@code null}/empty @@ -100,13 +104,13 @@ public enum KexProposalOption { if (GenericUtils.isEmpty(n)) { return null; } - + for (KexProposalOption o : VALUES) { if (n.equalsIgnoreCase(o.name())) { return o; } } - + return null; } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/kex/KexState.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/kex/KexState.java b/sshd-core/src/main/java/org/apache/sshd/common/kex/KexState.java index 47756b8..751d759 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/kex/KexState.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/kex/KexState.java @@ -25,6 +25,7 @@ import java.util.Set; /** * Used to track the key-exchange (KEX) protocol progression + * * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> */ public enum KexState { @@ -33,6 +34,6 @@ public enum KexState { RUN, KEYS, DONE; - + public static final Set<KexState> VALUES = Collections.unmodifiableSet(EnumSet.allOf(KexState.class)); } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/kex/KeyExchange.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/kex/KeyExchange.java b/sshd-core/src/main/java/org/apache/sshd/common/kex/KeyExchange.java index 39cd2a0..9d052ac 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/kex/KeyExchange.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/kex/KeyExchange.java @@ -35,13 +35,13 @@ public interface KeyExchange { * Initialize the key exchange algorithm. * * @param session the session using this algorithm - * @param V_S the server identification string - * @param V_C the client identification string - * @param I_S the server key init packet - * @param I_C the client key init packet + * @param v_s the server identification string + * @param v_c the client identification string + * @param i_s the server key init packet + * @param i_c the client key init packet * @throws Exception if an error occurs */ - void init(AbstractSession session, byte[] V_S, byte[] V_C, byte[] I_S, byte[] I_C) throws Exception; + void init(AbstractSession session, byte[] v_s, byte[] v_c, byte[] i_s, byte[] i_c) throws Exception; /** * Process the next packet @@ -60,14 +60,14 @@ public interface KeyExchange { Digest getHash(); /** - * Retrieves the computed H parameter + * Retrieves the computed h parameter * * @return */ byte[] getH(); /** - * Retrieves the computed K parameter + * Retrieves the computed k parameter * * @return */ http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/kex/KeyExchangeFactory.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/kex/KeyExchangeFactory.java b/sshd-core/src/main/java/org/apache/sshd/common/kex/KeyExchangeFactory.java index 460ec60..ae8f769 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/kex/KeyExchangeFactory.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/kex/KeyExchangeFactory.java @@ -20,18 +20,11 @@ package org.apache.sshd.common.kex; import org.apache.sshd.common.NamedFactory; -import org.apache.sshd.common.util.Transformer; /** * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> */ +// CHECKSTYLE:OFF public interface KeyExchangeFactory extends NamedFactory<KeyExchange> { - // required because of generics issues - Transformer<KeyExchangeFactory,NamedFactory<KeyExchange>> FAC2NAMED=new Transformer<KeyExchangeFactory,NamedFactory<KeyExchange>>() { - @Override - public NamedFactory<KeyExchange> transform(KeyExchangeFactory input) { - return input; - } - }; } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/kex/dh/AbstractDHKeyExchange.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/kex/dh/AbstractDHKeyExchange.java b/sshd-core/src/main/java/org/apache/sshd/common/kex/dh/AbstractDHKeyExchange.java index 2440955..65e306b 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/kex/dh/AbstractDHKeyExchange.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/kex/dh/AbstractDHKeyExchange.java @@ -22,7 +22,6 @@ package org.apache.sshd.common.kex.dh; import org.apache.sshd.common.digest.Digest; import org.apache.sshd.common.kex.KeyExchange; import org.apache.sshd.common.session.AbstractSession; -import org.apache.sshd.common.util.GenericUtils; import org.apache.sshd.common.util.ValidateUtils; import org.apache.sshd.common.util.logging.AbstractLoggingBean; @@ -30,28 +29,29 @@ import org.apache.sshd.common.util.logging.AbstractLoggingBean; * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> */ public abstract class AbstractDHKeyExchange extends AbstractLoggingBean implements KeyExchange { - private AbstractSession session; - protected byte[] V_S; - protected byte[] V_C; - protected byte[] I_S; - protected byte[] I_C; + + protected AbstractSession session; + protected byte[] v_s; + protected byte[] v_c; + protected byte[] i_s; + protected byte[] i_c; protected Digest hash; protected byte[] e; protected byte[] f; - protected byte[] K; - protected byte[] H; + protected byte[] k; + protected byte[] h; protected AbstractDHKeyExchange() { super(); } @Override - public void init(AbstractSession s, byte[] V_S, byte[] V_C, byte[] I_S, byte[] I_C) throws Exception { + public void init(AbstractSession s, byte[] v_s, byte[] v_c, byte[] i_s, byte[] i_c) throws Exception { this.session = ValidateUtils.checkNotNull(s, "No session"); - this.V_S = ValidateUtils.checkNotNullAndNotEmpty(V_S, "No V_S value"); - this.V_C = ValidateUtils.checkNotNullAndNotEmpty(V_C, "No V_C value"); - this.I_S = ValidateUtils.checkNotNullAndNotEmpty(I_S, "No I_S value"); - this.I_C = ValidateUtils.checkNotNullAndNotEmpty(I_C, "No I_C value"); + this.v_s = ValidateUtils.checkNotNullAndNotEmpty(v_s, "No v_s value"); + this.v_c = ValidateUtils.checkNotNullAndNotEmpty(v_c, "No v_c value"); + this.i_s = ValidateUtils.checkNotNullAndNotEmpty(i_s, "No i_s value"); + this.i_c = ValidateUtils.checkNotNullAndNotEmpty(i_c, "No i_c value"); } public AbstractSession getSession() { @@ -65,11 +65,11 @@ public abstract class AbstractDHKeyExchange extends AbstractLoggingBean implemen @Override public byte[] getH() { - return H; + return h; } @Override public byte[] getK() { - return K; + return k; } } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/AbstractClassLoadableResourceKeyPairProvider.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/AbstractClassLoadableResourceKeyPairProvider.java b/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/AbstractClassLoadableResourceKeyPairProvider.java index 183bf06..11e011c 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/AbstractClassLoadableResourceKeyPairProvider.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/AbstractClassLoadableResourceKeyPairProvider.java @@ -33,11 +33,12 @@ import org.apache.sshd.common.util.threads.ThreadUtils; * are accessible via {@link ClassLoader#getResourceAsStream(String)}. * If no loader configured via {@link #setResourceLoader(ClassLoader)}, then * {@link ThreadUtils#resolveDefaultClassLoader(Class)} is used + * * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> */ public abstract class AbstractClassLoadableResourceKeyPairProvider extends AbstractResourceKeyPairProvider<String> { private ClassLoader classLoader; - private Collection<String> resources; + private Collection<String> resources; protected AbstractClassLoadableResourceKeyPairProvider() { classLoader = ThreadUtils.resolveDefaultClassLoader(getClass()); @@ -70,7 +71,7 @@ public abstract class AbstractClassLoadableResourceKeyPairProvider extends Abstr if (cl == null) { throw new StreamCorruptedException("No resource loader for " + resource); } - + InputStream input = cl.getResourceAsStream(resource); if (input == null) { throw new FileNotFoundException("Cannot find resource " + resource); http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/AbstractFileKeyPairProvider.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/AbstractFileKeyPairProvider.java b/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/AbstractFileKeyPairProvider.java index 25e57fd..590a7c7 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/AbstractFileKeyPairProvider.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/AbstractFileKeyPairProvider.java @@ -38,6 +38,7 @@ import org.apache.sshd.common.util.io.IoUtils; * loading is <U>lazy</U> - i.e., a file is not loaded until it is actually * required. Once required though, its loaded {@link KeyPair} result is * <U>cached</U> and not re-loaded. + * * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> */ public abstract class AbstractFileKeyPairProvider extends AbstractResourceKeyPairProvider<Path> { http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/AbstractResourceKeyPairProvider.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/AbstractResourceKeyPairProvider.java b/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/AbstractResourceKeyPairProvider.java index 85a59f2..ee65334 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/AbstractResourceKeyPairProvider.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/AbstractResourceKeyPairProvider.java @@ -39,13 +39,14 @@ import org.apache.sshd.common.util.GenericUtils; * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> */ public abstract class AbstractResourceKeyPairProvider<R> extends AbstractKeyPairProvider { + private FilePasswordProvider passwordFinder; /* * NOTE: the map is case insensitive even for Linux, as it is (very) bad * practice to have 2 key files that differ from one another only in their * case... */ - private final Map<String,KeyPair> cacheMap=new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + private final Map<String, KeyPair> cacheMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); protected AbstractResourceKeyPairProvider() { super(); @@ -61,8 +62,8 @@ public abstract class AbstractResourceKeyPairProvider<R> extends AbstractKeyPair protected void resetCacheMap(Collection<?> resources) { // if have any cached pairs then see what we can keep from previous load - Collection<String> toDelete=Collections.emptySet(); - synchronized(cacheMap) { + Collection<String> toDelete = Collections.emptySet(); + synchronized (cacheMap) { if (cacheMap.size() <= 0) { return; // already empty - nothing to keep } @@ -77,11 +78,11 @@ public abstract class AbstractResourceKeyPairProvider<R> extends AbstractKeyPair if (cacheMap.containsKey(resourceKey)) { continue; } - + if (toDelete.isEmpty()) { - toDelete = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER); + toDelete = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); } - + if (!toDelete.add(resourceKey)) { continue; // debug breakpoint } @@ -93,12 +94,12 @@ public abstract class AbstractResourceKeyPairProvider<R> extends AbstractKeyPair } } } - + if (log.isDebugEnabled()) { log.debug("resetCacheMap(" + resources + ") removed previous cached keys for " + toDelete); } } - + protected Iterable<KeyPair> loadKeys(final Collection<? extends R> resources) { if (GenericUtils.isEmpty(resources)) { return Collections.emptyList(); @@ -106,54 +107,7 @@ public abstract class AbstractResourceKeyPairProvider<R> extends AbstractKeyPair return new Iterable<KeyPair>() { @Override public Iterator<KeyPair> iterator() { - return new Iterator<KeyPair>() { - private final Iterator<? extends R> iterator = resources.iterator(); - private KeyPair nextKeyPair; - private boolean nextKeyPairSet = false; - - @Override - public boolean hasNext() { - return nextKeyPairSet || setNextObject(); - } - - @Override - public KeyPair next() { - if (!nextKeyPairSet) { - if (!setNextObject()) { - throw new NoSuchElementException("Out of files to try"); - } - } - nextKeyPairSet = false; - return nextKeyPair; - } - - @Override - public void remove() { - throw new UnsupportedOperationException("loadKeys(files) Iterator#remove() N/A"); - } - - @SuppressWarnings("synthetic-access") - private boolean setNextObject() { - while (iterator.hasNext()) { - R r = iterator.next(); - try { - nextKeyPair = doLoadKey(r); - } catch(Exception e) { - log.warn("Failed (" + e.getClass().getSimpleName() + ")" - + " to load key resource=" + r + ": " + e.getMessage()); - nextKeyPair = null; - continue; - } - - if (nextKeyPair != null) { - nextKeyPairSet = true; - return true; - } - } - - return false; - } - }; + return new KeyPairIterator(resources); } }; } @@ -162,15 +116,17 @@ public abstract class AbstractResourceKeyPairProvider<R> extends AbstractKeyPair protected KeyPair doLoadKey(R resource) throws IOException, GeneralSecurityException { String resourceKey = Objects.toString(resource); KeyPair kp; - synchronized(cacheMap) { + synchronized (cacheMap) { // check if lucky enough to have already loaded this file - if ((kp=cacheMap.get(resourceKey)) != null) { + kp = cacheMap.get(resourceKey); + if (kp != null) { return kp; } } - if ((kp=doLoadKey(resourceKey, resource, getPasswordFinder())) != null) { - synchronized(cacheMap) { + kp = doLoadKey(resourceKey, resource, getPasswordFinder()); + if (kp != null) { + synchronized (cacheMap) { // if somebody else beat us to it, use the cached key if (cacheMap.containsKey(resourceKey)) { kp = cacheMap.get(resourceKey); @@ -178,22 +134,75 @@ public abstract class AbstractResourceKeyPairProvider<R> extends AbstractKeyPair cacheMap.put(resourceKey, kp); } } - + if (log.isDebugEnabled()) { log.debug("doLoadKey(" + resourceKey + ") loaded " + kp.getPublic() + " / " + kp.getPrivate()); } } - + return kp; } protected KeyPair doLoadKey(String resourceKey, R resource, FilePasswordProvider provider) throws IOException, GeneralSecurityException { - try(InputStream inputStream = openKeyPairResource(resourceKey, resource)) { + try (InputStream inputStream = openKeyPairResource(resourceKey, resource)) { return doLoadKey(resourceKey, inputStream, provider); } } - + protected abstract InputStream openKeyPairResource(String resourceKey, R resource) throws IOException; - + protected abstract KeyPair doLoadKey(String resourceKey, InputStream inputStream, FilePasswordProvider provider) throws IOException, GeneralSecurityException; + + private class KeyPairIterator implements Iterator<KeyPair> { + private final Iterator<? extends R> iterator; + private KeyPair nextKeyPair; + private boolean nextKeyPairSet; + + public KeyPairIterator(Collection<? extends R> resources) { + iterator = resources.iterator(); + } + + @Override + public boolean hasNext() { + return nextKeyPairSet || setNextObject(); + } + + @Override + public KeyPair next() { + if (!nextKeyPairSet) { + if (!setNextObject()) { + throw new NoSuchElementException("Out of files to try"); + } + } + nextKeyPairSet = false; + return nextKeyPair; + } + + @Override + public void remove() { + throw new UnsupportedOperationException("loadKeys(files) Iterator#remove() N/A"); + } + + @SuppressWarnings("synthetic-access") + private boolean setNextObject() { + while (iterator.hasNext()) { + R r = iterator.next(); + try { + nextKeyPair = doLoadKey(r); + } catch (Exception e) { + log.warn("Failed (" + e.getClass().getSimpleName() + ")" + + " to load key resource=" + r + ": " + e.getMessage()); + nextKeyPair = null; + continue; + } + + if (nextKeyPair != null) { + nextKeyPairSet = true; + return true; + } + } + + return false; + } + } } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/KeyPairProvider.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/KeyPairProvider.java b/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/KeyPairProvider.java index 2f22413..5947376 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/KeyPairProvider.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/KeyPairProvider.java @@ -57,27 +57,6 @@ public interface KeyPairProvider { String ECDSA_SHA2_NISTP521 = ECCurves.nistp521.getKeyType(); /** - * Load available keys. - * @return an {@link Iterable} instance of available keys, never {@code null} - */ - Iterable<KeyPair> loadKeys(); - - /** - * Load a key of the specified type which can be "ssh-rsa", "ssh-dss", or - * "ecdsa-sha2-nistp{256,384,521}". If there is no key of this type, return - * {@code null} - * - * @param type the type of key to load - * @return a valid key pair or {@code null} - */ - KeyPair loadKey(String type); - - /** - * @return The available {@link Iterable} key types in preferred order - never {@code null} - */ - Iterable<String> getKeyTypes(); - - /** * A {@link KeyPairProvider} that has no keys */ KeyPairProvider EMPTY_KEYPAIR_PROVIDER = @@ -102,4 +81,27 @@ public interface KeyPairProvider { return "EMPTY_KEYPAIR_PROVIDER"; } }; + + /** + * Load available keys. + * + * @return an {@link Iterable} instance of available keys, never {@code null} + */ + Iterable<KeyPair> loadKeys(); + + /** + * Load a key of the specified type which can be "ssh-rsa", "ssh-dss", or + * "ecdsa-sha2-nistp{256,384,521}". If there is no key of this type, return + * {@code null} + * + * @param type the type of key to load + * @return a valid key pair or {@code null} + */ + KeyPair loadKey(String type); + + /** + * @return The available {@link Iterable} key types in preferred order - never {@code null} + */ + Iterable<String> getKeyTypes(); + } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/MappedKeyPairProvider.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/MappedKeyPairProvider.java b/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/MappedKeyPairProvider.java index c8c187d..0b6fe13 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/MappedKeyPairProvider.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/keyprovider/MappedKeyPairProvider.java @@ -22,13 +22,13 @@ package org.apache.sshd.common.keyprovider; import java.security.KeyPair; import java.util.Map; -import org.apache.sshd.common.util.GenericUtils; import org.apache.sshd.common.util.Transformer; import org.apache.sshd.common.util.ValidateUtils; /** * Holds a {@link Map} of {@link String}->{@link KeyPair} where the map key * is the type and value is the associated {@link KeyPair} + * * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> */ public class MappedKeyPairProvider implements KeyPairProvider { @@ -37,17 +37,17 @@ public class MappedKeyPairProvider implements KeyPairProvider { * {@link KeyPairProvider} where map key is the type and value is the * associated {@link KeyPair} */ - public static final Transformer<Map<String,KeyPair>, KeyPairProvider> MAP_TO_KEY_PAIR_PROVIDER = - new Transformer<Map<String,KeyPair>, KeyPairProvider>() { + public static final Transformer<Map<String, KeyPair>, KeyPairProvider> MAP_TO_KEY_PAIR_PROVIDER = + new Transformer<Map<String, KeyPair>, KeyPairProvider>() { @Override public KeyPairProvider transform(final Map<String, KeyPair> input) { return new MappedKeyPairProvider(input); } }; - private final Map<String,KeyPair> pairsMap; + private final Map<String, KeyPair> pairsMap; - public MappedKeyPairProvider(Map<String,KeyPair> pairsMap) { + public MappedKeyPairProvider(Map<String, KeyPair> pairsMap) { this.pairsMap = ValidateUtils.checkNotNull(pairsMap, "No pairs map provided"); } @@ -55,12 +55,12 @@ public class MappedKeyPairProvider implements KeyPairProvider { public Iterable<KeyPair> loadKeys() { return pairsMap.values(); } - + @Override public KeyPair loadKey(String type) { return pairsMap.get(type); } - + @Override public Iterable<String> getKeyTypes() { return pairsMap.keySet(); http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/mac/BuiltinMacs.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/mac/BuiltinMacs.java b/sshd-core/src/main/java/org/apache/sshd/common/mac/BuiltinMacs.java index 2624ef9..5e55ebf 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/mac/BuiltinMacs.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/mac/BuiltinMacs.java @@ -80,8 +80,18 @@ public enum BuiltinMacs implements MacFactory { } }; + public static final Set<BuiltinMacs> VALUES = + Collections.unmodifiableSet(EnumSet.allOf(BuiltinMacs.class)); + + private static final Map<String, MacFactory> EXTENSIONS = + new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + private final String factoryName; + BuiltinMacs(String facName) { + factoryName = facName; + } + @Override public final String getName() { return factoryName; @@ -96,31 +106,23 @@ public enum BuiltinMacs implements MacFactory { public final String toString() { return getName(); } - - BuiltinMacs(String facName) { - factoryName = facName; - } - - public static final Set<BuiltinMacs> VALUES = - Collections.unmodifiableSet(EnumSet.allOf(BuiltinMacs.class)); - private static final Map<String,MacFactory> extensions = - new TreeMap<>(String.CASE_INSENSITIVE_ORDER); /** * Registered a {@link NamedFactory} to be available besides the built-in * ones when parsing configuration + * * @param extension The factory to register * @throws IllegalArgumentException if factory instance is {@code null}, - * or overrides a built-in one or overrides another registered factory - * with the same name (case <U>insensitive</U>). + * or overrides a built-in one or overrides another registered factory + * with the same name (case <U>insensitive</U>). */ public static void registerExtension(MacFactory extension) { - String name=ValidateUtils.checkNotNull(extension, "No extension provided").getName(); + String name = ValidateUtils.checkNotNull(extension, "No extension provided").getName(); ValidateUtils.checkTrue(fromFactoryName(name) == null, "Extension overrides built-in: %s", name); - synchronized(extensions) { - ValidateUtils.checkTrue(!extensions.containsKey(name), "Extension overrides existinh: %s", name); - extensions.put(name, extension); + synchronized (EXTENSIONS) { + ValidateUtils.checkTrue(!EXTENSIONS.containsKey(name), "Extension overrides existing: %s", name); + EXTENSIONS.put(name, extension); } } @@ -130,13 +132,14 @@ public enum BuiltinMacs implements MacFactory { */ public static SortedSet<MacFactory> getRegisteredExtensions() { // TODO for JDK-8 return Collections.emptySortedSet() - synchronized(extensions) { - return GenericUtils.asSortedSet(NamedResource.BY_NAME_COMPARATOR, extensions.values()); + synchronized (EXTENSIONS) { + return GenericUtils.asSortedSet(NamedResource.BY_NAME_COMPARATOR, EXTENSIONS.values()); } } /** * Unregisters specified extension + * * @param name The factory name - ignored if {@code null}/empty * @return The registered extension - {@code null} if not found */ @@ -144,9 +147,9 @@ public enum BuiltinMacs implements MacFactory { if (GenericUtils.isEmpty(name)) { return null; } - - synchronized(extensions) { - return extensions.remove(name); + + synchronized (EXTENSIONS) { + return EXTENSIONS.remove(name); } } @@ -194,7 +197,7 @@ public enum BuiltinMacs implements MacFactory { /** * @param macs A comma-separated list of MACs' names - ignored - * if {@code null}/empty + * if {@code null}/empty * @return A {@link ParseResult} containing the successfully parsed * factories and the unknown ones. <B>Note:</B> it is up to caller to * ensure that the lists do not contain duplicates @@ -203,7 +206,7 @@ public enum BuiltinMacs implements MacFactory { return parseMacsList(GenericUtils.split(macs, ',')); } - public static ParseResult parseMacsList(String ... macs) { + public static ParseResult parseMacsList(String... macs) { return parseMacsList(GenericUtils.isEmpty((Object[]) macs) ? Collections.<String>emptyList() : Arrays.asList(macs)); } @@ -211,11 +214,11 @@ public enum BuiltinMacs implements MacFactory { if (GenericUtils.isEmpty(macs)) { return ParseResult.EMPTY; } - - List<MacFactory> factories=new ArrayList<>(macs.size()); - List<String> unknown=Collections.emptyList(); + + List<MacFactory> factories = new ArrayList<>(macs.size()); + List<String> unknown = Collections.emptyList(); for (String name : macs) { - MacFactory m=resolveFactory(name); + MacFactory m = resolveFactory(name); if (m != null) { factories.add(m); } else { @@ -226,33 +229,33 @@ public enum BuiltinMacs implements MacFactory { unknown.add(name); } } - + return new ParseResult(factories, unknown); } /** * @param name The factory name * @return The factory or {@code null} if it is neither a built-in one - * or a registered extension + * or a registered extension */ public static MacFactory resolveFactory(String name) { if (GenericUtils.isEmpty(name)) { return null; } - MacFactory m=fromFactoryName(name); + MacFactory m = fromFactoryName(name); if (m != null) { return m; } - - synchronized(extensions) { - return extensions.get(name); + + synchronized (EXTENSIONS) { + return EXTENSIONS.get(name); } } - public static final class ParseResult extends NamedFactoriesListParseResult<Mac,MacFactory> { - public static final ParseResult EMPTY=new ParseResult(Collections.<MacFactory>emptyList(), Collections.<String>emptyList()); - + public static final class ParseResult extends NamedFactoriesListParseResult<Mac, MacFactory> { + public static final ParseResult EMPTY = new ParseResult(Collections.<MacFactory>emptyList(), Collections.<String>emptyList()); + public ParseResult(List<MacFactory> parsed, List<String> unsupported) { super(parsed, unsupported); } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/mac/MacFactory.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/mac/MacFactory.java b/sshd-core/src/main/java/org/apache/sshd/common/mac/MacFactory.java index e84bbb4..ec5a0ca 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/mac/MacFactory.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/mac/MacFactory.java @@ -19,19 +19,12 @@ package org.apache.sshd.common.mac; -import org.apache.sshd.common.NamedFactory; -import org.apache.sshd.common.OptionalFeature; -import org.apache.sshd.common.util.Transformer; +import org.apache.sshd.common.BuiltinFactory; /** * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> */ -public interface MacFactory extends NamedFactory<Mac>, OptionalFeature { - // required because of generics issues - Transformer<MacFactory,NamedFactory<Mac>> FAC2NAMED=new Transformer<MacFactory,NamedFactory<Mac>>() { - @Override - public NamedFactory<Mac> transform(MacFactory input) { - return input; - } - }; +// CHECKSTYLE:OFF +public interface MacFactory extends BuiltinFactory<Mac> { + } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/random/AbstractRandom.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/random/AbstractRandom.java b/sshd-core/src/main/java/org/apache/sshd/common/random/AbstractRandom.java index 372de9b..5746e4d 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/random/AbstractRandom.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/random/AbstractRandom.java @@ -26,7 +26,7 @@ public abstract class AbstractRandom implements Random { protected AbstractRandom() { super(); } - + @Override // TODO in JDK-8 make this a default method public void fill(byte[] bytes) { fill(bytes, 0, bytes.length); http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/17f2d627/sshd-core/src/main/java/org/apache/sshd/common/random/JceRandom.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/random/JceRandom.java b/sshd-core/src/main/java/org/apache/sshd/common/random/JceRandom.java index 7e1b3a5..5b64666 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/random/JceRandom.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/random/JceRandom.java @@ -21,7 +21,7 @@ package org.apache.sshd.common.random; import java.security.SecureRandom; /** - * A <code>Random</code> implementation using the built-in {@link SecureRandom} PRNG. + * A <code>Random</code> implementation using the built-in {@link SecureRandom} PRNG. * * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> */ @@ -31,7 +31,7 @@ public class JceRandom extends AbstractRandom { private final SecureRandom random = new SecureRandom(); public JceRandom() { - super(); + super(); } @Override
