[SSHD-440] Moved provider specific code to separate package
Project: http://git-wip-us.apache.org/repos/asf/mina-sshd/repo Commit: http://git-wip-us.apache.org/repos/asf/mina-sshd/commit/ed064a09 Tree: http://git-wip-us.apache.org/repos/asf/mina-sshd/tree/ed064a09 Diff: http://git-wip-us.apache.org/repos/asf/mina-sshd/diff/ed064a09 Branch: refs/heads/master Commit: ed064a091de766dcc0cccc6ff573d0d852e85ac8 Parents: a2e9256 Author: Lyor Goldstein <[email protected]> Authored: Wed Oct 12 08:51:50 2016 +0300 Committer: Lyor Goldstein <[email protected]> Committed: Wed Oct 12 08:51:50 2016 +0300 ---------------------------------------------------------------------- .../org/apache/sshd/agent/local/AgentImpl.java | 2 +- .../java/org/apache/sshd/client/SshClient.java | 2 +- .../java/org/apache/sshd/client/SshKeyScan.java | 2 +- .../sshd/client/config/keys/ClientIdentity.java | 2 +- .../config/keys/ClientIdentityLoader.java | 2 +- .../org/apache/sshd/client/kex/DHGEXClient.java | 2 +- .../org/apache/sshd/common/BaseBuilder.java | 2 +- .../apache/sshd/common/cipher/BaseCipher.java | 2 +- .../sshd/common/cipher/BaseRC4Cipher.java | 2 +- .../org/apache/sshd/common/cipher/ECCurves.java | 2 +- .../common/config/keys/BuiltinIdentities.java | 2 +- .../config/keys/DSSPublicKeyEntryDecoder.java | 2 +- .../config/keys/ECDSAPublicKeyEntryDecoder.java | 2 +- .../sshd/common/config/keys/IdentityUtils.java | 2 +- .../sshd/common/config/keys/KeyUtils.java | 2 +- .../config/keys/PublicKeyEntryDecoder.java | 1 - .../common/config/keys/RSAPublicKeyDecoder.java | 2 +- .../apache/sshd/common/digest/BaseDigest.java | 2 +- .../apache/sshd/common/digest/DigestUtils.java | 2 +- .../sshd/common/kex/BuiltinDHFactories.java | 2 +- .../java/org/apache/sshd/common/kex/DHG.java | 2 +- .../java/org/apache/sshd/common/kex/ECDH.java | 2 +- .../org/apache/sshd/common/mac/BaseMac.java | 2 +- .../common/signature/AbstractSignature.java | 2 +- .../common/signature/BuiltinSignatures.java | 2 +- .../apache/sshd/common/util/SecurityUtils.java | 1018 ------------------ .../apache/sshd/common/util/buffer/Buffer.java | 2 +- .../keys/AbstractBufferPublicKeyParser.java | 2 +- .../keys/ED25519BufferPublicKeyParser.java | 2 +- .../common/util/security/SecurityUtils.java | 657 +++++++++++ ...tleClassLoadableResourceKeyPairProvider.java | 42 + .../BouncyCastleFileKeyPairProvider.java | 42 + .../BouncyCastleGeneratorHostKeyProvider.java | 54 + .../BouncyCastleInputStreamLoader.java | 67 ++ .../bouncycastle/BouncyCastleRandom.java | 88 ++ .../bouncycastle/BouncyCastleRandomFactory.java | 45 + .../security/eddsa/Ed25519PublicKeyDecoder.java | 107 ++ .../security/eddsa/EdDSASecurityProvider.java | 174 +++ .../util/security/eddsa/SignatureEd25519.java | 48 + .../java/org/apache/sshd/server/SshServer.java | 2 +- .../auth/hostbased/UserAuthHostBased.java | 2 +- .../sshd/server/config/keys/ServerIdentity.java | 2 +- .../org/apache/sshd/server/kex/DHGEXServer.java | 2 +- .../AbstractGeneratorHostKeyProvider.java | 2 +- .../java/org/apache/sshd/KeyReExchangeTest.java | 2 +- .../java/org/apache/sshd/agent/AgentTest.java | 2 +- .../client/config/keys/ClientIdentityTest.java | 2 +- .../org/apache/sshd/client/kex/KexTest.java | 2 +- .../sshd/common/cipher/BaseCipherTest.java | 2 +- .../config/keys/AuthorizedKeysTestSupport.java | 2 +- .../config/keys/BuiltinIdentitiesTest.java | 2 +- .../common/config/keys/KeyRandomArtTest.java | 2 +- .../common/config/keys/KeyUtilsCloneTest.java | 2 +- .../sshd/common/random/RandomFactoryTest.java | 2 +- .../signature/SignatureFactoriesTest.java | 2 +- .../sshd/common/signature/SignatureRSATest.java | 2 +- .../sshd/common/util/EDDSAProviderTest.java | 1 + .../sshd/common/util/SecurityUtilsTest.java | 1 + .../server/config/keys/ServerIdentityTest.java | 2 +- .../PEMGeneratorHostKeyProviderTest.java | 2 +- .../SimpleGeneratorHostKeyProviderTest.java | 2 +- .../server/subsystem/sftp/SshFsMounter.java | 2 +- .../java/org/apache/sshd/util/test/Utils.java | 2 +- 63 files changed, 1375 insertions(+), 1068 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/sshd-core/src/main/java/org/apache/sshd/agent/local/AgentImpl.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/agent/local/AgentImpl.java b/sshd-core/src/main/java/org/apache/sshd/agent/local/AgentImpl.java index 33e926d..b1c8602 100644 --- a/sshd-core/src/main/java/org/apache/sshd/agent/local/AgentImpl.java +++ b/sshd-core/src/main/java/org/apache/sshd/agent/local/AgentImpl.java @@ -38,8 +38,8 @@ import org.apache.sshd.common.signature.BuiltinSignatures; import org.apache.sshd.common.signature.Signature; import org.apache.sshd.common.util.GenericUtils; import org.apache.sshd.common.util.Pair; -import org.apache.sshd.common.util.SecurityUtils; import org.apache.sshd.common.util.ValidateUtils; +import org.apache.sshd.common.util.security.SecurityUtils; /** * A local SSH agent implementation http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/sshd-core/src/main/java/org/apache/sshd/client/SshClient.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/SshClient.java b/sshd-core/src/main/java/org/apache/sshd/client/SshClient.java index 7ae4a8f..49e3712 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/SshClient.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/SshClient.java @@ -114,12 +114,12 @@ import org.apache.sshd.common.scp.ScpFileOpener; import org.apache.sshd.common.session.helpers.AbstractSession; import org.apache.sshd.common.util.GenericUtils; import org.apache.sshd.common.util.OsUtils; -import org.apache.sshd.common.util.SecurityUtils; import org.apache.sshd.common.util.ValidateUtils; import org.apache.sshd.common.util.io.IoUtils; import org.apache.sshd.common.util.io.NoCloseInputStream; import org.apache.sshd.common.util.io.NoCloseOutputStream; import org.apache.sshd.common.util.net.SshdSocketAddress; +import org.apache.sshd.common.util.security.SecurityUtils; /** * <P> http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/sshd-core/src/main/java/org/apache/sshd/client/SshKeyScan.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/SshKeyScan.java b/sshd-core/src/main/java/org/apache/sshd/client/SshKeyScan.java index 37765ab..d75cfaf 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/SshKeyScan.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/SshKeyScan.java @@ -75,13 +75,13 @@ import org.apache.sshd.common.session.SessionListener; import org.apache.sshd.common.signature.BuiltinSignatures; import org.apache.sshd.common.signature.Signature; import org.apache.sshd.common.util.GenericUtils; -import org.apache.sshd.common.util.SecurityUtils; import org.apache.sshd.common.util.ValidateUtils; import org.apache.sshd.common.util.io.IoUtils; import org.apache.sshd.common.util.io.NoCloseInputStream; import org.apache.sshd.common.util.logging.LoggingUtils; import org.apache.sshd.common.util.logging.SimplifiedLog; import org.apache.sshd.common.util.net.SshdSocketAddress; +import org.apache.sshd.common.util.security.SecurityUtils; /** * A naive implementation of <A HREF="https://www.freebsd.org/cgi/man.cgi?query=ssh-keyscan&sektion=1">ssh-keyscan(1)</A> http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/sshd-core/src/main/java/org/apache/sshd/client/config/keys/ClientIdentity.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/config/keys/ClientIdentity.java b/sshd-core/src/main/java/org/apache/sshd/client/config/keys/ClientIdentity.java index 736d879..5802b2a 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/config/keys/ClientIdentity.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/config/keys/ClientIdentity.java @@ -48,7 +48,7 @@ import org.apache.sshd.common.util.io.IoUtils; * Provides keys loading capability from the user's keys folder - e.g., {@code id_rsa} * * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> - * @see org.apache.sshd.common.util.SecurityUtils#isBouncyCastleRegistered() + * @see org.apache.sshd.common.util.security.SecurityUtils#isBouncyCastleRegistered() */ public final class ClientIdentity { http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/sshd-core/src/main/java/org/apache/sshd/client/config/keys/ClientIdentityLoader.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/config/keys/ClientIdentityLoader.java b/sshd-core/src/main/java/org/apache/sshd/client/config/keys/ClientIdentityLoader.java index cb11e10..1f04e6f 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/config/keys/ClientIdentityLoader.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/config/keys/ClientIdentityLoader.java @@ -28,9 +28,9 @@ import java.security.GeneralSecurityException; import java.security.KeyPair; import org.apache.sshd.common.config.keys.FilePasswordProvider; -import org.apache.sshd.common.util.SecurityUtils; import org.apache.sshd.common.util.ValidateUtils; import org.apache.sshd.common.util.io.IoUtils; +import org.apache.sshd.common.util.security.SecurityUtils; /** * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/sshd-core/src/main/java/org/apache/sshd/client/kex/DHGEXClient.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/client/kex/DHGEXClient.java b/sshd-core/src/main/java/org/apache/sshd/client/kex/DHGEXClient.java index 533d971..5a93609 100644 --- a/sshd-core/src/main/java/org/apache/sshd/client/kex/DHGEXClient.java +++ b/sshd-core/src/main/java/org/apache/sshd/client/kex/DHGEXClient.java @@ -33,10 +33,10 @@ import org.apache.sshd.common.kex.KeyExchangeFactory; import org.apache.sshd.common.session.Session; import org.apache.sshd.common.signature.Signature; import org.apache.sshd.common.util.GenericUtils; -import org.apache.sshd.common.util.SecurityUtils; import org.apache.sshd.common.util.ValidateUtils; import org.apache.sshd.common.util.buffer.Buffer; import org.apache.sshd.common.util.buffer.ByteArrayBuffer; +import org.apache.sshd.common.util.security.SecurityUtils; /** http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/sshd-core/src/main/java/org/apache/sshd/common/BaseBuilder.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/BaseBuilder.java b/sshd-core/src/main/java/org/apache/sshd/common/BaseBuilder.java index 818a072..534ac0e 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/BaseBuilder.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/BaseBuilder.java @@ -43,7 +43,7 @@ import org.apache.sshd.common.session.ConnectionService; import org.apache.sshd.common.signature.BuiltinSignatures; import org.apache.sshd.common.signature.Signature; import org.apache.sshd.common.util.ObjectBuilder; -import org.apache.sshd.common.util.SecurityUtils; +import org.apache.sshd.common.util.security.SecurityUtils; import org.apache.sshd.server.forward.ForwardingFilter; import org.apache.sshd.server.forward.RejectAllForwardingFilter; http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/sshd-core/src/main/java/org/apache/sshd/common/cipher/BaseCipher.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/cipher/BaseCipher.java b/sshd-core/src/main/java/org/apache/sshd/common/cipher/BaseCipher.java index baaf3fc..c3d9426 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/cipher/BaseCipher.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/cipher/BaseCipher.java @@ -22,8 +22,8 @@ import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import org.apache.sshd.common.SshException; -import org.apache.sshd.common.util.SecurityUtils; import org.apache.sshd.common.util.ValidateUtils; +import org.apache.sshd.common.util.security.SecurityUtils; /** * Base class for all Cipher implementations delegating to the JCE provider. http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/sshd-core/src/main/java/org/apache/sshd/common/cipher/BaseRC4Cipher.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/cipher/BaseRC4Cipher.java b/sshd-core/src/main/java/org/apache/sshd/common/cipher/BaseRC4Cipher.java index 016ecee..2e3fc1e 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/cipher/BaseRC4Cipher.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/cipher/BaseRC4Cipher.java @@ -20,7 +20,7 @@ package org.apache.sshd.common.cipher; import javax.crypto.spec.SecretKeySpec; -import org.apache.sshd.common.util.SecurityUtils; +import org.apache.sshd.common.util.security.SecurityUtils; /** * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/sshd-core/src/main/java/org/apache/sshd/common/cipher/ECCurves.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/cipher/ECCurves.java b/sshd-core/src/main/java/org/apache/sshd/common/cipher/ECCurves.java index f2557ea..f452fee 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/cipher/ECCurves.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/cipher/ECCurves.java @@ -38,8 +38,8 @@ import org.apache.sshd.common.digest.BuiltinDigests; import org.apache.sshd.common.digest.Digest; import org.apache.sshd.common.digest.DigestFactory; import org.apache.sshd.common.util.GenericUtils; -import org.apache.sshd.common.util.SecurityUtils; import org.apache.sshd.common.util.ValidateUtils; +import org.apache.sshd.common.util.security.SecurityUtils; /** * Utilities for working with elliptic curves. http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/sshd-core/src/main/java/org/apache/sshd/common/config/keys/BuiltinIdentities.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/config/keys/BuiltinIdentities.java b/sshd-core/src/main/java/org/apache/sshd/common/config/keys/BuiltinIdentities.java index 8e7ca96..dd60cf1 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/config/keys/BuiltinIdentities.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/config/keys/BuiltinIdentities.java @@ -36,7 +36,7 @@ import java.util.Set; import org.apache.sshd.common.NamedResource; import org.apache.sshd.common.util.GenericUtils; -import org.apache.sshd.common.util.SecurityUtils; +import org.apache.sshd.common.util.security.SecurityUtils; /** * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/sshd-core/src/main/java/org/apache/sshd/common/config/keys/DSSPublicKeyEntryDecoder.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/config/keys/DSSPublicKeyEntryDecoder.java b/sshd-core/src/main/java/org/apache/sshd/common/config/keys/DSSPublicKeyEntryDecoder.java index 740510e..8384cac 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/config/keys/DSSPublicKeyEntryDecoder.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/config/keys/DSSPublicKeyEntryDecoder.java @@ -37,7 +37,7 @@ import java.util.Collections; import java.util.Objects; import org.apache.sshd.common.keyprovider.KeyPairProvider; -import org.apache.sshd.common.util.SecurityUtils; +import org.apache.sshd.common.util.security.SecurityUtils; /** * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/sshd-core/src/main/java/org/apache/sshd/common/config/keys/ECDSAPublicKeyEntryDecoder.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/config/keys/ECDSAPublicKeyEntryDecoder.java b/sshd-core/src/main/java/org/apache/sshd/common/config/keys/ECDSAPublicKeyEntryDecoder.java index 03607d4..9ffa705 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/config/keys/ECDSAPublicKeyEntryDecoder.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/config/keys/ECDSAPublicKeyEntryDecoder.java @@ -46,8 +46,8 @@ import java.util.Set; import org.apache.sshd.common.cipher.ECCurves; import org.apache.sshd.common.util.NumberUtils; -import org.apache.sshd.common.util.SecurityUtils; import org.apache.sshd.common.util.buffer.BufferUtils; +import org.apache.sshd.common.util.security.SecurityUtils; /** * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/sshd-core/src/main/java/org/apache/sshd/common/config/keys/IdentityUtils.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/config/keys/IdentityUtils.java b/sshd-core/src/main/java/org/apache/sshd/common/config/keys/IdentityUtils.java index c5267ad..1bd1cc7 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/config/keys/IdentityUtils.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/config/keys/IdentityUtils.java @@ -34,8 +34,8 @@ import java.util.TreeMap; import org.apache.sshd.common.keyprovider.KeyPairProvider; import org.apache.sshd.common.keyprovider.MappedKeyPairProvider; import org.apache.sshd.common.util.GenericUtils; -import org.apache.sshd.common.util.SecurityUtils; import org.apache.sshd.common.util.ValidateUtils; +import org.apache.sshd.common.util.security.SecurityUtils; /** * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/sshd-core/src/main/java/org/apache/sshd/common/config/keys/KeyUtils.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/config/keys/KeyUtils.java b/sshd-core/src/main/java/org/apache/sshd/common/config/keys/KeyUtils.java index 36acaf8..56f6318 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/config/keys/KeyUtils.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/config/keys/KeyUtils.java @@ -65,11 +65,11 @@ import org.apache.sshd.common.keyprovider.KeyPairProvider; import org.apache.sshd.common.util.GenericUtils; import org.apache.sshd.common.util.OsUtils; import org.apache.sshd.common.util.Pair; -import org.apache.sshd.common.util.SecurityUtils; import org.apache.sshd.common.util.ValidateUtils; import org.apache.sshd.common.util.buffer.Buffer; import org.apache.sshd.common.util.buffer.ByteArrayBuffer; import org.apache.sshd.common.util.io.IoUtils; +import org.apache.sshd.common.util.security.SecurityUtils; /** * Utility class for keys http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/sshd-core/src/main/java/org/apache/sshd/common/config/keys/PublicKeyEntryDecoder.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/config/keys/PublicKeyEntryDecoder.java b/sshd-core/src/main/java/org/apache/sshd/common/config/keys/PublicKeyEntryDecoder.java index cf62786..8d8f132 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/config/keys/PublicKeyEntryDecoder.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/config/keys/PublicKeyEntryDecoder.java @@ -248,5 +248,4 @@ public interface PublicKeyEntryDecoder<PUB extends PublicKey, PRV extends Privat | ((bytes[2] & 0xFF) << 8) | (bytes[3] & 0xFF); } - } http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/sshd-core/src/main/java/org/apache/sshd/common/config/keys/RSAPublicKeyDecoder.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/config/keys/RSAPublicKeyDecoder.java b/sshd-core/src/main/java/org/apache/sshd/common/config/keys/RSAPublicKeyDecoder.java index b25c45a..a76b4b3 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/config/keys/RSAPublicKeyDecoder.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/config/keys/RSAPublicKeyDecoder.java @@ -37,7 +37,7 @@ import java.util.Collections; import java.util.Objects; import org.apache.sshd.common.keyprovider.KeyPairProvider; -import org.apache.sshd.common.util.SecurityUtils; +import org.apache.sshd.common.util.security.SecurityUtils; /** * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/sshd-core/src/main/java/org/apache/sshd/common/digest/BaseDigest.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/digest/BaseDigest.java b/sshd-core/src/main/java/org/apache/sshd/common/digest/BaseDigest.java index ffab49d..baa64ee 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/digest/BaseDigest.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/digest/BaseDigest.java @@ -23,8 +23,8 @@ import java.util.Objects; import org.apache.sshd.common.util.GenericUtils; import org.apache.sshd.common.util.NumberUtils; -import org.apache.sshd.common.util.SecurityUtils; import org.apache.sshd.common.util.ValidateUtils; +import org.apache.sshd.common.util.security.SecurityUtils; /** * Base class for Digest algorithms based on the JCE provider. http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/sshd-core/src/main/java/org/apache/sshd/common/digest/DigestUtils.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/digest/DigestUtils.java b/sshd-core/src/main/java/org/apache/sshd/common/digest/DigestUtils.java index 8a4ee98..84caba1 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/digest/DigestUtils.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/digest/DigestUtils.java @@ -30,9 +30,9 @@ import org.apache.sshd.common.Factory; import org.apache.sshd.common.util.Base64; import org.apache.sshd.common.util.GenericUtils; import org.apache.sshd.common.util.NumberUtils; -import org.apache.sshd.common.util.SecurityUtils; import org.apache.sshd.common.util.ValidateUtils; import org.apache.sshd.common.util.buffer.BufferUtils; +import org.apache.sshd.common.util.security.SecurityUtils; /** * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/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 2f34fa8..068bd55 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 @@ -37,8 +37,8 @@ import org.apache.sshd.common.cipher.ECCurves; import org.apache.sshd.common.config.NamedResourceListParseResult; import org.apache.sshd.common.digest.BuiltinDigests; import org.apache.sshd.common.util.GenericUtils; -import org.apache.sshd.common.util.SecurityUtils; import org.apache.sshd.common.util.ValidateUtils; +import org.apache.sshd.common.util.security.SecurityUtils; /** * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/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 1f8908c..44fa725 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 @@ -30,7 +30,7 @@ import javax.crypto.spec.DHPublicKeySpec; import org.apache.sshd.common.Factory; import org.apache.sshd.common.digest.Digest; -import org.apache.sshd.common.util.SecurityUtils; +import org.apache.sshd.common.util.security.SecurityUtils; /** * Diffie-Hellman key generator. http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/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 3c4e8d9..a02d811 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 @@ -34,8 +34,8 @@ import org.apache.sshd.common.cipher.ECCurves; import org.apache.sshd.common.config.keys.ECDSAPublicKeyEntryDecoder; import org.apache.sshd.common.config.keys.KeyUtils; import org.apache.sshd.common.digest.Digest; -import org.apache.sshd.common.util.SecurityUtils; import org.apache.sshd.common.util.ValidateUtils; +import org.apache.sshd.common.util.security.SecurityUtils; /** * Elliptic Curve Diffie-Hellman key agreement. http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/sshd-core/src/main/java/org/apache/sshd/common/mac/BaseMac.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/mac/BaseMac.java b/sshd-core/src/main/java/org/apache/sshd/common/mac/BaseMac.java index 3210cf6..e1681d4 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/mac/BaseMac.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/mac/BaseMac.java @@ -20,7 +20,7 @@ package org.apache.sshd.common.mac; import javax.crypto.spec.SecretKeySpec; -import org.apache.sshd.common.util.SecurityUtils; +import org.apache.sshd.common.util.security.SecurityUtils; /** * Base class for <code>Mac</code> implementations based on the JCE provider. http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/sshd-core/src/main/java/org/apache/sshd/common/signature/AbstractSignature.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/signature/AbstractSignature.java b/sshd-core/src/main/java/org/apache/sshd/common/signature/AbstractSignature.java index f82cee9..d2849da 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/signature/AbstractSignature.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/signature/AbstractSignature.java @@ -27,9 +27,9 @@ import java.util.Objects; import org.apache.sshd.common.util.NumberUtils; import org.apache.sshd.common.util.Pair; -import org.apache.sshd.common.util.SecurityUtils; import org.apache.sshd.common.util.ValidateUtils; import org.apache.sshd.common.util.buffer.BufferUtils; +import org.apache.sshd.common.util.security.SecurityUtils; /** * Useful base class for {@link Signature} implementation http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/sshd-core/src/main/java/org/apache/sshd/common/signature/BuiltinSignatures.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/signature/BuiltinSignatures.java b/sshd-core/src/main/java/org/apache/sshd/common/signature/BuiltinSignatures.java index 0a53596..a938acc 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/signature/BuiltinSignatures.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/signature/BuiltinSignatures.java @@ -38,8 +38,8 @@ import org.apache.sshd.common.cipher.ECCurves; import org.apache.sshd.common.config.NamedFactoriesListParseResult; import org.apache.sshd.common.keyprovider.KeyPairProvider; import org.apache.sshd.common.util.GenericUtils; -import org.apache.sshd.common.util.SecurityUtils; import org.apache.sshd.common.util.ValidateUtils; +import org.apache.sshd.common.util.security.SecurityUtils; /** * Provides easy access to the currently implemented signatures http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/sshd-core/src/main/java/org/apache/sshd/common/util/SecurityUtils.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/SecurityUtils.java b/sshd-core/src/main/java/org/apache/sshd/common/util/SecurityUtils.java deleted file mode 100644 index 2175aa1..0000000 --- a/sshd-core/src/main/java/org/apache/sshd/common/util/SecurityUtils.java +++ /dev/null @@ -1,1018 +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; - -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.math.BigInteger; -import java.nio.charset.StandardCharsets; -import java.nio.file.Path; -import java.security.GeneralSecurityException; -import java.security.InvalidKeyException; -import java.security.Key; -import java.security.KeyFactory; -import java.security.KeyPair; -import java.security.KeyPairGenerator; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.security.NoSuchProviderException; -import java.security.PrivateKey; -import java.security.Provider; -import java.security.PublicKey; -import java.security.SecureRandom; -import java.security.Signature; -import java.security.cert.CertificateFactory; -import java.util.Arrays; -import java.util.Collections; -import java.util.Objects; -import java.util.Set; -import java.util.TreeSet; -import java.util.concurrent.Callable; -import java.util.concurrent.atomic.AtomicInteger; - -import javax.crypto.Cipher; -import javax.crypto.KeyAgreement; -import javax.crypto.Mac; -import javax.crypto.spec.DHParameterSpec; - -import net.i2p.crypto.eddsa.EdDSAKey; -import net.i2p.crypto.eddsa.EdDSAPrivateKey; -import net.i2p.crypto.eddsa.EdDSAPublicKey; -import net.i2p.crypto.eddsa.spec.EdDSANamedCurveTable; -import net.i2p.crypto.eddsa.spec.EdDSAParameterSpec; -import net.i2p.crypto.eddsa.spec.EdDSAPrivateKeySpec; -import net.i2p.crypto.eddsa.spec.EdDSAPublicKeySpec; - -import org.apache.sshd.common.config.keys.AbstractPublicKeyEntryDecoder; -import org.apache.sshd.common.config.keys.FilePasswordProvider; -import org.apache.sshd.common.config.keys.KeyUtils; -import org.apache.sshd.common.config.keys.PublicKeyEntryDecoder; -import org.apache.sshd.common.keyprovider.AbstractClassLoadableResourceKeyPairProvider; -import org.apache.sshd.common.keyprovider.AbstractFileKeyPairProvider; -import org.apache.sshd.common.keyprovider.KeyPairProvider; -import org.apache.sshd.common.random.AbstractRandom; -import org.apache.sshd.common.random.AbstractRandomFactory; -import org.apache.sshd.common.random.JceRandomFactory; -import org.apache.sshd.common.random.Random; -import org.apache.sshd.common.random.RandomFactory; -import org.apache.sshd.common.signature.AbstractSignature; -import org.apache.sshd.common.util.buffer.Buffer; -import org.apache.sshd.common.util.threads.ThreadUtils; -import org.apache.sshd.server.keyprovider.AbstractGeneratorHostKeyProvider; -import org.bouncycastle.crypto.prng.RandomGenerator; -import org.bouncycastle.crypto.prng.VMPCRandomGenerator; -import org.bouncycastle.jce.provider.BouncyCastleProvider; -import org.bouncycastle.openssl.PEMDecryptorProvider; -import org.bouncycastle.openssl.PEMEncryptedKeyPair; -import org.bouncycastle.openssl.PEMKeyPair; -import org.bouncycastle.openssl.PEMParser; -import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter; -import org.bouncycastle.openssl.jcajce.JcePEMDecryptorProviderBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Specific security providers related code - * - * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> - */ -public final class SecurityUtils { - /** - * Bouncycastle JCE provider name - */ - public static final String BOUNCY_CASTLE = "BC"; - - /** - * EDDSA support - */ - public static final String EDDSA = "EdDSA"; - - /** - * System property used to configure the value for the maximum supported Diffie-Hellman - * Group Exchange key size. If not set, then an internal auto-discovery mechanism is employed. - * If set to negative value then Diffie-Hellman Group Exchange is disabled. If set to a - * negative value then Diffie-Hellman Group Exchange is disabled - */ - public static final String MAX_DHGEX_KEY_SIZE_PROP = "org.apache.sshd.maxDHGexKeySize"; - - /** - * The min. key size value used for testing whether Diffie-Hellman Group Exchange - * is supported or not. According to <A HREF="https://tools.ietf.org/html/rfc4419">RFC 4419</A> - * section 3: "Servers and clients SHOULD support groups with a modulus length of k - * bits, where 1024 <= k <= 8192". - * </code> - */ - public static final int MIN_DHGEX_KEY_SIZE = 1024; - // Keys of size > 1024 are not support by default with JCE - public static final int DEFAULT_DHGEX_KEY_SIZE = MIN_DHGEX_KEY_SIZE; - public static final int PREFERRED_DHGEX_KEY_SIZE = 4096; - public static final int MAX_DHGEX_KEY_SIZE = 8192; - - /** - * System property used to control whether to automatically register the - * {@code Bouncyastle} JCE provider - */ - public static final String REGISTER_BOUNCY_CASTLE_PROP = "org.apache.sshd.registerBouncyCastle"; - - /** - * System property used to control whether Elliptic Curves are supported or not. - * If not set then the support is auto-detected. <B>Note:</B> if set to {@code true} - * it is up to the user to make sure that indeed there is a provider for them - */ - public static final String ECC_SUPPORTED_PROP = "org.apache.sshd.eccSupport"; - - /** - * System property used to decide whether EDDSA curves are supported or not - * (in addition or even in spite of {@link #isEDDSACurveSupported()}). If not - * set or set to {@code true}, then the existence of the optional support classes - * determines the support. - */ - public static final String EDDSA_SUPPORTED_PROP = "org.apache.sshd.eddsaSupport"; - - private static final AtomicInteger MAX_DHG_KEY_SIZE_HOLDER = new AtomicInteger(0); - - private static final Set<String> REGISTERED_PROVIDERS = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); - - private static String defaultProvider; - private static Boolean registerBouncyCastle; - private static boolean registrationDone; - private static Boolean hasEcc; - private static Boolean eddsaSupported; - - private SecurityUtils() { - throw new UnsupportedOperationException("No instance"); - } - - /** - * @return {@code true} if Elliptic Curve Cryptography is supported - * @see #ECC_SUPPORTED_PROP - */ - public static boolean hasEcc() { - if (hasEcc == null) { - String propValue = System.getProperty(ECC_SUPPORTED_PROP); - if (GenericUtils.isEmpty(propValue)) { - try { - getKeyPairGenerator(KeyUtils.EC_ALGORITHM); - hasEcc = Boolean.TRUE; - } catch (Throwable t) { - hasEcc = Boolean.FALSE; - } - } else { - Logger logger = LoggerFactory.getLogger(SecurityUtils.class); - logger.info("Override ECC support value: " + propValue); - hasEcc = Boolean.valueOf(propValue); - } - } - - return hasEcc; - } - - /** - * @return {@code true} if Diffie-Hellman Group Exchange is supported - * @see #getMaxDHGroupExchangeKeySize() - */ - public static boolean isDHGroupExchangeSupported() { - return getMaxDHGroupExchangeKeySize() > 0; - } - - /** - * @param keySize The expected key size - * @return {@code true} if Oakely Diffie-Hellman Group Exchange is supported - * for the specified key size - * @see #getMaxDHGroupExchangeKeySize() - */ - public static boolean isDHOakelyGroupSupported(int keySize) { - return getMaxDHGroupExchangeKeySize() >= keySize; - } - - /** - * @return The maximum supported Diffie-Hellman Group Exchange key size, - * or non-positive if not supported - */ - public static int getMaxDHGroupExchangeKeySize() { - int maxSupportedKeySize; - synchronized (MAX_DHG_KEY_SIZE_HOLDER) { - maxSupportedKeySize = MAX_DHG_KEY_SIZE_HOLDER.get(); - if (maxSupportedKeySize != 0) { // 1st time we are called ? - return maxSupportedKeySize; - } - - String propValue = System.getProperty(MAX_DHGEX_KEY_SIZE_PROP); - if (GenericUtils.isEmpty(propValue)) { - maxSupportedKeySize = -1; - // Go down from max. to min. to ensure we stop at 1st maximum value success - for (int testKeySize = MAX_DHGEX_KEY_SIZE; testKeySize >= MIN_DHGEX_KEY_SIZE; testKeySize -= 1024) { - if (isDHGroupExchangeSupported(testKeySize)) { - maxSupportedKeySize = testKeySize; - break; - } - } - } else { - Logger logger = LoggerFactory.getLogger(SecurityUtils.class); - logger.info("Override max. DH group exchange key size: " + propValue); - maxSupportedKeySize = Integer.parseInt(propValue); - // negative is OK - means user wants to disable DH group exchange - ValidateUtils.checkTrue(maxSupportedKeySize != 0, - "Configured " + MAX_DHGEX_KEY_SIZE_PROP + " value must be non-zero: %d", maxSupportedKeySize); - } - - MAX_DHG_KEY_SIZE_HOLDER.set(maxSupportedKeySize); - } - - return maxSupportedKeySize; - } - - /** - * Set programmatically the reported value for {@link #getMaxDHGroupExchangeKeySize()} - * @param keySize The reported key size - if zero, then it will be auto-detected, if - * negative then DH group exchange will be disabled - */ - public static void setMaxDHGroupExchangeKeySize(int keySize) { - synchronized (MAX_DHG_KEY_SIZE_HOLDER) { - MAX_DHG_KEY_SIZE_HOLDER.set(keySize); - } - } - - public static boolean isDHGroupExchangeSupported(int maxKeySize) { - ValidateUtils.checkTrue(maxKeySize > Byte.SIZE, "Invalid max. key size: %d", maxKeySize); - - try { - BigInteger r = new BigInteger("0").setBit(maxKeySize - 1); - DHParameterSpec dhSkipParamSpec = new DHParameterSpec(r, r); - KeyPairGenerator kpg = getKeyPairGenerator("DH"); - kpg.initialize(dhSkipParamSpec); - return true; - } catch (GeneralSecurityException t) { - return false; - } - } - - public static synchronized void setRegisterBouncyCastle(boolean registerBouncyCastle) { - SecurityUtils.registerBouncyCastle = registerBouncyCastle; - registrationDone = false; - } - - public static synchronized String getDefaultProvider() { - return defaultProvider; - } - - public static synchronized void setDefaultProvider(String provider) { - defaultProvider = provider; - registrationDone = false; - } - - /** - * @return A <U>copy</U> of the currently registered security providers - */ - public static synchronized Set<String> getRegisteredProviders() { - register(); - - // returns a COPY of the providers in order to avoid modifications - synchronized (REGISTERED_PROVIDERS) { - return new TreeSet<>(REGISTERED_PROVIDERS); - } - } - - public static synchronized boolean isBouncyCastleRegistered() { - register(); - return isBouncyCastleListed(); - } - - private static boolean isBouncyCastleListed() { - return isProviderRegistered(BOUNCY_CASTLE); - } - - private static boolean isEDDSAListed() { - return isProviderRegistered(EDDSA); - } - - private static boolean isProviderRegistered(String provider) { - Objects.requireNonNull(provider, "No provider name specified"); - synchronized (REGISTERED_PROVIDERS) { - return REGISTERED_PROVIDERS.contains(provider); - } - } - - @SuppressWarnings("synthetic-access") - private static void register() { - if (!registrationDone) { - if (registerBouncyCastle == null) { - String propValue = System.getProperty(REGISTER_BOUNCY_CASTLE_PROP); - if (!GenericUtils.isEmpty(propValue)) { - Logger logger = LoggerFactory.getLogger(SecurityUtils.class); - logger.info("Override BouncyCastle registration value: " + propValue); - registerBouncyCastle = Boolean.valueOf(propValue); - } - } - - if ((defaultProvider == null) && (!isBouncyCastleListed()) && ((registerBouncyCastle == null) || registerBouncyCastle)) { - // Use an inner class to avoid a strong dependency from SshServer on BouncyCastle - try { - new BouncyCastleRegistration().call(); - defaultProvider = BOUNCY_CASTLE; - } catch (Throwable t) { - Logger logger = LoggerFactory.getLogger(SecurityUtils.class); - if (registerBouncyCastle == null) { - logger.info("BouncyCastle not registered, using the default JCE provider"); - } else { - logger.error("Failed {} to register BouncyCastle as a JCE provider: {}", t.getClass().getSimpleName(), t.getMessage()); - throw new RuntimeException("Failed to register BouncyCastle as a JCE provider", t); - } - } - } - - if ((!isEDDSAListed()) && isEDDSACurveSupported()) { - try { - new EdDSARegistration().call(); - } catch (Throwable t) { - Logger logger = LoggerFactory.getLogger(SecurityUtils.class); - logger.error("Failed {} to register " + EDDSA + " as a JCE provider: {}", t.getClass().getSimpleName(), t.getMessage()); - throw new RuntimeException("Failed to register " + EDDSA + " as a JCE provider", t); - } - } - - registrationDone = true; - } - } - - ///////////////// Bouncycastle specific implementations ////////////////// - - private static class BouncyCastleRegistration implements Callable<Void> { - @SuppressWarnings("synthetic-access") - @Override - public Void call() throws Exception { - // no need for a logger specific to this class since this is a one-time call - Logger logger = LoggerFactory.getLogger(SecurityUtils.class); - if (java.security.Security.getProvider(BOUNCY_CASTLE) == null) { - logger.info("Trying to register BouncyCastle as a JCE provider"); - java.security.Security.addProvider(new BouncyCastleProvider()); - MessageDigest.getInstance("MD5", BOUNCY_CASTLE); - KeyAgreement.getInstance("DH", BOUNCY_CASTLE); - logger.info("Registration succeeded"); - } else { - logger.info("BouncyCastle already registered as a JCE provider"); - } - - synchronized (REGISTERED_PROVIDERS) { - REGISTERED_PROVIDERS.add(BOUNCY_CASTLE); - } - return null; - } - } - - /* -------------------------------------------------------------------- */ - - private interface BouncyCastleInputStreamLoader { - static KeyPair loadKeyPair(String resourceKey, InputStream inputStream, FilePasswordProvider provider) - throws IOException, GeneralSecurityException { - try (PEMParser r = new PEMParser(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) { - Object o = r.readObject(); - - JcaPEMKeyConverter pemConverter = new JcaPEMKeyConverter(); - pemConverter.setProvider(SecurityUtils.BOUNCY_CASTLE); - if (o instanceof PEMEncryptedKeyPair) { - ValidateUtils.checkNotNull(provider, "No password provider for resource=%s", resourceKey); - - String password = ValidateUtils.checkNotNullAndNotEmpty(provider.getPassword(resourceKey), "No password provided for resource=%s", resourceKey); - JcePEMDecryptorProviderBuilder decryptorBuilder = new JcePEMDecryptorProviderBuilder(); - PEMDecryptorProvider pemDecryptor = decryptorBuilder.build(password.toCharArray()); - o = ((PEMEncryptedKeyPair) o).decryptKeyPair(pemDecryptor); - } - - if (o instanceof PEMKeyPair) { - return pemConverter.getKeyPair((PEMKeyPair) o); - } else if (o instanceof KeyPair) { - return (KeyPair) o; - } else { - throw new IOException("Failed to read " + resourceKey + " - unknown result object: " + o); - } - } - } - } - - /** - * @param resourceKey An identifier of the key being loaded - used as - * argument to the {@link FilePasswordProvider#getPassword(String)} - * invocation - * @param inputStream The {@link InputStream} for the <U>private</U> key - * @param provider A {@link FilePasswordProvider} - may be {@code null} - * if the loaded key is <U>guaranteed</U> not to be encrypted - * @return The loaded {@link KeyPair} - * @throws IOException If failed to read/parse the input stream - * @throws GeneralSecurityException If failed to generate the keys - specifically, - * {@link NoSuchProviderException} is thrown also if {@link #isBouncyCastleRegistered()} - * is {@code false} - */ - public static KeyPair loadKeyPairIdentity(String resourceKey, InputStream inputStream, FilePasswordProvider provider) - throws IOException, GeneralSecurityException { - if (!isBouncyCastleRegistered()) { - throw new NoSuchProviderException("BouncyCastle not registered"); - } - - return BouncyCastleInputStreamLoader.loadKeyPair(resourceKey, inputStream, provider); - } - - /* -------------------------------------------------------------------- */ - - // use a separate class in order to avoid direct dependency - private static final class BouncyCastleFileKeyPairProvider extends AbstractFileKeyPairProvider { - private BouncyCastleFileKeyPairProvider() { - ValidateUtils.checkTrue(isBouncyCastleRegistered(), "BouncyCastle not registered"); - } - - @Override - protected KeyPair doLoadKey(String resourceKey, InputStream inputStream, FilePasswordProvider provider) - throws IOException, GeneralSecurityException { - return BouncyCastleInputStreamLoader.loadKeyPair(resourceKey, inputStream, provider); - } - } - - @SuppressWarnings("synthetic-access") - public static AbstractFileKeyPairProvider createFileKeyPairProvider() { - return new BouncyCastleFileKeyPairProvider(); - } - - /* -------------------------------------------------------------------- */ - - private static final class BouncyCastleClassLoadableResourceKeyPairProvider extends AbstractClassLoadableResourceKeyPairProvider { - private BouncyCastleClassLoadableResourceKeyPairProvider() { - ValidateUtils.checkTrue(isBouncyCastleRegistered(), "BouncyCastle not registered"); - } - - @Override - protected KeyPair doLoadKey(String resourceKey, InputStream inputStream, FilePasswordProvider provider) - throws IOException, GeneralSecurityException { - return BouncyCastleInputStreamLoader.loadKeyPair(resourceKey, inputStream, provider); - } - } - - @SuppressWarnings("synthetic-access") - public static AbstractClassLoadableResourceKeyPairProvider createClassLoadableResourceKeyPairProvider() { - return new BouncyCastleClassLoadableResourceKeyPairProvider(); - } - - /* -------------------------------------------------------------------- */ - - private static final class BouncyCastleGeneratorHostKeyProvider extends AbstractGeneratorHostKeyProvider { - private BouncyCastleGeneratorHostKeyProvider(Path path) { - ValidateUtils.checkTrue(isBouncyCastleRegistered(), "BouncyCastle not registered"); - setPath(path); - } - - @Override - protected KeyPair doReadKeyPair(String resourceKey, InputStream inputStream) throws IOException, GeneralSecurityException { - return BouncyCastleInputStreamLoader.loadKeyPair(resourceKey, inputStream, null); - } - - @SuppressWarnings("deprecation") - @Override - protected void doWriteKeyPair(String resourceKey, KeyPair kp, OutputStream outputStream) throws IOException, GeneralSecurityException { - try (org.bouncycastle.openssl.PEMWriter w = - new org.bouncycastle.openssl.PEMWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8))) { - w.writeObject(kp); - w.flush(); - } - } - } - - @SuppressWarnings("synthetic-access") - public static AbstractGeneratorHostKeyProvider createGeneratorHostKeyProvider(Path path) { - return new BouncyCastleGeneratorHostKeyProvider(path); - } - - /* -------------------------------------------------------------------- */ - - /** - * Named factory for the BouncyCastle <code>Random</code> - */ - public static final class BouncyCastleRandomFactory extends AbstractRandomFactory { - public static final String NAME = "bouncycastle"; - private static final BouncyCastleRandomFactory INSTANCE = new BouncyCastleRandomFactory(); - - public BouncyCastleRandomFactory() { - super(NAME); - } - - @Override - public boolean isSupported() { - return isBouncyCastleRegistered(); - } - - @Override - public Random create() { - return new BouncyCastleRandom(); - } - } - - /** - * BouncyCastle <code>Random</code>. - * This pseudo random number generator uses the a very fast PRNG from BouncyCastle. - * The JRE random will be used when creating a new generator to add some random - * data to the seed. - * - * @author <a href="mailto:[email protected]">Apache MINA SSHD Project</a> - */ - public static final class BouncyCastleRandom extends AbstractRandom { - public static final String NAME = BOUNCY_CASTLE; - private final RandomGenerator random; - - BouncyCastleRandom() { - ValidateUtils.checkTrue(isBouncyCastleRegistered(), "BouncyCastle not registered"); - this.random = new VMPCRandomGenerator(); - byte[] seed = new SecureRandom().generateSeed(8); - this.random.addSeedMaterial(seed); - } - - @Override - public String getName() { - return NAME; - } - - @Override - public void fill(byte[] bytes, int start, int len) { - this.random.nextBytes(bytes, start, len); - } - - /** - * Returns a pseudo-random uniformly distributed {@code int} - * in the half-open range [0, n). - */ - @Override - public int random(int n) { - ValidateUtils.checkTrue(n > 0, "Limit must be positive: %d", n); - if ((n & -n) == n) { - return (int) ((n * (long) next(31)) >> 31); - } - - int bits; - int val; - do { - bits = next(31); - val = bits % n; - } while (bits - val + (n - 1) < 0); - return val; - } - - private int next(int numBits) { - int bytes = (numBits + 7) / 8; - byte next[] = new byte[bytes]; - int ret = 0; - random.nextBytes(next); - for (int i = 0; i < bytes; i++) { - ret = (next[i] & 0xFF) | (ret << 8); - } - return ret >>> (bytes * 8 - numBits); - } - } - - /** - * @return If {@link #isBouncyCastleRegistered()} then a {@link BouncyCastleRandomFactory} - * instance, otherwise a {@link JceRandomFactory} one - */ - @SuppressWarnings("synthetic-access") - public static RandomFactory getRandomFactory() { - if (isBouncyCastleRegistered()) { - return BouncyCastleRandomFactory.INSTANCE; - } else { - return JceRandomFactory.INSTANCE; - } - } - - ///////////////////////////// ED25519 support /////////////////////////////// - - /** - * @return {@code true} if EDDSA curves (e.g., {@code ed25519}) are supported - */ - public static boolean isEDDSACurveSupported() { - if (eddsaSupported == null) { - String propValue = System.getProperty(EDDSA_SUPPORTED_PROP); - if (GenericUtils.isEmpty(propValue) || "true".equals(propValue)) { - ClassLoader cl = ThreadUtils.resolveDefaultClassLoader(SecurityUtils.class); - eddsaSupported = ReflectionUtils.isClassAvailable(cl, "net.i2p.crypto.eddsa.EdDSAKey"); - } else { - eddsaSupported = Boolean.FALSE; - Logger logger = LoggerFactory.getLogger(SecurityUtils.class); - logger.info("Override EDDSA support value: " + propValue); - } - } - - return eddsaSupported; - } - - /* -------------------------------------------------------------------- */ - - // see https://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/HowToImplAProvider.html - private static class EdDSASecurityProvider extends Provider { - private static final long serialVersionUID = -6183277432144104981L; - - EdDSASecurityProvider() { - super(EDDSA, 0.1, "net.i2p security provider wrapper"); - - put("KeyPairGenerator." + EDDSA, "net.i2p.crypto.eddsa.KeyPairGenerator"); - put("KeyFactory." + EDDSA, "net.i2p.crypto.eddsa.KeyFactory"); - put("Signature." + EdDSANamedCurveTable.CURVE_ED25519_SHA512, "net.i2p.crypto.eddsa.EdDSAEngine"); - } - - private static boolean compareEDDSAPPublicKeys(PublicKey k1, PublicKey k2) { - if ((k1 instanceof EdDSAPublicKey) && (k2 instanceof EdDSAPublicKey)) { - if (Objects.equals(k1, k2)) { - return true; - } else if (k1 == null || k2 == null) { - return false; // both null is covered by Objects#equals - } - - EdDSAPublicKey ed1 = (EdDSAPublicKey) k1; - EdDSAPublicKey ed2 = (EdDSAPublicKey) k2; - return Arrays.equals(ed1.getAbyte(), ed2.getAbyte()) - && compareEDDSAKeyParams(ed1.getParams(), ed2.getParams()); - } - - return false; - } - - private static boolean compareEDDSAPrivateKeys(PrivateKey k1, PrivateKey k2) { - if (!isEDDSACurveSupported()) { - return false; - } - - if ((k1 instanceof EdDSAPrivateKey) && (k2 instanceof EdDSAPrivateKey)) { - if (Objects.equals(k1, k2)) { - return true; - } else if (k1 == null || k2 == null) { - return false; // both null is covered by Objects#equals - } - - EdDSAPrivateKey ed1 = (EdDSAPrivateKey) k1; - EdDSAPrivateKey ed2 = (EdDSAPrivateKey) k2; - return Arrays.equals(ed1.getSeed(), ed2.getSeed()) - && compareEDDSAKeyParams(ed1.getParams(), ed2.getParams()); - } - - return false; - } - - private static boolean compareEDDSAKeyParams(EdDSAParameterSpec s1, EdDSAParameterSpec s2) { - if (Objects.equals(s1, s2)) { - return true; - } else if (s1 == null || s2 == null) { - return false; // both null is covered by Objects#equals - } else { - return Objects.equals(s1.getHashAlgorithm(), s2.getHashAlgorithm()) - && Objects.equals(s1.getCurve(), s2.getCurve()) - && Objects.equals(s1.getB(), s2.getB()); - } - } - - private static PublicKey generateEDDSAPublicKey(byte[] seed) throws GeneralSecurityException { - EdDSAParameterSpec params = EdDSANamedCurveTable.getByName(EdDSANamedCurveTable.CURVE_ED25519_SHA512); - EdDSAPublicKeySpec keySpec = new EdDSAPublicKeySpec(seed, params); - KeyFactory factory = SecurityUtils.getKeyFactory(EDDSA); - return factory.generatePublic(keySpec); - } - - private static <B extends Buffer> B putRawEDDSAPublicKey(B buffer, PublicKey key) { - EdDSAPublicKey edKey = ValidateUtils.checkInstanceOf(key, EdDSAPublicKey.class, "Not an EDDSA public key: %s", key); - byte[] seed = Ed25519PublicKeyDecoder.getSeedValue(edKey); - ValidateUtils.checkNotNull(seed, "No seed extracted from key: %s", edKey.getA()); - buffer.putString(KeyPairProvider.SSH_ED25519); - buffer.putBytes(seed); - return buffer; - } - - private static <B extends Buffer> B putEDDSAKeyPair(B buffer, PublicKey pubKey, PrivateKey prvKey) { - ValidateUtils.checkInstanceOf(pubKey, EdDSAPublicKey.class, "Not an EDDSA public key: %s", pubKey); - ValidateUtils.checkInstanceOf(prvKey, EdDSAPrivateKey.class, "Not an EDDSA private key: %s", prvKey); - throw new UnsupportedOperationException("Full SSHD-440 implementation N/A"); - } - } - - /* -------------------------------------------------------------------- */ - - private static class EdDSARegistration implements Callable<Void> { - EdDSARegistration() { - super(); - } - - @SuppressWarnings("synthetic-access") - @Override - public Void call() throws Exception { - // no need for a logger specific to this class since this is a one-time call - Logger logger = LoggerFactory.getLogger(SecurityUtils.class); - if (java.security.Security.getProvider(EDDSA) == null) { - logger.info("Trying to register " + EDDSA + " as a JCE provider"); - java.security.Security.addProvider(new EdDSASecurityProvider()); - KeyFactory.getInstance(EDDSA, EDDSA); - logger.info("Registration succeeded"); - } else { - logger.info(EDDSA + " already registered as a JCE provider"); - } - - synchronized (REGISTERED_PROVIDERS) { - REGISTERED_PROVIDERS.add(EDDSA); - } - - return null; - } - } - - /* -------------------------------------------------------------------- */ - - private static final class Ed25519PublicKeyDecoder extends AbstractPublicKeyEntryDecoder<EdDSAPublicKey, EdDSAPrivateKey> { - private static final Ed25519PublicKeyDecoder INSTANCE = new Ed25519PublicKeyDecoder(); - - private Ed25519PublicKeyDecoder() { - super(EdDSAPublicKey.class, EdDSAPrivateKey.class, Collections.unmodifiableList(Collections.singletonList(KeyPairProvider.SSH_ED25519))); - } - - @Override - public EdDSAPublicKey clonePublicKey(EdDSAPublicKey key) throws GeneralSecurityException { - if (key == null) { - return null; - } else { - return generatePublicKey(new EdDSAPublicKeySpec(key.getA(), key.getParams())); - } - } - - @Override - public EdDSAPrivateKey clonePrivateKey(EdDSAPrivateKey key) throws GeneralSecurityException { - if (key == null) { - return null; - } else { - return generatePrivateKey(new EdDSAPrivateKeySpec(key.getSeed(), key.getParams())); - } - } - - @Override - public KeyPairGenerator getKeyPairGenerator() throws GeneralSecurityException { - return SecurityUtils.getKeyPairGenerator(EDDSA); - } - - @Override - public String encodePublicKey(OutputStream s, EdDSAPublicKey key) throws IOException { - Objects.requireNonNull(key, "No public key provided"); - PublicKeyEntryDecoder.encodeString(s, KeyPairProvider.SSH_ED25519); - byte[] seed = getSeedValue(key); - PublicKeyEntryDecoder.writeRLEBytes(s, seed); - return KeyPairProvider.SSH_ED25519; - } - - @Override - public KeyFactory getKeyFactoryInstance() throws GeneralSecurityException { - return SecurityUtils.getKeyFactory(EDDSA); - } - - @Override - public EdDSAPublicKey decodePublicKey(String keyType, InputStream keyData) throws IOException, GeneralSecurityException { - byte[] seed = PublicKeyEntryDecoder.readRLEBytes(keyData); - return EdDSAPublicKey.class.cast(SecurityUtils.generateEDDSAPublicKey(keyType, seed)); - } - - public static byte[] getSeedValue(EdDSAPublicKey key) { - // a bit of reverse-engineering on the EdDSAPublicKeySpec - return (key == null) ? null : key.getAbyte(); - } - - private static EdDSAPublicKey fromPrivateKey(EdDSAPrivateKey prvKey) throws GeneralSecurityException { - if (prvKey == null) { - return null; - } - - EdDSAPublicKeySpec keySpec = new EdDSAPublicKeySpec(prvKey.getSeed(), prvKey.getParams()); - KeyFactory factory = SecurityUtils.getKeyFactory(EDDSA); - return EdDSAPublicKey.class.cast(factory.generatePublic(keySpec)); - } - } - - @SuppressWarnings("synthetic-access") - public static PublicKeyEntryDecoder<? extends PublicKey, ? extends PrivateKey> getEDDSAPublicKeyEntryDecoder() { - if (!isEDDSACurveSupported()) { - throw new UnsupportedOperationException(EDDSA + " provider N/A"); - } - - return Ed25519PublicKeyDecoder.INSTANCE; - } - - /* -------------------------------------------------------------------- */ - - private static final class SignatureEd25519 extends AbstractSignature { - private SignatureEd25519() { - super(EdDSANamedCurveTable.CURVE_ED25519_SHA512); - } - - @Override - public boolean verify(byte[] sig) throws Exception { - byte[] data = sig; - Pair<String, byte[]> encoding = extractEncodedSignature(data); - if (encoding != null) { - String keyType = encoding.getFirst(); - ValidateUtils.checkTrue(KeyPairProvider.SSH_ED25519.equals(keyType), "Mismatched key type: %s", keyType); - data = encoding.getSecond(); - } - - return doVerify(data); - } - } - - @SuppressWarnings("synthetic-access") - public static org.apache.sshd.common.signature.Signature getEDDSASigner() { - if (isEDDSACurveSupported()) { - return new SignatureEd25519(); - } - - throw new UnsupportedOperationException(EDDSA + " Signer not available"); - } - - /* -------------------------------------------------------------------- */ - - public static int getEDDSAKeySize(Key key) { - return (key instanceof EdDSAKey) ? 256 : -1; - } - - public static Class<? extends PublicKey> getEDDSAPublicKeyType() { - return isEDDSACurveSupported() ? EdDSAPublicKey.class : PublicKey.class; - } - - public static Class<? extends PrivateKey> getEDDSAPrivateKeyType() { - return isEDDSACurveSupported() ? EdDSAPrivateKey.class : PrivateKey.class; - } - - @SuppressWarnings("synthetic-access") - public static boolean compareEDDSAPPublicKeys(PublicKey k1, PublicKey k2) { - return isEDDSACurveSupported() ? EdDSASecurityProvider.compareEDDSAPPublicKeys(k1, k2) : false; - } - - @SuppressWarnings("synthetic-access") - public static boolean compareEDDSAPrivateKeys(PrivateKey k1, PrivateKey k2) { - return isEDDSACurveSupported() ? EdDSASecurityProvider.compareEDDSAPrivateKeys(k1, k2) : false; - } - - /* -------------------------------------------------------------------- */ - - @SuppressWarnings("synthetic-access") - public static PublicKey generateEDDSAPublicKey(String keyType, byte[] seed) throws GeneralSecurityException { - if (!KeyPairProvider.SSH_ED25519.equals(keyType)) { - throw new InvalidKeyException("Unsupported key type: " + keyType); - } - - if (!isEDDSACurveSupported()) { - throw new NoSuchAlgorithmException(EDDSA + " provider not supported"); - } - - return EdDSASecurityProvider.generateEDDSAPublicKey(seed); - } - - @SuppressWarnings("synthetic-access") - public static <B extends Buffer> B putRawEDDSAPublicKey(B buffer, PublicKey key) { - if (!isEDDSACurveSupported()) { - throw new UnsupportedOperationException(EDDSA + " provider not supported"); - } - - return EdDSASecurityProvider.putRawEDDSAPublicKey(buffer, key); - } - - public static <B extends Buffer> B putEDDSAKeyPair(B buffer, KeyPair kp) { - return putEDDSAKeyPair(buffer, Objects.requireNonNull(kp, "No key pair").getPublic(), kp.getPrivate()); - } - - @SuppressWarnings("synthetic-access") - public static <B extends Buffer> B putEDDSAKeyPair(B buffer, PublicKey pubKey, PrivateKey prvKey) { - if (!isEDDSACurveSupported()) { - throw new UnsupportedOperationException(EDDSA + " provider not supported"); - } - - return EdDSASecurityProvider.putEDDSAKeyPair(buffer, pubKey, prvKey); - } - - public static KeyPair extractEDDSAKeyPair(Buffer buffer, String keyType) throws GeneralSecurityException { - if (!KeyPairProvider.SSH_ED25519.equals(keyType)) { - throw new InvalidKeyException("Unsupported key type: " + keyType); - } - - if (!isEDDSACurveSupported()) { - throw new NoSuchAlgorithmException(EDDSA + " provider not supported"); - } - - throw new GeneralSecurityException("Full SSHD-440 implementation N/A"); - } - - ////////////////////////////////////////////////////////////////////////// - - public static synchronized KeyFactory getKeyFactory(String algorithm) throws GeneralSecurityException { - register(); - - String providerName = getDefaultProvider(); - if (EDDSA.equalsIgnoreCase(algorithm) && isEDDSACurveSupported()) { - providerName = EDDSA; - } - - if (GenericUtils.isEmpty(providerName)) { - return KeyFactory.getInstance(algorithm); - } else { - return KeyFactory.getInstance(algorithm, providerName); - } - } - - public static synchronized Cipher getCipher(String transformation) throws GeneralSecurityException { - register(); - - String providerName = getDefaultProvider(); - if (GenericUtils.isEmpty(providerName)) { - return Cipher.getInstance(transformation); - } else { - return Cipher.getInstance(transformation, providerName); - } - } - - public static synchronized MessageDigest getMessageDigest(String algorithm) throws GeneralSecurityException { - register(); - - String providerName = getDefaultProvider(); - if (GenericUtils.isEmpty(providerName)) { - return MessageDigest.getInstance(algorithm); - } else { - return MessageDigest.getInstance(algorithm, providerName); - } - } - - public static synchronized KeyPairGenerator getKeyPairGenerator(String algorithm) throws GeneralSecurityException { - register(); - - String providerName = getDefaultProvider(); - if (EDDSA.equalsIgnoreCase(algorithm) && isEDDSACurveSupported()) { - providerName = EDDSA; - } - - if (GenericUtils.isEmpty(providerName)) { - return KeyPairGenerator.getInstance(algorithm); - } else { - return KeyPairGenerator.getInstance(algorithm, providerName); - } - } - - public static synchronized KeyAgreement getKeyAgreement(String algorithm) throws GeneralSecurityException { - register(); - - String providerName = getDefaultProvider(); - if (GenericUtils.isEmpty(providerName)) { - return KeyAgreement.getInstance(algorithm); - } else { - return KeyAgreement.getInstance(algorithm, providerName); - } - } - - public static synchronized Mac getMac(String algorithm) throws GeneralSecurityException { - register(); - - String providerName = getDefaultProvider(); - if (GenericUtils.isEmpty(providerName)) { - return Mac.getInstance(algorithm); - } else { - return Mac.getInstance(algorithm, providerName); - } - } - - public static synchronized Signature getSignature(String algorithm) throws GeneralSecurityException { - register(); - - String providerName = getDefaultProvider(); - if (EdDSANamedCurveTable.CURVE_ED25519_SHA512.equalsIgnoreCase(algorithm) && isEDDSACurveSupported()) { - providerName = EDDSA; - } - - if (GenericUtils.isEmpty(providerName)) { - return Signature.getInstance(algorithm); - } else { - return Signature.getInstance(algorithm, providerName); - } - } - - public static synchronized CertificateFactory getCertificateFactory(String type) throws GeneralSecurityException { - register(); - - String providerName = getDefaultProvider(); - if (GenericUtils.isEmpty(providerName)) { - return CertificateFactory.getInstance(type); - } else { - return CertificateFactory.getInstance(type, providerName); - } - } -} http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/Buffer.java ---------------------------------------------------------------------- diff --git a/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/Buffer.java b/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/Buffer.java index 6bea9b6..7fcedff 100644 --- a/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/Buffer.java +++ b/sshd-core/src/main/java/org/apache/sshd/common/util/buffer/Buffer.java @@ -61,10 +61,10 @@ import org.apache.sshd.common.keyprovider.KeyPairProvider; import org.apache.sshd.common.util.GenericUtils; import org.apache.sshd.common.util.Int2IntFunction; import org.apache.sshd.common.util.Readable; -import org.apache.sshd.common.util.SecurityUtils; import org.apache.sshd.common.util.Transformer; import org.apache.sshd.common.util.buffer.keys.BufferPublicKeyParser; import org.apache.sshd.common.util.logging.SimplifiedLog; +import org.apache.sshd.common.util.security.SecurityUtils; /** * Provides an abstract message buffer for encoding SSH messages http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/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 index 2cca99f..547f8b8 100644 --- 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 @@ -30,8 +30,8 @@ import java.util.Collections; import java.util.Objects; import org.apache.sshd.common.util.GenericUtils; -import org.apache.sshd.common.util.SecurityUtils; import org.apache.sshd.common.util.ValidateUtils; +import org.apache.sshd.common.util.security.SecurityUtils; /** * @param <PUB> Type of {@link PublicKey} being extracted http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/ed064a09/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 index 5915e13..61ce6ab 100644 --- 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 @@ -23,9 +23,9 @@ import java.security.GeneralSecurityException; import java.security.PublicKey; import org.apache.sshd.common.keyprovider.KeyPairProvider; -import org.apache.sshd.common.util.SecurityUtils; 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
