Skip to content

Commit cb8655a

Browse files
committed
feat: More work on Schnorr signature support
1 parent 66c73b6 commit cb8655a

25 files changed

+574
-54
lines changed

src/main/java/com/danubetech/dataintegrity/signer/DataIntegrityProofLdSigner.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import com.danubetech.dataintegrity.suites.DataIntegrityProofDataIntegritySuite;
77
import com.danubetech.dataintegrity.suites.DataIntegritySuites;
88
import com.danubetech.keyformats.crypto.ByteSigner;
9-
import com.danubetech.keyformats.crypto.impl.Ed25519_EdDSA_PrivateKeySigner;
109
import io.ipfs.multibase.Multibase;
1110

1211
import java.security.GeneralSecurityException;
@@ -17,29 +16,25 @@ public DataIntegrityProofLdSigner(ByteSigner signer) {
1716
super(DataIntegritySuites.DATA_INTEGRITY_SUITE_DATAINTEGRITYPROOF, signer);
1817
}
1918

20-
public DataIntegrityProofLdSigner(byte[] privateKey) {
21-
this(new Ed25519_EdDSA_PrivateKeySigner(privateKey));
22-
}
23-
2419
public DataIntegrityProofLdSigner() {
2520
this((ByteSigner) null);
2621
}
2722

2823
public Canonicalizer getCanonicalizer(DataIntegrityProof dataIntegrityProof) {
2924
String cryptosuite = dataIntegrityProof.getCryptosuite();
3025
if (cryptosuite == null) return RDFC10Canonicalizer.getInstance();
31-
return DataIntegrityProofDataIntegritySuite.findCanonicalizerByCryptosuite(cryptosuite);
26+
Canonicalizer canonicalizer = DataIntegrityProofDataIntegritySuite.findCanonicalizerByCryptosuite(cryptosuite);
27+
if (canonicalizer == null) throw new IllegalArgumentException("Unknown cryptosuite: " + cryptosuite);
28+
return canonicalizer;
3229
}
3330

34-
public static void sign(DataIntegrityProof.Builder<? extends DataIntegrityProof.Builder<?>> ldProofBuilder, byte[] signingInput, ByteSigner signer) throws GeneralSecurityException {
31+
public static void sign(DataIntegrityProof.Builder<? extends DataIntegrityProof.Builder<?>> ldProofBuilder, byte[] signingInput, ByteSigner signer, String cryptosuite) throws GeneralSecurityException {
3532

3633
// determine algorithm and cryptosuite
3734

3835
String algorithm;
39-
String cryptosuite;
4036

4137
algorithm = signer.getAlgorithm();
42-
cryptosuite = ldProofBuilder.build().getCryptosuite();
4338
if (cryptosuite != null) {
4439
if (! DataIntegrityProofDataIntegritySuite.findCryptosuitesByJwsAlgorithm(algorithm).contains(cryptosuite)) {
4540
throw new GeneralSecurityException("Algorithm " + algorithm + " is not supported by cryptosuite " + cryptosuite);
@@ -63,6 +58,6 @@ public static void sign(DataIntegrityProof.Builder<? extends DataIntegrityProof.
6358

6459
@Override
6560
public void sign(DataIntegrityProof.Builder<? extends DataIntegrityProof.Builder<?>> ldProofBuilder, byte[] signingInput) throws GeneralSecurityException {
66-
sign(ldProofBuilder, signingInput, this.getSigner());
61+
sign(ldProofBuilder, signingInput, this.getSigner(), this.getCryptosuite());
6762
}
6863
}

src/main/java/com/danubetech/dataintegrity/signer/EcdsaKoblitzSignature2016LdSigner.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import com.danubetech.dataintegrity.suites.EcdsaKoblitzSignature2016DataIntegritySuite;
1515
import com.danubetech.dataintegrity.suites.DataIntegritySuites;
1616
import com.danubetech.dataintegrity.util.JWSUtil;
17-
import org.bitcoinj.core.ECKey;
17+
import org.bitcoinj.crypto.ECKey;
1818

1919
import java.security.GeneralSecurityException;
2020
import java.util.Collections;

src/main/java/com/danubetech/dataintegrity/signer/EcdsaSecp256k1Signature2019LdSigner.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import com.nimbusds.jose.JWSHeader;
1515
import com.nimbusds.jose.JWSSigner;
1616
import com.nimbusds.jose.util.Base64URL;
17-
import org.bitcoinj.core.ECKey;
17+
import org.bitcoinj.crypto.ECKey;
1818

1919
import java.security.GeneralSecurityException;
2020
import java.util.Collections;

src/main/java/com/danubetech/dataintegrity/signer/JcsEcdsaSecp256k1Signature2019LdSigner.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import com.danubetech.dataintegrity.suites.JcsEcdsaSecp256K1Signature2019DataIntegritySuite;
1111
import com.danubetech.dataintegrity.suites.DataIntegritySuites;
1212
import io.ipfs.multibase.Base58;
13-
import org.bitcoinj.core.ECKey;
13+
import org.bitcoinj.crypto.ECKey;
1414

1515
import java.security.GeneralSecurityException;
1616
import java.util.Map;

src/main/java/com/danubetech/dataintegrity/signer/LdSigner.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ public DataIntegrityProof sign(JsonLDObject jsonLdObject, boolean addToJsonLdObj
8787
.previousProof(this.getPreviousProof())
8888
.build();
8989

90+
// add missing context(s)
91+
92+
loadMissingContext(jsonLdObject);
93+
9094
// obtain the canonicalized document
9195

9296
byte[] canonicalizationResult = this.getCanonicalizer(dataIntegrityProof).canonicalize(dataIntegrityProof, jsonLdObject);
@@ -103,7 +107,6 @@ public DataIntegrityProof sign(JsonLDObject jsonLdObject, boolean addToJsonLdObj
103107
// add proof to JSON-LD
104108

105109
if (addToJsonLdObject) dataIntegrityProof.addToJsonLDObject(jsonLdObject);
106-
loadMissingContext(jsonLdObject);
107110

108111
// done
109112

src/main/java/com/danubetech/dataintegrity/suites/DataIntegrityProofDataIntegritySuite.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@
1414
public class DataIntegrityProofDataIntegritySuite extends DataIntegritySuite {
1515

1616
private static final Map<String, Canonicalizer> CANONICALIZERS_BY_CRYPTOSUITE = Map.of(
17+
"eddsa-rdfc-2022", RDFC10Canonicalizer.getInstance(),
18+
"eddsa-jcs-2022", JCSCanonicalizer.getInstance(),
1719
"ecdsa-rdfc-2019", RDFC10Canonicalizer.getInstance(),
1820
"ecdsa-jcs-2019", JCSCanonicalizer.getInstance(),
19-
"eddsa-rdfc-2022", RDFC10Canonicalizer.getInstance(),
20-
"eddsa-jcs-2022", JCSCanonicalizer.getInstance()
21+
"schnorr-secp256k1-rdfc-2025", RDFC10Canonicalizer.getInstance(),
22+
"schnorr-secp256k1-jcs-2025", JCSCanonicalizer.getInstance()
2123
);
2224

2325
private static final Map<String, List<String>> CRYPTOSUITES_BY_JWS_ALGORITHM = Map.of(

src/main/java/com/danubetech/dataintegrity/verifier/BbsBlsSignature2020LdVerifier.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public BbsBlsSignature2020LdVerifier() {
2727
this((ByteVerifier) null);
2828
}
2929

30-
public Canonicalizer getCanonicalizer() {
30+
public Canonicalizer getCanonicalizer(DataIntegrityProof dataIntegrityProof) {
3131
return URDNA2015Canonicalizer.getInstance();
3232
}
3333

src/main/java/com/danubetech/dataintegrity/verifier/DataIntegrityProofLdVerifier.java

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,14 @@
11
package com.danubetech.dataintegrity.verifier;
22

33
import com.danubetech.dataintegrity.DataIntegrityProof;
4-
import com.danubetech.dataintegrity.adapter.JWSVerifierAdapter;
54
import com.danubetech.dataintegrity.canonicalizer.Canonicalizer;
65
import com.danubetech.dataintegrity.canonicalizer.RDFC10Canonicalizer;
76
import com.danubetech.dataintegrity.suites.DataIntegrityProofDataIntegritySuite;
87
import com.danubetech.dataintegrity.suites.DataIntegritySuites;
9-
import com.danubetech.dataintegrity.util.JWSUtil;
108
import com.danubetech.keyformats.crypto.ByteVerifier;
11-
import com.nimbusds.jose.JOSEException;
12-
import com.nimbusds.jose.JWSAlgorithm;
13-
import com.nimbusds.jose.JWSObject;
14-
import com.nimbusds.jose.JWSVerifier;
9+
import io.ipfs.multibase.Multibase;
1510

1611
import java.security.GeneralSecurityException;
17-
import java.text.ParseException;
1812

1913
public class DataIntegrityProofLdVerifier extends LdVerifier<DataIntegrityProofDataIntegritySuite> {
2014

@@ -26,30 +20,37 @@ public DataIntegrityProofLdVerifier() {
2620
this(null);
2721
}
2822

29-
public Canonicalizer getCanonicalizer() {
30-
return RDFC10Canonicalizer.getInstance();
23+
public Canonicalizer getCanonicalizer(DataIntegrityProof dataIntegrityProof) {
24+
String cryptosuite = dataIntegrityProof.getCryptosuite();
25+
if (cryptosuite == null) return RDFC10Canonicalizer.getInstance();
26+
Canonicalizer canonicalizer = DataIntegrityProofDataIntegritySuite.findCanonicalizerByCryptosuite(cryptosuite);
27+
if (canonicalizer == null) throw new IllegalArgumentException("Unknown cryptosuite: " + cryptosuite);
28+
return canonicalizer;
3129
}
3230

3331
public static boolean verify(byte[] signingInput, DataIntegrityProof dataIntegrityProof, ByteVerifier verifier) throws GeneralSecurityException {
3432

35-
// build the JWS and verify
33+
// determine algorithm and cryptosuite
3634

37-
String jws = dataIntegrityProof.getJws();
38-
if (jws == null) throw new GeneralSecurityException("No 'jws' in proof.");
35+
String cryptosuite = dataIntegrityProof.getCryptosuite();
36+
if (cryptosuite == null) throw new GeneralSecurityException("No cryptosuite in data integrity proof: " + dataIntegrityProof);
3937

40-
boolean verify;
38+
String algorithm;
4139

42-
try {
40+
algorithm = verifier.getAlgorithm();
41+
if (! DataIntegrityProofDataIntegritySuite.findCryptosuitesByJwsAlgorithm(algorithm).contains(cryptosuite)) {
42+
throw new GeneralSecurityException("Algorithm " + algorithm + " is not supported by cryptosuite " + cryptosuite);
43+
}
4344

44-
JWSObject detachedJwsObject = JWSObject.parse(jws);
45-
byte[] jwsSigningInput = JWSUtil.getJwsSigningInput(detachedJwsObject.getHeader(), signingInput);
45+
// verify
4646

47-
JWSVerifier jwsVerifier = new JWSVerifierAdapter(verifier, JWSAlgorithm.parse(verifier.getAlgorithm()));
48-
verify = jwsVerifier.verify(detachedJwsObject.getHeader(), jwsSigningInput, detachedJwsObject.getSignature());
49-
} catch (JOSEException | ParseException ex) {
47+
String proofValue = dataIntegrityProof.getProofValue();
48+
if (proofValue == null) throw new GeneralSecurityException("No 'proofValue' in proof.");
5049

51-
throw new GeneralSecurityException("JOSE verification problem: " + ex.getMessage(), ex);
52-
}
50+
boolean verify;
51+
52+
byte[] bytes = Multibase.decode(proofValue);
53+
verify = verifier.verify(signingInput, bytes, algorithm);
5354

5455
// done
5556

src/main/java/com/danubetech/dataintegrity/verifier/EcdsaKoblitzSignature2016LdVerifier.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import com.danubetech.dataintegrity.suites.EcdsaKoblitzSignature2016DataIntegritySuite;
1414
import com.danubetech.dataintegrity.suites.DataIntegritySuites;
1515
import com.danubetech.dataintegrity.util.JWSUtil;
16-
import org.bitcoinj.core.ECKey;
16+
import org.bitcoinj.crypto.ECKey;
1717

1818
import java.security.GeneralSecurityException;
1919
import java.text.ParseException;
@@ -32,7 +32,7 @@ public EcdsaKoblitzSignature2016LdVerifier() {
3232
this((ByteVerifier) null);
3333
}
3434

35-
public Canonicalizer getCanonicalizer() {
35+
public Canonicalizer getCanonicalizer(DataIntegrityProof dataIntegrityProof) {
3636
return URDNA2015Canonicalizer.getInstance();
3737
}
3838

src/main/java/com/danubetech/dataintegrity/verifier/EcdsaSecp256k1Signature2019LdVerifier.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import com.nimbusds.jose.JWSAlgorithm;
1414
import com.nimbusds.jose.JWSObject;
1515
import com.nimbusds.jose.JWSVerifier;
16-
import org.bitcoinj.core.ECKey;
16+
import org.bitcoinj.crypto.ECKey;
1717

1818
import java.security.GeneralSecurityException;
1919
import java.text.ParseException;
@@ -32,7 +32,7 @@ public EcdsaSecp256k1Signature2019LdVerifier() {
3232
this((ByteVerifier) null);
3333
}
3434

35-
public Canonicalizer getCanonicalizer() {
35+
public Canonicalizer getCanonicalizer(DataIntegrityProof dataIntegrityProof) {
3636
return URDNA2015Canonicalizer.getInstance();
3737
}
3838

0 commit comments

Comments
 (0)