From 113aa0aebdfd47b3f664fed8aaad44c5692f4796 Mon Sep 17 00:00:00 2001 From: David Solin Date: Sat, 13 Aug 2016 10:24:05 -0500 Subject: [PATCH] Updated KeyProviderUtil, KeyFormat, KeyProviderUtilTest and test resources to properly differentiate between PKCS5 and PKCS8 file formats. --- .../sshj/userauth/keyprovider/KeyFormat.java | 1 + .../userauth/keyprovider/KeyProviderUtil.java | 5 +- .../sshj/keyprovider/KeyProviderUtilTest.java | 6 ++ .../sshj/keyprovider/PKCS5KeyFileTest.java | 59 +++++++++++++++++++ src/test/resources/keyformats/pkcs5 | 15 +++++ src/test/resources/keyformats/pkcs8 | 32 +++++----- 6 files changed, 101 insertions(+), 17 deletions(-) create mode 100644 src/test/java/net/schmizz/sshj/keyprovider/PKCS5KeyFileTest.java create mode 100644 src/test/resources/keyformats/pkcs5 diff --git a/src/main/java/net/schmizz/sshj/userauth/keyprovider/KeyFormat.java b/src/main/java/net/schmizz/sshj/userauth/keyprovider/KeyFormat.java index cc1a5b44..816b2bd8 100644 --- a/src/main/java/net/schmizz/sshj/userauth/keyprovider/KeyFormat.java +++ b/src/main/java/net/schmizz/sshj/userauth/keyprovider/KeyFormat.java @@ -19,6 +19,7 @@ package net.schmizz.sshj.userauth.keyprovider; * @version $Id:$ */ public enum KeyFormat { + PKCS5, PKCS8, OpenSSH, PuTTY, diff --git a/src/main/java/net/schmizz/sshj/userauth/keyprovider/KeyProviderUtil.java b/src/main/java/net/schmizz/sshj/userauth/keyprovider/KeyProviderUtil.java index 4e897825..b6f8a8c4 100644 --- a/src/main/java/net/schmizz/sshj/userauth/keyprovider/KeyProviderUtil.java +++ b/src/main/java/net/schmizz/sshj/userauth/keyprovider/KeyProviderUtil.java @@ -96,9 +96,10 @@ public class KeyProviderUtil { if (separatePubKey) { // Can delay asking for password since have unencrypted pubkey return KeyFormat.OpenSSH; - } else { - // More general + } else if (header.indexOf("BEGIN PRIVATE KEY") != -1 || header.indexOf("BEGIN ENCRYPTED PRIVATE KEY") != -1) { return KeyFormat.PKCS8; + } else { + return KeyFormat.PKCS5; } } else if (header.startsWith("PuTTY-User-Key-File-")) { return KeyFormat.PuTTY; diff --git a/src/test/java/net/schmizz/sshj/keyprovider/KeyProviderUtilTest.java b/src/test/java/net/schmizz/sshj/keyprovider/KeyProviderUtilTest.java index fbb64c12..36a8d345 100644 --- a/src/test/java/net/schmizz/sshj/keyprovider/KeyProviderUtilTest.java +++ b/src/test/java/net/schmizz/sshj/keyprovider/KeyProviderUtilTest.java @@ -35,6 +35,12 @@ public class KeyProviderUtilTest { assertEquals(KeyFormat.OpenSSH, format); } + @Test + public void testPkcs5() throws IOException { + KeyFormat format = KeyProviderUtil.detectKeyFileFormat(new File(ROOT, "pkcs5")); + assertEquals(KeyFormat.PKCS5, format); + } + @Test public void testPkcs8() throws IOException { KeyFormat format = KeyProviderUtil.detectKeyFileFormat(new File(ROOT, "pkcs8")); diff --git a/src/test/java/net/schmizz/sshj/keyprovider/PKCS5KeyFileTest.java b/src/test/java/net/schmizz/sshj/keyprovider/PKCS5KeyFileTest.java new file mode 100644 index 00000000..952365e2 --- /dev/null +++ b/src/test/java/net/schmizz/sshj/keyprovider/PKCS5KeyFileTest.java @@ -0,0 +1,59 @@ +/* + * Copyright (C)2009 - SSHJ Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package net.schmizz.sshj.keyprovider; + +import net.schmizz.sshj.common.KeyType; +import net.schmizz.sshj.userauth.keyprovider.FileKeyProvider; +import net.schmizz.sshj.userauth.keyprovider.PKCS5KeyFile; +import net.schmizz.sshj.util.KeyUtil; +import org.junit.Before; +import org.junit.Test; + +import java.io.File; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.security.GeneralSecurityException; + +import static org.junit.Assert.assertEquals; + +public class PKCS5KeyFileTest { + + static final FileKeyProvider rsa = new PKCS5KeyFile(); + + static final String modulus = "a19f65e93926d9a2f5b52072db2c38c54e6cf0113d31fa92ff827b0f3bec609c45ea84264c88e64adba11ff093ed48ee0ed297757654b0884ab5a7e28b3c463bc9074b32837a2b69b61d914abf1d74ccd92b20fa44db3b31fb208c0dd44edaeb4ab097118e8ee374b6727b89ad6ce43f1b70c5a437ccebc36d2dad8ae973caad15cd89ae840fdae02cae42d241baef8fda8aa6bbaa54fd507a23338da6f06f61b34fb07d560e63fbce4a39c073e28573c2962cedb292b14b80d1b4e67b0465f2be0e38526232d0a7f88ce91a055fde082038a87ed91f3ef5ff971e30ea6cccf70d38498b186621c08f8fdceb8632992b480bf57fc218e91f2ca5936770fe9469"; + static final String pubExp = "23"; + static final String privExp = "57bcee2e2656eb2c94033d802dd62d726c6705fabad1fd0df86b67600a96431301620d395cbf5871c7af3d3974dfe5c30f5c60d95d7e6e75df69ed6c5a36a9c8aef554b5058b76a719b8478efa08ad1ebf08c8c25fe4b9bc0bfbb9be5d4f60e6213b4ab1c26ad33f5bba7d93e1cd65f65f5a79eb6ebfb32f930a2b0244378b4727acf83b5fb376c38d4abecc5dc3fc399e618e792d4c745d2dbbb9735242e5033129f2985ca3e28fa33cad2afe3e70e1b07ed2b6ec8a3f843fb4bffe3385ad211c6600618488f4ac70397e8eb036b82d811283dc728504cddbe1533c4dd31b1ec99ffa74fd0e3883a9cb3e2315cc1a56f55d38ed40520dd9ec91b4d2dd790d1b"; + + @Before + public void setUp() + throws UnsupportedEncodingException, GeneralSecurityException { + rsa.init(new File("src/test/resources/id_rsa")); + } + + @Test + public void testKeys() + throws IOException, GeneralSecurityException { + assertEquals(KeyUtil.newRSAPublicKey(modulus, pubExp), rsa.getPublic()); + assertEquals(KeyUtil.newRSAPrivateKey(modulus, privExp), rsa.getPrivate()); + } + + @Test + public void testType() + throws IOException { + assertEquals(rsa.getType(), KeyType.RSA); + } + +} diff --git a/src/test/resources/keyformats/pkcs5 b/src/test/resources/keyformats/pkcs5 new file mode 100644 index 00000000..221453d8 --- /dev/null +++ b/src/test/resources/keyformats/pkcs5 @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQCm2IJ9gWDkPTlQ37NNUB0za5mCsQ8bi++8fyEqw7wl8ZNBh3qt +TcnL+m+NZfQjUC0BXic7PcMLVm4A3ID2IAZQM+axfq9aL4huWerm4ua6tvdt4gQK +oL1+8JFmdFvFw5pWW/NZHtkIprbVf7KtYrU27WmMhXruN071UzqLsw08cwIDAQAB +AoGAHQ7cOyuLSnT3RISRX8eyLkBxLffUX8HRcQzbI+2PGTSnpuQHk6NWn/Xv87pr ++LKABBr3zjOFgrX81p2QwEz3jDxNXzbOeZzhuvGXCX5GocuEO4n5EhDvXRDF4uht +uvVV5FsQv/sTOR0PNo1nELiAA8k3NYDxraB83q7wtsmErtECQQDYWMnq8mwRe49d +jIXNKJeNiuLUYxO3CLI/vx279gDKlKrt677trr1e7JZqm/DapEWG511tw3cW63gQ ++qxtgkw1AkEAxW0UeaNaJd7DApqwGAcS1JkygCKwzQ4ns/Co15qUgMkqCkmQU9AU +/zQpt2+BjdYVe50r/nr8K1KYwrBsyndrBwJBALe90N+FvFqswfoFmq2/R9eimTsg +WmIdNKYHPs2gBNQIp5MhoSpkOdkgvi8U+d33nkUQwryyQbZpjbN98mufOfECQEML +eBiW0NZrf+4yefqu7EYmgG/jWAdK91C0OaJ+bFAQAKbdtJXB5F+GZ2RUCbsRKNqB +1Z7mRRyxQA9dupRHWaECQQCM9bbCtfGesgvZlhBavlWavu8iCvJlAbGdf5QMlFQE +kABmZg84Fy3NUFCD+RXCuatb4Oo9P/WPIbjYiC4p0hLJ +-----END RSA PRIVATE KEY----- diff --git a/src/test/resources/keyformats/pkcs8 b/src/test/resources/keyformats/pkcs8 index 221453d8..d93ad278 100644 --- a/src/test/resources/keyformats/pkcs8 +++ b/src/test/resources/keyformats/pkcs8 @@ -1,15 +1,17 @@ ------BEGIN RSA PRIVATE KEY----- -MIICXQIBAAKBgQCm2IJ9gWDkPTlQ37NNUB0za5mCsQ8bi++8fyEqw7wl8ZNBh3qt -TcnL+m+NZfQjUC0BXic7PcMLVm4A3ID2IAZQM+axfq9aL4huWerm4ua6tvdt4gQK -oL1+8JFmdFvFw5pWW/NZHtkIprbVf7KtYrU27WmMhXruN071UzqLsw08cwIDAQAB -AoGAHQ7cOyuLSnT3RISRX8eyLkBxLffUX8HRcQzbI+2PGTSnpuQHk6NWn/Xv87pr -+LKABBr3zjOFgrX81p2QwEz3jDxNXzbOeZzhuvGXCX5GocuEO4n5EhDvXRDF4uht -uvVV5FsQv/sTOR0PNo1nELiAA8k3NYDxraB83q7wtsmErtECQQDYWMnq8mwRe49d -jIXNKJeNiuLUYxO3CLI/vx279gDKlKrt677trr1e7JZqm/DapEWG511tw3cW63gQ -+qxtgkw1AkEAxW0UeaNaJd7DApqwGAcS1JkygCKwzQ4ns/Co15qUgMkqCkmQU9AU -/zQpt2+BjdYVe50r/nr8K1KYwrBsyndrBwJBALe90N+FvFqswfoFmq2/R9eimTsg -WmIdNKYHPs2gBNQIp5MhoSpkOdkgvi8U+d33nkUQwryyQbZpjbN98mufOfECQEML -eBiW0NZrf+4yefqu7EYmgG/jWAdK91C0OaJ+bFAQAKbdtJXB5F+GZ2RUCbsRKNqB -1Z7mRRyxQA9dupRHWaECQQCM9bbCtfGesgvZlhBavlWavu8iCvJlAbGdf5QMlFQE -kABmZg84Fy3NUFCD+RXCuatb4Oo9P/WPIbjYiC4p0hLJ ------END RSA PRIVATE KEY----- +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIICxjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIjU/bh7L5QOQCAggA +MBQGCCqGSIb3DQMHBAiNTcqc0NzYuwSCAoBtM9PXHkaG+ylhY7qkeiZlVcMY0k6i +AfqQxROZvjUuwh/fcZBjRDsYoesN/H2WpRPF507KwXUAT8PG4Qeu+1WrQdXd7jt+ +GCBAKi2FMm3FgLPVsCwquMKagpCbFHJty9f0YbgZLxvcI036GNPMN5JTRIuyZbYu +mQJ7HvA9KKpkdVHp1YrRKqyn5RXUA0Zb1QeHkynMq+GTTWODZhRkETNT/humBbbU +JUMNiLKYOyUkIXoU9n3C4fh8yFL3lZXsE5SQnpph/3qjIfcrs3Pz1mqBGPoGmkWV +Zmi5JBQZqfTV7W8xdMEc+WEYAgBE/0rzVypSQi8Ow+jLXiYt4i1dMK97YB0h8Tll +dpYH2XTalpdeG5uGxdiQhWCNaCSSYQuLTfr1pQIbiYBeK7mB2pBWHGjU7SnqeN6r +3LN4G2Kc0ovutlJgprZicfaawzIENUOqMCXa62tjUK6mYXWOcKEnKoqB+vQ31Q8g +HBdsGbJOFTVQEaiiZM9CluIpwjBVsTpMD82L7D4Upd2WdakAcGE/26TlcjZ55R4p +h5/rtWekKTKkistlmGWqFrT4Gxwi5hVBFwxb5/+2/iAyZCMdGQkIr4KuzQYliu3J +eo5qvNmg0fD7xiQZPWgRJyoteSn6fzZIBzpkmoQsAf83vhz6FVoPtfI0QGkQlzlV +IxEHGmlZ7ETja4TvbMENqBerNnaadSThsKfZ01evdPc8uRJ7P0d72VFcm5kW04eL +fzLS40uqQgWx3Aq4wXTzVcOZnU9c7ljRBMkqHE9YmnN85DnoidOATAOIIbEzyevA +1VeceIYVQTs7YH/WVtlNsfb7VtpvWQZHq3wjLnr+t8rQEnZSYeJ+0mPA +-----END ENCRYPTED PRIVATE KEY-----