66import com .appsmith .external .models .Property ;
77import com .appsmith .external .models .SSHConnection ;
88import net .schmizz .sshj .SSHClient ;
9- import net .schmizz .sshj .userauth .keyprovider .OpenSSHKeyFile ;
109import net .schmizz .sshj .userauth .keyprovider .PKCS8KeyFile ;
10+ import org .bouncycastle .asn1 .pkcs .RSAPrivateKey ;
1111import org .bouncycastle .jce .provider .BouncyCastleProvider ;
1212import org .junit .jupiter .api .BeforeAll ;
1313import org .junit .jupiter .api .Test ;
1414
15+ import java .io .IOException ;
1516import java .io .Reader ;
1617import java .io .StringReader ;
18+ import java .security .KeyPair ;
19+ import java .security .KeyPairGenerator ;
1720import java .security .Security ;
21+ import java .security .interfaces .RSAPrivateCrtKey ;
1822import java .util .ArrayList ;
23+ import java .util .Base64 ;
1924import java .util .List ;
2025
2126import static com .appsmith .external .helpers .SSHUtils .getConnectionContext ;
@@ -31,28 +36,15 @@ public class SSHUtilsTest {
3136
3237 @ BeforeAll
3338 static void setup () {
34- Security .addProvider (new BouncyCastleProvider ()); // Ensure BouncyCastle is available for OpenSSH keys
35- }
36-
37- /* Test OpenSSH Key Parsing */
38- @ Test
39- public void testOpenSSHKeyParsing () throws Exception {
40- String opensshKey = "-----BEGIN OPENSSH PRIVATE KEY-----\n "
41- + "b3BlbnNzaC1rZXktdmVyc2lvbjE=\n "
42- + "-----END OPENSSH PRIVATE KEY-----" ;
43-
44- Reader reader = new StringReader (opensshKey );
45- OpenSSHKeyFile openSSHKeyFile = new OpenSSHKeyFile ();
46- openSSHKeyFile .init (reader );
47-
48- assertNotNull (openSSHKeyFile );
39+ Security .addProvider (
40+ new BouncyCastleProvider ()); // Ensure BouncyCastle algorithms are registered for key parsing
4941 }
5042
5143 /* Test PKCS#8 PEM Key Parsing */
5244 @ Test
5345 public void testPKCS8PEMKeyParsing () throws Exception {
54- String pkcs8Key =
55- "-----BEGIN PRIVATE KEY----- \n " + "MIIEvQIBADANBgkqhkiG9w0BAQEFAASC... \n " + "-----END PRIVATE KEY-----" ;
46+ KeyPair keyPair = generateRsaKeyPair ();
47+ String pkcs8Key = toPkcs8Pem ( keyPair ) ;
5648
5749 Reader reader = new StringReader (pkcs8Key );
5850 PKCS8KeyFile pkcs8KeyFile = new PKCS8KeyFile ();
@@ -64,14 +56,17 @@ public void testPKCS8PEMKeyParsing() throws Exception {
6456 /* Test RSA PEM Key Parsing */
6557 @ Test
6658 public void testRSAPEMKeyParsing () throws Exception {
67- String rsaKey =
68- "-----BEGIN RSA PRIVATE KEY-----\n " + "MIIEowIBAAKCAQEA7...\n " + "-----END RSA PRIVATE KEY-----" ;
59+ KeyPair keyPair = generateRsaKeyPair ();
60+ String rsaPkcs1 = toPkcs1Pem ((RSAPrivateCrtKey ) keyPair .getPrivate ());
61+
62+ String convertedKey = SSHUtils .convertRsaPkcs1ToPkcs8 (rsaPkcs1 );
6963
70- Reader reader = new StringReader (rsaKey );
64+ Reader reader = new StringReader (convertedKey );
7165 PKCS8KeyFile pkcs8KeyFile = new PKCS8KeyFile ();
7266 pkcs8KeyFile .init (reader );
7367
7468 assertNotNull (pkcs8KeyFile );
69+ assertTrue (convertedKey .contains ("BEGIN PRIVATE KEY" ));
7570 }
7671
7772 /* Test is ssh enabled method */
@@ -168,4 +163,34 @@ public void testDefaultDBPortValue() {
168163
169164 assertEquals (getDBPortFromConfigOrDefault (datasourceConfiguration , 1234L ), 1234L );
170165 }
166+
167+ private KeyPair generateRsaKeyPair () throws Exception {
168+ KeyPairGenerator generator = KeyPairGenerator .getInstance ("RSA" );
169+ generator .initialize (1024 );
170+ return generator .generateKeyPair ();
171+ }
172+
173+ private String toPkcs8Pem (KeyPair keyPair ) {
174+ byte [] pkcs8Bytes = keyPair .getPrivate ().getEncoded ();
175+ return formatPem ("PRIVATE KEY" , pkcs8Bytes );
176+ }
177+
178+ private String toPkcs1Pem (RSAPrivateCrtKey privateKey ) throws IOException {
179+ RSAPrivateKey bcPrivateKey = new RSAPrivateKey (
180+ privateKey .getModulus (),
181+ privateKey .getPublicExponent (),
182+ privateKey .getPrivateExponent (),
183+ privateKey .getPrimeP (),
184+ privateKey .getPrimeQ (),
185+ privateKey .getPrimeExponentP (),
186+ privateKey .getPrimeExponentQ (),
187+ privateKey .getCrtCoefficient ());
188+
189+ return formatPem ("RSA PRIVATE KEY" , bcPrivateKey .getEncoded ());
190+ }
191+
192+ private String formatPem (String header , byte [] encodedBytes ) {
193+ String base64 = Base64 .getMimeEncoder (64 , new byte [] {'\n' }).encodeToString (encodedBytes );
194+ return "-----BEGIN " + header + "-----\n " + base64 + "\n -----END " + header + "-----\n " ;
195+ }
171196}
0 commit comments