Skip to content

Commit ff51fa0

Browse files
committed
feat: Add support for EcdsaSecp384r1Signature2019
1 parent 06e6e73 commit ff51fa0

33 files changed

+404
-51
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ It provides an implementation of the following cryptographic suites for [Linked
1111
- [Ed25519Signature2018](https://w3c-ccg.github.io/lds-ed25519-2018/)
1212
- [Ed25519Signature2020](https://www.w3.org/community/reports/credentials/CG-FINAL-di-eddsa-2020-20220724/)
1313
- [EcdsaSecp256k1Signature2019](https://w3c-ccg.github.io/lds-ecdsa-secp256k1-2019/)
14-
- [EcdsaSecp256r1Signature2019](https://www.w3.org/community/reports/credentials/CG-FINAL-di-ecdsa-2019-20220724/)
14+
- [EcdsaSecp256r1Signature2019](https://www.w3.org/community/reports/credentials/CG-FINAL-di-ecdsa-2019-20220724/)
15+
- [EcdsaSecp384r1Signature2019](https://www.w3.org/community/reports/credentials/CG-FINAL-di-ecdsa-2019-20220724/)
1516
- [RsaSignature2018](https://w3c-ccg.github.io/lds-rsa2018/)
1617
- [JcsEd25519Signature2020](https://identity.foundation/JcsEd25519Signature2020/)
1718
- JcsEcdsaSecp256k1Signature2019

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@
88
public class Canonicalizers {
99

1010
public static final JCSSHA256Canonicalizer CANONICALIZER_JCSCANONICALIZER = new JCSSHA256Canonicalizer();
11-
public static final URDNA2015Canonicalizer CANONICALIZER_URDNA2015CANONICALIZER = new URDNA2015Canonicalizer();
11+
public static final URDNA2015SHA256Canonicalizer CANONICALIZER_URDNA2015SHA256CANONICALIZER = new URDNA2015SHA256Canonicalizer();
12+
public static final URDNA2015SHA384Canonicalizer CANONICALIZER_URDNA2015SHA384CANONICALIZER = new URDNA2015SHA384Canonicalizer();
1213

1314
public static final List<? extends Canonicalizer> CANONICALIZERS = List.of(
1415
CANONICALIZER_JCSCANONICALIZER,
15-
CANONICALIZER_URDNA2015CANONICALIZER
16+
CANONICALIZER_URDNA2015SHA256CANONICALIZER,
17+
CANONICALIZER_URDNA2015SHA384CANONICALIZER
1618
);
1719

1820
private static final Map<Class<? extends Canonicalizer>, Canonicalizer> CANONICALIZERS_BY_CANONICALIZER_CLASS;

src/main/java/com/danubetech/dataintegrity/canonicalizer/URDNA2015Canonicalizer.java renamed to src/main/java/com/danubetech/dataintegrity/canonicalizer/URDNA2015SHA256Canonicalizer.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,17 @@
1717
import java.security.NoSuchAlgorithmException;
1818
import java.util.List;
1919

20-
public class URDNA2015Canonicalizer extends Canonicalizer {
20+
public class URDNA2015SHA256Canonicalizer extends Canonicalizer {
2121

2222
private static final Logger log = LoggerFactory.getLogger(RDFC10Canonicalizer.class);
2323

24-
public static final URDNA2015Canonicalizer INSTANCE = new URDNA2015Canonicalizer();
24+
public static final URDNA2015SHA256Canonicalizer INSTANCE = new URDNA2015SHA256Canonicalizer();
2525

26-
public URDNA2015Canonicalizer() {
26+
public URDNA2015SHA256Canonicalizer() {
2727
super(List.of("urdna2015"));
2828
}
2929

30-
public static URDNA2015Canonicalizer getInstance() {
30+
public static URDNA2015SHA256Canonicalizer getInstance() {
3131
return INSTANCE;
3232
}
3333

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package com.danubetech.dataintegrity.canonicalizer;
2+
3+
import com.apicatalog.rdf.RdfDataset;
4+
import com.apicatalog.rdf.io.nquad.NQuadsWriter;
5+
import com.danubetech.dataintegrity.DataIntegrityProof;
6+
import com.danubetech.dataintegrity.util.SHAUtil;
7+
import foundation.identity.jsonld.JsonLDException;
8+
import foundation.identity.jsonld.JsonLDObject;
9+
import io.setl.rdf.normalization.RdfNormalize;
10+
import org.apache.commons.codec.binary.Hex;
11+
import org.slf4j.Logger;
12+
import org.slf4j.LoggerFactory;
13+
14+
import java.io.IOException;
15+
import java.io.StringWriter;
16+
import java.security.GeneralSecurityException;
17+
import java.security.NoSuchAlgorithmException;
18+
import java.util.List;
19+
20+
public class URDNA2015SHA384Canonicalizer extends Canonicalizer {
21+
22+
private static final Logger log = LoggerFactory.getLogger(RDFC10Canonicalizer.class);
23+
24+
public static final URDNA2015SHA384Canonicalizer INSTANCE = new URDNA2015SHA384Canonicalizer();
25+
26+
public URDNA2015SHA384Canonicalizer() {
27+
super(List.of("urdna2015"));
28+
}
29+
30+
public static URDNA2015SHA384Canonicalizer getInstance() {
31+
return INSTANCE;
32+
}
33+
34+
@Override
35+
public String canonicalize(JsonLDObject jsonLDObject) throws JsonLDException, IOException, NoSuchAlgorithmException {
36+
37+
RdfDataset rdfDataset = jsonLDObject.toDataset();
38+
rdfDataset = RdfNormalize.normalize(rdfDataset, "urdna2015");
39+
StringWriter stringWriter = new StringWriter();
40+
NQuadsWriter nQuadsWriter = new NQuadsWriter(stringWriter);
41+
nQuadsWriter.write(rdfDataset);
42+
return stringWriter.getBuffer().toString();
43+
}
44+
45+
@Override
46+
public byte[] canonicalize(DataIntegrityProof dataIntegrityProof, JsonLDObject jsonLdObject) throws IOException, GeneralSecurityException, JsonLDException {
47+
48+
// construct the LD object without proof
49+
50+
JsonLDObject jsonLdObjectWithoutProof = JsonLDObject.builder()
51+
.base(jsonLdObject)
52+
.build();
53+
jsonLdObjectWithoutProof.setDocumentLoader(jsonLdObject.getDocumentLoader());
54+
DataIntegrityProof.removeFromJsonLdObject(jsonLdObjectWithoutProof);
55+
56+
// construct the LD proof without proof values
57+
58+
DataIntegrityProof dataIntegrityProofWithoutProofValues = DataIntegrityProof.builder()
59+
.base(dataIntegrityProof)
60+
.defaultContexts(false)
61+
.build();
62+
dataIntegrityProofWithoutProofValues.setDocumentLoader(jsonLdObject.getDocumentLoader());
63+
DataIntegrityProof.removeLdProofValues(dataIntegrityProofWithoutProofValues);
64+
65+
// canonicalize the LD object and LD proof options
66+
67+
jsonLdObjectWithoutProof.setDocumentLoader(jsonLdObject.getDocumentLoader());
68+
String canonicalizedJsonLdObjectWithoutProof = this.canonicalize(jsonLdObjectWithoutProof);
69+
byte[] canonicalizedJsonLdObjectWithoutProofHash = SHAUtil.sha256(canonicalizedJsonLdObjectWithoutProof);
70+
if (log.isDebugEnabled()) log.debug("Canonicalized LD object without proof: {}", canonicalizedJsonLdObjectWithoutProof);
71+
if (log.isDebugEnabled()) log.debug("Hashed canonicalized LD object without proof: {}", Hex.encodeHexString(canonicalizedJsonLdObjectWithoutProofHash));
72+
73+
dataIntegrityProofWithoutProofValues.setDocumentLoader(jsonLdObject.getDocumentLoader());
74+
String canonicalizedLdProofWithoutProofValues = this.canonicalize(dataIntegrityProofWithoutProofValues);
75+
byte[] canonicalizedLdProofWithoutProofValuesHash = SHAUtil.sha256(canonicalizedLdProofWithoutProofValues);
76+
if (log.isDebugEnabled()) log.debug("Canonicalized LD proof without proof value: {}", canonicalizedLdProofWithoutProofValues);
77+
if (log.isDebugEnabled()) log.debug("Hashed canonicalized LD proof without proof value: {}", Hex.encodeHexString(canonicalizedLdProofWithoutProofValuesHash));
78+
79+
// construct the canonicalization result
80+
81+
byte[] canonicalizationResult = new byte[64];
82+
System.arraycopy(canonicalizedLdProofWithoutProofValuesHash, 0, canonicalizationResult, 0, 32);
83+
System.arraycopy(canonicalizedJsonLdObjectWithoutProofHash, 0, canonicalizationResult, 32, 32);
84+
85+
return canonicalizationResult;
86+
}
87+
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import bbs.signatures.KeyPair;
44
import com.danubetech.dataintegrity.DataIntegrityProof;
55
import com.danubetech.dataintegrity.canonicalizer.Canonicalizer;
6-
import com.danubetech.dataintegrity.canonicalizer.URDNA2015Canonicalizer;
6+
import com.danubetech.dataintegrity.canonicalizer.URDNA2015SHA256Canonicalizer;
77
import com.danubetech.dataintegrity.suites.BbsBlsSignature2020DataIntegritySuite;
88
import com.danubetech.dataintegrity.suites.DataIntegritySuites;
99
import com.danubetech.keyformats.crypto.ByteSigner;
@@ -28,7 +28,7 @@ public BbsBlsSignature2020LdSigner() {
2828
}
2929

3030
public Canonicalizer getCanonicalizer(DataIntegrityProof dataIntegrityProof) {
31-
return URDNA2015Canonicalizer.getInstance();
31+
return URDNA2015SHA256Canonicalizer.getInstance();
3232
}
3333

3434
public static void sign(DataIntegrityProof.Builder<? extends DataIntegrityProof.Builder<?>> ldProofBuilder, byte[] signingInput, ByteSigner signer) throws GeneralSecurityException {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import com.danubetech.dataintegrity.DataIntegrityProof;
44
import com.danubetech.dataintegrity.adapter.JWSSignerAdapter;
55
import com.danubetech.dataintegrity.canonicalizer.Canonicalizer;
6-
import com.danubetech.dataintegrity.canonicalizer.URDNA2015Canonicalizer;
6+
import com.danubetech.dataintegrity.canonicalizer.URDNA2015SHA256Canonicalizer;
77
import com.danubetech.dataintegrity.suites.DataIntegritySuites;
88
import com.danubetech.dataintegrity.suites.EcdsaKoblitzSignature2016DataIntegritySuite;
99
import com.danubetech.dataintegrity.util.JWSUtil;
@@ -34,7 +34,7 @@ public EcdsaKoblitzSignature2016LdSigner() {
3434
}
3535

3636
public Canonicalizer getCanonicalizer(DataIntegrityProof dataIntegrityProof) {
37-
return URDNA2015Canonicalizer.getInstance();
37+
return URDNA2015SHA256Canonicalizer.getInstance();
3838
}
3939

4040
public static void sign(DataIntegrityProof.Builder<? extends DataIntegrityProof.Builder<?>> ldProofBuilder, byte[] signingInput, ByteSigner signer) throws GeneralSecurityException {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import com.danubetech.dataintegrity.DataIntegrityProof;
44
import com.danubetech.dataintegrity.adapter.JWSSignerAdapter;
55
import com.danubetech.dataintegrity.canonicalizer.Canonicalizer;
6-
import com.danubetech.dataintegrity.canonicalizer.URDNA2015Canonicalizer;
6+
import com.danubetech.dataintegrity.canonicalizer.URDNA2015SHA256Canonicalizer;
77
import com.danubetech.dataintegrity.suites.DataIntegritySuites;
88
import com.danubetech.dataintegrity.suites.EcdsaSecp256k1Signature2019DataIntegritySuite;
99
import com.danubetech.dataintegrity.util.JWSUtil;
@@ -34,7 +34,7 @@ public EcdsaSecp256k1Signature2019LdSigner() {
3434
}
3535

3636
public Canonicalizer getCanonicalizer(DataIntegrityProof dataIntegrityProof) {
37-
return URDNA2015Canonicalizer.getInstance();
37+
return URDNA2015SHA256Canonicalizer.getInstance();
3838
}
3939

4040
public static void sign(DataIntegrityProof.Builder<? extends DataIntegrityProof.Builder<?>> ldProofBuilder, byte[] signingInput, ByteSigner signer) throws GeneralSecurityException {

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

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

33
import com.danubetech.dataintegrity.DataIntegrityProof;
4-
import com.danubetech.dataintegrity.adapter.JWSSignerAdapter;
54
import com.danubetech.dataintegrity.canonicalizer.Canonicalizer;
6-
import com.danubetech.dataintegrity.canonicalizer.URDNA2015Canonicalizer;
5+
import com.danubetech.dataintegrity.canonicalizer.URDNA2015SHA256Canonicalizer;
76
import com.danubetech.dataintegrity.suites.DataIntegritySuites;
87
import com.danubetech.dataintegrity.suites.EcdsaSecp256r1Signature2019DataIntegritySuite;
9-
import com.danubetech.dataintegrity.util.JWSUtil;
108
import com.danubetech.keyformats.crypto.ByteSigner;
119
import com.danubetech.keyformats.crypto.impl.P_256_ES256_PrivateKeySigner;
1210
import com.danubetech.keyformats.jose.JWSAlgorithm;
13-
import com.nimbusds.jose.JOSEException;
14-
import com.nimbusds.jose.JWSHeader;
15-
import com.nimbusds.jose.JWSSigner;
16-
import com.nimbusds.jose.util.Base64URL;
1711
import io.ipfs.multibase.Multibase;
1812

1913
import java.security.GeneralSecurityException;
2014
import java.security.interfaces.ECPrivateKey;
21-
import java.util.Collections;
2215

2316
public class EcdsaSecp256r1Signature2019LdSigner extends LdSigner<EcdsaSecp256r1Signature2019DataIntegritySuite> {
2417

@@ -35,7 +28,7 @@ public EcdsaSecp256r1Signature2019LdSigner() {
3528
}
3629

3730
public Canonicalizer getCanonicalizer(DataIntegrityProof dataIntegrityProof) {
38-
return URDNA2015Canonicalizer.getInstance();
31+
return URDNA2015SHA256Canonicalizer.getInstance();
3932
}
4033

4134
public static void sign(DataIntegrityProof.Builder<? extends DataIntegrityProof.Builder<?>> ldProofBuilder, byte[] signingInput, ByteSigner signer) throws GeneralSecurityException {
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.danubetech.dataintegrity.signer;
2+
3+
import com.danubetech.dataintegrity.DataIntegrityProof;
4+
import com.danubetech.dataintegrity.canonicalizer.Canonicalizer;
5+
import com.danubetech.dataintegrity.canonicalizer.URDNA2015SHA384Canonicalizer;
6+
import com.danubetech.dataintegrity.suites.DataIntegritySuites;
7+
import com.danubetech.dataintegrity.suites.EcdsaSecp384r1Signature2019DataIntegritySuite;
8+
import com.danubetech.keyformats.crypto.ByteSigner;
9+
import com.danubetech.keyformats.crypto.impl.P_384_ES384_PrivateKeySigner;
10+
import com.danubetech.keyformats.jose.JWSAlgorithm;
11+
import io.ipfs.multibase.Multibase;
12+
13+
import java.security.GeneralSecurityException;
14+
import java.security.interfaces.ECPrivateKey;
15+
16+
public class EcdsaSecp384r1Signature2019LdSigner extends LdSigner<EcdsaSecp384r1Signature2019DataIntegritySuite> {
17+
18+
public EcdsaSecp384r1Signature2019LdSigner(ByteSigner signer) {
19+
super(DataIntegritySuites.DATA_INTEGRITY_SUITE_ECDSASECP384R1SIGNATURE2019, signer);
20+
}
21+
22+
public EcdsaSecp384r1Signature2019LdSigner(ECPrivateKey privateKey) {
23+
this(new P_384_ES384_PrivateKeySigner(privateKey));
24+
}
25+
26+
public EcdsaSecp384r1Signature2019LdSigner() {
27+
this((ByteSigner) null);
28+
}
29+
30+
public Canonicalizer getCanonicalizer(DataIntegrityProof dataIntegrityProof) {
31+
return URDNA2015SHA384Canonicalizer.getInstance();
32+
}
33+
34+
public static void sign(DataIntegrityProof.Builder<? extends DataIntegrityProof.Builder<?>> ldProofBuilder, byte[] signingInput, ByteSigner signer) throws GeneralSecurityException {
35+
36+
// sign
37+
38+
String proofValue;
39+
40+
byte[] bytes = signer.sign(signingInput, JWSAlgorithm.ES384);
41+
proofValue = Multibase.encode(Multibase.Base.Base58BTC, bytes);
42+
43+
// done
44+
45+
ldProofBuilder.proofValue(proofValue);
46+
}
47+
48+
@Override
49+
public void sign(DataIntegrityProof.Builder<? extends DataIntegrityProof.Builder<?>> ldProofBuilder, byte[] signingInput) throws GeneralSecurityException {
50+
51+
sign(ldProofBuilder, signingInput, this.getSigner());
52+
}
53+
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import com.danubetech.dataintegrity.DataIntegrityProof;
44
import com.danubetech.dataintegrity.adapter.JWSSignerAdapter;
55
import com.danubetech.dataintegrity.canonicalizer.Canonicalizer;
6-
import com.danubetech.dataintegrity.canonicalizer.URDNA2015Canonicalizer;
6+
import com.danubetech.dataintegrity.canonicalizer.URDNA2015SHA256Canonicalizer;
77
import com.danubetech.dataintegrity.suites.DataIntegritySuites;
88
import com.danubetech.dataintegrity.suites.Ed25519Signature2018DataIntegritySuite;
99
import com.danubetech.dataintegrity.util.JWSUtil;
@@ -33,7 +33,7 @@ public Ed25519Signature2018LdSigner() {
3333
}
3434

3535
public Canonicalizer getCanonicalizer(DataIntegrityProof dataIntegrityProof) {
36-
return URDNA2015Canonicalizer.getInstance();
36+
return URDNA2015SHA256Canonicalizer.getInstance();
3737
}
3838

3939
public static void sign(DataIntegrityProof.Builder<? extends DataIntegrityProof.Builder<?>> ldProofBuilder, byte[] signingInput, ByteSigner signer) throws GeneralSecurityException {

0 commit comments

Comments
 (0)