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

[08/12] mina-sshd git commit: [SSHD-862] Provide SessionContext argument when loading client keys identities

[SSHD-862] Provide SessionContext argument when loading client keys identities


Project: http://git-wip-us.apache.org/repos/asf/mina-sshd/repo
Commit: http://git-wip-us.apache.org/repos/asf/mina-sshd/commit/210f638e
Tree: http://git-wip-us.apache.org/repos/asf/mina-sshd/tree/210f638e
Diff: http://git-wip-us.apache.org/repos/asf/mina-sshd/diff/210f638e

Branch: refs/heads/master
Commit: 210f638e34ced6ce6322dc788dd01d8818b1da3d
Parents: e05898c
Author: Lyor Goldstein <lg...@apache.org>
Authored: Tue Nov 13 17:21:42 2018 +0200
Committer: Lyor Goldstein <lg...@apache.org>
Committed: Sun Nov 18 06:54:47 2018 +0200

----------------------------------------------------------------------
 CHANGES.md                                      |  4 ++
 .../sshd/cli/server/SshServerCliSupport.java    |  4 +-
 .../auth/AuthenticationIdentitiesProvider.java  |  3 +-
 .../keys/BuiltinClientIdentitiesWatcher.java    | 11 +++--
 .../config/keys/ClientIdentitiesWatcher.java    | 13 +++---
 .../config/keys/ClientIdentityFileWatcher.java  |  7 ++--
 .../config/keys/ClientIdentityProvider.java     |  8 +++-
 .../sshd/common/config/keys/KeyRandomArt.java   | 22 +++++++---
 .../AbstractResourceKeyPairProvider.java        | 31 ++++++++------
 .../ClassLoadableResourceKeyPairProvider.java   |  5 ++-
 .../common/keyprovider/FileKeyPairProvider.java |  9 ++--
 .../common/keyprovider/KeyIdentityProvider.java | 44 +++++++++++---------
 .../common/keyprovider/KeyPairProvider.java     |  8 ++--
 .../keyprovider/MappedKeyPairProvider.java      |  2 +-
 .../keyprovider/MultiKeyIdentityIterator.java   | 13 +++++-
 .../keyprovider/MultiKeyIdentityProvider.java   |  6 ++-
 .../AbstractGeneratorHostKeyProvider.java       | 30 +++++++------
 .../SimpleGeneratorHostKeyProvider.java         |  8 +++-
 .../BuiltinClientIdentitiesWatcherTest.java     |  2 +-
 .../keys/ClientIdentityFileWatcherTest.java     |  7 ++--
 .../client/config/keys/ClientIdentityTest.java  |  2 +-
 .../common/config/keys/KeyRandomArtTest.java    |  2 +-
 .../common/keyprovider/KeyPairProviderTest.java |  4 +-
 .../MultiKeyIdentityProviderTest.java           |  5 ++-
 .../common/util/security/SecurityUtilsTest.java |  2 +-
 .../AbstractGeneratorHostKeyProviderTest.java   | 14 ++++---
 .../sshd/util/test/CommonTestSupportUtils.java  |  4 +-
 .../keys/LazyClientIdentityIteratorTest.java    |  7 ++--
 .../auth/pubkey/UserAuthPublicKeyIterator.java  |  2 +-
 .../sshd/client/session/ClientSession.java      |  4 +-
 .../server/session/ServerUserAuthService.java   |  2 +-
 .../hosts/HostConfigEntryResolverTest.java      |  3 +-
 .../signature/SignatureFactoriesTest.java       | 11 ++---
 .../sshd/server/auth/WelcomeBannerTest.java     |  5 ++-
 .../server/config/keys/ServerIdentityTest.java  |  2 +-
 35 files changed, 186 insertions(+), 120 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/CHANGES.md
----------------------------------------------------------------------
diff --git a/CHANGES.md b/CHANGES.md
index 6751736..a07e953 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -42,6 +42,10 @@ accept also an `AttributeRepository` connection context argument (propagated fro
 
 * `KeyPairProvider` accepts a `SessionContext` argument in its `getKeyTypes/loadKey` methods
 
+* `KeyIdentityProvider` accepts a `SessionContext` argument in its `loadKeys` method
+
+* `ClientIdentityProvider` accepts a `SessionContext` argument in its `getClientIdentity` method
+
 ## Behavioral changes and enhancements
 
 * [SSHD-849](https://issues.apache.org/jira/browse/SSHD-849) - Data forwarding code makes sure all

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-cli/src/main/java/org/apache/sshd/cli/server/SshServerCliSupport.java
----------------------------------------------------------------------
diff --git a/sshd-cli/src/main/java/org/apache/sshd/cli/server/SshServerCliSupport.java b/sshd-cli/src/main/java/org/apache/sshd/cli/server/SshServerCliSupport.java
index 6cdffc8..eac5b7e 100644
--- a/sshd-cli/src/main/java/org/apache/sshd/cli/server/SshServerCliSupport.java
+++ b/sshd-cli/src/main/java/org/apache/sshd/cli/server/SshServerCliSupport.java
@@ -92,8 +92,8 @@ public abstract class SshServerCliSupport extends CliSupport {
                 hostKeyProvider.setKeySize(hostKeySize);
             }
 
-            List<KeyPair> keys = ValidateUtils.checkNotNullAndNotEmpty(hostKeyProvider.loadKeys(),
-                    "Failed to load keys from %s", hostKeyFile);
+            List<KeyPair> keys = ValidateUtils.checkNotNullAndNotEmpty(
+                hostKeyProvider.loadKeys(null), "Failed to load keys from %s", hostKeyFile);
             KeyPair kp = keys.get(0);
             PublicKey pubKey = kp.getPublic();
             String keyAlgorithm = pubKey.getAlgorithm();

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-common/src/main/java/org/apache/sshd/client/auth/AuthenticationIdentitiesProvider.java
----------------------------------------------------------------------
diff --git a/sshd-common/src/main/java/org/apache/sshd/client/auth/AuthenticationIdentitiesProvider.java b/sshd-common/src/main/java/org/apache/sshd/client/auth/AuthenticationIdentitiesProvider.java
index ee7c856..6ac1a93 100644
--- a/sshd-common/src/main/java/org/apache/sshd/client/auth/AuthenticationIdentitiesProvider.java
+++ b/sshd-common/src/main/java/org/apache/sshd/client/auth/AuthenticationIdentitiesProvider.java
@@ -26,6 +26,7 @@ import java.util.List;
 import org.apache.sshd.client.auth.password.PasswordIdentityProvider;
 import org.apache.sshd.common.config.keys.KeyUtils;
 import org.apache.sshd.common.keyprovider.KeyIdentityProvider;
+import org.apache.sshd.common.session.SessionContext;
 import org.apache.sshd.common.util.helper.LazyMatchingTypeIterable;
 
 /**
@@ -82,7 +83,7 @@ public interface AuthenticationIdentitiesProvider extends KeyIdentityProvider, P
     static AuthenticationIdentitiesProvider wrapIdentities(Iterable<?> identities) {
         return new AuthenticationIdentitiesProvider() {
             @Override
-            public Iterable<KeyPair> loadKeys() {
+            public Iterable<KeyPair> loadKeys(SessionContext session) {
                 return LazyMatchingTypeIterable.lazySelectMatchingTypes(identities, KeyPair.class);
             }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-common/src/main/java/org/apache/sshd/client/config/keys/BuiltinClientIdentitiesWatcher.java
----------------------------------------------------------------------
diff --git a/sshd-common/src/main/java/org/apache/sshd/client/config/keys/BuiltinClientIdentitiesWatcher.java b/sshd-common/src/main/java/org/apache/sshd/client/config/keys/BuiltinClientIdentitiesWatcher.java
index ab9929b..bb3f738 100644
--- a/sshd-common/src/main/java/org/apache/sshd/client/config/keys/BuiltinClientIdentitiesWatcher.java
+++ b/sshd-common/src/main/java/org/apache/sshd/client/config/keys/BuiltinClientIdentitiesWatcher.java
@@ -32,6 +32,7 @@ import org.apache.sshd.common.NamedResource;
 import org.apache.sshd.common.config.keys.BuiltinIdentities;
 import org.apache.sshd.common.config.keys.FilePasswordProvider;
 import org.apache.sshd.common.config.keys.KeyUtils;
+import org.apache.sshd.common.session.SessionContext;
 import org.apache.sshd.common.util.GenericUtils;
 
 /**
@@ -69,18 +70,20 @@ public class BuiltinClientIdentitiesWatcher extends ClientIdentitiesWatcher {
     }
 
     @Override
-    public Iterable<KeyPair> loadKeys() {
-        return isSupportedOnly() ? loadKeys(this::isSupported) : super.loadKeys();
+    public Iterable<KeyPair> loadKeys(SessionContext session) {
+        return isSupportedOnly()
+            ? loadKeys(session, p -> isSupported(session, p))
+            : super.loadKeys(session);
     }
 
-    private boolean isSupported(KeyPair kp) {
+    protected boolean isSupported(SessionContext session, KeyPair kp) {
         BuiltinIdentities id = BuiltinIdentities.fromKeyPair(kp);
         if ((id != null) && id.isSupported()) {
             return true;
         }
         if (log.isDebugEnabled()) {
             log.debug("loadKeys - remove unsupported identity={}, key-type={}, key={}",
-                    id, KeyUtils.getKeyType(kp), KeyUtils.getFingerPrint(kp.getPublic()));
+                id, KeyUtils.getKeyType(kp), KeyUtils.getFingerPrint(kp.getPublic()));
         }
         return false;
     }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentitiesWatcher.java
----------------------------------------------------------------------
diff --git a/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentitiesWatcher.java b/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentitiesWatcher.java
index 05660f7..eed14e9 100644
--- a/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentitiesWatcher.java
+++ b/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentitiesWatcher.java
@@ -31,6 +31,7 @@ import java.util.function.Supplier;
 import org.apache.sshd.common.config.keys.FilePasswordProvider;
 import org.apache.sshd.common.keyprovider.AbstractKeyPairProvider;
 import org.apache.sshd.common.keyprovider.KeyPairProvider;
+import org.apache.sshd.common.session.SessionContext;
 import org.apache.sshd.common.util.GenericUtils;
 
 /**
@@ -69,17 +70,17 @@ public class ClientIdentitiesWatcher extends AbstractKeyPairProvider implements
     }
 
     @Override
-    public Iterable<KeyPair> loadKeys() {
-        return loadKeys(null);
+    public Iterable<KeyPair> loadKeys(SessionContext session) {
+        return loadKeys(session, null);
     }
 
-    protected Iterable<KeyPair> loadKeys(Predicate<? super KeyPair> filter) {
-        return ClientIdentityProvider.lazyKeysLoader(providers, this::doGetKeyPair, filter);
+    protected Iterable<KeyPair> loadKeys(SessionContext session, Predicate<? super KeyPair> filter) {
+        return ClientIdentityProvider.lazyKeysLoader(providers, p -> doGetKeyPair(session, p), filter);
     }
 
-    protected KeyPair doGetKeyPair(ClientIdentityProvider p) {
+    protected KeyPair doGetKeyPair(SessionContext session, ClientIdentityProvider p) {
         try {
-            KeyPair kp = p.getClientIdentity();
+            KeyPair kp = p.getClientIdentity(session);
             if (kp == null) {
                 if (log.isDebugEnabled()) {
                     log.debug("loadKeys({}) no key loaded", p);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentityFileWatcher.java
----------------------------------------------------------------------
diff --git a/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentityFileWatcher.java b/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentityFileWatcher.java
index dc2128f..411ae1b 100644
--- a/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentityFileWatcher.java
+++ b/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentityFileWatcher.java
@@ -31,6 +31,7 @@ import java.util.function.Supplier;
 
 import org.apache.sshd.common.config.keys.FilePasswordProvider;
 import org.apache.sshd.common.config.keys.KeyUtils;
+import org.apache.sshd.common.session.SessionContext;
 import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.common.util.io.IoUtils;
 import org.apache.sshd.common.util.io.ModifiableFileWatcher;
@@ -84,7 +85,7 @@ public class ClientIdentityFileWatcher extends ModifiableFileWatcher implements
     }
 
     @Override
-    public KeyPair getClientIdentity() throws IOException, GeneralSecurityException {
+    public KeyPair getClientIdentity(SessionContext session) throws IOException, GeneralSecurityException {
         if (!checkReloadRequired()) {
             return identityHolder.get();
         }
@@ -95,7 +96,7 @@ public class ClientIdentityFileWatcher extends ModifiableFileWatcher implements
             return identityHolder.get();
         }
 
-        KeyPair id = reloadClientIdentity(path);
+        KeyPair id = reloadClientIdentity(session, path);
         if (!KeyUtils.compareKeyPairs(kp, id)) {
             if (log.isDebugEnabled()) {
                 log.debug("getClientIdentity({}) identity {}", path, (kp == null) ? "loaded" : "re-loaded");
@@ -107,7 +108,7 @@ public class ClientIdentityFileWatcher extends ModifiableFileWatcher implements
         return identityHolder.get();
     }
 
-    protected KeyPair reloadClientIdentity(Path path) throws IOException, GeneralSecurityException {
+    protected KeyPair reloadClientIdentity(SessionContext session, Path path) throws IOException, GeneralSecurityException {
         if (isStrict()) {
             Map.Entry<String, Object> violation =
                 KeyUtils.validateStrictKeyFilePermissions(path, IoUtils.EMPTY_LINK_OPTIONS);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentityProvider.java
----------------------------------------------------------------------
diff --git a/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentityProvider.java b/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentityProvider.java
index 6bd4c07..8c52d4f 100644
--- a/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentityProvider.java
+++ b/sshd-common/src/main/java/org/apache/sshd/client/config/keys/ClientIdentityProvider.java
@@ -28,6 +28,8 @@ import java.util.Objects;
 import java.util.function.Function;
 import java.util.function.Predicate;
 
+import org.apache.sshd.common.session.SessionContext;
+
 /**
  * @author <a href="mailto:dev@mina.apache.org">Apache MINA SSHD Project</a>
  */
@@ -36,6 +38,8 @@ public interface ClientIdentityProvider {
     /**
      * Provides a {@link KeyPair} representing the client identity
      *
+     * @param session The {@link SessionContext} for invoking this load command - may
+     * be {@code null} if not invoked within a session context (e.g., offline tool).
      * @return The client identity - may be {@code null} if no currently
      * available identity from this provider. <B>Note:</B> the provider
      * may return a <U>different</U> value every time this method is called
@@ -43,7 +47,7 @@ public interface ClientIdentityProvider {
      * @throws IOException If failed to load the identity
      * @throws GeneralSecurityException If failed to parse the identity
      */
-    KeyPair getClientIdentity() throws IOException, GeneralSecurityException;
+    KeyPair getClientIdentity(SessionContext session) throws IOException, GeneralSecurityException;
 
     /**
      * Wraps a {@link KeyPair} into a {@link ClientIdentityProvider} that
@@ -53,7 +57,7 @@ public interface ClientIdentityProvider {
      * @return The wrapping provider
      */
     static ClientIdentityProvider of(KeyPair kp) {
-        return () -> kp;
+        return session -> kp;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-common/src/main/java/org/apache/sshd/common/config/keys/KeyRandomArt.java
----------------------------------------------------------------------
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/config/keys/KeyRandomArt.java b/sshd-common/src/main/java/org/apache/sshd/common/config/keys/KeyRandomArt.java
index b59dbd0..cf0b1c9 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/config/keys/KeyRandomArt.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/config/keys/KeyRandomArt.java
@@ -34,6 +34,7 @@ import java.util.Objects;
 import org.apache.sshd.common.Factory;
 import org.apache.sshd.common.digest.Digest;
 import org.apache.sshd.common.keyprovider.KeyIdentityProvider;
+import org.apache.sshd.common.session.SessionContext;
 import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.common.util.ValidateUtils;
 
@@ -197,6 +198,8 @@ public class KeyRandomArt {
     /**
      * Creates the combined representation of the random art entries for the provided keys
      *
+     * @param session The {@link SessionContext} for invoking this load command - may
+     * be {@code null} if not invoked within a session context (e.g., offline tool or session unknown).
      * @param separator The separator to use between the arts - if empty char
      * ('\0') then no separation is done
      * @param provider The {@link KeyIdentityProvider} - ignored if {@code null}
@@ -205,14 +208,18 @@ public class KeyRandomArt {
      * @throws Exception If failed to extract or combine the entries
      * @see #combine(Appendable, char, KeyIdentityProvider)
      */
-    public static String combine(char separator, KeyIdentityProvider provider) throws Exception {
-        return combine(new StringBuilder(4 * (FLDSIZE_X + 4) * (FLDSIZE_Y + 3)), separator, provider).toString();
+    public static String combine(
+            SessionContext session, char separator, KeyIdentityProvider provider)
+                throws Exception {
+        return combine(session, new StringBuilder(4 * (FLDSIZE_X + 4) * (FLDSIZE_Y + 3)), separator, provider).toString();
     }
 
     /**
      * Appends the combined random art entries for the provided keys
      *
      * @param <A> The {@link Appendable} output writer
+     * @param session The {@link SessionContext} for invoking this load command - may
+     * be {@code null} if not invoked within a session context (e.g., offline tool or session unknown).
      * @param sb The writer
      * @param separator The separator to use between the arts - if empty char
      * ('\0') then no separation is done
@@ -223,21 +230,24 @@ public class KeyRandomArt {
      * @see #generate(KeyIdentityProvider)
      * @see #combine(Appendable, char, Collection)
      */
-    public static <A extends Appendable> A combine(A sb, char separator, KeyIdentityProvider provider) throws Exception {
-        return combine(sb, separator, generate(provider));
+    public static <A extends Appendable> A combine(
+            SessionContext session, A sb, char separator, KeyIdentityProvider provider) throws Exception {
+        return combine(sb, separator, generate(session, provider));
     }
 
     /**
      * Extracts and generates random art entries for all key in the provider
      *
+     * @param session The {@link SessionContext} for invoking this load command - may
+     * be {@code null} if not invoked within a session context (e.g., offline tool or session unknown).
      * @param provider The {@link KeyIdentityProvider} - ignored if {@code null}
      * or has no keys to provide
      * @return The extracted {@link KeyRandomArt}s
      * @throws Exception If failed to extract the entries
      * @see KeyIdentityProvider#loadKeys()
      */
-    public static Collection<KeyRandomArt> generate(KeyIdentityProvider provider) throws Exception {
-        Iterable<KeyPair> keys = (provider == null) ? null : provider.loadKeys();
+    public static Collection<KeyRandomArt> generate(SessionContext session, KeyIdentityProvider provider) throws Exception {
+        Iterable<KeyPair> keys = (provider == null) ? null : provider.loadKeys(session);
         Iterator<KeyPair> iter = (keys == null) ? null : keys.iterator();
         if ((iter == null) || (!iter.hasNext())) {
             return Collections.emptyList();

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/AbstractResourceKeyPairProvider.java
----------------------------------------------------------------------
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/AbstractResourceKeyPairProvider.java b/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/AbstractResourceKeyPairProvider.java
index e4e941d..194daf5 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/AbstractResourceKeyPairProvider.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/AbstractResourceKeyPairProvider.java
@@ -35,6 +35,7 @@ import java.util.TreeSet;
 
 import org.apache.sshd.common.config.keys.FilePasswordProvider;
 import org.apache.sshd.common.config.keys.KeyUtils;
+import org.apache.sshd.common.session.SessionContext;
 import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.common.util.ValidateUtils;
 import org.apache.sshd.common.util.security.SecurityUtils;
@@ -109,15 +110,16 @@ public abstract class AbstractResourceKeyPairProvider<R> extends AbstractKeyPair
         }
     }
 
-    protected Iterable<KeyPair> loadKeys(final Collection<? extends R> resources) {
+    protected Iterable<KeyPair> loadKeys(SessionContext session, Collection<? extends R> resources) {
         if (GenericUtils.isEmpty(resources)) {
             return Collections.emptyList();
         } else {
-            return () -> new KeyPairIterator(resources);
+            return () -> new KeyPairIterator(session, resources);
         }
     }
 
-    protected KeyPair doLoadKey(R resource) throws IOException, GeneralSecurityException {
+    protected KeyPair doLoadKey(SessionContext session, R resource)
+            throws IOException, GeneralSecurityException {
         String resourceKey = ValidateUtils.checkNotNullAndNotEmpty(Objects.toString(resource, null), "No resource string value");
         KeyPair kp;
         synchronized (cacheMap) {
@@ -129,12 +131,12 @@ public abstract class AbstractResourceKeyPairProvider<R> extends AbstractKeyPair
             if (log.isTraceEnabled()) {
                 PublicKey key = kp.getPublic();
                 log.trace("doLoadKey({}) use cached key {}-{}",
-                          resourceKey, KeyUtils.getKeyType(key), KeyUtils.getFingerPrint(key));
+                      resourceKey, KeyUtils.getKeyType(key), KeyUtils.getFingerPrint(key));
             }
             return kp;
         }
 
-        kp = doLoadKey(resourceKey, resource, getPasswordFinder());
+        kp = doLoadKey(session, resourceKey, resource, getPasswordFinder());
         if (kp != null) {
             boolean reusedKey;
             synchronized (cacheMap) {
@@ -150,8 +152,8 @@ public abstract class AbstractResourceKeyPairProvider<R> extends AbstractKeyPair
             if (log.isDebugEnabled()) {
                 PublicKey key = kp.getPublic();
                 log.debug("doLoadKey({}) {} {}-{}",
-                          resourceKey, reusedKey ? "re-loaded" : "loaded",
-                          KeyUtils.getKeyType(key), KeyUtils.getFingerPrint(key));
+                      resourceKey, reusedKey ? "re-loaded" : "loaded",
+                      KeyUtils.getKeyType(key), KeyUtils.getFingerPrint(key));
             }
         } else {
             if (log.isDebugEnabled()) {
@@ -162,26 +164,29 @@ public abstract class AbstractResourceKeyPairProvider<R> extends AbstractKeyPair
         return kp;
     }
 
-    protected KeyPair doLoadKey(String resourceKey, R resource, FilePasswordProvider provider) throws IOException, GeneralSecurityException {
+    protected KeyPair doLoadKey(SessionContext session, String resourceKey, R resource, FilePasswordProvider provider)
+            throws IOException, GeneralSecurityException {
         try (InputStream inputStream = openKeyPairResource(resourceKey, resource)) {
-            return doLoadKey(resourceKey, inputStream, provider);
+            return doLoadKey(session, resourceKey, inputStream, provider);
         }
     }
 
     protected abstract InputStream openKeyPairResource(String resourceKey, R resource) throws IOException;
 
-    protected KeyPair doLoadKey(String resourceKey, InputStream inputStream, FilePasswordProvider provider)
+    protected KeyPair doLoadKey(SessionContext session, String resourceKey, InputStream inputStream, FilePasswordProvider provider)
             throws IOException, GeneralSecurityException {
         return SecurityUtils.loadKeyPairIdentity(resourceKey, inputStream, provider);
     }
 
     protected class KeyPairIterator implements Iterator<KeyPair> {
+        protected final SessionContext session;
         private final Iterator<? extends R> iterator;
         private KeyPair nextKeyPair;
         private boolean nextKeyPairSet;
 
-        protected KeyPairIterator(Collection<? extends R> resources) {
-            iterator = resources.iterator();
+        protected KeyPairIterator(SessionContext session, Collection<? extends R> resources) {
+            this.session = session;
+            this.iterator = resources.iterator();
         }
 
         @Override
@@ -211,7 +216,7 @@ public abstract class AbstractResourceKeyPairProvider<R> extends AbstractKeyPair
             while (iterator.hasNext()) {
                 R r = iterator.next();
                 try {
-                    nextKeyPair = doLoadKey(r);
+                    nextKeyPair = doLoadKey(session, r);
                 } catch (Throwable e) {
                     log.warn("Failed (" + e.getClass().getSimpleName() + ")"
                            + " to load key resource=" + r + ": " + e.getMessage());

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/ClassLoadableResourceKeyPairProvider.java
----------------------------------------------------------------------
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/ClassLoadableResourceKeyPairProvider.java b/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/ClassLoadableResourceKeyPairProvider.java
index 6e8da54..3132abd 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/ClassLoadableResourceKeyPairProvider.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/ClassLoadableResourceKeyPairProvider.java
@@ -26,6 +26,7 @@ import java.security.KeyPair;
 import java.util.Collection;
 import java.util.Collections;
 
+import org.apache.sshd.common.session.SessionContext;
 import org.apache.sshd.common.util.ValidateUtils;
 import org.apache.sshd.common.util.threads.ThreadUtils;
 
@@ -84,8 +85,8 @@ public class ClassLoadableResourceKeyPairProvider extends AbstractResourceKeyPai
     }
 
     @Override
-    public Iterable<KeyPair> loadKeys() {
-        return loadKeys(getResources());
+    public Iterable<KeyPair> loadKeys(SessionContext session) {
+        return loadKeys(session, getResources());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/FileKeyPairProvider.java
----------------------------------------------------------------------
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/FileKeyPairProvider.java b/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/FileKeyPairProvider.java
index fa52eb2..a416871 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/FileKeyPairProvider.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/FileKeyPairProvider.java
@@ -29,6 +29,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Objects;
 
+import org.apache.sshd.common.session.SessionContext;
 import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.common.util.io.IoUtils;
 
@@ -71,13 +72,13 @@ public class FileKeyPairProvider extends AbstractResourceKeyPairProvider<Path> {
     }
 
     @Override
-    public Iterable<KeyPair> loadKeys() {
-        return loadKeys(getPaths());
+    public Iterable<KeyPair> loadKeys(SessionContext session) {
+        return loadKeys(session, getPaths());
     }
 
     @Override
-    protected KeyPair doLoadKey(Path resource) throws IOException, GeneralSecurityException {
-        return super.doLoadKey((resource == null) ? null : resource.toAbsolutePath());
+    protected KeyPair doLoadKey(SessionContext session, Path resource) throws IOException, GeneralSecurityException {
+        return super.doLoadKey(session, (resource == null) ? null : resource.toAbsolutePath());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/KeyIdentityProvider.java
----------------------------------------------------------------------
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/KeyIdentityProvider.java b/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/KeyIdentityProvider.java
index f03b68b..46b6f52 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/KeyIdentityProvider.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/KeyIdentityProvider.java
@@ -23,8 +23,8 @@ import java.security.KeyPair;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
-import java.util.function.Function;
 
+import org.apache.sshd.common.session.SessionContext;
 import org.apache.sshd.common.util.GenericUtils;
 
 /**
@@ -38,7 +38,7 @@ public interface KeyIdentityProvider {
      */
     KeyIdentityProvider EMPTY_KEYS_PROVIDER = new KeyIdentityProvider() {
         @Override
-        public Iterable<KeyPair> loadKeys() {
+        public Iterable<KeyPair> loadKeys(SessionContext session) {
             return Collections.emptyList();
         }
 
@@ -49,40 +49,40 @@ public interface KeyIdentityProvider {
     };
 
     /**
-     * Invokes {@link KeyIdentityProvider#loadKeys()} and returns the result - ignores
-     * {@code null} providers (i.e., returns an empty iterable instance)
-     */
-    Function<KeyIdentityProvider, Iterable<KeyPair>> LOADER = p ->
-        (p == null) ? Collections.<KeyPair>emptyList() : p.loadKeys();
-
-    /**
      * Load available keys.
      *
+     * @param session The {@link SessionContext} for invoking this load command - may
+     * be {@code null} if not invoked within a session context (e.g., offline tool or session unknown).
      * @return an {@link Iterable} instance of available keys - ignored if {@code null}
      */
-    Iterable<KeyPair> loadKeys();
+    Iterable<KeyPair> loadKeys(SessionContext session);
 
     /**
      * Creates a &quot;unified&quot; {@link Iterator} of {@link KeyPair}s out of 2 possible
      * {@link KeyIdentityProvider}
      *
+     * @param session The {@link SessionContext} for invoking this load command - may
+     * be {@code null} if not invoked within a session context (e.g., offline tool or session unknown).
      * @param identities The registered keys identities
      * @param keys Extra available key pairs
      * @return The wrapping iterator
      * @see #resolveKeyIdentityProvider(KeyIdentityProvider, KeyIdentityProvider)
      */
-    static Iterator<KeyPair> iteratorOf(KeyIdentityProvider identities, KeyIdentityProvider keys) {
-        return iteratorOf(resolveKeyIdentityProvider(identities, keys));
+    static Iterator<KeyPair> iteratorOf(
+            SessionContext session, KeyIdentityProvider identities, KeyIdentityProvider keys) {
+        return iteratorOf(session, resolveKeyIdentityProvider(identities, keys));
     }
 
     /**
      * Resolves a non-{@code null} iterator of the available keys
      *
+     * @param session The {@link SessionContext} for invoking this load command - may
+     * be {@code null} if not invoked within a session context (e.g., offline tool or session unknown).
      * @param provider The {@link KeyIdentityProvider} - ignored if {@code null}
      * @return A non-{@code null} iterator - which may be empty if no provider or no keys
      */
-    static Iterator<KeyPair> iteratorOf(KeyIdentityProvider provider) {
-        return GenericUtils.iteratorOf((provider == null) ? null : provider.loadKeys());
+    static Iterator<KeyPair> iteratorOf(SessionContext session, KeyIdentityProvider provider) {
+        return GenericUtils.iteratorOf((provider == null) ? null : provider.loadKeys(session));
     }
 
     /**
@@ -94,12 +94,14 @@ public interface KeyIdentityProvider {
      *      <LI>If both are the same instance then use it.</U>
      *      <LI>Otherwise, returns a wrapper that groups both providers.</LI>
      * </UL>
+     *
      * @param identities The registered key pair identities
      * @param keys The extra available key pairs
      * @return The resolved provider
      * @see #multiProvider(KeyIdentityProvider...)
      */
-    static KeyIdentityProvider resolveKeyIdentityProvider(KeyIdentityProvider identities, KeyIdentityProvider keys) {
+    static KeyIdentityProvider resolveKeyIdentityProvider(
+            KeyIdentityProvider identities, KeyIdentityProvider keys) {
         if ((keys == null) || (identities == keys)) {
             return identities;
         } else if (identities == null) {
@@ -124,6 +126,8 @@ public interface KeyIdentityProvider {
     /**
      * Wraps a group of {@link KeyIdentityProvider} into a single one
      *
+     * @param session The {@link SessionContext} for invoking this load command - may
+     * be {@code null} if not invoked within a session context (e.g., offline tool or session unknown).
      * @param providers The providers - ignored if {@code null}/empty (i.e., returns
      * {@link #EMPTY_KEYS_PROVIDER})
      * @return The wrapping provider
@@ -143,22 +147,24 @@ public interface KeyIdentityProvider {
     /**
      * Wraps a group of {@link KeyIdentityProvider} into an {@link Iterable} of {@link KeyPair}s
      *
+     * @param session The {@link SessionContext} for invoking this load command - may
+     * be {@code null} if not invoked within a session context (e.g., offline tool or session unknown).
      * @param providers The group of providers - ignored if {@code null}/empty (i.e., returns an
      * empty iterable instance)
      * @return The wrapping iterable
      */
-    static Iterable<KeyPair> iterableOf(Collection<? extends KeyIdentityProvider> providers) {
+    static Iterable<KeyPair> iterableOf(SessionContext session, Collection<? extends KeyIdentityProvider> providers) {
         int numProviders = GenericUtils.size(providers);
         if (numProviders <= 0) {
             return Collections.emptyList();
         } else if (numProviders == 1) {
             KeyIdentityProvider p = GenericUtils.head(providers);
-            return p.loadKeys();
+            return p.loadKeys(session);
         } else {
             return new Iterable<KeyPair>() {
                 @Override
                 public Iterator<KeyPair> iterator() {
-                    return new MultiKeyIdentityIterator(providers);
+                    return new MultiKeyIdentityIterator(session, providers);
                 }
 
                 @Override
@@ -188,6 +194,6 @@ public interface KeyIdentityProvider {
      * @return The provider wrapper
      */
     static KeyIdentityProvider wrapKeyPairs(Iterable<KeyPair> pairs) {
-        return (pairs == null) ? EMPTY_KEYS_PROVIDER : () -> pairs;
+        return (pairs == null) ? EMPTY_KEYS_PROVIDER : session -> pairs;
     }
 }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/KeyPairProvider.java
----------------------------------------------------------------------
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/KeyPairProvider.java b/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/KeyPairProvider.java
index 68c4daf..6b2224f 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/KeyPairProvider.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/KeyPairProvider.java
@@ -86,7 +86,7 @@ public interface KeyPairProvider extends KeyIdentityProvider {
             }
 
             @Override
-            public Iterable<KeyPair> loadKeys() {
+            public Iterable<KeyPair> loadKeys(SessionContext session) {
                 return Collections.emptyList();
             }
 
@@ -108,7 +108,7 @@ public interface KeyPairProvider extends KeyIdentityProvider {
      */
     default KeyPair loadKey(SessionContext session, String type) {
         ValidateUtils.checkNotNullAndNotEmpty(type, "No key type to load");
-        return GenericUtils.stream(loadKeys())
+        return GenericUtils.stream(loadKeys(session))
                 .filter(key -> type.equals(KeyUtils.getKeyType(key)))
                 .findFirst()
                 .orElse(null);
@@ -120,7 +120,7 @@ public interface KeyPairProvider extends KeyIdentityProvider {
      * @return The available {@link Iterable} key types in preferred order - never {@code null}
      */
     default Iterable<String> getKeyTypes(SessionContext session) {
-        return GenericUtils.stream(loadKeys())
+        return GenericUtils.stream(loadKeys(session))
                 .map(KeyUtils::getKeyType)
                 .filter(GenericUtils::isNotEmpty)
                 .collect(Collectors.toSet());
@@ -148,7 +148,7 @@ public interface KeyPairProvider extends KeyIdentityProvider {
     static KeyPairProvider wrap(Iterable<KeyPair> pairs) {
         return (pairs == null) ? EMPTY_KEYPAIR_PROVIDER : new KeyPairProvider() {
             @Override
-            public Iterable<KeyPair> loadKeys() {
+            public Iterable<KeyPair> loadKeys(SessionContext session) {
                 return pairs;
             }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/MappedKeyPairProvider.java
----------------------------------------------------------------------
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/MappedKeyPairProvider.java b/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/MappedKeyPairProvider.java
index d8f2350..ca4fd5e 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/MappedKeyPairProvider.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/MappedKeyPairProvider.java
@@ -62,7 +62,7 @@ public class MappedKeyPairProvider implements KeyPairProvider {
     }
 
     @Override
-    public Iterable<KeyPair> loadKeys() {
+    public Iterable<KeyPair> loadKeys(SessionContext session) {
         return pairsMap.values();
     }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/MultiKeyIdentityIterator.java
----------------------------------------------------------------------
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/MultiKeyIdentityIterator.java b/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/MultiKeyIdentityIterator.java
index 5ba5386..9de7c17 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/MultiKeyIdentityIterator.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/MultiKeyIdentityIterator.java
@@ -23,6 +23,8 @@ import java.security.KeyPair;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 
+import org.apache.sshd.common.session.SessionContext;
+
 /**
  * Iterates over several {@link KeyIdentityProvider}-s exhausting their
  * keys one by one (lazily).
@@ -32,16 +34,22 @@ import java.util.NoSuchElementException;
 public class MultiKeyIdentityIterator implements Iterator<KeyPair> {
     protected Iterator<KeyPair> currentProvider;
     protected boolean finished;
+    private final SessionContext sessionContext;
     private final Iterator<? extends KeyIdentityProvider> providers;
 
-    public MultiKeyIdentityIterator(Iterable<? extends KeyIdentityProvider> providers) {
+    public MultiKeyIdentityIterator(SessionContext session, Iterable<? extends KeyIdentityProvider> providers) {
         this.providers = (providers == null) ? null : providers.iterator();
+        this.sessionContext = session;
     }
 
     public Iterator<? extends KeyIdentityProvider> getProviders() {
         return providers;
     }
 
+    public SessionContext getSessionContext() {
+        return sessionContext;
+    }
+
     @Override
     public boolean hasNext() {
         if (finished) {
@@ -58,9 +66,10 @@ public class MultiKeyIdentityIterator implements Iterator<KeyPair> {
             return true;
         }
 
+        SessionContext session = getSessionContext();
         while (provs.hasNext()) {
             KeyIdentityProvider p = provs.next();
-            Iterable<KeyPair> keys = (p == null) ? null : p.loadKeys();
+            Iterable<KeyPair> keys = (p == null) ? null : p.loadKeys(session);
             currentProvider = (keys == null) ? null : keys.iterator();
 
             if ((currentProvider != null) && currentProvider.hasNext()) {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/MultiKeyIdentityProvider.java
----------------------------------------------------------------------
diff --git a/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/MultiKeyIdentityProvider.java b/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/MultiKeyIdentityProvider.java
index 18304ff..97b94a5 100644
--- a/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/MultiKeyIdentityProvider.java
+++ b/sshd-common/src/main/java/org/apache/sshd/common/keyprovider/MultiKeyIdentityProvider.java
@@ -23,6 +23,8 @@ import java.security.KeyPair;
 import java.util.Collections;
 import java.util.Iterator;
 
+import org.apache.sshd.common.session.SessionContext;
+
 /**
  * Aggregates several {@link KeyIdentityProvider}-s into a single logical
  * one that (lazily) exposes the keys from each aggregated provider
@@ -37,11 +39,11 @@ public class MultiKeyIdentityProvider implements KeyIdentityProvider {
     }
 
     @Override
-    public Iterable<KeyPair> loadKeys() {
+    public Iterable<KeyPair> loadKeys(SessionContext session) {
         return new Iterable<KeyPair>() {
             @Override
             public Iterator<KeyPair> iterator() {
-                return (providers == null) ? Collections.emptyIterator() : new MultiKeyIdentityIterator(providers);
+                return (providers == null) ? Collections.emptyIterator() : new MultiKeyIdentityIterator(session, providers);
             }
 
             @Override

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-common/src/main/java/org/apache/sshd/server/keyprovider/AbstractGeneratorHostKeyProvider.java
----------------------------------------------------------------------
diff --git a/sshd-common/src/main/java/org/apache/sshd/server/keyprovider/AbstractGeneratorHostKeyProvider.java b/sshd-common/src/main/java/org/apache/sshd/server/keyprovider/AbstractGeneratorHostKeyProvider.java
index f43f5c0..d30b4b8 100644
--- a/sshd-common/src/main/java/org/apache/sshd/server/keyprovider/AbstractGeneratorHostKeyProvider.java
+++ b/sshd-common/src/main/java/org/apache/sshd/server/keyprovider/AbstractGeneratorHostKeyProvider.java
@@ -39,6 +39,7 @@ import org.apache.sshd.common.cipher.ECCurves;
 import org.apache.sshd.common.config.keys.BuiltinIdentities;
 import org.apache.sshd.common.config.keys.KeyUtils;
 import org.apache.sshd.common.keyprovider.AbstractKeyPairProvider;
+import org.apache.sshd.common.session.SessionContext;
 import org.apache.sshd.common.util.io.IoUtils;
 import org.apache.sshd.common.util.security.SecurityUtils;
 
@@ -120,20 +121,20 @@ public abstract class AbstractGeneratorHostKeyProvider extends AbstractKeyPairPr
     }
 
     @Override   // co-variant return
-    public synchronized List<KeyPair> loadKeys() {
+    public synchronized List<KeyPair> loadKeys(SessionContext session) {
         Path keyPath = getPath();
         KeyPair kp;
         synchronized (keyPairHolder) {
             kp = keyPairHolder.get();
             if (kp == null) {
                 try {
-                    kp = resolveKeyPair(keyPath);
+                    kp = resolveKeyPair(session, keyPath);
                     if (kp != null) {
                         keyPairHolder.set(kp);
                     }
                 } catch (Throwable t) {
                     log.warn("loadKeys({}) Failed ({}) to resolve: {}",
-                            keyPath, t.getClass().getSimpleName(), t.getMessage());
+                        keyPath, t.getClass().getSimpleName(), t.getMessage());
                     if (log.isDebugEnabled()) {
                         log.debug("loadKeys(" + keyPath + ") resolution failure details", t);
                     }
@@ -148,12 +149,12 @@ public abstract class AbstractGeneratorHostKeyProvider extends AbstractKeyPairPr
         }
     }
 
-    protected KeyPair resolveKeyPair(Path keyPath) throws IOException, GeneralSecurityException {
+    protected KeyPair resolveKeyPair(SessionContext session, Path keyPath) throws IOException, GeneralSecurityException {
         String alg = getAlgorithm();
         KeyPair kp;
         if (keyPath != null) {
             try {
-                kp = loadFromFile(alg, keyPath);
+                kp = loadFromFile(session, alg, keyPath);
                 if (kp != null) {
                     return kp;
                 }
@@ -203,13 +204,13 @@ public abstract class AbstractGeneratorHostKeyProvider extends AbstractKeyPairPr
         return kp;
     }
 
-    protected KeyPair loadFromFile(String alg, Path keyPath) throws IOException, GeneralSecurityException {
+    protected KeyPair loadFromFile(SessionContext session, String alg, Path keyPath) throws IOException, GeneralSecurityException {
         LinkOption[] options = IoUtils.getLinkOptions(true);
         if ((!Files.exists(keyPath, options)) || (!Files.isRegularFile(keyPath, options))) {
             return null;
         }
 
-        KeyPair kp = readKeyPair(keyPath, IoUtils.EMPTY_OPEN_OPTIONS);
+        KeyPair kp = readKeyPair(session, keyPath, IoUtils.EMPTY_OPEN_OPTIONS);
         if (kp == null) {
             return null;
         }
@@ -225,7 +226,7 @@ public abstract class AbstractGeneratorHostKeyProvider extends AbstractKeyPairPr
         if (Objects.equals(alg, keyAlgorithm)) {
             if (log.isDebugEnabled()) {
                 log.debug("resolveKeyPair({}) loaded key={}-{}",
-                          keyPath, KeyUtils.getKeyType(key), KeyUtils.getFingerPrint(key));
+                      keyPath, KeyUtils.getKeyType(key), KeyUtils.getFingerPrint(key));
             }
             return kp;
         }
@@ -233,23 +234,26 @@ public abstract class AbstractGeneratorHostKeyProvider extends AbstractKeyPairPr
         // Not same algorithm - start again
         if (log.isDebugEnabled()) {
             log.debug("resolveKeyPair({}) mismatched loaded key algorithm: expected={}, loaded={}",
-                      keyPath, alg, keyAlgorithm);
+                  keyPath, alg, keyAlgorithm);
         }
         Files.deleteIfExists(keyPath);
         return null;
     }
 
-    protected KeyPair readKeyPair(Path keyPath, OpenOption... options) throws IOException, GeneralSecurityException {
+    protected KeyPair readKeyPair(SessionContext session, Path keyPath, OpenOption... options)
+            throws IOException, GeneralSecurityException {
         try (InputStream inputStream = Files.newInputStream(keyPath, options)) {
-            return doReadKeyPair(keyPath.toString(), inputStream);
+            return doReadKeyPair(session, keyPath.toString(), inputStream);
         }
     }
 
-    protected KeyPair doReadKeyPair(String resourceKey, InputStream inputStream) throws IOException, GeneralSecurityException {
+    protected KeyPair doReadKeyPair(SessionContext session, String resourceKey, InputStream inputStream)
+            throws IOException, GeneralSecurityException {
         return SecurityUtils.loadKeyPairIdentity(resourceKey, inputStream, null);
     }
 
-    protected void writeKeyPair(KeyPair kp, Path keyPath, OpenOption... options) throws IOException, GeneralSecurityException {
+    protected void writeKeyPair(KeyPair kp, Path keyPath, OpenOption... options)
+            throws IOException, GeneralSecurityException {
         if ((!Files.exists(keyPath)) || isOverwriteAllowed()) {
             try (OutputStream os = Files.newOutputStream(keyPath, options)) {
                 doWriteKeyPair(keyPath.toString(), kp, os);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-common/src/main/java/org/apache/sshd/server/keyprovider/SimpleGeneratorHostKeyProvider.java
----------------------------------------------------------------------
diff --git a/sshd-common/src/main/java/org/apache/sshd/server/keyprovider/SimpleGeneratorHostKeyProvider.java b/sshd-common/src/main/java/org/apache/sshd/server/keyprovider/SimpleGeneratorHostKeyProvider.java
index 7f2888e..b40edcb 100644
--- a/sshd-common/src/main/java/org/apache/sshd/server/keyprovider/SimpleGeneratorHostKeyProvider.java
+++ b/sshd-common/src/main/java/org/apache/sshd/server/keyprovider/SimpleGeneratorHostKeyProvider.java
@@ -28,6 +28,8 @@ import java.security.GeneralSecurityException;
 import java.security.KeyPair;
 import java.security.spec.InvalidKeySpecException;
 
+import org.apache.sshd.common.session.SessionContext;
+
 /**
  * TODO Add javadoc
  *
@@ -43,7 +45,8 @@ public class SimpleGeneratorHostKeyProvider extends AbstractGeneratorHostKeyProv
     }
 
     @Override
-    protected KeyPair doReadKeyPair(String resourceKey, InputStream inputStream) throws IOException, GeneralSecurityException {
+    protected KeyPair doReadKeyPair(SessionContext session, String resourceKey, InputStream inputStream)
+            throws IOException, GeneralSecurityException {
         try (ObjectInputStream r = new ObjectInputStream(inputStream)) {
             try {
                 return (KeyPair) r.readObject();
@@ -54,7 +57,8 @@ public class SimpleGeneratorHostKeyProvider extends AbstractGeneratorHostKeyProv
     }
 
     @Override
-    protected void doWriteKeyPair(String resourceKey, KeyPair kp, OutputStream outputStream) throws IOException, GeneralSecurityException {
+    protected void doWriteKeyPair(String resourceKey, KeyPair kp, OutputStream outputStream)
+            throws IOException, GeneralSecurityException {
         try (ObjectOutputStream w = new ObjectOutputStream(outputStream)) {
             w.writeObject(kp);
         }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-common/src/test/java/org/apache/sshd/client/config/keys/BuiltinClientIdentitiesWatcherTest.java
----------------------------------------------------------------------
diff --git a/sshd-common/src/test/java/org/apache/sshd/client/config/keys/BuiltinClientIdentitiesWatcherTest.java b/sshd-common/src/test/java/org/apache/sshd/client/config/keys/BuiltinClientIdentitiesWatcherTest.java
index 19375ec..4f4b285 100644
--- a/sshd-common/src/test/java/org/apache/sshd/client/config/keys/BuiltinClientIdentitiesWatcherTest.java
+++ b/sshd-common/src/test/java/org/apache/sshd/client/config/keys/BuiltinClientIdentitiesWatcherTest.java
@@ -145,7 +145,7 @@ public class BuiltinClientIdentitiesWatcherTest extends JUnitTestSupport {
     }
 
     private static void testMultipleFilesWatch(String phase, KeyIdentityProvider watcher, Collection<? extends KeyPair> expected) {
-        Iterable<KeyPair> keys = watcher.loadKeys();
+        Iterable<KeyPair> keys = watcher.loadKeys(null);
         Collection<KeyPair> actual = new ArrayList<>();
         for (KeyPair kp : keys) {
             actual.add(kp);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-common/src/test/java/org/apache/sshd/client/config/keys/ClientIdentityFileWatcherTest.java
----------------------------------------------------------------------
diff --git a/sshd-common/src/test/java/org/apache/sshd/client/config/keys/ClientIdentityFileWatcherTest.java b/sshd-common/src/test/java/org/apache/sshd/client/config/keys/ClientIdentityFileWatcherTest.java
index 144a3b0..690a381 100644
--- a/sshd-common/src/test/java/org/apache/sshd/client/config/keys/ClientIdentityFileWatcherTest.java
+++ b/sshd-common/src/test/java/org/apache/sshd/client/config/keys/ClientIdentityFileWatcherTest.java
@@ -33,6 +33,7 @@ import java.util.Objects;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.sshd.common.config.keys.FilePasswordProvider;
+import org.apache.sshd.common.session.SessionContext;
 import org.apache.sshd.common.util.io.IoUtils;
 import org.apache.sshd.util.test.CommonTestSupportUtils;
 import org.apache.sshd.util.test.JUnitTestSupport;
@@ -78,10 +79,10 @@ public class ClientIdentityFileWatcherTest extends JUnitTestSupport {
         AtomicInteger reloadCount = new AtomicInteger(0);
         ClientIdentityProvider idProvider = new ClientIdentityFileWatcher(idFile, loader, FilePasswordProvider.EMPTY, false) {
             @Override
-            protected KeyPair reloadClientIdentity(Path path) throws IOException, GeneralSecurityException {
+            protected KeyPair reloadClientIdentity(SessionContext session, Path path) throws IOException, GeneralSecurityException {
                 assertEquals("Mismatched client identity path", idFile, path);
                 reloadCount.incrementAndGet();
-                return super.reloadClientIdentity(path);
+                return super.reloadClientIdentity(session, path);
             }
         };
         Files.deleteIfExists(idFile);
@@ -114,7 +115,7 @@ public class ClientIdentityFileWatcherTest extends JUnitTestSupport {
     private static void testIdentityReload(
             String phase, Number reloadCount, ClientIdentityProvider provider, KeyPair expectedIdentity, int expectedCount)
                 throws Exception {
-        KeyPair actualIdentity = provider.getClientIdentity();
+        KeyPair actualIdentity = provider.getClientIdentity(null);
         assertSame(phase + ": mismatched identity", expectedIdentity, actualIdentity);
         assertEquals(phase + ": mismatched re-load count", expectedCount, reloadCount.intValue());
     }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-common/src/test/java/org/apache/sshd/client/config/keys/ClientIdentityTest.java
----------------------------------------------------------------------
diff --git a/sshd-common/src/test/java/org/apache/sshd/client/config/keys/ClientIdentityTest.java b/sshd-common/src/test/java/org/apache/sshd/client/config/keys/ClientIdentityTest.java
index bc2f02c..c8acfa5 100644
--- a/sshd-common/src/test/java/org/apache/sshd/client/config/keys/ClientIdentityTest.java
+++ b/sshd-common/src/test/java/org/apache/sshd/client/config/keys/ClientIdentityTest.java
@@ -90,7 +90,7 @@ public class ClientIdentityTest extends JUnitTestSupport {
         KeyIdentityProvider provider = IdentityUtils.createKeyPairProvider(ids, true /* supported only */);
         assertNotNull("No provider generated", provider);
 
-        Iterable<KeyPair> keys = provider.loadKeys();
+        Iterable<KeyPair> keys = provider.loadKeys(null);
         for (KeyPair kp : keys) {
             assertTrue("Unexpected loaded key: " + kp, pairs.remove(kp));
         }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-common/src/test/java/org/apache/sshd/common/config/keys/KeyRandomArtTest.java
----------------------------------------------------------------------
diff --git a/sshd-common/src/test/java/org/apache/sshd/common/config/keys/KeyRandomArtTest.java b/sshd-common/src/test/java/org/apache/sshd/common/config/keys/KeyRandomArtTest.java
index eedbfe7..42b39e1 100644
--- a/sshd-common/src/test/java/org/apache/sshd/common/config/keys/KeyRandomArtTest.java
+++ b/sshd-common/src/test/java/org/apache/sshd/common/config/keys/KeyRandomArtTest.java
@@ -90,7 +90,7 @@ public class KeyRandomArtTest extends JUnitTestSupport {
 
     @AfterClass
     public static void dumpAllArts() throws Exception {
-        KeyRandomArt.combine(System.out, ' ', () -> KEYS);
+        KeyRandomArt.combine(null, System.out, ' ', session -> KEYS);
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-common/src/test/java/org/apache/sshd/common/keyprovider/KeyPairProviderTest.java
----------------------------------------------------------------------
diff --git a/sshd-common/src/test/java/org/apache/sshd/common/keyprovider/KeyPairProviderTest.java b/sshd-common/src/test/java/org/apache/sshd/common/keyprovider/KeyPairProviderTest.java
index afa55cd..6f00621 100644
--- a/sshd-common/src/test/java/org/apache/sshd/common/keyprovider/KeyPairProviderTest.java
+++ b/sshd-common/src/test/java/org/apache/sshd/common/keyprovider/KeyPairProviderTest.java
@@ -48,7 +48,7 @@ public class KeyPairProviderTest extends JUnitTestSupport {
     @Test
     public void testEmptyKeyProvider() {
         KeyPairProvider provider = KeyPairProvider.EMPTY_KEYPAIR_PROVIDER;
-        assertTrue("Non empty loaded keys", GenericUtils.isEmpty(provider.loadKeys()));
+        assertTrue("Non empty loaded keys", GenericUtils.isEmpty(provider.loadKeys(null)));
         assertTrue("Non empty key type", GenericUtils.isEmpty(provider.getKeyTypes(null)));
 
         for (String keyType : new String[]{null, "", getCurrentTestName()}) {
@@ -69,7 +69,7 @@ public class KeyPairProviderTest extends JUnitTestSupport {
 
         KeyPairProvider provider = MappedKeyPairProvider.MAP_TO_KEY_PAIR_PROVIDER.apply(pairsMap);
         assertEquals("Key types", pairsMap.keySet(), provider.getKeyTypes(null));
-        assertEquals("Key pairs", pairsMap.values(), provider.loadKeys());
+        assertEquals("Key pairs", pairsMap.values(), provider.loadKeys(null));
 
         pairsMap.forEach((keyType, expected) -> {
             KeyPair actual = provider.loadKey(null, keyType);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-common/src/test/java/org/apache/sshd/common/keyprovider/MultiKeyIdentityProviderTest.java
----------------------------------------------------------------------
diff --git a/sshd-common/src/test/java/org/apache/sshd/common/keyprovider/MultiKeyIdentityProviderTest.java b/sshd-common/src/test/java/org/apache/sshd/common/keyprovider/MultiKeyIdentityProviderTest.java
index 5a24da2..e5a4329 100644
--- a/sshd-common/src/test/java/org/apache/sshd/common/keyprovider/MultiKeyIdentityProviderTest.java
+++ b/sshd-common/src/test/java/org/apache/sshd/common/keyprovider/MultiKeyIdentityProviderTest.java
@@ -28,6 +28,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import org.apache.sshd.common.session.SessionContext;
 import org.apache.sshd.util.test.JUnitTestSupport;
 import org.junit.FixMethodOrder;
 import org.junit.Test;
@@ -66,7 +67,7 @@ public class MultiKeyIdentityProviderTest extends JUnitTestSupport {
         KeyIdentityProvider multiProvider = KeyIdentityProvider.multiProvider(providers);
         assertObjectInstanceOf(MultiKeyIdentityProvider.class.getSimpleName(), MultiKeyIdentityProvider.class, multiProvider);
 
-        Iterable<KeyPair> keys = multiProvider.loadKeys();
+        Iterable<KeyPair> keys = multiProvider.loadKeys(null);
         Iterator<KeyPair> iter = keys.iterator();
         for (int index = 0, count = expected.size(); index < count; index++) {
             KeyPair kpExpected = expected.get(index);
@@ -82,7 +83,7 @@ public class MultiKeyIdentityProviderTest extends JUnitTestSupport {
     private static KeyIdentityProvider wrapKeyPairs(AtomicInteger position, Iterable<KeyPair> keys) {
         return new KeyIdentityProvider() {
             @Override
-            public Iterable<KeyPair> loadKeys() {
+            public Iterable<KeyPair> loadKeys(SessionContext session) {
                 return new Iterable<KeyPair>() {
                     @Override
                     public Iterator<KeyPair> iterator() {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-common/src/test/java/org/apache/sshd/common/util/security/SecurityUtilsTest.java
----------------------------------------------------------------------
diff --git a/sshd-common/src/test/java/org/apache/sshd/common/util/security/SecurityUtilsTest.java b/sshd-common/src/test/java/org/apache/sshd/common/util/security/SecurityUtilsTest.java
index cdb4967..488d2ce 100644
--- a/sshd-common/src/test/java/org/apache/sshd/common/util/security/SecurityUtilsTest.java
+++ b/sshd-common/src/test/java/org/apache/sshd/common/util/security/SecurityUtilsTest.java
@@ -183,7 +183,7 @@ public class SecurityUtilsTest extends JUnitTestSupport {
             String resourceKey, AbstractResourceKeyPairProvider<?> provider,
             Class<? extends PublicKey> pubType, Class<? extends PrivateKey> prvType) {
         provider.setPasswordFinder(TEST_PASSWORD_PROVIDER);
-        Iterable<KeyPair> iterator = provider.loadKeys();
+        Iterable<KeyPair> iterator = provider.loadKeys(null);
         List<KeyPair> pairs = new ArrayList<>();
         for (KeyPair kp : iterator) {
             pairs.add(kp);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-common/src/test/java/org/apache/sshd/server/keyprovider/AbstractGeneratorHostKeyProviderTest.java
----------------------------------------------------------------------
diff --git a/sshd-common/src/test/java/org/apache/sshd/server/keyprovider/AbstractGeneratorHostKeyProviderTest.java b/sshd-common/src/test/java/org/apache/sshd/server/keyprovider/AbstractGeneratorHostKeyProviderTest.java
index 2978a18..66ecb05 100644
--- a/sshd-common/src/test/java/org/apache/sshd/server/keyprovider/AbstractGeneratorHostKeyProviderTest.java
+++ b/sshd-common/src/test/java/org/apache/sshd/server/keyprovider/AbstractGeneratorHostKeyProviderTest.java
@@ -27,6 +27,7 @@ import java.security.GeneralSecurityException;
 import java.security.KeyPair;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import org.apache.sshd.common.session.SessionContext;
 import org.apache.sshd.util.test.JUnitTestSupport;
 import org.apache.sshd.util.test.NoIoTestCase;
 import org.junit.FixMethodOrder;
@@ -41,20 +42,20 @@ public class AbstractGeneratorHostKeyProviderTest extends JUnitTestSupport {
         super();
     }
 
-    @SuppressWarnings("synthetic-access")
     @Test
+    @SuppressWarnings("synthetic-access")
     public void testOverwriteKey() throws Exception {
         Path tempDir = assertHierarchyTargetFolderExists(getTempTargetFolder());
         Path keyPairFile = tempDir.resolve(getCurrentTestName() + ".key");
         Files.deleteIfExists(keyPairFile);
 
         TestProvider provider = new TestProvider(keyPairFile);
-        provider.loadKeys();
+        provider.loadKeys(null);
         assertEquals("Mismatched generate write count", 1, provider.getWriteCount());
 
         provider = new TestProvider(keyPairFile);
         provider.setOverwriteAllowed(false);
-        provider.loadKeys();
+        provider.loadKeys(null);
         assertEquals("Mismatched load write count", 0, provider.getWriteCount());
     }
 
@@ -67,12 +68,15 @@ public class AbstractGeneratorHostKeyProviderTest extends JUnitTestSupport {
         }
 
         @Override
-        protected KeyPair doReadKeyPair(String resourceKey, InputStream inputStream) throws IOException, GeneralSecurityException {
+        protected KeyPair doReadKeyPair(
+                SessionContext session, String resourceKey, InputStream inputStream)
+                    throws IOException, GeneralSecurityException {
             return null;
         }
 
         @Override
-        protected void doWriteKeyPair(String resourceKey, KeyPair kp, OutputStream outputStream) throws IOException, GeneralSecurityException {
+        protected void doWriteKeyPair(String resourceKey, KeyPair kp, OutputStream outputStream)
+                throws IOException, GeneralSecurityException {
             writes.incrementAndGet();
         }
 

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-common/src/test/java/org/apache/sshd/util/test/CommonTestSupportUtils.java
----------------------------------------------------------------------
diff --git a/sshd-common/src/test/java/org/apache/sshd/util/test/CommonTestSupportUtils.java b/sshd-common/src/test/java/org/apache/sshd/util/test/CommonTestSupportUtils.java
index 6558c07..a1d77ef 100644
--- a/sshd-common/src/test/java/org/apache/sshd/util/test/CommonTestSupportUtils.java
+++ b/sshd-common/src/test/java/org/apache/sshd/util/test/CommonTestSupportUtils.java
@@ -453,7 +453,7 @@ public final class CommonTestSupportUtils {
 
     public static KeyPair getFirstKeyPair(KeyIdentityProvider provider) {
         Objects.requireNonNull(provider, "No key pair provider");
-        Iterable<? extends KeyPair> pairs = Objects.requireNonNull(provider.loadKeys(), "No loaded keys");
+        Iterable<? extends KeyPair> pairs = Objects.requireNonNull(provider.loadKeys(null), "No loaded keys");
         Iterator<? extends KeyPair> iter = Objects.requireNonNull(pairs.iterator(), "No keys iterator");
         ValidateUtils.checkTrue(iter.hasNext(), "Empty loaded kyes iterator");
         return Objects.requireNonNull(iter.next(), "No key pair in iterator");
@@ -537,7 +537,7 @@ public final class CommonTestSupportUtils {
         Objects.requireNonNull(provider, "No provider");
 
         // get the I/O out of the way
-        Iterable<KeyPair> keys = Objects.requireNonNull(provider.loadKeys(), "No keys loaded");
+        Iterable<KeyPair> keys = Objects.requireNonNull(provider.loadKeys(null), "No keys loaded");
         if (keys instanceof Collection<?>) {
             ValidateUtils.checkNotNullAndNotEmpty((Collection<?>) keys, "Empty keys loaded");
         }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-common/src/test/java/rg/apache/sshd/client/config/keys/LazyClientIdentityIteratorTest.java
----------------------------------------------------------------------
diff --git a/sshd-common/src/test/java/rg/apache/sshd/client/config/keys/LazyClientIdentityIteratorTest.java b/sshd-common/src/test/java/rg/apache/sshd/client/config/keys/LazyClientIdentityIteratorTest.java
index d6137a8..32f2712 100644
--- a/sshd-common/src/test/java/rg/apache/sshd/client/config/keys/LazyClientIdentityIteratorTest.java
+++ b/sshd-common/src/test/java/rg/apache/sshd/client/config/keys/LazyClientIdentityIteratorTest.java
@@ -27,6 +27,7 @@ import java.util.Iterator;
 import java.util.List;
 
 import org.apache.sshd.client.config.keys.ClientIdentityProvider;
+import org.apache.sshd.common.session.SessionContext;
 import org.apache.sshd.util.test.JUnitTestSupport;
 import org.junit.FixMethodOrder;
 import org.junit.Test;
@@ -56,7 +57,7 @@ public class LazyClientIdentityIteratorTest extends JUnitTestSupport {
         Iterable<KeyPair> ids = ClientIdentityProvider.lazyKeysLoader(
             providers, p -> {
                 try {
-                    return p.getClientIdentity();
+                    return p.getClientIdentity(null);
                 } catch (Exception e) {
                     throw new RuntimeException("Unexpected " + e.getClass().getSimpleName() + ": " + e.getMessage(), e);
                 }
@@ -93,7 +94,7 @@ public class LazyClientIdentityIteratorTest extends JUnitTestSupport {
         }
 
         @Override
-        public KeyPair getClientIdentity() {
+        public KeyPair getClientIdentity(SessionContext session) {
             loadCount++;
             return getKeyPair();
         }
@@ -101,7 +102,7 @@ public class LazyClientIdentityIteratorTest extends JUnitTestSupport {
         @Override
         public String toString() {
             return getClass().getSimpleName()
-                + "[" + getClientIdentity() + "]"
+                + "[" + getKeyPair() + "]"
                 + ": loadCount=" + getLoadCount();
         }
     }

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-core/src/main/java/org/apache/sshd/client/auth/pubkey/UserAuthPublicKeyIterator.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/auth/pubkey/UserAuthPublicKeyIterator.java b/sshd-core/src/main/java/org/apache/sshd/client/auth/pubkey/UserAuthPublicKeyIterator.java
index 73e34ee..d476464 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/auth/pubkey/UserAuthPublicKeyIterator.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/auth/pubkey/UserAuthPublicKeyIterator.java
@@ -95,7 +95,7 @@ public class UserAuthPublicKeyIterator extends AbstractKeyPairIterator<PublicKey
                 // Lazy load the keys the 1st time the iterator is called
                 if (keysHolder.get() == null) {
                     KeyIdentityProvider sessionKeysProvider = ClientSession.providerOf(session);
-                    keysHolder.set(sessionKeysProvider.loadKeys());
+                    keysHolder.set(sessionKeysProvider.loadKeys(session));
                 }
 
                 return new Iterator<KeyPairIdentity>() {

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSession.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSession.java b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSession.java
index 63343cb..b6d6235 100644
--- a/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSession.java
+++ b/sshd-core/src/main/java/org/apache/sshd/client/session/ClientSession.java
@@ -381,7 +381,7 @@ public interface ClientSession
         return (session == null)
             ? KeyIdentityProvider.EMPTY_KEYS_PROVIDER
             : KeyIdentityProvider.resolveKeyIdentityProvider(
-                    session.getRegisteredIdentities(), session.getKeyPairProvider());
+                session.getRegisteredIdentities(), session.getKeyPairProvider());
     }
 
     /**
@@ -396,7 +396,7 @@ public interface ClientSession
      * @see ClientSession#getKeyPairProvider()
      */
     static Iterator<KeyPair> keyPairIteratorOf(ClientSession session) {
-        return KeyIdentityProvider.iteratorOf(providerOf(session));
+        return KeyIdentityProvider.iteratorOf(session, providerOf(session));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-core/src/main/java/org/apache/sshd/server/session/ServerUserAuthService.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/main/java/org/apache/sshd/server/session/ServerUserAuthService.java b/sshd-core/src/main/java/org/apache/sshd/server/session/ServerUserAuthService.java
index ae038ae..d6f6d51 100644
--- a/sshd-core/src/main/java/org/apache/sshd/server/session/ServerUserAuthService.java
+++ b/sshd-core/src/main/java/org/apache/sshd/server/session/ServerUserAuthService.java
@@ -437,7 +437,7 @@ public class ServerUserAuthService extends AbstractCloseable implements Service,
 
             if (ServerAuthenticationManager.AUTO_WELCOME_BANNER_VALUE.equalsIgnoreCase(message)) {
                 try {
-                    return KeyRandomArt.combine(' ', session.getKeyPairProvider());
+                    return KeyRandomArt.combine(session, ' ', session.getKeyPairProvider());
                 } catch (Exception e) {
                     if (e instanceof IOException) {
                         throw (IOException) e;

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-core/src/test/java/org/apache/sshd/client/config/hosts/HostConfigEntryResolverTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/client/config/hosts/HostConfigEntryResolverTest.java b/sshd-core/src/test/java/org/apache/sshd/client/config/hosts/HostConfigEntryResolverTest.java
index 0679fa3..30cb1ff 100644
--- a/sshd-core/src/test/java/org/apache/sshd/client/config/hosts/HostConfigEntryResolverTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/client/config/hosts/HostConfigEntryResolverTest.java
@@ -43,6 +43,7 @@ import org.apache.sshd.common.io.IoSession;
 import org.apache.sshd.common.keyprovider.AbstractKeyPairProvider;
 import org.apache.sshd.common.keyprovider.KeyPairProvider;
 import org.apache.sshd.common.session.Session;
+import org.apache.sshd.common.session.SessionContext;
 import org.apache.sshd.common.util.ValidateUtils;
 import org.apache.sshd.common.util.net.SshdSocketAddress;
 import org.apache.sshd.server.SshServer;
@@ -231,7 +232,7 @@ public class HostConfigEntryResolverTest extends BaseTestSupport {
         Collection<KeyPair> clientIdentities = Collections.singletonList(defaultIdentity);
         KeyPairProvider provider = new AbstractKeyPairProvider() {
             @Override
-            public Iterable<KeyPair> loadKeys() {
+            public Iterable<KeyPair> loadKeys(SessionContext session) {
                 return clientIdentities;
             }
         };

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-core/src/test/java/org/apache/sshd/common/signature/SignatureFactoriesTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/common/signature/SignatureFactoriesTest.java b/sshd-core/src/test/java/org/apache/sshd/common/signature/SignatureFactoriesTest.java
index 164c2f1..7ae6c96 100644
--- a/sshd-core/src/test/java/org/apache/sshd/common/signature/SignatureFactoriesTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/common/signature/SignatureFactoriesTest.java
@@ -39,6 +39,7 @@ import org.apache.sshd.common.config.keys.impl.DSSPublicKeyEntryDecoder;
 import org.apache.sshd.common.config.keys.impl.ECDSAPublicKeyEntryDecoder;
 import org.apache.sshd.common.config.keys.impl.RSAPublicKeyDecoder;
 import org.apache.sshd.common.keyprovider.KeyPairProvider;
+import org.apache.sshd.common.session.SessionContext;
 import org.apache.sshd.common.util.ValidateUtils;
 import org.apache.sshd.common.util.security.SecurityUtils;
 import org.apache.sshd.server.SshServer;
@@ -164,8 +165,8 @@ public class SignatureFactoriesTest extends BaseTestSupport implements OptionalF
     }
 
     protected void testKeyPairProvider(
-            final String keyName, final int keySize, final PublicKeyEntryDecoder<?, ?> decoder, List<NamedFactory<Signature>> signatures)
-                    throws Exception {
+            String keyName, int keySize, PublicKeyEntryDecoder<?, ?> decoder, List<NamedFactory<Signature>> signatures)
+                throws Exception {
         testKeyPairProvider(keyName, () -> {
             try {
                 KeyPair kp = decoder.generateKeyPair(keySize);
@@ -178,12 +179,12 @@ public class SignatureFactoriesTest extends BaseTestSupport implements OptionalF
     }
 
     protected void testKeyPairProvider(
-            final String keyName, final Factory<Iterable<KeyPair>> keyPairFactory, List<NamedFactory<Signature>> signatures)
+            String keyName, Factory<Iterable<KeyPair>> keyPairFactory, List<NamedFactory<Signature>> signatures)
                     throws Exception {
-        final Iterable<KeyPair> iter = keyPairFactory.create();
+        Iterable<KeyPair> iter = keyPairFactory.create();
         testKeyPairProvider(new KeyPairProvider() {
             @Override
-            public Iterable<KeyPair> loadKeys() {
+            public Iterable<KeyPair> loadKeys(SessionContext session) {
                 return iter;
             }
         }, signatures);

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-core/src/test/java/org/apache/sshd/server/auth/WelcomeBannerTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/server/auth/WelcomeBannerTest.java b/sshd-core/src/test/java/org/apache/sshd/server/auth/WelcomeBannerTest.java
index e417aa9..4ae73b6 100644
--- a/sshd-core/src/test/java/org/apache/sshd/server/auth/WelcomeBannerTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/server/auth/WelcomeBannerTest.java
@@ -98,8 +98,9 @@ public class WelcomeBannerTest extends BaseTestSupport {
     @Test   // see SSHD-686
     public void testAutoGeneratedBanner() throws Exception {
         KeyPairProvider keys = sshd.getKeyPairProvider();
-        PropertyResolverUtils.updateProperty(sshd, ServerAuthenticationManager.WELCOME_BANNER, ServerAuthenticationManager.AUTO_WELCOME_BANNER_VALUE);
-        testBanner(KeyRandomArt.combine(' ', keys));
+        PropertyResolverUtils.updateProperty(sshd,
+            ServerAuthenticationManager.WELCOME_BANNER, ServerAuthenticationManager.AUTO_WELCOME_BANNER_VALUE);
+        testBanner(KeyRandomArt.combine(null, ' ', keys));
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/mina-sshd/blob/210f638e/sshd-core/src/test/java/org/apache/sshd/server/config/keys/ServerIdentityTest.java
----------------------------------------------------------------------
diff --git a/sshd-core/src/test/java/org/apache/sshd/server/config/keys/ServerIdentityTest.java b/sshd-core/src/test/java/org/apache/sshd/server/config/keys/ServerIdentityTest.java
index 5e3bb7b..1665dc9 100644
--- a/sshd-core/src/test/java/org/apache/sshd/server/config/keys/ServerIdentityTest.java
+++ b/sshd-core/src/test/java/org/apache/sshd/server/config/keys/ServerIdentityTest.java
@@ -92,7 +92,7 @@ public class ServerIdentityTest extends BaseTestSupport {
         KeyPairProvider provider = IdentityUtils.createKeyPairProvider(ids, true /* supported only */);
         assertNotNull("No provider generated", provider);
 
-        Iterable<KeyPair> keys = provider.loadKeys();
+        Iterable<KeyPair> keys = provider.loadKeys(null);
         for (KeyPair kp : keys) {
             assertTrue("Unexpected loaded key: " + kp, pairs.remove(kp));
         }