Skip to content

Commit 662fa2c

Browse files
committed
fix: Update support for EcdsaSecp256r1Signature2019
Addresses #2
1 parent 70b614b commit 662fa2c

File tree

4 files changed

+16
-39
lines changed

4 files changed

+16
-39
lines changed

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

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,12 @@
99
import com.danubetech.dataintegrity.util.JWSUtil;
1010
import com.danubetech.keyformats.crypto.ByteSigner;
1111
import com.danubetech.keyformats.crypto.impl.P_256_ES256_PrivateKeySigner;
12+
import com.danubetech.keyformats.jose.JWSAlgorithm;
1213
import com.nimbusds.jose.JOSEException;
13-
import com.nimbusds.jose.JWSAlgorithm;
1414
import com.nimbusds.jose.JWSHeader;
1515
import com.nimbusds.jose.JWSSigner;
1616
import com.nimbusds.jose.util.Base64URL;
17+
import io.ipfs.multibase.Multibase;
1718

1819
import java.security.GeneralSecurityException;
1920
import java.security.interfaces.ECPrivateKey;
@@ -39,26 +40,16 @@ public Canonicalizer getCanonicalizer(DataIntegrityProof dataIntegrityProof) {
3940

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

42-
// build the JWS and sign
43+
// sign
4344

44-
String jws;
45+
String proofValue;
4546

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-
}
47+
byte[] bytes = signer.sign(signingInput, JWSAlgorithm.ES256);
48+
proofValue = Multibase.encode(Multibase.Base.Base58BTC, bytes);
5849

5950
// done
6051

61-
ldProofBuilder.jws(jws);
52+
ldProofBuilder.proofValue(proofValue);
6253
}
6354

6455
@Override

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

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,17 @@
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.URDNA2015Canonicalizer;
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.ByteVerifier;
119
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;
10+
import com.danubetech.keyformats.jose.JWSAlgorithm;
11+
import io.ipfs.multibase.Multibase;
1612

1713
import java.security.GeneralSecurityException;
1814
import java.security.interfaces.ECPublicKey;
19-
import java.text.ParseException;
2015

2116
public class EcdsaSecp256r1Signature2019LdVerifier extends LdVerifier<EcdsaSecp256r1Signature2019DataIntegritySuite> {
2217

@@ -38,24 +33,15 @@ public Canonicalizer getCanonicalizer(DataIntegrityProof dataIntegrityProof) {
3833

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

41-
// build the JWS and verify
36+
// verify
4237

43-
String jws = dataIntegrityProof.getJws();
44-
if (jws == null) throw new GeneralSecurityException("No 'jws' in proof.");
38+
String proofValue = dataIntegrityProof.getProofValue();
39+
if (proofValue == null) throw new GeneralSecurityException("No 'proofValue' in proof.");
4540

4641
boolean verify;
4742

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-
}
43+
byte[] bytes = Multibase.decode(proofValue);
44+
verify = verifier.verify(signingInput, bytes, JWSAlgorithm.ES256);
5945

6046
// done
6147

src/test/resources/com/danubetech/dataintegrity/signed.bad.EcdsaSecp256r1Signature2019.jsonld

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@
1111
"created": "2017-10-24T05:33:31Z",
1212
"expires": "2027-10-24T05:33:31Z",
1313
"domain": "example.com",
14-
"jws": "eyJiNjQiOmZhbHNlLCJjcml0IjpbImI2NCJdLCJhbGciOiJFUzI1NiJ9..75Io3jKMviPqbX1CxfkxZohSEZ1LTY-MJ8u_a5Fr8PCVQvW46eSrAIt6ekP4ItZltwJazScn2MymZo9_vvj1ZA"
14+
"proofValue": "z3J2bPbGmBtrHMWmzKiL4PmN6kokD3oZPXt5JjkqfkYXpjzoR6e3s6MM7YnsYTaTPr2HgeL5hJ77Ek3hm4Aq5ddh3"
1515
}
1616
}

src/test/resources/com/danubetech/dataintegrity/signed.good.EcdsaSecp256r1Signature2019.jsonld

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@
1111
"created": "2017-10-24T05:33:31Z",
1212
"expires": "2027-10-24T05:33:31Z",
1313
"domain": "example.com",
14-
"jws": "eyJiNjQiOmZhbHNlLCJjcml0IjpbImI2NCJdLCJhbGciOiJFUzI1NiJ9..75Io3jKMviPqbX1CxfkxZohSEZ1LTY-MJ8u_a5Fr8PCVQvW46eSrAIt6ekP4ItZltwJazScn2MymZo9_vvj1ZA"
14+
"proofValue": "z3J2bPbGmBtrHMWmzKiL4PmN6kokD3oZPXt5JjkqfkYXpjzoR6e3s6MM7YnsYTaTPr2HgeL5hJ77Ek3hm4Aq5ddh3"
1515
}
1616
}

0 commit comments

Comments
 (0)