Skip to content

Commit

Permalink
Add support for ECDSA & EdDSA type PuTTY keys.
Browse files Browse the repository at this point in the history
  • Loading branch information
norrisjeremy committed Jan 12, 2023
1 parent d77c858 commit 2fbfa19
Show file tree
Hide file tree
Showing 27 changed files with 493 additions and 22 deletions.
38 changes: 37 additions & 1 deletion src/main/java/com/jcraft/jsch/KeyPair.java
Original file line number Diff line number Diff line change
Expand Up @@ -1151,12 +1151,12 @@ static KeyPair loadPPK(JSch jsch, byte[] buf) throws JSchException {
KeyPair kpair = null;

if(typ.equals("ssh-rsa")) {

Buffer _buf = new Buffer(pubkey);
_buf.skip(pubkey.length);

int len = _buf.getInt();
_buf.getByte(new byte[len]); // ssh-rsa

byte[] pub_array = new byte[_buf.getInt()];
_buf.getByte(pub_array);
byte[] n_array = new byte[_buf.getInt()];
Expand All @@ -1182,6 +1182,42 @@ else if(typ.equals("ssh-dss")){

kpair = new KeyPairDSA(jsch, p_array, q_array, g_array, y_array, null);
}
else if(typ.equals("ecdsa-sha2-nistp256") || typ.equals("ecdsa-sha2-nistp384") || typ.equals("ecdsa-sha2-nistp521")){
Buffer _buf = new Buffer(pubkey);
_buf.skip(pubkey.length);

int len = _buf.getInt();
_buf.getByte(new byte[len]); // ecdsa-sha2-nistpXXX

byte[] name = new byte[_buf.getInt()];
_buf.getByte(name); // nistpXXX

len = _buf.getInt();
int x04 = _buf.getByte(); // in case of x04 it is uncompressed https://tools.ietf.org/html/rfc5480#page-7
byte[] r_array = new byte[(len - 1) / 2];
byte[] s_array = new byte[(len - 1) / 2];
_buf.getByte(r_array);
_buf.getByte(s_array);

kpair = new KeyPairECDSA(jsch, name, r_array, s_array, null);
}
else if(typ.equals("ssh-ed25519") || typ.equals("ssh-ed448")){
Buffer _buf = new Buffer(pubkey);
_buf.skip(pubkey.length);

int len = _buf.getInt();
_buf.getByte(new byte[len]); // ssh-edXXX

byte[] pub_array = new byte[_buf.getInt()];
_buf.getByte(pub_array);

if(typ.equals("ssh-ed25519")){
kpair = new KeyPairEd25519(jsch, pub_array, null);
}
else{
kpair = new KeyPairEd448(jsch, pub_array, null);
}
}
else {
return null;
}
Expand Down
5 changes: 2 additions & 3 deletions src/main/java/com/jcraft/jsch/KeyPairECDSA.java
Original file line number Diff line number Diff line change
Expand Up @@ -178,21 +178,20 @@ boolean parse(byte[] plain){
return false;
}
else if(vendor==VENDOR_PUTTY){
/*
Buffer buf=new Buffer(plain);
buf.skip(plain.length);

try {
byte[][] tmp = buf.getBytes(1, "");
prv_array = tmp[0];
key_size = prv_array.length>=64 ? 521 :
(prv_array.length>=48 ? 384 : 256);
}
catch(JSchException e){
return false;
}

return true;
*/
return false;
}

// OPENSSH Key v1 Format
Expand Down
50 changes: 33 additions & 17 deletions src/main/java/com/jcraft/jsch/KeyPairEdDSA.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,27 +74,43 @@ void generate(int key_size) throws JSchException{

@Override
boolean parse(byte [] plain){
if(vendor==VENDOR_PUTTY){
Buffer buf=new Buffer(plain);
buf.skip(plain.length);

// Only OPENSSH Key v1 Format supported for EdDSA keys
if(vendor != VENDOR_OPENSSH_V1) return false;
try{
// OPENSSH Key v1 Format
final Buffer buf = new Buffer(plain);
int checkInt1 = buf.getInt(); // uint32 checkint1
int checkInt2 = buf.getInt(); // uint32 checkint2
if (checkInt1 != checkInt2) {
throw new JSchException("check failed");
try {
byte[][] tmp = buf.getBytes(1, "");
prv_array = tmp[0];
}
catch(JSchException e){
return false;
}
String keyType = Util.byte2str(buf.getString()); // string keytype
pub_array = buf.getString(); // public key
// OpenSSH stores private key in first half of string and duplicate copy of public key in second half of string
byte[] tmp = buf.getString(); // secret key (private key + public key)
prv_array = Arrays.copyOf(tmp, getKeySize());
publicKeyComment = Util.byte2str(buf.getString());

return true;
}
catch(Exception e){
//System.err.println(e);
else if(vendor==VENDOR_OPENSSH_V1){
try{
// OPENSSH Key v1 Format
final Buffer buf = new Buffer(plain);
int checkInt1 = buf.getInt(); // uint32 checkint1
int checkInt2 = buf.getInt(); // uint32 checkint2
if (checkInt1 != checkInt2) {
throw new JSchException("check failed");
}
String keyType = Util.byte2str(buf.getString()); // string keytype
pub_array = buf.getString(); // public key
// OpenSSH stores private key in first half of string and duplicate copy of public key in second half of string
byte[] tmp = buf.getString(); // secret key (private key + public key)
prv_array = Arrays.copyOf(tmp, getKeySize());
publicKeyComment = Util.byte2str(buf.getString());
return true;
}
catch(Exception e){
//System.err.println(e);
return false;
}
}
else {
return false;
}
}
Expand Down
131 changes: 131 additions & 0 deletions src/test/java/com/jcraft/jsch/KeyPair2IT.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
package com.jcraft.jsch;

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.images.builder.ImageFromDockerfile;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;

import java.net.URISyntaxException;
import java.nio.file.Paths;

import static org.junit.jupiter.api.Assertions.assertTrue;

@Testcontainers
public class KeyPair2IT {

// Python can be slow for DH group 18
private static final int timeout = 10000;

@Container
public GenericContainer<?> sshd = new GenericContainer<>(
new ImageFromDockerfile().withFileFromClasspath("asyncsshd.py", "docker/asyncsshd.py")
.withFileFromClasspath("ssh_host_ed448_key", "docker/ssh_host_ed448_key")
.withFileFromClasspath("ssh_host_ed448_key.pub", "docker/ssh_host_ed448_key.pub")
.withFileFromClasspath("ssh_host_rsa_key", "docker/ssh_host_rsa_key")
.withFileFromClasspath("ssh_host_rsa_key.pub", "docker/ssh_host_rsa_key.pub")
.withFileFromClasspath("ssh_host_ecdsa256_key", "docker/ssh_host_ecdsa256_key")
.withFileFromClasspath("ssh_host_ecdsa256_key.pub", "docker/ssh_host_ecdsa256_key.pub")
.withFileFromClasspath("ssh_host_ecdsa384_key", "docker/ssh_host_ecdsa384_key")
.withFileFromClasspath("ssh_host_ecdsa384_key.pub", "docker/ssh_host_ecdsa384_key.pub")
.withFileFromClasspath("ssh_host_ecdsa521_key", "docker/ssh_host_ecdsa521_key")
.withFileFromClasspath("ssh_host_ecdsa521_key.pub", "docker/ssh_host_ecdsa521_key.pub")
.withFileFromClasspath("ssh_host_ed25519_key", "docker/ssh_host_ed25519_key")
.withFileFromClasspath("ssh_host_ed25519_key.pub", "docker/ssh_host_ed25519_key.pub")
.withFileFromClasspath("ssh_host_dsa_key", "docker/ssh_host_dsa_key")
.withFileFromClasspath("ssh_host_dsa_key.pub", "docker/ssh_host_dsa_key.pub")
.withFileFromClasspath("authorized_keys", "docker/authorized_keys.KeyPairIT")
.withFileFromClasspath("Dockerfile", "docker/Dockerfile.asyncssh")).withExposedPorts(22);

@ParameterizedTest
@MethodSource("com.jcraft.jsch.KeyPair2Test#keyArgs")
void connectWithPublicKey(String path, String password, String keyType) throws Exception {

final JSch jSch = createIdentity(path, password);

Session session = createSession(jSch);

if (keyType != null) {
session.setConfig("PubkeyAcceptedAlgorithms", keyType);
}
try {
session.connect(timeout);
assertTrue(session.isConnected());
} finally {
session.disconnect();
}

}

@ParameterizedTest
@MethodSource("com.jcraft.jsch.KeyPair2Test#keyArgs")
void connectWithPublicKeyAndUserInfo(String path, String password, String keyType) throws Exception {

final JSch jSch = new JSch();

jSch.addIdentity(Paths.get(ClassLoader.getSystemResource(path).toURI()).toFile().getAbsolutePath());

Session session = createSession(jSch);
session.setUserInfo(new UserInfo() {
@Override
public String getPassphrase() {
return password;
}

@Override
public String getPassword() {
return null;
}

@Override
public boolean promptPassword(String message) {
return false;
}

@Override
public boolean promptPassphrase(String message) {
return true;
}

@Override
public boolean promptYesNo(String message) {
return false;
}

@Override
public void showMessage(String message) {

}
});

if (keyType != null) {
session.setConfig("PubkeyAcceptedAlgorithms", keyType);
}
try {
session.connect(timeout);
assertTrue(session.isConnected());
} finally {
session.disconnect();
}

}

private JSch createIdentity(String path, String password) throws JSchException, URISyntaxException {
JSch ssh = new JSch();
if (password != null) {
ssh.addIdentity(Paths.get(ClassLoader.getSystemResource(path).toURI()).toFile().getAbsolutePath(),
password);
} else {
ssh.addIdentity(Paths.get(ClassLoader.getSystemResource(path).toURI()).toFile().getAbsolutePath());
}
return ssh;
}

private Session createSession(JSch ssh) throws Exception {
Session session = ssh.getSession("root", sshd.getHost(), sshd.getFirstMappedPort());
session.setConfig("StrictHostKeyChecking", "no");
session.setConfig("PreferredAuthentications", "publickey");
return session;
}
}
45 changes: 45 additions & 0 deletions src/test/java/com/jcraft/jsch/KeyPair2Test.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.jcraft.jsch;

import org.junit.jupiter.api.io.TempDir;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;

import java.io.File;
import java.net.URISyntaxException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;

import static org.junit.jupiter.api.Assertions.*;

class KeyPair2Test {

@TempDir
public Path tmpDir;

static Stream<Arguments> keyArgs() {
return Stream.of(
Arguments.of("ppkv2_ed448_unix.ppk", null, "ssh-ed448"),
Arguments.of("ppkv2_ed448_unix_encrypted.ppk", "secret123", "ssh-ed448"),
Arguments.of("ppkv2_ed448_windows.ppk", null, "ssh-ed448"),
Arguments.of("ppkv2_ed448_windows_encrypted.ppk", "secret123", "ssh-ed448")
);
}

@ParameterizedTest
@MethodSource("keyArgs")
void loadKey(String path, String password, String keyType) throws URISyntaxException, JSchException {
final JSch jSch = new JSch();
final String prvkey = Paths.get(ClassLoader.getSystemResource(path).toURI()).toFile().getAbsolutePath();
assertTrue(new File(prvkey).exists());
assertDoesNotThrow(() -> {
if (null != password) {
jSch.addIdentity(prvkey, password);
} else {
jSch.addIdentity(prvkey);
}
});
assertEquals(keyType, jSch.getIdentityRepository().getIdentities().get(0).getAlgName());
}
}
18 changes: 17 additions & 1 deletion src/test/java/com/jcraft/jsch/KeyPairTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,23 @@ static Stream<Arguments> keyArgs() {
Arguments.of("ppkv2_rsa_unix.ppk", null, "ssh-rsa"),
Arguments.of("ppkv2_rsa_unix_encrypted.ppk", "secret123", "ssh-rsa"),
Arguments.of("ppkv2_rsa_windows.ppk", null, "ssh-rsa"),
Arguments.of("ppkv2_rsa_windows_encrypted.ppk", "secret123", "ssh-rsa")
Arguments.of("ppkv2_rsa_windows_encrypted.ppk", "secret123", "ssh-rsa"),
Arguments.of("ppkv2_ecdsa256_unix.ppk", null, "ecdsa-sha2-nistp256"),
Arguments.of("ppkv2_ecdsa256_unix_encrypted.ppk", "secret123", "ecdsa-sha2-nistp256"),
Arguments.of("ppkv2_ecdsa384_unix.ppk", null, "ecdsa-sha2-nistp384"),
Arguments.of("ppkv2_ecdsa384_unix_encrypted.ppk", "secret123", "ecdsa-sha2-nistp384"),
Arguments.of("ppkv2_ecdsa521_unix.ppk", null, "ecdsa-sha2-nistp521"),
Arguments.of("ppkv2_ecdsa521_unix_encrypted.ppk", "secret123", "ecdsa-sha2-nistp521"),
Arguments.of("ppkv2_ecdsa256_windows.ppk", null, "ecdsa-sha2-nistp256"),
Arguments.of("ppkv2_ecdsa256_windows_encrypted.ppk", "secret123", "ecdsa-sha2-nistp256"),
Arguments.of("ppkv2_ecdsa384_windows.ppk", null, "ecdsa-sha2-nistp384"),
Arguments.of("ppkv2_ecdsa384_windows_encrypted.ppk", "secret123", "ecdsa-sha2-nistp384"),
Arguments.of("ppkv2_ecdsa521_windows.ppk", null, "ecdsa-sha2-nistp521"),
Arguments.of("ppkv2_ecdsa521_windows_encrypted.ppk", "secret123", "ecdsa-sha2-nistp521"),
Arguments.of("ppkv2_ed25519_unix.ppk", null, "ssh-ed25519"),
Arguments.of("ppkv2_ed25519_unix_encrypted.ppk", "secret123", "ssh-ed25519"),
Arguments.of("ppkv2_ed25519_windows.ppk", null, "ssh-ed25519"),
Arguments.of("ppkv2_ed25519_windows_encrypted.ppk", "secret123", "ssh-ed25519")
);
}

Expand Down
20 changes: 20 additions & 0 deletions src/test/resources/docker/authorized_keys.KeyPairIT
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,23 @@ ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDsUXXjApfYYCtRK2LrymKvcZpS4cf6agyOj1/VW48g
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCXX5GPy2zMByhViM5aW+lVH3oPVBVvsfXjb7Afy2ldttHHkDMhoQKMNUScBTdyLwHrje6c0C99aYNkSl5TLXePWx4nIkNFrEyhOfooY8CHPTuhCjfy+4A/psxeE5aoI5YGfffSr0uOVOUdhV3X3p1SmQsybzSiFz0THULrtirxoCbf5a1UGNafYoXPvtSS3/qGJnsnbxE/gL2mTEvOyLI7o3ffFIgbfOranbuow/HSboX/Uc9i2FsbJR4i6K5A6KB3NIL3gFJHxzjumJB4QXt7mUXzo0FWnOXLORFrzYd1Rf26AVcUc24wwStVAOtXO3EIr/AylwgsqWqoStOzoRFB test
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCdPnSRJDt/YuU5Oj1gq6JKYsJacWbgsdU+vpzAT7IiIVOoGB7oPi8EGcZSt1kIJBc9Lf70uRYCbCmq3v3EOLGpSdhV16oKQygSgSZawq2YwYHzHnonp6akLfQQXwE/nnubX3S6iYAaJSrJ50APhKfQXYsz4CH2alrzYb9Y2TDl4hKfxYABgMza3O02BFooK2tbxy2+0fbOKB/qjamGVE/CoMcv4ChB9FDGdUr0AVy7BYtfELAZ1dPrUh7lMCXa6JRRhFtdRWQGKmfM1nH/KpuzB+yZsl8kfHf47qiX/mwTQM87JMxm7HuV8pHHr7DNFs9g30CreF+hbY1Cx+IKh+eR test
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCPJDCMNOM7Huv+NNeP626Slq54aPceMLEaoqlfvLJiQf11b8jXcKfFgLlp/f0Ltk10p+5hAGlzBw/nlYRU85i7Eq75kSb6LPcQ3SNY1/NkrNcZcFf4p/AKeC0s1qgbypvjWy7Zk8AUooPFrhIo/kKaPMouq4hcyENz2VKgpdJ21SzTxjDASj7zd9DZP8uc1Lsg3ftbr8Mi+MFFQRnFPLv/w2zIoLo6xwO0UplUIyAGAsRPDdRZQ50h9b5BFyFLnXUlwI/Jrpgs2J31Vg8J2j2Y3BFDgn/Mf/P9Rsvdo4fp/y+W195198VQ2gsH2+Az+3Id6ySsGhztBP5Pl2Z2K5Pt test
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCo/5qxk4V6ZZGDFHDeVBr7ayBkc85+7SPuuY2OnBSrObqo06lw3nlH8dcloRzCt7qYvbmWTutlTujgSOJuvd3A= test
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBAJ3Mot6VLEkkG5HscBLY3geI20FnwrgQi2wzAKiktPDhF39ZavVlOMzvkIGgQDxmo8WoQllY52ed4e8+7KQ76M= test
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCDseBAbWBVvO3A6gqqd2+Qm9uSTBPEFvvj/huI35w7iYhMmIjWAYwi9av867hF9GsRJaPGSkoWUIcA6QBXarAM= test
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBKIrHi0RIW1gbd9+rJLTPJ5qAyXzNjEHidpxBzRnN22jDcnvBjqnAtfWPBjazs2KHSn/RP+KtyejY1Q+mMikDDk= test
ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBBCTReLXxPo93rpl1xlrrx7yYZgD0DzRieTvFO9C3a8Z8blHuZHNy2iljsIYeCPOtK9lcivx+faOrp5FdE2VDroGPdDY2ZAuwF4/UxBiGNNEXWBhRFkupBcM6RbyjvCXaA== test
ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBBRylqfIuL/Bzq92j3g4UHd3TOlU2aG1U/2W76hrf1svwNPNe5d81xXA6j7Uh+AxOYfYrJRQr9KotRvd8WcxbikMZs5O/dKG+xx8WmTcgvu+jVW4lCbZrZk4S7/hqIlVjw== test
ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBPATBzcVXx8g+unFg+8RAEvjiY/ZSb98vuIQ6MAtFCkNU2zgUHI9m/Jn9FitFd/F7KlIh4G5/wMB2dGhks/FYSk+OxgAmhjif6lKLfD5veRCLhRnVbhTQm1fOmU0Sy+FSA== test
ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBGxZq9s9JfIvKluYcWj/f+OuiV0bJ9RLE8rT+8qF0syMvzZZVRqLmF+a9VxJ4uxxRVvmMQ1CXb5TGtLVdBv1SrviKWMoaBw/sosSMr8v3eoQ04f4bs32fx8/dN4JQbCZEg== test
ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBACuthNYwDJn4I/b0fdhJdD3ykWe5gMBS91H9qWt0NHh4QTYxVyu3npbLveRVr9AWoF36UYIVF0Z3WjFV4u4fOPapQFNlGDf1DNn8aipy/5iUKY02z+AxnWIIjToN0IPPizMw3LApwmy0UaBSw7sZyfxNHD0Nu8wXsP8A6HG+Y01zSMAqg== test
ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAEUP4llO/qJcKrD5gZ6L+8+JzEU5RLICud1jgVh+QgtuuAZQUztdee3GEPmR+C9Mv5cAHg138OCNcyRI1eukjFNDgAq3xeh0V6BwjZZur+v5zyTnXQASBwuI+iofZZqS0z8lsM48eIluTZuo3siTlv6uvFLs4ovN/cg67QyGIpsKusESQ== test
ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAGIVlZVYKq71fKe0Uxj73A5WPmvTuohTARpvnJ0VB5zIHFEtHRuI7Qkn6pRGv8rbKDRKygv1kZc6rFZ2fgfhLxXcQHG1LwWM8x+XXoWMJM0C0kpCEErKd/tCZstQqg4v2JO0iG5+wmoZ90Cru912t24fhFGfVeFIbLN/xqznIm0dZTN/Q== test
ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBACcIEokqqdXr1cB4vJksHNPuIb4HhwaRqaCi22yZa1slGr5+KQhWc6TaRP2yEsXaskuwThVy5hNjfONP/uB5IMj6QCxnR3bA/knuB2n7YRFlbIICLmCxr6QI5bz271MxCB+ccJO1L8sSfEsS6IcxH7O3rYv7hDadwcY9t5VmsJ3t7A67w== test
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINknjInRhIeQB0yCD/N+ilxpTNwD2OGA776pYHI8bOdZ test
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFYLKsn61Pg/YYmumVe7oXik0o+Ca/P3vvN0Om3KCHqo test
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHh90f1nUVIpoKQoYxtD66cTGgLZ33D3hCxVqS/N5R3u test
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILhbcrIlE43dp+IlosYszkS0c4zpwC60ec1MRwZuxwvr test
ssh-ed448 AAAACXNzaC1lZDQ0OAAAADnTDrr21+87QbcPF+2Ayh61ot/Jtf0c9yTy126ki8Um/UUEW6uy87s/9gpS0OHyoH3GO3WgsUoe/AA= test
ssh-ed448 AAAACXNzaC1lZDQ0OAAAADnwdqOa0pIeeorEzsEY7kskGeyZfhpkYZtbA/iR5Nyp0cbPZnl9UFsfKQIYKJwPWwnim8BXTkEq6YA= test
ssh-ed448 AAAACXNzaC1lZDQ0OAAAADk5uIOJgx7OfFkbkRV43yMP37dcnIVemLPjlaH/WRKjLTwueFIgN5Mc4UYcIZtlbAaUhiiEvW7aYQA= test
ssh-ed448 AAAACXNzaC1lZDQ0OAAAADkVNtCwBIBWO41k+QYmuMromfii6QbjVKRxjxbTYGPDaw8u+gSCHAnqgaxi9qkc7HU0U01BJI5tJgA= test
10 changes: 10 additions & 0 deletions src/test/resources/ppkv2_ecdsa256_unix.ppk
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
PuTTY-User-Key-File-2: ecdsa-sha2-nistp256
Encryption: none
Comment: test
Public-Lines: 3
AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCo/5qxk4V6Z
ZGDFHDeVBr7ayBkc85+7SPuuY2OnBSrObqo06lw3nlH8dcloRzCt7qYvbmWTutlT
ujgSOJuvd3A=
Private-Lines: 1
AAAAIEfIpXqum0vHuX3aJmumOiRTGEcPs8cB6B5cmKV7j8Pq
Private-MAC: c2c907c13abcd1e429a8a53c162fb27fa32bf88d
10 changes: 10 additions & 0 deletions src/test/resources/ppkv2_ecdsa256_unix_encrypted.ppk
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
PuTTY-User-Key-File-2: ecdsa-sha2-nistp256
Encryption: aes256-cbc
Comment: test
Public-Lines: 3
AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBAJ3Mot6VLEk
kG5HscBLY3geI20FnwrgQi2wzAKiktPDhF39ZavVlOMzvkIGgQDxmo8WoQllY52e
d4e8+7KQ76M=
Private-Lines: 1
Giq4fU1ffVMQzpRS7vPtl4eViHxNmagS8TmYqnvb4KsMip0XwtRkRd1tqV9UGS2F
Private-MAC: 9a55718d397e4bbbc0c00003bdcf5b8648da7f2c
Loading

0 comments on commit 2fbfa19

Please sign in to comment.