Skip to content

Commit 67a9f06

Browse files
edgaoyurii-bidiuk
andauthored
add EdDSA support in SSH tunnel (#9494)
* add EdDSA support * verify EdDSA support works correct Co-authored-by: Yurii Bidiuk <[email protected]>
1 parent 7121364 commit 67a9f06

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

airbyte-integrations/bases/base-java/build.gradle

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ dependencies {
1111
api 'io.sentry:sentry:5.6.0'
1212

1313
implementation 'commons-cli:commons-cli:1.4'
14+
implementation 'net.i2p.crypto:eddsa:0.3.0'
1415
implementation 'org.apache.sshd:sshd-mina:2.8.0'
1516
// bouncycastle is pinned to version-match the transitive dependency from kubernetes client-java
1617
// because a version conflict causes "parameter object not a ECParameterSpec" on ssh tunnel initiation
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
* Copyright (c) 2022 Airbyte, Inc., all rights reserved.
3+
*/
4+
5+
package io.airbyte.integrations.base.ssh;
6+
7+
import static org.junit.jupiter.api.Assertions.assertTrue;
8+
9+
import java.nio.charset.StandardCharsets;
10+
import java.security.KeyPair;
11+
import java.security.PrivateKey;
12+
import java.security.PublicKey;
13+
import org.apache.sshd.common.util.security.SecurityUtils;
14+
import org.apache.sshd.common.util.security.eddsa.EdDSASecurityProviderRegistrar;
15+
import org.junit.jupiter.api.Test;
16+
17+
class SshTunnelTest {
18+
19+
/**
20+
* This test verifies that 'net.i2p.crypto:eddsa' is present and EdDSA is supported. If
21+
* net.i2p.crypto:eddsa will be removed from project, then will be thrown: generator not correctly
22+
* initialized
23+
*
24+
* @throws Exception
25+
*/
26+
@Test
27+
public void edDsaIsSupported() throws Exception {
28+
var keygen = SecurityUtils.getKeyPairGenerator("EdDSA");
29+
final String message = "hello world";
30+
KeyPair keyPair = keygen.generateKeyPair();
31+
32+
byte[] signedMessage = sign(keyPair.getPrivate(), message);
33+
34+
assertTrue(new EdDSASecurityProviderRegistrar().isSupported());
35+
assertTrue(verify(keyPair.getPublic(), signedMessage, message));
36+
}
37+
38+
private byte[] sign(final PrivateKey privateKey, final String message) throws Exception {
39+
var signature = SecurityUtils.getSignature("NONEwithEdDSA");
40+
signature.initSign(privateKey);
41+
42+
signature.update(message.getBytes(StandardCharsets.UTF_8));
43+
44+
return signature.sign();
45+
}
46+
47+
private boolean verify(final PublicKey publicKey, byte[] signed, final String message)
48+
throws Exception {
49+
var signature = SecurityUtils.getSignature("NONEwithEdDSA");
50+
signature.initVerify(publicKey);
51+
52+
signature.update(message.getBytes(StandardCharsets.UTF_8));
53+
54+
return signature.verify(signed);
55+
}
56+
57+
}

0 commit comments

Comments
 (0)