Skip to content

Commit 3047194

Browse files
committed
chore: Update unit tests to include EcdsaSecp256r1Signature2019
1 parent eaa3271 commit 3047194

File tree

34 files changed

+508
-142
lines changed

34 files changed

+508
-142
lines changed
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package com.danubetech.dataintegrity.signer;
2+
3+
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.EcdsaSecp256r1Signature2019DataIntegritySuite;
9+
import com.danubetech.dataintegrity.util.JWSUtil;
10+
import com.danubetech.keyformats.crypto.ByteSigner;
11+
import com.danubetech.keyformats.crypto.impl.P_256_ES256_PrivateKeySigner;
12+
import com.nimbusds.jose.JOSEException;
13+
import com.nimbusds.jose.JWSAlgorithm;
14+
import com.nimbusds.jose.JWSHeader;
15+
import com.nimbusds.jose.JWSSigner;
16+
import com.nimbusds.jose.util.Base64URL;
17+
18+
import java.security.GeneralSecurityException;
19+
import java.security.interfaces.ECPrivateKey;
20+
import java.util.Collections;
21+
22+
public class EcdsaSecp256r1Signature2019LdSigner extends LdSigner<EcdsaSecp256r1Signature2019DataIntegritySuite> {
23+
24+
public EcdsaSecp256r1Signature2019LdSigner(ByteSigner signer) {
25+
super(DataIntegritySuites.DATA_INTEGRITY_SUITE_ECDSASECP256R1SIGNATURE2019, signer);
26+
}
27+
28+
public EcdsaSecp256r1Signature2019LdSigner(ECPrivateKey privateKey) {
29+
this(new P_256_ES256_PrivateKeySigner(privateKey));
30+
}
31+
32+
public EcdsaSecp256r1Signature2019LdSigner() {
33+
this((ByteSigner) null);
34+
}
35+
36+
public Canonicalizer getCanonicalizer(DataIntegrityProof dataIntegrityProof) {
37+
return URDNA2015Canonicalizer.getInstance();
38+
}
39+
40+
public static void sign(DataIntegrityProof.Builder<? extends DataIntegrityProof.Builder<?>> ldProofBuilder, byte[] signingInput, ByteSigner signer) throws GeneralSecurityException {
41+
42+
// build the JWS and sign
43+
44+
String jws;
45+
46+
try {
47+
48+
JWSHeader jwsHeader = new JWSHeader.Builder(JWSAlgorithm.ES256).base64URLEncodePayload(false).criticalParams(Collections.singleton("b64")).build();
49+
byte[] jwsSigningInput = JWSUtil.getJwsSigningInput(jwsHeader, signingInput);
50+
51+
JWSSigner jwsSigner = new JWSSignerAdapter(signer, JWSAlgorithm.ES256);
52+
Base64URL signature = jwsSigner.sign(jwsHeader, jwsSigningInput);
53+
jws = JWSUtil.serializeDetachedJws(jwsHeader, signature);
54+
} catch (JOSEException ex) {
55+
56+
throw new GeneralSecurityException("JOSE signing problem: " + ex.getMessage(), ex);
57+
}
58+
59+
// done
60+
61+
ldProofBuilder.jws(jws);
62+
}
63+
64+
@Override
65+
public void sign(DataIntegrityProof.Builder<? extends DataIntegrityProof.Builder<?>> ldProofBuilder, byte[] signingInput) throws GeneralSecurityException {
66+
67+
sign(ldProofBuilder, signingInput, this.getSigner());
68+
}
69+
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public class LdSignerRegistry {
2121
Ed25519Signature2020LdSigner.class,
2222
JcsEd25519Signature2020LdSigner.class,
2323
EcdsaSecp256k1Signature2019LdSigner.class,
24+
EcdsaSecp256r1Signature2019LdSigner.class,
2425
EcdsaKoblitzSignature2016LdSigner.class,
2526
JcsEcdsaSecp256k1Signature2019LdSigner.class,
2627
BbsBlsSignature2020LdSigner.class,
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package com.danubetech.dataintegrity.verifier;
2+
3+
import com.danubetech.dataintegrity.DataIntegrityProof;
4+
import com.danubetech.dataintegrity.adapter.JWSVerifierAdapter;
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.EcdsaSecp256r1Signature2019DataIntegritySuite;
9+
import com.danubetech.dataintegrity.util.JWSUtil;
10+
import com.danubetech.keyformats.crypto.ByteVerifier;
11+
import com.danubetech.keyformats.crypto.impl.P_256_ES256_PublicKeyVerifier;
12+
import com.nimbusds.jose.JOSEException;
13+
import com.nimbusds.jose.JWSAlgorithm;
14+
import com.nimbusds.jose.JWSObject;
15+
import com.nimbusds.jose.JWSVerifier;
16+
17+
import java.security.GeneralSecurityException;
18+
import java.security.interfaces.ECPublicKey;
19+
import java.text.ParseException;
20+
21+
public class EcdsaSecp256r1Signature2019LdVerifier extends LdVerifier<EcdsaSecp256r1Signature2019DataIntegritySuite> {
22+
23+
public EcdsaSecp256r1Signature2019LdVerifier(ByteVerifier verifier) {
24+
super(DataIntegritySuites.DATA_INTEGRITY_SUITE_ECDSASECP256R1SIGNATURE2019, verifier);
25+
}
26+
27+
public EcdsaSecp256r1Signature2019LdVerifier(ECPublicKey publicKey) {
28+
this(new P_256_ES256_PublicKeyVerifier(publicKey));
29+
}
30+
31+
public EcdsaSecp256r1Signature2019LdVerifier() {
32+
this((ByteVerifier) null);
33+
}
34+
35+
public Canonicalizer getCanonicalizer(DataIntegrityProof dataIntegrityProof) {
36+
return URDNA2015Canonicalizer.getInstance();
37+
}
38+
39+
public static boolean verify(byte[] signingInput, DataIntegrityProof dataIntegrityProof, ByteVerifier verifier) throws GeneralSecurityException {
40+
41+
// build the JWS and verify
42+
43+
String jws = dataIntegrityProof.getJws();
44+
if (jws == null) throw new GeneralSecurityException("No 'jws' in proof.");
45+
46+
boolean verify;
47+
48+
try {
49+
50+
JWSObject detachedJwsObject = JWSObject.parse(jws);
51+
byte[] jwsSigningInput = JWSUtil.getJwsSigningInput(detachedJwsObject.getHeader(), signingInput);
52+
53+
JWSVerifier jwsVerifier = new JWSVerifierAdapter(verifier, JWSAlgorithm.ES256);
54+
verify = jwsVerifier.verify(detachedJwsObject.getHeader(), jwsSigningInput, detachedJwsObject.getSignature());
55+
} catch (JOSEException | ParseException ex) {
56+
57+
throw new GeneralSecurityException("JOSE verification problem: " + ex.getMessage(), ex);
58+
}
59+
60+
// done
61+
62+
return verify;
63+
}
64+
65+
@Override
66+
public boolean verify(byte[] signingInput, DataIntegrityProof dataIntegrityProof) throws GeneralSecurityException {
67+
68+
return verify(signingInput, dataIntegrityProof, this.getVerifier());
69+
}
70+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.danubetech.dataintegrity.verifier;
22

3-
import com.danubetech.dataintegrity.signer.LdSignerRegistry;
43
import com.danubetech.dataintegrity.suites.DataIntegritySuite;
54
import com.danubetech.dataintegrity.suites.DataIntegritySuites;
65
import org.slf4j.Logger;
@@ -22,6 +21,7 @@ public class LdVerifierRegistry {
2221
Ed25519Signature2020LdVerifier.class,
2322
JcsEd25519Signature2020LdVerifier.class,
2423
EcdsaSecp256k1Signature2019LdVerifier.class,
24+
EcdsaSecp256r1Signature2019LdVerifier.class,
2525
EcdsaKoblitzSignature2016LdVerifier.class,
2626
JcsEcdsaSecp256k1Signature2019LdVerifier.class,
2727
BbsBlsSignature2020LdVerifier.class,

src/test/java/com/danubetech/dataintegrity/DataIntegritySuitesTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public void testDataIntegritySuites() throws Exception {
1515
assertEquals(2, DataIntegritySuites.findDataIntegritySuitesByKeyTypeName(KeyTypeName.RSA).size());
1616
assertEquals(5, DataIntegritySuites.findDataIntegritySuitesByKeyTypeName(KeyTypeName.secp256k1).size());
1717
assertEquals(5, DataIntegritySuites.findDataIntegritySuitesByKeyTypeName(KeyTypeName.Ed25519).size());
18-
assertEquals(2, DataIntegritySuites.findDataIntegritySuitesByKeyTypeName(KeyTypeName.P_256).size());
18+
assertEquals(3, DataIntegritySuites.findDataIntegritySuitesByKeyTypeName(KeyTypeName.P_256).size());
1919
assertEquals(2, DataIntegritySuites.findDataIntegritySuitesByKeyTypeName(KeyTypeName.P_384).size());
2020
assertEquals(1, DataIntegritySuites.findDataIntegritySuitesByKeyTypeName(KeyTypeName.Bls12381G1).size());
2121
assertEquals(1, DataIntegritySuites.findDataIntegritySuitesByKeyTypeName(KeyTypeName.Bls12381G2).size());

src/test/java/com/danubetech/dataintegrity/JsonLdSignEcdsaSecp256k1Signature2019Test.java

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

3-
import com.danubetech.dataintegrity.util.TestKeys;
4-
import foundation.identity.jsonld.JsonLDObject;
5-
import foundation.identity.jsonld.JsonLDUtils;
63
import com.danubetech.dataintegrity.jsonld.DataIntegrityContexts;
74
import com.danubetech.dataintegrity.signer.EcdsaSecp256k1Signature2019LdSigner;
85
import com.danubetech.dataintegrity.suites.DataIntegritySuites;
6+
import com.danubetech.dataintegrity.util.TestKeys;
97
import com.danubetech.dataintegrity.verifier.EcdsaSecp256k1Signature2019LdVerifier;
8+
import foundation.identity.jsonld.JsonLDObject;
9+
import foundation.identity.jsonld.JsonLDUtils;
1010
import org.junit.jupiter.api.Test;
1111

1212
import java.io.InputStreamReader;
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.danubetech.dataintegrity;
2+
3+
import com.danubetech.dataintegrity.jsonld.DataIntegrityContexts;
4+
import com.danubetech.dataintegrity.signer.EcdsaSecp256r1Signature2019LdSigner;
5+
import com.danubetech.dataintegrity.suites.DataIntegritySuites;
6+
import com.danubetech.dataintegrity.util.TestKeys;
7+
import com.danubetech.dataintegrity.verifier.EcdsaSecp256r1Signature2019LdVerifier;
8+
import foundation.identity.jsonld.JsonLDObject;
9+
import foundation.identity.jsonld.JsonLDUtils;
10+
import org.junit.jupiter.api.Test;
11+
12+
import java.io.InputStreamReader;
13+
import java.util.Date;
14+
import java.util.Objects;
15+
16+
import static org.junit.jupiter.api.Assertions.assertEquals;
17+
import static org.junit.jupiter.api.Assertions.assertTrue;
18+
19+
public class JsonLdSignEcdsaSecp256r1Signature2019Test {
20+
21+
@Test
22+
@SuppressWarnings("unchecked")
23+
public void testSignEcdsaSecp256r1Signature2019() throws Throwable {
24+
25+
JsonLDObject jsonLdObject = JsonLDObject.fromJson(new InputStreamReader(Objects.requireNonNull(JsonLdSignEcdsaSecp256r1Signature2019Test.class.getResourceAsStream("input.jsonld"))));
26+
jsonLdObject.setDocumentLoader(DataIntegrityContexts.DOCUMENT_LOADER);
27+
28+
Date created = JsonLDUtils.DATE_FORMAT.parse("2017-10-24T05:33:31Z");
29+
Date expires = JsonLDUtils.DATE_FORMAT.parse("2027-10-24T05:33:31Z");
30+
String domain = "example.com";
31+
String nonce = null;
32+
33+
EcdsaSecp256r1Signature2019LdSigner signer = new EcdsaSecp256r1Signature2019LdSigner(TestKeys.testP256PrivateKey);
34+
signer.setCreated(created);
35+
signer.setExpires(expires);
36+
signer.setDomain(domain);
37+
signer.setNonce(nonce);
38+
DataIntegrityProof dataIntegrityProof = signer.sign(jsonLdObject);
39+
40+
assertEquals(DataIntegritySuites.DATA_INTEGRITY_SUITE_ECDSASECP256R1SIGNATURE2019.getTerm(), dataIntegrityProof.getType());
41+
assertEquals(created, dataIntegrityProof.getCreated());
42+
assertEquals(expires, dataIntegrityProof.getExpires());
43+
assertEquals(domain, dataIntegrityProof.getDomain());
44+
assertEquals(nonce, dataIntegrityProof.getNonce());
45+
46+
System.out.println(jsonLdObject.toJson());
47+
48+
EcdsaSecp256r1Signature2019LdVerifier verifier = new EcdsaSecp256r1Signature2019LdVerifier(TestKeys.testP256PublicKey);
49+
boolean verify = verifier.verify(jsonLdObject, dataIntegrityProof);
50+
assertTrue(verify);
51+
}
52+
}

src/test/java/com/danubetech/dataintegrity/JsonLdSignEd25519Signature2018Test.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import com.danubetech.dataintegrity.signer.Ed25519Signature2018LdSigner;
55
import com.danubetech.dataintegrity.suites.DataIntegritySuites;
66
import com.danubetech.dataintegrity.util.TestKeys;
7-
import com.danubetech.dataintegrity.util.TestUtil;
87
import com.danubetech.dataintegrity.verifier.Ed25519Signature2018LdVerifier;
98
import com.danubetech.keyformats.crypto.provider.Ed25519Provider;
109
import com.danubetech.keyformats.crypto.provider.RandomProvider;

src/test/java/com/danubetech/dataintegrity/JsonLdSignEd25519Signature2020Test.java

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

3+
import com.danubetech.dataintegrity.jsonld.DataIntegrityContexts;
4+
import com.danubetech.dataintegrity.signer.Ed25519Signature2020LdSigner;
5+
import com.danubetech.dataintegrity.suites.DataIntegritySuites;
36
import com.danubetech.dataintegrity.util.TestKeys;
4-
import com.danubetech.dataintegrity.util.TestUtil;
7+
import com.danubetech.dataintegrity.verifier.Ed25519Signature2020LdVerifier;
58
import com.danubetech.keyformats.crypto.provider.Ed25519Provider;
69
import com.danubetech.keyformats.crypto.provider.RandomProvider;
710
import com.danubetech.keyformats.crypto.provider.SHA256Provider;
@@ -10,10 +13,6 @@
1013
import com.danubetech.keyformats.crypto.provider.impl.TinkEd25519Provider;
1114
import foundation.identity.jsonld.JsonLDObject;
1215
import foundation.identity.jsonld.JsonLDUtils;
13-
import com.danubetech.dataintegrity.jsonld.DataIntegrityContexts;
14-
import com.danubetech.dataintegrity.signer.Ed25519Signature2020LdSigner;
15-
import com.danubetech.dataintegrity.suites.DataIntegritySuites;
16-
import com.danubetech.dataintegrity.verifier.Ed25519Signature2020LdVerifier;
1716
import org.junit.jupiter.api.BeforeEach;
1817
import org.junit.jupiter.api.Test;
1918

src/test/java/com/danubetech/dataintegrity/JsonLdSignJcsEcdsaSecp256k1Signature2019Test.java

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

3-
import com.danubetech.dataintegrity.util.TestKeys;
4-
import com.danubetech.dataintegrity.util.TestUtil;
5-
import foundation.identity.jsonld.JsonLDObject;
6-
import foundation.identity.jsonld.JsonLDUtils;
73
import com.danubetech.dataintegrity.jsonld.DataIntegrityContexts;
84
import com.danubetech.dataintegrity.signer.JcsEcdsaSecp256k1Signature2019LdSigner;
95
import com.danubetech.dataintegrity.suites.DataIntegritySuites;
6+
import com.danubetech.dataintegrity.util.TestKeys;
107
import com.danubetech.dataintegrity.verifier.JcsEcdsaSecp256k1Signature2019LdVerifier;
8+
import foundation.identity.jsonld.JsonLDObject;
9+
import foundation.identity.jsonld.JsonLDUtils;
1110
import org.junit.jupiter.api.Test;
1211

1312
import java.io.InputStreamReader;

0 commit comments

Comments
 (0)