Skip to content

Commit 31c78aa

Browse files
committed
feat: Better support for cryptosuites
1 parent 37f71fb commit 31c78aa

File tree

9 files changed

+52
-19
lines changed

9 files changed

+52
-19
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public DataIntegrityProofLdSigner() {
2727
public Canonicalizer getCanonicalizer(DataIntegrityProof dataIntegrityProof) {
2828
String cryptosuite = dataIntegrityProof.getCryptosuite();
2929
if (cryptosuite == null) return RDFC10Canonicalizer.getInstance();
30-
Canonicalizer canonicalizer = DataIntegrityProofDataIntegritySuite.findCanonicalizerByCryptosuite(cryptosuite);
30+
Canonicalizer canonicalizer = DataIntegritySuites.DATA_INTEGRITY_SUITE_DATAINTEGRITYPROOF.findCanonicalizerByCryptosuite(cryptosuite);
3131
if (canonicalizer == null) throw new IllegalArgumentException("Unknown cryptosuite: " + cryptosuite);
3232
return canonicalizer;
3333
}
@@ -40,11 +40,11 @@ public static void sign(DataIntegrityProof.Builder<? extends DataIntegrityProof.
4040

4141
algorithm = signer.getAlgorithm();
4242
if (cryptosuite != null) {
43-
if (! DataIntegrityProofDataIntegritySuite.findCryptosuitesByJwsAlgorithm(algorithm).contains(cryptosuite)) {
43+
if (! DataIntegritySuites.DATA_INTEGRITY_SUITE_DATAINTEGRITYPROOF.findCryptosuitesByJwsAlgorithm(algorithm).contains(cryptosuite)) {
4444
throw new GeneralSecurityException("Algorithm " + algorithm + " is not supported by cryptosuite " + cryptosuite);
4545
}
4646
} else {
47-
cryptosuite = DataIntegrityProofDataIntegritySuite.findDefaultCryptosuiteByJwsAlgorithm(algorithm);
47+
cryptosuite = DataIntegritySuites.DATA_INTEGRITY_SUITE_DATAINTEGRITYPROOF.findDefaultCryptosuiteByJwsAlgorithm(algorithm);
4848
ldProofBuilder.cryptosuite(cryptosuite);
4949
}
5050
if (log.isDebugEnabled()) log.debug("Determined algorithm {} and cryptosuite: {}", algorithm, cryptosuite);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ public DataIntegrityProof sign(JsonLDObject jsonLdObject) throws IOException, Ge
135135
return this.sign(jsonLdObject, true, false);
136136
}
137137

138-
public DataIntegritySuite getDataIntegritySuite() {
138+
public DATAINTEGRITYSUITE getDataIntegritySuite() {
139139
return this.dataIntegritySuite;
140140
}
141141

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import com.danubetech.dataintegrity.suites.DataIntegritySuite;
44
import com.danubetech.dataintegrity.suites.DataIntegritySuites;
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
57

68
import java.lang.reflect.InvocationTargetException;
79
import java.lang.reflect.ParameterizedType;
@@ -11,6 +13,8 @@
1113

1214
public class LdSignerRegistry {
1315

16+
private static final Logger log = LoggerFactory.getLogger(LdSignerRegistry.class);
17+
1418
public static final List<Class<? extends LdSigner<? extends DataIntegritySuite>>> LD_SIGNERS = List.of(
1519
RsaSignature2018LdSigner.class,
1620
Ed25519Signature2018LdSigner.class,
@@ -44,6 +48,7 @@ public static LdSigner<? extends DataIntegritySuite> getLdSignerByDataIntegrityS
4448
} catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException ex) {
4549
throw new RuntimeException(ex.getMessage(), ex);
4650
}
51+
if (log.isDebugEnabled()) log.debug("Found LD signer " + ldSigner.getClass() + " for data integrity suite " + dataIntegritySuiteTerm);
4752
return ldSigner;
4853
}
4954

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import java.net.URI;
1111
import java.util.List;
1212
import java.util.Map;
13+
import java.util.stream.Collectors;
1314

1415
public class DataIntegrityProofDataIntegritySuite extends DataIntegritySuite {
1516

@@ -36,22 +37,29 @@ public class DataIntegrityProofDataIntegritySuite extends DataIntegritySuite {
3637
"DataIntegrityProof",
3738
URI.create("https://w3id.org/security#DataIntegrityProof"),
3839
Map.of(KeyTypeName.Ed25519, List.of(JWSAlgorithm.EdDSA),
39-
KeyTypeName.secp256k1, List.of(JWSAlgorithm.ES256K),
40+
KeyTypeName.secp256k1, List.of(JWSAlgorithm.ES256K, JWSAlgorithm.ES256KS),
4041
KeyTypeName.P_256, List.of(JWSAlgorithm.ES256),
4142
KeyTypeName.P_384, List.of(JWSAlgorithm.ES384),
4243
KeyTypeName.P_521, List.of(JWSAlgorithm.ES512)),
4344
List.of(LDSecurityContexts.JSONLD_CONTEXT_W3ID_DATAINTEGRITY_V2));
4445
}
4546

46-
public static Canonicalizer findCanonicalizerByCryptosuite(String cryptosuite) {
47+
@Override
48+
public List<String> findJwsAlgorithmsForKeyTypeName(KeyTypeName keyTypeName, String cryptosuite) {
49+
List<String> jwsAlgorithms = super.findJwsAlgorithmsForKeyTypeName(keyTypeName, cryptosuite);
50+
jwsAlgorithms = jwsAlgorithms.stream().filter(jwsAlgorithm -> this.findCryptosuitesByJwsAlgorithm(jwsAlgorithm).contains(cryptosuite)).collect(Collectors.toList());
51+
return jwsAlgorithms;
52+
}
53+
54+
public Canonicalizer findCanonicalizerByCryptosuite(String cryptosuite) {
4755
return CANONICALIZERS_BY_CRYPTOSUITE.get(cryptosuite);
4856
}
4957

50-
public static List<String> findCryptosuitesByJwsAlgorithm(String jwsAlgorithm) {
58+
public List<String> findCryptosuitesByJwsAlgorithm(String jwsAlgorithm) {
5159
return CRYPTOSUITES_BY_JWS_ALGORITHM.get(jwsAlgorithm);
5260
}
5361

54-
public static String findDefaultCryptosuiteByJwsAlgorithm(String jwsAlgorithm) {
62+
public String findDefaultCryptosuiteByJwsAlgorithm(String jwsAlgorithm) {
5563
List<String> foundCryptosuiteByJwsAlgorithm = findCryptosuitesByJwsAlgorithm(jwsAlgorithm);
5664
return foundCryptosuiteByJwsAlgorithm == null ? null : foundCryptosuiteByJwsAlgorithm.get(0);
5765
}

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

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,34 +29,42 @@ public List<String> findJwsAlgorithmsForKeyTypeName(KeyTypeName keyTypeName) {
2929
return this.getKeyTypeNamesAndJwsAlgorithms().get(keyTypeName);
3030
}
3131

32+
public List<String> findJwsAlgorithmsForKeyTypeName(KeyTypeName keyTypeName, String cryptosuite) {
33+
return this.findJwsAlgorithmsForKeyTypeName(keyTypeName);
34+
}
35+
3236
public String findDefaultJwsAlgorithmForKeyTypeName(KeyTypeName keyTypeName) {
3337
List<String> foundAlgorithmsForKeyTypeName = this.findJwsAlgorithmsForKeyTypeName(keyTypeName);
3438
return (foundAlgorithmsForKeyTypeName == null || foundAlgorithmsForKeyTypeName.isEmpty()) ? null : foundAlgorithmsForKeyTypeName.get(0);
3539
}
3640

41+
public String findDefaultJwsAlgorithmForKeyTypeName(KeyTypeName keyTypeName, String cryptosuite) {
42+
return this.findDefaultJwsAlgorithmForKeyTypeName(keyTypeName);
43+
}
44+
3745
public URI getDefaultSupportedJsonLDContext() {
3846
List<URI> supportedJsonLDContexts = this.getSupportedJsonLDContexts();
3947
return (supportedJsonLDContexts == null || supportedJsonLDContexts.isEmpty()) ? null : supportedJsonLDContexts.get(0);
4048
}
4149

4250
public String getTerm() {
43-
return term;
51+
return this.term;
4452
}
4553

4654
public URI getId() {
47-
return id;
55+
return this.id;
4856
}
4957

5058
public URI getType() {
51-
return type;
59+
return this.type;
5260
}
5361

5462
public Map<KeyTypeName, List<String>> getKeyTypeNamesAndJwsAlgorithms() {
55-
return keyTypeNamesAndJwsAlgorithms;
63+
return this.keyTypeNamesAndJwsAlgorithms;
5664
}
5765

5866
public List<URI> getSupportedJsonLDContexts() {
59-
return supportedJsonLDContexts;
67+
return this.supportedJsonLDContexts;
6068
}
6169

6270
@Override

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package com.danubetech.dataintegrity.suites;
22

33
import com.danubetech.keyformats.jose.KeyTypeName;
4+
import org.slf4j.Logger;
5+
import org.slf4j.LoggerFactory;
46

57
import java.util.*;
68

79
public class DataIntegritySuites {
810

11+
private static final Logger log = LoggerFactory.getLogger(DataIntegritySuites.class);
12+
913
public static final RsaSignature2018DataIntegritySuite DATA_INTEGRITY_SUITE_RSASIGNATURE2018 = new RsaSignature2018DataIntegritySuite();
1014
public static final Ed25519Signature2018DataIntegritySuite DATA_INTEGRITY_SUITE_ED25519SIGNATURE2018 = new Ed25519Signature2018DataIntegritySuite();
1115
public static final Ed25519Signature2020DataIntegritySuite DATA_INTEGRITY_SUITE_ED25519SIGNATURE2020 = new Ed25519Signature2020DataIntegritySuite();
@@ -75,6 +79,8 @@ public static List<DataIntegritySuite> findDataIntegritySuitesByKeyTypeName(KeyT
7579

7680
public static DataIntegritySuite findDefaultDataIntegritySuiteByKeyTypeName(KeyTypeName keyTypeName) {
7781
List<DataIntegritySuite> foundDataIntegritySuitesByKeyTypeName = findDataIntegritySuitesByKeyTypeName(keyTypeName);
78-
return foundDataIntegritySuitesByKeyTypeName == null ? null : foundDataIntegritySuitesByKeyTypeName.get(0);
82+
DataIntegritySuite dataIntegritySuite = foundDataIntegritySuitesByKeyTypeName == null ? null : foundDataIntegritySuitesByKeyTypeName.get(0);
83+
if (log.isDebugEnabled()) log.debug("Found default data integrity suite for key type " + keyTypeName.getValue() + ": " + dataIntegritySuite);
84+
return dataIntegritySuite;
7985
}
8086
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public DataIntegrityProofLdVerifier() {
2727
public Canonicalizer getCanonicalizer(DataIntegrityProof dataIntegrityProof) {
2828
String cryptosuite = dataIntegrityProof.getCryptosuite();
2929
if (cryptosuite == null) return RDFC10Canonicalizer.getInstance();
30-
Canonicalizer canonicalizer = DataIntegrityProofDataIntegritySuite.findCanonicalizerByCryptosuite(cryptosuite);
30+
Canonicalizer canonicalizer = DataIntegritySuites.DATA_INTEGRITY_SUITE_DATAINTEGRITYPROOF.findCanonicalizerByCryptosuite(cryptosuite);
3131
if (canonicalizer == null) throw new IllegalArgumentException("Unknown cryptosuite: " + cryptosuite);
3232
return canonicalizer;
3333
}
@@ -42,7 +42,7 @@ public static boolean verify(byte[] signingInput, DataIntegrityProof dataIntegri
4242
String algorithm;
4343

4444
algorithm = verifier.getAlgorithm();
45-
if (! DataIntegrityProofDataIntegritySuite.findCryptosuitesByJwsAlgorithm(algorithm).contains(cryptosuite)) {
45+
if (! DataIntegritySuites.DATA_INTEGRITY_SUITE_DATAINTEGRITYPROOF.findCryptosuitesByJwsAlgorithm(algorithm).contains(cryptosuite)) {
4646
throw new GeneralSecurityException("Algorithm " + algorithm + " is not supported by cryptosuite " + cryptosuite);
4747
}
4848
if (log.isDebugEnabled()) log.debug("Determined algorithm {} and cryptosuite: {}", algorithm, cryptosuite);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public boolean verify(JsonLDObject jsonLdObject) throws IOException, GeneralSecu
8181
return this.verify(jsonLdObject, dataIntegrityProof);
8282
}
8383

84-
public DataIntegritySuite getDataIntegritySuite() {
84+
public DATAINTEGRITYSUITE getDataIntegritySuite() {
8585
return this.dataIntegritySuite;
8686
}
8787

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.danubetech.dataintegrity.verifier;
22

3+
import com.danubetech.dataintegrity.signer.LdSignerRegistry;
34
import com.danubetech.dataintegrity.suites.DataIntegritySuite;
45
import com.danubetech.dataintegrity.suites.DataIntegritySuites;
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
58

69
import java.lang.reflect.InvocationTargetException;
710
import java.lang.reflect.ParameterizedType;
@@ -11,6 +14,8 @@
1114

1215
public class LdVerifierRegistry {
1316

17+
private static final Logger log = LoggerFactory.getLogger(LdVerifierRegistry.class);
18+
1419
public static final List<Class<? extends LdVerifier<? extends DataIntegritySuite>>> LD_VERIFIERS = List.of(
1520
RsaSignature2018LdVerifier.class,
1621
Ed25519Signature2018LdVerifier.class,
@@ -35,15 +40,16 @@ public class LdVerifierRegistry {
3540
}
3641
}
3742

38-
public static LdVerifier<? extends DataIntegritySuite> getLdVerifierByDataIntegritySuiteTerm(String dataInegritySuiteTerm) {
39-
Class<? extends LdVerifier<? extends DataIntegritySuite>> ldVerifierClass = LD_VERIFIERS_BY_DATA_INTEGRITY_SUITE_TERM.get(dataInegritySuiteTerm);
43+
public static LdVerifier<? extends DataIntegritySuite> getLdVerifierByDataIntegritySuiteTerm(String dataIntegritySuiteTerm) {
44+
Class<? extends LdVerifier<? extends DataIntegritySuite>> ldVerifierClass = LD_VERIFIERS_BY_DATA_INTEGRITY_SUITE_TERM.get(dataIntegritySuiteTerm);
4045
if (ldVerifierClass == null) throw new IllegalArgumentException();
4146
LdVerifier<? extends DataIntegritySuite> ldVerifier;
4247
try {
4348
ldVerifier = ldVerifierClass.getConstructor().newInstance();
4449
} catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException ex) {
4550
throw new RuntimeException(ex.getMessage(), ex);
4651
}
52+
if (log.isDebugEnabled()) log.debug("Found LD verifier " + ldVerifier.getClass() + " for data integrity suite " + dataIntegritySuiteTerm);
4753
return ldVerifier;
4854
}
4955

0 commit comments

Comments
 (0)