From 1adfa1979549740665d0e6d845d7575ebad5faae Mon Sep 17 00:00:00 2001 From: Kenny Root Date: Fri, 12 Apr 2013 00:13:42 -0700 Subject: Add EC pubkey to UI --- .../trilead/ssh2/auth/AuthenticationManager.java | 6 ++-- .../trilead/ssh2/signature/ECDSASHA2Verify.java | 37 +++++++++++++++++++--- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/lib/src/main/java/com/trilead/ssh2/auth/AuthenticationManager.java b/lib/src/main/java/com/trilead/ssh2/auth/AuthenticationManager.java index 7a1305b..e551495 100644 --- a/lib/src/main/java/com/trilead/ssh2/auth/AuthenticationManager.java +++ b/lib/src/main/java/com/trilead/ssh2/auth/AuthenticationManager.java @@ -246,6 +246,8 @@ public class AuthenticationManager implements MessageHandler else if (key instanceof ECPrivateKey) { ECPrivateKey pk = (ECPrivateKey) key; + final String algo = ECDSASHA2Verify.ECDSA_SHA2_PREFIX + + ECDSASHA2Verify.getCurveName(pk.getParams()); byte[] pk_enc = ECDSASHA2Verify.encodeSSHECDSAPublicKey((ECPublicKey) pair.getPublic()); @@ -259,7 +261,7 @@ public class AuthenticationManager implements MessageHandler tw.writeString("ssh-connection"); tw.writeString("publickey"); tw.writeBoolean(true); - tw.writeString("ecdsa-sha2-nistp256"); + tw.writeString(algo); tw.writeString(pk_enc, 0, pk_enc.length); } @@ -270,7 +272,7 @@ public class AuthenticationManager implements MessageHandler byte[] ec_sig_enc = ECDSASHA2Verify.encodeSSHECDSASignature(ds, pk.getParams()); PacketUserauthRequestPublicKey ua = new PacketUserauthRequestPublicKey("ssh-connection", user, - "ecdsa-sha2-nistp256", pk_enc, ec_sig_enc); + algo, pk_enc, ec_sig_enc); tm.sendMessage(ua.getPayload()); } diff --git a/lib/src/main/java/com/trilead/ssh2/signature/ECDSASHA2Verify.java b/lib/src/main/java/com/trilead/ssh2/signature/ECDSASHA2Verify.java index 4f3bae2..7b4f6af 100644 --- a/lib/src/main/java/com/trilead/ssh2/signature/ECDSASHA2Verify.java +++ b/lib/src/main/java/com/trilead/ssh2/signature/ECDSASHA2Verify.java @@ -55,6 +55,23 @@ public class ECDSASHA2Verify { CURVE_SIZES.put(521, NISTP521); } + public static int[] getCurveSizes() { + int[] keys = new int[CURVE_SIZES.size()]; + int i = 0; + for (Integer n : CURVE_SIZES.keySet().toArray(new Integer[keys.length])) { + keys[i++] = n; + } + return keys; + } + + public static ECParameterSpec getCurveForSize(int size) { + final String name = CURVE_SIZES.get(size); + if (name == null) { + return null; + } + return CURVES.get(name); + } + public static ECPublicKey decodeSSHECDSAPublicKey(byte[] key) throws IOException { TypesReader tr = new TypesReader(key); @@ -112,21 +129,30 @@ public class ECDSASHA2Verify { tw.writeString(curveName); - tw.writeBytes(encodeECPoint(key.getW(), key.getParams().getCurve())); + byte[] encoded = encodeECPoint(key.getW(), key.getParams().getCurve()); + tw.writeString(encoded, 0, encoded.length); return tw.getBytes(); } - private static String getCurveName(ECParameterSpec params) throws IOException { + public static String getCurveName(ECParameterSpec params) throws IOException { int fieldSize = getCurveSize(params); + final String curveName = getCurveName(fieldSize); + if (curveName == null) { + throw new IOException("invalid curve size " + fieldSize); + } + return curveName; + } + + public static String getCurveName(int fieldSize) { String curveName = CURVE_SIZES.get(fieldSize); if (curveName == null) { - throw new IOException("Unsupported curve field size: " + fieldSize); + return null; } return curveName; } - private static int getCurveSize(ECParameterSpec params) { + public static int getCurveSize(ECParameterSpec params) { return params.getCurve().getField().getFieldSize(); } @@ -258,7 +284,8 @@ public class ECDSASHA2Verify { TypesWriter rsWriter = new TypesWriter(); rsWriter.writeMPInt(r); rsWriter.writeMPInt(s); - tw.writeBytes(rsWriter.getBytes()); + byte[] encoded = rsWriter.getBytes(); + tw.writeString(encoded, 0, encoded.length); return tw.getBytes(); } -- cgit v1.2.3