Fix for OpenSSHGeneratorKeyFileProvider writeSshKey method: JUnit test to assert the class can read what was previously written
Project: http://git-wip-us.apache.org/repos/asf/karaf/repo Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/98ae0b6d Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/98ae0b6d Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/98ae0b6d Branch: refs/heads/master Commit: 98ae0b6db4feab04777bf1a777a82994bdde2339 Parents: f9473d1 Author: Lukasz Lech <l.l...@ringler.ch> Authored: Thu Mar 30 10:29:05 2017 +0200 Committer: Guillaume Nodet <gno...@apache.org> Committed: Wed Jun 7 12:13:45 2017 +0200 ---------------------------------------------------------------------- .../ssh/OpenSSHGeneratorFileKeyProvider.java | 6 ++-- .../OpenSSHGeneratorKeyFileProviderTest.java | 32 ++++++++++++++++++-- 2 files changed, 34 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/karaf/blob/98ae0b6d/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/OpenSSHGeneratorFileKeyProvider.java ---------------------------------------------------------------------- diff --git a/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/OpenSSHGeneratorFileKeyProvider.java b/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/OpenSSHGeneratorFileKeyProvider.java index 0285053..4050644 100644 --- a/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/OpenSSHGeneratorFileKeyProvider.java +++ b/shell/ssh/src/main/java/org/apache/karaf/shell/ssh/OpenSSHGeneratorFileKeyProvider.java @@ -19,6 +19,7 @@ package org.apache.karaf.shell.ssh; +import org.apache.commons.ssl.PEMItem; import org.apache.commons.ssl.PEMUtil; import org.apache.commons.ssl.PKCS8Key; import org.apache.sshd.server.keyprovider.AbstractGeneratorHostKeyProvider; @@ -29,6 +30,7 @@ import java.io.OutputStream; import java.nio.file.Paths; import java.security.GeneralSecurityException; import java.security.KeyPair; +import java.security.interfaces.RSAPrivateCrtKey; import java.util.ArrayList; import java.util.Collection; @@ -72,10 +74,10 @@ public class OpenSSHGeneratorFileKeyProvider extends AbstractGeneratorHostKeyPro @Override protected void doWriteKeyPair(String resourceKey, KeyPair kp, OutputStream os) throws IOException, GeneralSecurityException { Collection<Object> items = new ArrayList<>(); - items.add(kp.getPrivate()); - items.add(kp.getPublic()); + items.add(new PEMItem(kp.getPrivate().getEncoded(), "PRIVATE KEY")); byte[] bytes = PEMUtil.encode(items); os.write(bytes); + os.close(); } } http://git-wip-us.apache.org/repos/asf/karaf/blob/98ae0b6d/shell/ssh/src/test/java/org/apache/karaf/shell/ssh/OpenSSHGeneratorKeyFileProviderTest.java ---------------------------------------------------------------------- diff --git a/shell/ssh/src/test/java/org/apache/karaf/shell/ssh/OpenSSHGeneratorKeyFileProviderTest.java b/shell/ssh/src/test/java/org/apache/karaf/shell/ssh/OpenSSHGeneratorKeyFileProviderTest.java index 2ba97cf..04066c4 100644 --- a/shell/ssh/src/test/java/org/apache/karaf/shell/ssh/OpenSSHGeneratorKeyFileProviderTest.java +++ b/shell/ssh/src/test/java/org/apache/karaf/shell/ssh/OpenSSHGeneratorKeyFileProviderTest.java @@ -18,9 +18,14 @@ */ package org.apache.karaf.shell.ssh; -import org.junit.Test; - +import java.io.File; +import java.math.BigInteger; import java.security.KeyPair; +import java.security.interfaces.RSAPrivateCrtKey; +import java.security.interfaces.RSAPublicKey; + +import org.junit.Assert; +import org.junit.Test; public class OpenSSHGeneratorKeyFileProviderTest { @@ -30,5 +35,28 @@ public class OpenSSHGeneratorKeyFileProviderTest { prov.setOverwriteAllowed(false); KeyPair keys = prov.loadKeys().iterator().next(); // how would we tell if they read 'correctly'? Well, the base class will throw if the key isn't reasonable. + Assert.assertNotNull(keys); + Assert.assertTrue("Loaded key is not RSA Key", keys.getPublic() instanceof RSAPublicKey); + Assert.assertEquals(65537, ((RSAPublicKey) keys.getPublic()).getPublicExponent().intValue()); + } + + @Test + public void writeSshKey() throws Exception { + // create a temporary file + File temp = File.createTempFile(this.getClass().getCanonicalName(), ".pem"); + temp.deleteOnExit(); + OpenSSHGeneratorFileKeyProvider prov = new OpenSSHGeneratorFileKeyProvider(temp.getPath(), "RSA", 4096); + KeyPair keys = prov.loadKeys().iterator().next(); + Assert.assertNotNull(keys); + Assert.assertTrue(temp.exists()); + Assert.assertFalse(temp.length() == 0); + BigInteger privateExponent = ((RSAPrivateCrtKey) keys.getPrivate()).getPrivateExponent(); + // read and check if correctly read + prov = new OpenSSHGeneratorFileKeyProvider(temp.getPath()); + keys = prov.loadKeys().iterator().next(); + Assert.assertNotNull(keys); + Assert.assertTrue("Loaded key is not RSA Key", keys.getPrivate() instanceof RSAPrivateCrtKey); + BigInteger privateExponent2 = ((RSAPrivateCrtKey) keys.getPrivate()).getPrivateExponent(); + Assert.assertEquals(privateExponent, privateExponent2); } }