Skip to content

Commit de18bac

Browse files
committed
refactor: Support for DataIntegrityProof
1 parent a8467fb commit de18bac

File tree

47 files changed

+1704
-196
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+1704
-196
lines changed

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ Dependency:
2828
</repositories>
2929

3030
<dependency>
31-
<groupId>info.weboftrust</groupId>
32-
<artifactId>ld-signatures-java</artifactId>
31+
<groupId>com.danubetech</groupId>
32+
<artifactId>data-integrity-java</artifactId>
3333
<version>1.6.0</version>
3434
</dependency>
3535

@@ -81,12 +81,12 @@ Example Linked Data Proof:
8181

8282
Danube Tech - https://danubetech.com/
8383

84-
<img align="left" src="https://raw.githubusercontent.com/WebOfTrustInfo/ld-signatures-java/main/docs/logo-wot.png">
84+
<img align="left" src="https://raw.githubusercontent.com/danubetech/data-integrity-java/main/docs/logo-wot.png">
8585

8686
Originally built during [Rebooting Web-of-Trust](http://www.weboftrust.info/) in Paris on April 21st 2017.
8787

8888
<br clear="left" />
8989

90-
<img align="left" height="70" src="https://raw.githubusercontent.com/WebOfTrustInfo/ld-signatures-java/main/docs/logo-ngi-essiflab.png">
90+
<img align="left" height="70" src="https://raw.githubusercontent.com/danubetech/data-integrity-java/main/docs/logo-ngi-essiflab.png">
9191

9292
This software library is part of a project that has received funding from the European Union's Horizon 2020 research and innovation programme under grant agreement No 871932

pom.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
22

33
<modelVersion>4.0.0</modelVersion>
4-
<groupId>info.weboftrust</groupId>
4+
<groupId>com.danubetech</groupId>
55
<artifactId>data-integrity-java</artifactId>
66
<packaging>jar</packaging>
77
<version>1.12-SNAPSHOT</version>
@@ -189,6 +189,11 @@
189189
<artifactId>key-formats-java</artifactId>
190190
<version>1.20.0</version>
191191
</dependency>
192+
<dependency>
193+
<groupId>io.setl</groupId>
194+
<artifactId>rdf-urdna</artifactId>
195+
<version>1.4</version>
196+
</dependency>
192197
<dependency>
193198
<groupId>io.github.erdtman</groupId>
194199
<artifactId>java-json-canonicalization</artifactId>

src/main/java/com/danubetech/dataintegrity/canonicalizer/JCSCanonicalizer.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package com.danubetech.dataintegrity.canonicalizer;
22

33
import com.danubetech.dataintegrity.DataIntegrityProof;
4+
import com.danubetech.dataintegrity.util.SHAUtil;
45
import foundation.identity.jsonld.JsonLDException;
56
import foundation.identity.jsonld.JsonLDObject;
6-
import com.danubetech.dataintegrity.util.SHAUtil;
77
import org.erdtman.jcs.JsonCanonicalizer;
88

99
import java.io.IOException;
@@ -12,11 +12,16 @@
1212

1313
public class JCSCanonicalizer extends Canonicalizer {
1414

15-
public JCSCanonicalizer() {
15+
private static final JCSCanonicalizer INSTANCE = new JCSCanonicalizer();
1616

17+
public JCSCanonicalizer() {
1718
super(List.of("jcs"));
1819
}
1920

21+
public static JCSCanonicalizer getInstance() {
22+
return INSTANCE;
23+
}
24+
2025
@Override
2126
public byte[] canonicalize(DataIntegrityProof dataIntegrityProof, JsonLDObject jsonLdObject) throws IOException, GeneralSecurityException, JsonLDException {
2227

@@ -39,11 +44,15 @@ public byte[] canonicalize(DataIntegrityProof dataIntegrityProof, JsonLDObject j
3944

4045
// canonicalize the LD object
4146

42-
String canonicalizedJsonLdObjectWithProofWithoutProofValues = new JsonCanonicalizer(jsonLdObjectWithProofWithoutProofValues.toJson()).getEncodedString();
47+
String canonicalizedJsonLdObjectWithProofWithoutProofValues = this.canonicalize(jsonLdObjectWithProofWithoutProofValues);
4348

4449
// construct the canonicalization result
4550

4651
byte[] canonicalizationResult = SHAUtil.sha256(canonicalizedJsonLdObjectWithProofWithoutProofValues);
4752
return canonicalizationResult;
4853
}
54+
55+
public String canonicalize(JsonLDObject jsonLDObject) throws JsonLDException, IOException {
56+
return new JsonCanonicalizer(jsonLDObject.toJson()).getEncodedString();
57+
}
4958
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package com.danubetech.dataintegrity.canonicalizer;
2+
3+
import com.apicatalog.rdf.RdfDataset;
4+
import com.apicatalog.rdf.RdfNQuad;
5+
import com.apicatalog.rdf.canon.RdfCanonicalizer;
6+
import com.apicatalog.rdf.io.nquad.NQuadsWriter;
7+
import com.danubetech.dataintegrity.DataIntegrityProof;
8+
import com.danubetech.dataintegrity.util.SHAUtil;
9+
import foundation.identity.jsonld.JsonLDException;
10+
import foundation.identity.jsonld.JsonLDObject;
11+
import io.setl.rdf.normalization.RdfNormalize;
12+
13+
import java.io.IOException;
14+
import java.io.StringWriter;
15+
import java.security.GeneralSecurityException;
16+
import java.security.NoSuchAlgorithmException;
17+
import java.util.Collection;
18+
import java.util.List;
19+
20+
public class RDFC10Canonicalizer extends Canonicalizer {
21+
22+
private static final RDFC10Canonicalizer INSTANCE = new RDFC10Canonicalizer();
23+
24+
public RDFC10Canonicalizer() {
25+
super(List.of("urdna2015"));
26+
}
27+
28+
public static RDFC10Canonicalizer getInstance() {
29+
return INSTANCE;
30+
}
31+
32+
@Override
33+
public byte[] canonicalize(DataIntegrityProof dataIntegrityProof, JsonLDObject jsonLdObject) throws IOException, GeneralSecurityException, JsonLDException {
34+
35+
// construct the LD proof without proof values
36+
37+
DataIntegrityProof dataIntegrityProofWithoutProofValues = DataIntegrityProof.builder()
38+
.base(dataIntegrityProof)
39+
.defaultContexts(true)
40+
.build();
41+
DataIntegrityProof.removeLdProofValues(dataIntegrityProofWithoutProofValues);
42+
43+
// construct the LD object without proof
44+
45+
JsonLDObject jsonLdObjectWithoutProof = JsonLDObject.builder()
46+
.base(jsonLdObject)
47+
.build();
48+
jsonLdObjectWithoutProof.setDocumentLoader(jsonLdObject.getDocumentLoader());
49+
DataIntegrityProof.removeFromJsonLdObject(jsonLdObjectWithoutProof);
50+
51+
// canonicalize the LD proof and LD object
52+
53+
String canonicalizedLdProofWithoutProofValues = this.canonicalize(dataIntegrityProofWithoutProofValues);
54+
String canonicalizedJsonLdObjectWithoutProof = this.canonicalize(jsonLdObjectWithoutProof);
55+
56+
// construct the canonicalization result
57+
58+
byte[] canonicalizationResult = new byte[64];
59+
System.arraycopy(SHAUtil.sha256(canonicalizedLdProofWithoutProofValues), 0, canonicalizationResult, 0, 32);
60+
System.arraycopy(SHAUtil.sha256(canonicalizedJsonLdObjectWithoutProof), 0, canonicalizationResult, 32, 32);
61+
62+
return canonicalizationResult;
63+
}
64+
65+
public String canonicalize(JsonLDObject jsonLDObject) throws JsonLDException, IOException {
66+
RdfDataset rdfDataset = jsonLDObject.toDataset();
67+
Collection<RdfNQuad> rdfNQuads = RdfCanonicalizer.canonicalize(rdfDataset.toList());
68+
StringWriter stringWriter = new StringWriter();
69+
NQuadsWriter nQuadsWriter = new NQuadsWriter(stringWriter);
70+
for (RdfNQuad rdfNQuad : rdfNQuads) nQuadsWriter.write(rdfNQuad);
71+
return stringWriter.getBuffer().toString();
72+
}
73+
}

src/main/java/com/danubetech/dataintegrity/canonicalizer/URDNA2015Canonicalizer.java

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,31 @@
11
package com.danubetech.dataintegrity.canonicalizer;
22

3+
import com.apicatalog.rdf.RdfDataset;
4+
import com.apicatalog.rdf.io.nquad.NQuadsWriter;
35
import com.danubetech.dataintegrity.DataIntegrityProof;
6+
import com.danubetech.dataintegrity.util.SHAUtil;
47
import foundation.identity.jsonld.JsonLDException;
58
import foundation.identity.jsonld.JsonLDObject;
6-
import com.danubetech.dataintegrity.util.SHAUtil;
9+
import io.setl.rdf.normalization.RdfNormalize;
710

811
import java.io.IOException;
12+
import java.io.StringWriter;
913
import java.security.GeneralSecurityException;
14+
import java.security.NoSuchAlgorithmException;
1015
import java.util.List;
1116

1217
public class URDNA2015Canonicalizer extends Canonicalizer {
1318

14-
public URDNA2015Canonicalizer() {
19+
public static final URDNA2015Canonicalizer INSTANCE = new URDNA2015Canonicalizer();
1520

21+
public URDNA2015Canonicalizer() {
1622
super(List.of("urdna2015"));
1723
}
1824

25+
public static URDNA2015Canonicalizer getInstance() {
26+
return INSTANCE;
27+
}
28+
1929
@Override
2030
public byte[] canonicalize(DataIntegrityProof dataIntegrityProof, JsonLDObject jsonLdObject) throws IOException, GeneralSecurityException, JsonLDException {
2131

@@ -37,8 +47,8 @@ public byte[] canonicalize(DataIntegrityProof dataIntegrityProof, JsonLDObject j
3747

3848
// canonicalize the LD proof and LD object
3949

40-
String canonicalizedLdProofWithoutProofValues = dataIntegrityProofWithoutProofValues.normalize("urdna2015");
41-
String canonicalizedJsonLdObjectWithoutProof = jsonLdObjectWithoutProof.normalize("urdna2015");
50+
String canonicalizedLdProofWithoutProofValues = this.canonicalize(dataIntegrityProofWithoutProofValues);
51+
String canonicalizedJsonLdObjectWithoutProof = this.canonicalize(jsonLdObjectWithoutProof);
4252

4353
// construct the canonicalization result
4454

@@ -48,4 +58,13 @@ public byte[] canonicalize(DataIntegrityProof dataIntegrityProof, JsonLDObject j
4858

4959
return canonicalizationResult;
5060
}
61+
62+
public String canonicalize(JsonLDObject jsonLDObject) throws JsonLDException, IOException, NoSuchAlgorithmException {
63+
RdfDataset rdfDataset = jsonLDObject.toDataset();
64+
rdfDataset = RdfNormalize.normalize(rdfDataset, "urdna2015");
65+
StringWriter stringWriter = new StringWriter();
66+
NQuadsWriter nQuadsWriter = new NQuadsWriter(stringWriter);
67+
nQuadsWriter.write(rdfDataset);
68+
return stringWriter.getBuffer().toString();
69+
}
5170
}

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import bbs.signatures.KeyPair;
44
import com.danubetech.dataintegrity.DataIntegrityProof;
5+
import com.danubetech.dataintegrity.canonicalizer.Canonicalizer;
56
import com.danubetech.keyformats.crypto.ByteSigner;
67
import com.danubetech.keyformats.crypto.impl.Bls12381G2_BBSPlus_PrivateKeySigner;
78
import com.danubetech.keyformats.jose.JWSAlgorithm;
@@ -15,20 +16,21 @@
1516
public class BbsBlsSignature2020LdSigner extends LdSigner<BbsBlsSignature2020DataIntegritySuite> {
1617

1718
public BbsBlsSignature2020LdSigner(ByteSigner signer) {
18-
19-
super(DataIntegritySuites.DATA_INTEGRITY_SUITE_BBSBLSSIGNATURE2020, signer, new URDNA2015Canonicalizer());
19+
super(DataIntegritySuites.DATA_INTEGRITY_SUITE_BBSBLSSIGNATURE2020, signer);
2020
}
2121

2222
public BbsBlsSignature2020LdSigner(KeyPair privateKey) {
23-
2423
this(new Bls12381G2_BBSPlus_PrivateKeySigner(privateKey));
2524
}
2625

2726
public BbsBlsSignature2020LdSigner() {
28-
2927
this((ByteSigner) null);
3028
}
3129

30+
public Canonicalizer getCanonicalizer() {
31+
return URDNA2015Canonicalizer.getInstance();
32+
}
33+
3234
public static void sign(DataIntegrityProof.Builder<? extends DataIntegrityProof.Builder<?>> ldProofBuilder, byte[] signingInput, ByteSigner signer) throws GeneralSecurityException {
3335

3436
// sign

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package com.danubetech.dataintegrity.signer;
22

33
import com.danubetech.dataintegrity.DataIntegrityProof;
4+
import com.danubetech.dataintegrity.canonicalizer.Canonicalizer;
5+
import com.danubetech.dataintegrity.canonicalizer.JCSCanonicalizer;
6+
import com.danubetech.dataintegrity.canonicalizer.RDFC10Canonicalizer;
47
import com.danubetech.dataintegrity.canonicalizer.URDNA2015Canonicalizer;
58
import com.danubetech.dataintegrity.suites.DataIntegrityProofDataIntegritySuite;
69
import com.danubetech.dataintegrity.suites.DataIntegritySuites;
@@ -15,20 +18,21 @@
1518
public class DataIntegrityProofLdSigner extends LdSigner<DataIntegrityProofDataIntegritySuite> {
1619

1720
public DataIntegrityProofLdSigner(ByteSigner signer) {
18-
19-
super(DataIntegritySuites.DATA_INTEGRITY_SUITE_DATAINTEGRITYPROOF, signer, new URDNA2015Canonicalizer());
21+
super(DataIntegritySuites.DATA_INTEGRITY_SUITE_DATAINTEGRITYPROOF, signer);
2022
}
2123

2224
public DataIntegrityProofLdSigner(byte[] privateKey) {
23-
2425
this(new Ed25519_EdDSA_PrivateKeySigner(privateKey));
2526
}
2627

2728
public DataIntegrityProofLdSigner() {
28-
2929
this((ByteSigner) null);
3030
}
3131

32+
public Canonicalizer getCanonicalizer() {
33+
return RDFC10Canonicalizer.getInstance();
34+
}
35+
3236
public static void sign(DataIntegrityProof.Builder<? extends DataIntegrityProof.Builder<?>> ldProofBuilder, byte[] signingInput, ByteSigner signer) throws GeneralSecurityException {
3337

3438
// sign

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.danubetech.dataintegrity.signer;
22

33
import com.danubetech.dataintegrity.DataIntegrityProof;
4+
import com.danubetech.dataintegrity.canonicalizer.Canonicalizer;
45
import com.danubetech.keyformats.crypto.ByteSigner;
56
import com.danubetech.keyformats.crypto.impl.secp256k1_ES256K_PrivateKeySigner;
67
import com.nimbusds.jose.JOSEException;
@@ -21,20 +22,21 @@
2122
public class EcdsaKoblitzSignature2016LdSigner extends LdSigner<EcdsaKoblitzSignature2016DataIntegritySuite> {
2223

2324
public EcdsaKoblitzSignature2016LdSigner(ByteSigner signer) {
24-
25-
super(DataIntegritySuites.DATA_INTEGRITY_SUITE_ECDSAKOBLITZSIGNATURE2016, signer, new URDNA2015Canonicalizer());
25+
super(DataIntegritySuites.DATA_INTEGRITY_SUITE_ECDSAKOBLITZSIGNATURE2016, signer);
2626
}
2727

2828
public EcdsaKoblitzSignature2016LdSigner(ECKey privateKey) {
29-
3029
this(new secp256k1_ES256K_PrivateKeySigner(privateKey));
3130
}
3231

3332
public EcdsaKoblitzSignature2016LdSigner() {
34-
3533
this((ByteSigner) null);
3634
}
3735

36+
public Canonicalizer getCanonicalizer() {
37+
return URDNA2015Canonicalizer.getInstance();
38+
}
39+
3840
public static void sign(DataIntegrityProof.Builder<? extends DataIntegrityProof.Builder<?>> ldProofBuilder, byte[] signingInput, ByteSigner signer) throws GeneralSecurityException {
3941

4042
// build the JWS and sign

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

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
package com.danubetech.dataintegrity.signer;
22

33
import com.danubetech.dataintegrity.DataIntegrityProof;
4+
import com.danubetech.dataintegrity.adapter.JWSSignerAdapter;
5+
import com.danubetech.dataintegrity.canonicalizer.Canonicalizer;
6+
import com.danubetech.dataintegrity.canonicalizer.URDNA2015Canonicalizer;
7+
import com.danubetech.dataintegrity.suites.DataIntegritySuites;
8+
import com.danubetech.dataintegrity.suites.EcdsaSecp256K1Signature2019DataIntegritySuite;
9+
import com.danubetech.dataintegrity.util.JWSUtil;
410
import com.danubetech.keyformats.crypto.ByteSigner;
511
import com.danubetech.keyformats.crypto.impl.secp256k1_ES256K_PrivateKeySigner;
612
import com.nimbusds.jose.JOSEException;
713
import com.nimbusds.jose.JWSAlgorithm;
814
import com.nimbusds.jose.JWSHeader;
915
import com.nimbusds.jose.JWSSigner;
1016
import com.nimbusds.jose.util.Base64URL;
11-
import com.danubetech.dataintegrity.adapter.JWSSignerAdapter;
12-
import com.danubetech.dataintegrity.canonicalizer.URDNA2015Canonicalizer;
13-
import com.danubetech.dataintegrity.suites.EcdsaSecp256K1Signature2019DataIntegritySuite;
14-
import com.danubetech.dataintegrity.suites.DataIntegritySuites;
15-
import com.danubetech.dataintegrity.util.JWSUtil;
1617
import org.bitcoinj.core.ECKey;
1718

1819
import java.security.GeneralSecurityException;
@@ -21,20 +22,21 @@
2122
public class EcdsaSecp256k1Signature2019LdSigner extends LdSigner<EcdsaSecp256K1Signature2019DataIntegritySuite> {
2223

2324
public EcdsaSecp256k1Signature2019LdSigner(ByteSigner signer) {
24-
25-
super(DataIntegritySuites.DATA_INTEGRITY_SUITE_ECDSASECP256L1SIGNATURE2019, signer, new URDNA2015Canonicalizer());
25+
super(DataIntegritySuites.DATA_INTEGRITY_SUITE_ECDSASECP256L1SIGNATURE2019, signer);
2626
}
2727

2828
public EcdsaSecp256k1Signature2019LdSigner(ECKey privateKey) {
29-
3029
this(new secp256k1_ES256K_PrivateKeySigner(privateKey));
3130
}
3231

3332
public EcdsaSecp256k1Signature2019LdSigner() {
34-
3533
this((ByteSigner) null);
3634
}
3735

36+
public Canonicalizer getCanonicalizer() {
37+
return URDNA2015Canonicalizer.getInstance();
38+
}
39+
3840
public static void sign(DataIntegrityProof.Builder<? extends DataIntegrityProof.Builder<?>> ldProofBuilder, byte[] signingInput, ByteSigner signer) throws GeneralSecurityException {
3941

4042
// build the JWS and sign

0 commit comments

Comments
 (0)