Mercurial > 510Connectbot
diff src/ch/ethz/ssh2/auth/AuthenticationManager.java @ 282:c3019725b123 ganymed
start conversion from trilead to ganymed
author | Carl Byington <carl@five-ten-sg.com> |
---|---|
date | Fri, 18 Jul 2014 17:19:41 -0700 |
parents | 51d5f434ef6b |
children | 3855f58ffd2b |
line wrap: on
line diff
--- a/src/ch/ethz/ssh2/auth/AuthenticationManager.java Fri Jul 18 17:07:38 2014 -0700 +++ b/src/ch/ethz/ssh2/auth/AuthenticationManager.java Fri Jul 18 17:19:41 2014 -0700 @@ -200,8 +200,9 @@ throw new PacketTypeException(type); } - public boolean authenticatePublicKey(String user, char[] PEMPrivateKey, String password, SecureRandom rnd) - throws IOException { + public boolean authenticatePublicKey(String user, KeyPair pair, String password, SecureRandom rnd) + throws IOException { + PrivateKey key = pair.getPrivate(); try { initialize(user); @@ -209,12 +210,10 @@ throw new IOException("Authentication method publickey not supported by the server at this stage."); } - Object key = PEMDecoder.decode(PEMPrivateKey, password); - - if(key instanceof DSAPrivateKey) { + if (key instanceof DSAPrivateKey) { DSAPrivateKey pk = (DSAPrivateKey) key; - byte[] pk_enc = DSASHA1Verify.encodeSSHDSAPublicKey(pk.getPublicKey()); + byte[] pk_enc = DSASHA1Verify.encodeSSHDSAPublicKey((DSAPublicKey) pair.getPublic()); TypesWriter tw = new TypesWriter(); @@ -242,7 +241,7 @@ else if(key instanceof RSAPrivateKey) { RSAPrivateKey pk = (RSAPrivateKey) key; - byte[] pk_enc = RSASHA1Verify.encodeSSHRSAPublicKey(pk.getPublicKey()); + byte[] pk_enc = RSASHA1Verify.encodeSSHRSAPublicKey((RSAPublicKey) pair.getPublic()); TypesWriter tw = new TypesWriter(); { @@ -268,6 +267,30 @@ "ssh-rsa", pk_enc, rsa_sig_enc); tm.sendMessage(ua.getPayload()); } + 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()); + TypesWriter tw = new TypesWriter(); + { + byte[] H = tm.getSessionIdentifier(); + tw.writeString(H, 0, H.length); + tw.writeByte(Packets.SSH_MSG_USERAUTH_REQUEST); + tw.writeString(user); + tw.writeString("ssh-connection"); + tw.writeString("publickey"); + tw.writeBoolean(true); + tw.writeString(algo); + tw.writeString(pk_enc, 0, pk_enc.length); + } + byte[] msg = tw.getBytes(); + byte[] ds = ECDSASHA2Verify.generateSignature(msg, pk); + byte[] ec_sig_enc = ECDSASHA2Verify.encodeSSHECDSASignature(ds, pk.getParams()); + PacketUserauthRequestPublicKey ua = new PacketUserauthRequestPublicKey("ssh-connection", user, + algo, pk_enc, ec_sig_enc); + tm.sendMessage(ua.getPayload()); + } else { throw new IOException("Unknown private key type returned by the PEM decoder."); }