From 5e39fe970937a425a8443c85e653420097af5200 Mon Sep 17 00:00:00 2001 From: David Kocher Date: Mon, 23 Oct 2023 21:51:34 +0200 Subject: [PATCH] Add overloaded init methods that take the public key from a stream and properly initialize. Resolves #907. --- .../userauth/keyprovider/OpenSSHKeyV1KeyFile.java | 11 +++++++++++ .../userauth/keyprovider/BaseFileKeyProvider.java | 13 +++++++++++++ .../sshj/userauth/keyprovider/FileKeyProvider.java | 4 ++++ .../sshj/userauth/keyprovider/OpenSSHKeyFile.java | 13 +++++++++++++ 4 files changed, 41 insertions(+) diff --git a/src/main/java/com/hierynomus/sshj/userauth/keyprovider/OpenSSHKeyV1KeyFile.java b/src/main/java/com/hierynomus/sshj/userauth/keyprovider/OpenSSHKeyV1KeyFile.java index 9229fa4af..445c07d5c 100644 --- a/src/main/java/com/hierynomus/sshj/userauth/keyprovider/OpenSSHKeyV1KeyFile.java +++ b/src/main/java/com/hierynomus/sshj/userauth/keyprovider/OpenSSHKeyV1KeyFile.java @@ -34,6 +34,7 @@ import net.schmizz.sshj.userauth.keyprovider.BaseFileKeyProvider; import net.schmizz.sshj.userauth.keyprovider.FileKeyProvider; import net.schmizz.sshj.userauth.keyprovider.KeyFormat; +import net.schmizz.sshj.userauth.password.PasswordFinder; import org.bouncycastle.asn1.nist.NISTNamedCurves; import org.bouncycastle.asn1.x9.X9ECParameters; import org.bouncycastle.jce.spec.ECNamedCurveSpec; @@ -118,6 +119,16 @@ public void init(File location) { super.init(location); } + @Override + public void init(Reader privateKey, Reader publicKey) { + try { + initPubKey(publicKey); + } catch (IOException e) { + log.warn("Error reading public key file: {}", e.toString()); + } + super.init(privateKey, (Reader) null); + } + @Override protected KeyPair readKeyPair() throws IOException { final BufferedReader reader = new BufferedReader(resource.getReader()); diff --git a/src/main/java/net/schmizz/sshj/userauth/keyprovider/BaseFileKeyProvider.java b/src/main/java/net/schmizz/sshj/userauth/keyprovider/BaseFileKeyProvider.java index f4e7580ea..6e4fa8159 100644 --- a/src/main/java/net/schmizz/sshj/userauth/keyprovider/BaseFileKeyProvider.java +++ b/src/main/java/net/schmizz/sshj/userauth/keyprovider/BaseFileKeyProvider.java @@ -44,6 +44,19 @@ public void init(Reader location, PasswordFinder pwdf) { this.pwdf = pwdf; } + @Override + public void init(Reader privateKey, Reader publicKey) { + assert publicKey == null; + init(privateKey); + } + + @Override + public void init(Reader privateKey, Reader publicKey, PasswordFinder pwdf) { + assert publicKey == null; + init(privateKey, publicKey); + this.pwdf = pwdf; + } + @Override public void init(File location) { assert location != null; diff --git a/src/main/java/net/schmizz/sshj/userauth/keyprovider/FileKeyProvider.java b/src/main/java/net/schmizz/sshj/userauth/keyprovider/FileKeyProvider.java index 1fcaa2423..4bab4e9f9 100644 --- a/src/main/java/net/schmizz/sshj/userauth/keyprovider/FileKeyProvider.java +++ b/src/main/java/net/schmizz/sshj/userauth/keyprovider/FileKeyProvider.java @@ -30,6 +30,10 @@ public interface FileKeyProvider void init(Reader location); + void init(Reader privateKey, Reader publicKey); + + void init(Reader privateKey, Reader publicKey, PasswordFinder pwdf); + void init(Reader location, PasswordFinder pwdf); void init(String privateKey, String publicKey); diff --git a/src/main/java/net/schmizz/sshj/userauth/keyprovider/OpenSSHKeyFile.java b/src/main/java/net/schmizz/sshj/userauth/keyprovider/OpenSSHKeyFile.java index a7aec1fa7..fe22f4b97 100644 --- a/src/main/java/net/schmizz/sshj/userauth/keyprovider/OpenSSHKeyFile.java +++ b/src/main/java/net/schmizz/sshj/userauth/keyprovider/OpenSSHKeyFile.java @@ -80,6 +80,19 @@ public void init(String privateKey, String publicKey) { super.init(privateKey, null); } + @Override + public void init(Reader privateKey, Reader publicKey) { + if (publicKey != null) { + try { + initPubKey(publicKey); + } catch (IOException e) { + // let super provide both public & private key + log.warn("Error reading public key: {}", e.toString()); + } + } + super.init(privateKey, (Reader) null); + } + /** * Read and store the separate public key provided alongside the private key *