This is an automated email from the ASF dual-hosted git repository. lgoldstein pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/mina-sshd.git
commit 20e149455f32a6c633146baaacab883279658afb Author: Lyor Goldstein <lgoldst...@apache.org> AuthorDate: Tue Nov 10 18:54:15 2020 +0200 [SSHD-1100] Split DHGEXServer#chooseDH code into smaller methods --- .../sshd/cli/client/SshClientCliSupport.java | 1 - .../org/apache/sshd/server/kex/DHGEXServer.java | 53 ++++++++++++---------- 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/sshd-cli/src/main/java/org/apache/sshd/cli/client/SshClientCliSupport.java b/sshd-cli/src/main/java/org/apache/sshd/cli/client/SshClientCliSupport.java index db26179..8947388 100644 --- a/sshd-cli/src/main/java/org/apache/sshd/cli/client/SshClientCliSupport.java +++ b/sshd-cli/src/main/java/org/apache/sshd/cli/client/SshClientCliSupport.java @@ -254,7 +254,6 @@ public abstract class SshClientCliSupport extends CliSupport { port = SshConstants.TO_EFFECTIVE_PORT.applyAsInt(port); HostConfigEntry entry = resolveHost(client, login, host, port, proxyJump); - // TODO use a configurable wait time ClientSession session = client.connect(entry, null, null) .verify(CliClientModuleProperties.CONECT_TIMEOUT.getRequired(client)) .getSession(); diff --git a/sshd-core/src/main/java/org/apache/sshd/server/kex/DHGEXServer.java b/sshd-core/src/main/java/org/apache/sshd/server/kex/DHGEXServer.java index 66fbf4a..3e23da2 100644 --- a/sshd-core/src/main/java/org/apache/sshd/server/kex/DHGEXServer.java +++ b/sshd-core/src/main/java/org/apache/sshd/server/kex/DHGEXServer.java @@ -269,14 +269,37 @@ public class DHGEXServer extends AbstractDHServerKeyExchange { } protected DHG chooseDH(int min, int prf, int max) throws Exception { + ServerSession session = getServerSession(); + List<Moduli.DhGroup> groups = loadModuliGroups(session); + List<Moduli.DhGroup> selected = selectModuliGroups(session, min, prf, max, groups); + if (GenericUtils.isEmpty(selected)) { + log.warn("chooseDH({})[{}][prf={}, min={}, max={}] No suitable primes found, defaulting to DHG1", + this, session, prf, min, max); + return getDH(new BigInteger(DHGroupData.getP1()), new BigInteger(DHGroupData.getG())); + } + + FactoryManager manager = Objects.requireNonNull(session.getFactoryManager(), "No factory manager"); + Factory<Random> factory = Objects.requireNonNull(manager.getRandomFactory(), "No random factory"); + Random random = Objects.requireNonNull(factory.create(), "No random generator"); + int which = random.random(selected.size()); + Moduli.DhGroup group = selected.get(which); + if (log.isTraceEnabled()) { + log.trace("chooseDH({})[{}][prf={}, min={}, max={}] selected {}", + this, session, prf, min, max, group); + } + + return getDH(group.getP(), group.getG()); + } + + protected List<Moduli.DhGroup> selectModuliGroups( + ServerSession session, int min, int prf, int max, List<Moduli.DhGroup> groups) + throws Exception { int maxDHGroupExchangeKeySize = SecurityUtils.getMaxDHGroupExchangeKeySize(); min = Math.max(min, SecurityUtils.MIN_DHGEX_KEY_SIZE); prf = Math.max(prf, SecurityUtils.MIN_DHGEX_KEY_SIZE); prf = Math.min(prf, maxDHGroupExchangeKeySize); max = Math.min(max, maxDHGroupExchangeKeySize); - List<Moduli.DhGroup> groups = loadModuliGroups(); - Session session = getServerSession(); List<Moduli.DhGroup> selected = new ArrayList<>(); int bestSize = 0; boolean traceEnabled = log.isTraceEnabled(); @@ -284,7 +307,7 @@ public class DHGEXServer extends AbstractDHServerKeyExchange { int size = group.getSize(); if ((size < min) || (size > max)) { if (traceEnabled) { - log.trace("chooseDH({})[{}] - skip group={} - size not in range [{}-{}]", + log.trace("selectModuliGroups({})[{}] - skip group={} - size not in range [{}-{}]", this, session, group, min, max); } continue; @@ -293,7 +316,7 @@ public class DHGEXServer extends AbstractDHServerKeyExchange { if (((size > prf) && (size < bestSize)) || ((size > bestSize) && (bestSize < prf))) { bestSize = size; if (traceEnabled) { - log.trace("chooseDH({})[{}][prf={}, min={}, max={}] new best size={} from group={}", + log.trace("selectModuliGroups({})[{}][prf={}, min={}, max={}] new best size={} from group={}", this, session, prf, min, max, bestSize, group); } selected.clear(); @@ -301,33 +324,17 @@ public class DHGEXServer extends AbstractDHServerKeyExchange { if (size == bestSize) { if (traceEnabled) { - log.trace("chooseDH({})[{}][prf={}, min={}, max={}] selected {}", + log.trace("selectModuliGroups({})[{}][prf={}, min={}, max={}] selected {}", this, session, prf, min, max, group); } selected.add(group); } } - if (selected.isEmpty()) { - log.warn("chooseDH({})[{}][prf={}, min={}, max={}] No suitable primes found, defaulting to DHG1", - this, session, prf, min, max); - return getDH(new BigInteger(DHGroupData.getP1()), new BigInteger(DHGroupData.getG())); - } - - FactoryManager manager = Objects.requireNonNull(session.getFactoryManager(), "No factory manager"); - Factory<Random> factory = Objects.requireNonNull(manager.getRandomFactory(), "No random factory"); - Random random = Objects.requireNonNull(factory.create(), "No random generator"); - int which = random.random(selected.size()); - Moduli.DhGroup group = selected.get(which); - if (traceEnabled) { - log.trace("chooseDH({})[{}][prf={}, min={}, max={}] selected {}", - this, session, prf, min, max, group); - } - return getDH(group.getP(), group.getG()); + return selected; } - protected List<Moduli.DhGroup> loadModuliGroups() throws IOException { - Session session = getServerSession(); + protected List<Moduli.DhGroup> loadModuliGroups(ServerSession session) throws IOException { String moduliStr = CoreModuleProperties.MODULI_URL.getOrNull(session); List<Moduli.DhGroup> groups = null; if (!GenericUtils.isEmpty(moduliStr)) {