From a10bf3c0bd0400b1c57663528b329ddf0eebafd0 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. --- .../keyprovider/OpenSSHKeyV1KeyFile.java | 21 +++++++++++++++ .../keyprovider/BaseFileKeyProvider.java | 13 +++++++++ .../userauth/keyprovider/FileKeyProvider.java | 4 +++ .../userauth/keyprovider/OpenSSHKeyFile.java | 27 +++++++++++++++++++ 4 files changed, 65 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..064c74bd4 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,26 @@ 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 + public void init(Reader privateKey, Reader publicKey, PasswordFinder pwdf) { + try { + initPubKey(publicKey); + } catch (IOException e) { + log.warn("Error reading public key file: {}", e.toString()); + } + super.init(privateKey, null, pwdf); + } + @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..201b9cb5b 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); + 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..07c567969 100644 --- a/src/main/java/net/schmizz/sshj/userauth/keyprovider/OpenSSHKeyFile.java +++ b/src/main/java/net/schmizz/sshj/userauth/keyprovider/OpenSSHKeyFile.java @@ -16,6 +16,7 @@ package net.schmizz.sshj.userauth.keyprovider; import com.hierynomus.sshj.userauth.keyprovider.OpenSSHKeyFileUtil; +import net.schmizz.sshj.userauth.password.PasswordFinder; import java.io.*; import java.security.PublicKey; @@ -80,6 +81,32 @@ 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); + } + + @Override + public void init(Reader privateKey, Reader publicKey, PasswordFinder pwdf) { + 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, null, pwdf); + } + /** * Read and store the separate public key provided alongside the private key *