From 0ad51709c25bf38b9f61fcacf0db6ec22527cccc Mon Sep 17 00:00:00 2001 From: Jeroen van Erp Date: Wed, 28 Dec 2016 10:00:24 +0100 Subject: [PATCH] Use the configured Random factory in DH KEX (Fixes #292) --- .../sshj/transport/kex/AbstractDHGex.java | 2 +- .../sshj/transport/kex/Curve25519DH.java | 18 +++++++++--------- .../sshj/transport/kex/Curve25519SHA256.java | 2 +- .../net/schmizz/sshj/transport/kex/DH.java | 4 +++- .../net/schmizz/sshj/transport/kex/DHBase.java | 4 +++- .../net/schmizz/sshj/transport/kex/DHG1.java | 2 +- .../net/schmizz/sshj/transport/kex/DHG14.java | 2 +- .../net/schmizz/sshj/transport/kex/ECDH.java | 4 +++- .../schmizz/sshj/transport/kex/ECDHNistP.java | 2 +- .../transport/random/BouncyCastleRandom.java | 5 +++++ .../sshj/transport/random/JCERandom.java | 4 ++++ .../schmizz/sshj/transport/random/Random.java | 7 +++++++ .../random/SingletonRandomFactory.java | 4 ++++ 13 files changed, 43 insertions(+), 17 deletions(-) diff --git a/src/main/java/net/schmizz/sshj/transport/kex/AbstractDHGex.java b/src/main/java/net/schmizz/sshj/transport/kex/AbstractDHGex.java index da9c0df0..25e496bf 100644 --- a/src/main/java/net/schmizz/sshj/transport/kex/AbstractDHGex.java +++ b/src/main/java/net/schmizz/sshj/transport/kex/AbstractDHGex.java @@ -103,7 +103,7 @@ public abstract class AbstractDHGex extends AbstractDH { throw new GeneralSecurityException("Server generated gex p is out of range (" + bitLength + " bits)"); } log.debug("Received server p bitlength {}", bitLength); - dh.init(new DHParameterSpec(p, g)); + dh.init(new DHParameterSpec(p, g), trans.getConfig().getRandomFactory()); log.debug("Sending {}", Message.KEX_DH_GEX_INIT); trans.write(new SSHPacket(Message.KEX_DH_GEX_INIT).putBytes(dh.getE())); return false; diff --git a/src/main/java/net/schmizz/sshj/transport/kex/Curve25519DH.java b/src/main/java/net/schmizz/sshj/transport/kex/Curve25519DH.java index b1deef4c..17c64584 100644 --- a/src/main/java/net/schmizz/sshj/transport/kex/Curve25519DH.java +++ b/src/main/java/net/schmizz/sshj/transport/kex/Curve25519DH.java @@ -15,19 +15,19 @@ */ package net.schmizz.sshj.transport.kex; +import java.math.BigInteger; +import java.security.GeneralSecurityException; +import java.security.spec.AlgorithmParameterSpec; +import java.util.Arrays; import org.bouncycastle.asn1.x9.X9ECParameters; import org.bouncycastle.crypto.ec.CustomNamedCurves; import org.bouncycastle.jce.spec.ECParameterSpec; -import java.math.BigInteger; -import java.security.GeneralSecurityException; -import java.security.SecureRandom; -import java.security.spec.AlgorithmParameterSpec; -import java.util.Arrays; +import net.schmizz.sshj.common.Factory; +import net.schmizz.sshj.transport.random.Random; public class Curve25519DH extends DHBase { - private byte[] secretKey; public Curve25519DH() { @@ -42,10 +42,10 @@ public class Curve25519DH extends DHBase { } @Override - public void init(AlgorithmParameterSpec params) throws GeneralSecurityException { - SecureRandom secureRandom = new SecureRandom(); + public void init(AlgorithmParameterSpec params, Factory randomFactory) throws GeneralSecurityException { + Random random = randomFactory.create(); byte[] secretBytes = new byte[32]; - secureRandom.nextBytes(secretBytes); + random.fill(secretBytes); byte[] publicBytes = new byte[32]; djb.Curve25519.keygen(publicBytes, null, secretBytes); this.secretKey = Arrays.copyOf(secretBytes, secretBytes.length); diff --git a/src/main/java/net/schmizz/sshj/transport/kex/Curve25519SHA256.java b/src/main/java/net/schmizz/sshj/transport/kex/Curve25519SHA256.java index ebf1bcbb..92f4461c 100644 --- a/src/main/java/net/schmizz/sshj/transport/kex/Curve25519SHA256.java +++ b/src/main/java/net/schmizz/sshj/transport/kex/Curve25519SHA256.java @@ -45,6 +45,6 @@ public class Curve25519SHA256 extends AbstractDHG { @Override protected void initDH(DHBase dh) throws GeneralSecurityException { - dh.init(Curve25519DH.getCurve25519Params()); + dh.init(Curve25519DH.getCurve25519Params(), trans.getConfig().getRandomFactory()); } } diff --git a/src/main/java/net/schmizz/sshj/transport/kex/DH.java b/src/main/java/net/schmizz/sshj/transport/kex/DH.java index a7d57e59..83f32bf8 100644 --- a/src/main/java/net/schmizz/sshj/transport/kex/DH.java +++ b/src/main/java/net/schmizz/sshj/transport/kex/DH.java @@ -15,8 +15,10 @@ */ package net.schmizz.sshj.transport.kex; +import net.schmizz.sshj.common.Factory; import net.schmizz.sshj.common.SSHRuntimeException; import net.schmizz.sshj.common.SecurityUtils; +import net.schmizz.sshj.transport.random.Random; import javax.crypto.spec.DHParameterSpec; import javax.crypto.spec.DHPublicKeySpec; @@ -38,7 +40,7 @@ public class DH extends DHBase { } @Override - protected void init(AlgorithmParameterSpec params) throws GeneralSecurityException { + protected void init(AlgorithmParameterSpec params, Factory randomFactory) throws GeneralSecurityException { if (!(params instanceof DHParameterSpec)) { throw new SSHRuntimeException("Wrong algorithm parameters for Diffie Hellman"); } diff --git a/src/main/java/net/schmizz/sshj/transport/kex/DHBase.java b/src/main/java/net/schmizz/sshj/transport/kex/DHBase.java index 18894c51..9ad12fa6 100644 --- a/src/main/java/net/schmizz/sshj/transport/kex/DHBase.java +++ b/src/main/java/net/schmizz/sshj/transport/kex/DHBase.java @@ -15,8 +15,10 @@ */ package net.schmizz.sshj.transport.kex; +import net.schmizz.sshj.common.Factory; import net.schmizz.sshj.common.SSHRuntimeException; import net.schmizz.sshj.common.SecurityUtils; +import net.schmizz.sshj.transport.random.Random; import javax.crypto.KeyAgreement; import java.math.BigInteger; @@ -42,7 +44,7 @@ abstract class DHBase { abstract void computeK(byte[] f) throws GeneralSecurityException; - protected abstract void init(AlgorithmParameterSpec params) throws GeneralSecurityException; + protected abstract void init(AlgorithmParameterSpec params, Factory randomFactory) throws GeneralSecurityException; void setE(byte[] e) { this.e = e; diff --git a/src/main/java/net/schmizz/sshj/transport/kex/DHG1.java b/src/main/java/net/schmizz/sshj/transport/kex/DHG1.java index 803217a3..d8e79013 100644 --- a/src/main/java/net/schmizz/sshj/transport/kex/DHG1.java +++ b/src/main/java/net/schmizz/sshj/transport/kex/DHG1.java @@ -51,6 +51,6 @@ public class DHG1 @Override protected void initDH(DHBase dh) throws GeneralSecurityException { - dh.init(new DHParameterSpec(DHGroupData.P1, DHGroupData.G)); + dh.init(new DHParameterSpec(DHGroupData.P1, DHGroupData.G), trans.getConfig().getRandomFactory()); } } diff --git a/src/main/java/net/schmizz/sshj/transport/kex/DHG14.java b/src/main/java/net/schmizz/sshj/transport/kex/DHG14.java index edfbc937..a6ab830a 100644 --- a/src/main/java/net/schmizz/sshj/transport/kex/DHG14.java +++ b/src/main/java/net/schmizz/sshj/transport/kex/DHG14.java @@ -51,6 +51,6 @@ public class DHG14 @Override protected void initDH(DHBase dh) throws GeneralSecurityException { - dh.init(new DHParameterSpec(DHGroupData.P14, DHGroupData.G)); + dh.init(new DHParameterSpec(DHGroupData.P14, DHGroupData.G), trans.getConfig().getRandomFactory()); } } diff --git a/src/main/java/net/schmizz/sshj/transport/kex/ECDH.java b/src/main/java/net/schmizz/sshj/transport/kex/ECDH.java index 2c5a74bf..ade185ba 100644 --- a/src/main/java/net/schmizz/sshj/transport/kex/ECDH.java +++ b/src/main/java/net/schmizz/sshj/transport/kex/ECDH.java @@ -15,7 +15,9 @@ */ package net.schmizz.sshj.transport.kex; +import net.schmizz.sshj.common.Factory; import net.schmizz.sshj.common.SecurityUtils; +import net.schmizz.sshj.transport.random.Random; import java.math.BigInteger; import java.security.GeneralSecurityException; @@ -39,7 +41,7 @@ public class ECDH extends DHBase { super("EC", "ECDH"); } - protected void init(AlgorithmParameterSpec params) throws GeneralSecurityException { + protected void init(AlgorithmParameterSpec params, Factory randomFactory) throws GeneralSecurityException { generator.initialize(params); KeyPair keyPair = generator.generateKeyPair(); agreement.init(keyPair.getPrivate()); diff --git a/src/main/java/net/schmizz/sshj/transport/kex/ECDHNistP.java b/src/main/java/net/schmizz/sshj/transport/kex/ECDHNistP.java index d382234e..53aa52e2 100644 --- a/src/main/java/net/schmizz/sshj/transport/kex/ECDHNistP.java +++ b/src/main/java/net/schmizz/sshj/transport/kex/ECDHNistP.java @@ -79,7 +79,7 @@ public class ECDHNistP extends AbstractDHG { @Override protected void initDH(DHBase dh) throws GeneralSecurityException { - dh.init(new ECNamedCurveGenParameterSpec(curve)); + dh.init(new ECNamedCurveGenParameterSpec(curve), trans.getConfig().getRandomFactory()); } } diff --git a/src/main/java/net/schmizz/sshj/transport/random/BouncyCastleRandom.java b/src/main/java/net/schmizz/sshj/transport/random/BouncyCastleRandom.java index 6fb9180c..d8211d3f 100644 --- a/src/main/java/net/schmizz/sshj/transport/random/BouncyCastleRandom.java +++ b/src/main/java/net/schmizz/sshj/transport/random/BouncyCastleRandom.java @@ -57,4 +57,9 @@ public class BouncyCastleRandom random.nextBytes(bytes, start, len); } + @Override + public void fill(byte[] bytes) { + random.nextBytes(bytes); + } + } diff --git a/src/main/java/net/schmizz/sshj/transport/random/JCERandom.java b/src/main/java/net/schmizz/sshj/transport/random/JCERandom.java index ea2179d9..a85710e0 100644 --- a/src/main/java/net/schmizz/sshj/transport/random/JCERandom.java +++ b/src/main/java/net/schmizz/sshj/transport/random/JCERandom.java @@ -71,4 +71,8 @@ public class JCERandom } } + @Override + public void fill(final byte[] bytes) { + random.nextBytes(bytes); + } } diff --git a/src/main/java/net/schmizz/sshj/transport/random/Random.java b/src/main/java/net/schmizz/sshj/transport/random/Random.java index 9dabb7b2..00410fdc 100644 --- a/src/main/java/net/schmizz/sshj/transport/random/Random.java +++ b/src/main/java/net/schmizz/sshj/transport/random/Random.java @@ -18,6 +18,13 @@ package net.schmizz.sshj.transport.random; /** A pseudo random number generator. */ public interface Random { + /** + * Fill the array of bytes with random values. + * + * @param bytes byte array to be filled. + */ + void fill(byte[] bytes); + /** * Fill part of bytes with random values. * diff --git a/src/main/java/net/schmizz/sshj/transport/random/SingletonRandomFactory.java b/src/main/java/net/schmizz/sshj/transport/random/SingletonRandomFactory.java index b2a1f9b0..bcaf4813 100644 --- a/src/main/java/net/schmizz/sshj/transport/random/SingletonRandomFactory.java +++ b/src/main/java/net/schmizz/sshj/transport/random/SingletonRandomFactory.java @@ -37,4 +37,8 @@ public class SingletonRandomFactory random.fill(bytes, start, len); } + @Override + public void fill(final byte[] bytes) { + random.fill(bytes); + } }