# HG changeset patch # User Carl Byington # Date 1406762373 25200 # Node ID 1d400fd78e4aeaedff57c4084d7c245d072a9e5f # Parent 1442be38051b0a8d9cb61e200f5abd83afde61c8 add ecdsa key support everywhere diff -r 1442be38051b -r 1d400fd78e4a src/ch/ethz/ssh2/crypto/dh/DhExchange.java --- a/src/ch/ethz/ssh2/crypto/dh/DhExchange.java Wed Jul 30 16:03:21 2014 -0700 +++ b/src/ch/ethz/ssh2/crypto/dh/DhExchange.java Wed Jul 30 16:19:33 2014 -0700 @@ -58,6 +58,7 @@ /* Server public */ private DHPublicKey serverPublic; + private byte[] f; @Override public void init(String name) throws IOException { @@ -105,6 +106,11 @@ } @Override + public byte[] getF() { + return f; + } + + @Override public void setF(byte[] f) throws IOException { if (clientPublic == null) throw new IllegalStateException("DhExchange not initialized!"); @@ -114,6 +120,7 @@ try { KeyFactory kf = KeyFactory.getInstance("DH"); DHParameterSpec params = clientPublic.getParams(); + this.f = f; this.serverPublic = (DHPublicKey) kf.generatePublic(new DHPublicKeySpec( new BigInteger(f), params.getP(), params.getG())); ka = KeyAgreement.getInstance("DH"); diff -r 1442be38051b -r 1d400fd78e4a src/ch/ethz/ssh2/crypto/dh/DhGroupExchange.java --- a/src/ch/ethz/ssh2/crypto/dh/DhGroupExchange.java Wed Jul 30 16:03:21 2014 -0700 +++ b/src/ch/ethz/ssh2/crypto/dh/DhGroupExchange.java Wed Jul 30 16:19:33 2014 -0700 @@ -3,6 +3,7 @@ import java.math.BigInteger; import java.security.SecureRandom; +import java.io.IOException; import ch.ethz.ssh2.DHGexParameters; import ch.ethz.ssh2.crypto.digest.HashForSSH2Types; diff -r 1442be38051b -r 1d400fd78e4a src/ch/ethz/ssh2/crypto/dh/EcDhExchange.java --- a/src/ch/ethz/ssh2/crypto/dh/EcDhExchange.java Wed Jul 30 16:03:21 2014 -0700 +++ b/src/ch/ethz/ssh2/crypto/dh/EcDhExchange.java Wed Jul 30 16:19:33 2014 -0700 @@ -27,9 +27,16 @@ * */ public class EcDhExchange extends GenericDhExchange { + + /* Client public and private */ + private ECPrivateKey clientPrivate; private ECPublicKey clientPublic; + + /* Server public */ + private ECPublicKey serverPublic; + private byte[] f; @Override public void init(String name) throws IOException { @@ -78,6 +85,11 @@ } @Override + public byte[] getF() { + return f; + } + + @Override public void setF(byte[] f) throws IOException { if (clientPublic == null) throw new IllegalStateException("DhDsaExchange not initialized!"); @@ -88,6 +100,7 @@ KeyFactory kf = KeyFactory.getInstance("EC"); ECParameterSpec params = clientPublic.getParams(); ECPoint serverPoint = ECDSASHA2Verify.decodeECPoint(f, params.getCurve()); + this.f = f; this.serverPublic = (ECPublicKey) kf.generatePublic(new ECPublicKeySpec(serverPoint, params)); ka = KeyAgreement.getInstance("ECDH"); diff -r 1442be38051b -r 1d400fd78e4a src/ch/ethz/ssh2/crypto/dh/GenericDhExchange.java --- a/src/ch/ethz/ssh2/crypto/dh/GenericDhExchange.java Wed Jul 30 16:03:21 2014 -0700 +++ b/src/ch/ethz/ssh2/crypto/dh/GenericDhExchange.java Wed Jul 30 16:19:33 2014 -0700 @@ -62,6 +62,12 @@ /** * @param f */ + public void setF(BigInteger f) throws IOException { + setF(f.toByteArray()); + } + + public abstract byte[] getF(); + public abstract void setF(byte[] f) throws IOException; public byte[] calculateH(byte[] clientversion, byte[] serverversion, byte[] clientKexPayload, diff -r 1442be38051b -r 1d400fd78e4a src/ch/ethz/ssh2/transport/ClientKexManager.java --- a/src/ch/ethz/ssh2/transport/ClientKexManager.java Wed Jul 30 16:03:21 2014 -0700 +++ b/src/ch/ethz/ssh2/transport/ClientKexManager.java Wed Jul 30 16:19:33 2014 -0700 @@ -257,7 +257,7 @@ kxs.dhgx.setF(dhgexrpl.getF()); try { - kxs.H = kxs.dhgx.calculateH(csh.getClientString(), csh.getServerString(), + kxs.H = kxs.dhgx.calculateH(kxs.hashAlgo, csh.getClientString(), csh.getServerString(), kxs.localKEX.getPayload(), kxs.remoteKEX.getPayload(), dhgexrpl.getHostKey(), kxs.dhgexParameters); } @@ -295,7 +295,7 @@ throw new IOException("The server host key was not accepted by the verifier callback", e); } } - kxs.dhx.setF(dhr.getF()); + kxs.dhx.setF(dhr.getF().toByteArray()); try { kxs.H = kxs.dhx.calculateH(kxs.hashAlgo, csh.getClientString(), csh.getServerString(), kxs.localKEX.getPayload(), kxs.remoteKEX.getPayload(), dhr.getHostKey());