Skip to content

Commit 01a7ea1

Browse files
committed
feat: Add experimental support for Schnorr signatures
1 parent a004fb4 commit 01a7ea1

File tree

2 files changed

+8
-3
lines changed

2 files changed

+8
-3
lines changed

src/main/java/com/danubetech/keyformats/crypto/impl/secp256k1_ES256KS_PublicKeyVerifier.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.danubetech.keyformats.jose.JWSAlgorithm;
55
import com.danubetech.keyformats.util.SchnorrUtil;
66
import org.bitcoinj.crypto.ECKey;
7+
import org.bitcoinj.crypto.LazyECPoint;
78
import org.web3j.crypto.Hash;
89

910
import java.security.GeneralSecurityException;
@@ -21,7 +22,8 @@ public boolean verify(byte[] content, byte[] signature) throws GeneralSecurityEx
2122
// verify
2223

2324
byte[] hash = Hash.sha3(content);
24-
boolean verified = SchnorrUtil.schnorr_verify(hash, this.getPublicKey().getPubKey(), signature);
25+
ECKey compressedPublicKey = ECKey.fromPublicOnly(new LazyECPoint(this.getPublicKey().getPubKeyPoint(), true).get(), true);
26+
boolean verified = SchnorrUtil.schnorr_verify(hash, compressedPublicKey.getPubKey(), signature);
2527

2628
// done
2729

src/test/java/com/danubetech/keyformats/crypto/SignVerifyTest.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@
77
import java.nio.charset.StandardCharsets;
88
import java.util.Map;
99

10+
import static org.junit.jupiter.api.Assertions.assertFalse;
1011
import static org.junit.jupiter.api.Assertions.assertTrue;
1112

1213
public class SignVerifyTest {
1314

1415
private static final byte[] CONTENT = "Hello World!".getBytes(StandardCharsets.UTF_8);
16+
private static final byte[] OTHER_CONTENT = "Goodbye World!".getBytes(StandardCharsets.UTF_8);
1517

1618
private static final Map<PrivateKeySigner<?>, PublicKeyVerifier<?>> SIGNERS_VERIFIERS = Map.of(
1719
PrivateKeySignerFactory.privateKeySignerForKey(Ed25519Test.jwkPrivate, JWSAlgorithm.EdDSA),
@@ -22,8 +24,8 @@ public class SignVerifyTest {
2224
PublicKeyVerifierFactory.publicKeyVerifierForKey(secp256k1Test.jwkPublic, JWSAlgorithm.ES256KCC),
2325
PrivateKeySignerFactory.privateKeySignerForKey(secp256k1Test.jwkPrivate, JWSAlgorithm.ES256KRR),
2426
PublicKeyVerifierFactory.publicKeyVerifierForKey(secp256k1Test.jwkPublic, JWSAlgorithm.ES256KRR),
25-
//PrivateKeySignerFactory.privateKeySignerForKey(secp256k1Test.jwkPrivate, JWSAlgorithm.ES256KS),
26-
//PublicKeyVerifierFactory.publicKeyVerifierForKey(secp256k1Test.jwkPublic, JWSAlgorithm.ES256KS),
27+
PrivateKeySignerFactory.privateKeySignerForKey(secp256k1Test.jwkPrivate, JWSAlgorithm.ES256KS),
28+
PublicKeyVerifierFactory.publicKeyVerifierForKey(secp256k1Test.jwkPublic, JWSAlgorithm.ES256KS),
2729
PrivateKeySignerFactory.privateKeySignerForKey(P_256Test.jwkPrivate, JWSAlgorithm.ES256),
2830
PublicKeyVerifierFactory.publicKeyVerifierForKey(P_256Test.jwkPublic, JWSAlgorithm.ES256),
2931
PrivateKeySignerFactory.privateKeySignerForKey(P_384Test.jwkPrivate, JWSAlgorithm.ES384),
@@ -39,6 +41,7 @@ public void testSignVerify() throws Exception {
3941
PublicKeyVerifier<?> publicKeyVerifierFactory = pair.getValue();
4042
byte[] signature = privateKeySigner.sign(CONTENT);
4143
assertTrue(publicKeyVerifierFactory.verify(CONTENT, signature));
44+
assertFalse(publicKeyVerifierFactory.verify(OTHER_CONTENT, signature));
4245
}
4346
}
4447
}

0 commit comments

Comments
 (0)