Skip to content

Commit 20728fb

Browse files
committed
Some more optimizations and checks.
Signed-off-by: Markus Sabadello <[email protected]>
1 parent da8073d commit 20728fb

File tree

9 files changed

+90
-61
lines changed

9 files changed

+90
-61
lines changed

src/main/java/com/danubetech/verifiablecredentials/CredentialSubject.java

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

44
import com.danubetech.verifiablecredentials.jsonld.VerifiableCredentialContexts;
55
import com.danubetech.verifiablecredentials.jsonld.VerifiableCredentialKeywords;
6+
import foundation.identity.jsonld.JsonLDKeywords;
67
import foundation.identity.jsonld.JsonLDObject;
78
import foundation.identity.jsonld.JsonLDUtils;
89
import info.weboftrust.ldsignatures.LdProof;
@@ -13,6 +14,8 @@
1314
import javax.json.JsonValue;
1415
import java.io.Reader;
1516
import java.net.URI;
17+
import java.util.HashMap;
18+
import java.util.LinkedHashMap;
1619
import java.util.Map;
1720

1821
public class CredentialSubject extends JsonLDObject {
@@ -47,7 +50,7 @@ public CredentialSubject build() {
4750
super.build();
4851

4952
// add JSON-LD properties
50-
if (this.claims != null) JsonLDUtils.jsonLdAddAllJsonValueMap(this.jsonLDObject.getJsonObjectBuilder(), this.claims);
53+
if (this.claims != null) JsonLDUtils.jsonLdAddAllJsonValueMap(this.jsonLDObject, this.claims);
5154

5255
return this.jsonLDObject;
5356
}
@@ -91,6 +94,8 @@ public static void removeFromJsonLdObject(JsonLDObject jsonLdObject) {
9194
*/
9295

9396
public Map<String, JsonValue> getClaims() {
94-
return JsonLDUtils.jsonLdGetAsJsonValueMap(this.getJsonObject());
97+
Map<String, JsonValue> claims = new LinkedHashMap<>(JsonLDUtils.jsonLdGetAsJsonValueMap(this.getJsonObject()));
98+
claims.remove(JsonLDKeywords.JSONLD_TERM_ID);
99+
return claims;
95100
}
96101
}

src/main/java/com/danubetech/verifiablecredentials/VerifiableCredential.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@ public VerifiableCredential build() {
4848
super.build();
4949

5050
// add JSON-LD properties
51-
if (this.issuer != null) JsonLDUtils.jsonLdAddString(this.jsonLDObject.getJsonObjectBuilder(), VerifiableCredentialKeywords.JSONLD_TERM_ISSUER, JsonLDUtils.uriToString(this.issuer));
52-
if (this.issuanceDate != null) JsonLDUtils.jsonLdAddString(this.jsonLDObject.getJsonObjectBuilder(), VerifiableCredentialKeywords.JSONLD_TERM_ISSUANCEDATE, JsonLDUtils.dateToString(this.issuanceDate));
53-
if (this.expirationDate != null) JsonLDUtils.jsonLdAddString(this.jsonLDObject.getJsonObjectBuilder(), VerifiableCredentialKeywords.JSONLD_TERM_EXPIRATIONDATE, JsonLDUtils.dateToString(this.expirationDate));
51+
if (this.issuer != null) JsonLDUtils.jsonLdAddString(this.jsonLDObject, VerifiableCredentialKeywords.JSONLD_TERM_ISSUER, JsonLDUtils.uriToString(this.issuer));
52+
if (this.issuanceDate != null) JsonLDUtils.jsonLdAddString(this.jsonLDObject, VerifiableCredentialKeywords.JSONLD_TERM_ISSUANCEDATE, JsonLDUtils.dateToString(this.issuanceDate));
53+
if (this.expirationDate != null) JsonLDUtils.jsonLdAddString(this.jsonLDObject, VerifiableCredentialKeywords.JSONLD_TERM_EXPIRATIONDATE, JsonLDUtils.dateToString(this.expirationDate));
5454
if (this.credentialSubject != null) this.credentialSubject.addToJsonLDObject(this.jsonLDObject);
5555
if (this.ldProof != null) this.ldProof.addToJsonLDObject(this.jsonLDObject);
5656

src/main/java/com/danubetech/verifiablecredentials/credentialstatus/RevocationQuery2020Status.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ public RevocationQuery2020Status build() {
4343
super.build();
4444

4545
// add JSON-LD properties
46-
if (this.credentialReference != null) JsonLDUtils.jsonLdAddString(this.jsonLDObject.getJsonObjectBuilder(), VerifiableCredentialKeywords.JSONLD_TERM_CREDENTIALREFERENCE, this.credentialReference);
47-
if (this.revocationService != null) JsonLDUtils.jsonLdAddString(this.jsonLDObject.getJsonObjectBuilder(), VerifiableCredentialKeywords.JSONLD_TERM_REVOCATIONSERVICE, this.revocationService);
46+
if (this.credentialReference != null) JsonLDUtils.jsonLdAddString(this.jsonLDObject, VerifiableCredentialKeywords.JSONLD_TERM_CREDENTIALREFERENCE, this.credentialReference);
47+
if (this.revocationService != null) JsonLDUtils.jsonLdAddString(this.jsonLDObject, VerifiableCredentialKeywords.JSONLD_TERM_REVOCATIONSERVICE, this.revocationService);
4848

4949
return this.jsonLDObject;
5050
}

src/main/java/com/danubetech/verifiablecredentials/jwt/FromJwtConverter.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@ public class FromJwtConverter {
1818
public static VerifiableCredential fromJwtVerifiableCredential(JwtVerifiableCredential jwtVerifiableCredential) {
1919

2020
VerifiableCredential payloadVerifiableCredential = VerifiableCredential.fromJson(jwtVerifiableCredential.getPayloadObject().toString());
21+
CredentialSubject payloadCredentialSubject = payloadVerifiableCredential.getCredentialSubject();
22+
CredentialSubject.removeFromJsonLdObject(payloadVerifiableCredential);
2123

2224
VerifiableCredential.Builder verifiableCredentialBuilder = VerifiableCredential.builder()
25+
.base(payloadVerifiableCredential)
2326
.defaultContexts(false)
24-
.defaultTypes(false)
25-
.template(payloadVerifiableCredential);
27+
.defaultTypes(false);
2628

2729
JWTClaimsSet payload = jwtVerifiableCredential.getPayload();
2830

@@ -34,7 +36,7 @@ public static VerifiableCredential fromJwtVerifiableCredential(JwtVerifiableCred
3436
String subject = payload.getSubject();
3537
if (subject != null) {
3638
CredentialSubject credentialSubject = CredentialSubject.builder()
37-
.template(payloadVerifiableCredential.getCredentialSubject())
39+
.base(payloadCredentialSubject)
3840
.id(URI.create(subject))
3941
.build();
4042
verifiableCredentialBuilder.credentialSubject(credentialSubject);

src/main/java/com/danubetech/verifiablecredentials/jwt/JwtObject.java

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

33
import java.security.interfaces.RSAPrivateKey;
44
import java.security.interfaces.RSAPublicKey;
5+
import java.util.Map;
56

7+
import com.nimbusds.jose.util.JSONObjectUtils;
68
import org.bitcoinj.core.ECKey;
79

810
import com.nimbusds.jose.JOSEException;
@@ -164,9 +166,13 @@ private static class EscapedSlashWorkaroundJWSObject extends JWSObject {
164166

165167
private static final long serialVersionUID = -587898962717783109L;
166168

167-
public EscapedSlashWorkaroundJWSObject(final JWSHeader header, final JWTClaimsSet claimsSet) {
169+
public EscapedSlashWorkaroundJWSObject(final JWSHeader jwsHeader, final JWTClaimsSet jwtClaimsSet) {
170+
super(jwsHeader, makePayload(jwtClaimsSet));
171+
}
168172

169-
super(header, new Payload(claimsSet.toJSONObject().toJSONString().replace("\\/", "/")));
173+
private static Payload makePayload(JWTClaimsSet jwtClaimsSet) {
174+
Map<String, Object> jsonObject = jwtClaimsSet.toJSONObject();
175+
return new Payload(JSONObjectUtils.toJSONString(jsonObject).replace("\\/", "/"));
170176
}
171177
}
172178

src/main/java/com/danubetech/verifiablecredentials/jwt/JwtVerifiableCredential.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package com.danubetech.verifiablecredentials.jwt;
22

3-
import java.text.ParseException;
4-
53
import com.danubetech.verifiablecredentials.VerifiableCredential;
64
import com.nimbusds.jose.JWSObject;
5+
import com.nimbusds.jose.util.JSONObjectUtils;
76
import com.nimbusds.jwt.JWTClaimsSet;
87
import com.nimbusds.jwt.SignedJWT;
98

10-
import net.minidev.json.JSONObject;
9+
import java.text.ParseException;
10+
import java.util.Map;
1111

1212
public class JwtVerifiableCredential extends JwtWrappingObject<VerifiableCredential> {
1313

@@ -24,10 +24,10 @@ public static JwtVerifiableCredential fromCompactSerialization(String compactSer
2424

2525
SignedJWT signedJWT = SignedJWT.parse(compactSerialization);
2626

27-
JWTClaimsSet payload = signedJWT.getJWTClaimsSet();
28-
JSONObject jsonLdObject = (JSONObject) payload.getClaims().get(JwtKeywords.JWT_CLAIM_VC);
29-
VerifiableCredential payloadVerifiableCredential = VerifiableCredential.fromJson(jsonLdObject.toJSONString());
27+
JWTClaimsSet jwtPayload = signedJWT.getJWTClaimsSet();
28+
Map<String, Object> jsonObject = (Map<String, Object>) jwtPayload.getClaims().get(JwtKeywords.JWT_CLAIM_VC);
29+
VerifiableCredential payloadVerifiableCredential = VerifiableCredential.fromJson(JSONObjectUtils.toJSONString(jsonObject));
3030

31-
return new JwtVerifiableCredential(payload, payloadVerifiableCredential, signedJWT, compactSerialization);
31+
return new JwtVerifiableCredential(jwtPayload, payloadVerifiableCredential, signedJWT, compactSerialization);
3232
}
3333
}

src/main/java/com/danubetech/verifiablecredentials/jwt/ToJwtConverter.java

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,25 @@
22

33
import com.danubetech.verifiablecredentials.CredentialSubject;
44
import com.danubetech.verifiablecredentials.VerifiableCredential;
5-
import com.danubetech.verifiablecredentials.VerifiablePresentation;
6-
import com.nimbusds.jose.JOSEException;
5+
import com.danubetech.verifiablecredentials.jsonld.VerifiableCredentialKeywords;
6+
import com.fasterxml.jackson.core.JsonFactory;
7+
import com.fasterxml.jackson.core.JsonParseException;
8+
import com.fasterxml.jackson.core.JsonParser;
9+
import com.fasterxml.jackson.core.ObjectCodec;
10+
import com.fasterxml.jackson.databind.ObjectMapper;
11+
import com.nimbusds.jose.util.JSONObjectUtils;
712
import com.nimbusds.jwt.JWTClaimsSet;
8-
import com.nimbusds.jwt.SignedJWT;
9-
import net.minidev.json.JSONObject;
13+
import foundation.identity.jsonld.JsonLDKeywords;
14+
import foundation.identity.jsonld.JsonLDUtils;
1015

1116
import java.io.IOException;
17+
import java.io.StringReader;
1218
import java.net.URI;
13-
import java.security.GeneralSecurityException;
1419
import java.text.ParseException;
20+
import java.util.Collections;
1521
import java.util.Date;
16-
import java.util.LinkedHashMap;
22+
import java.util.Map;
23+
import java.util.SortedMap;
1724

1825
public class ToJwtConverter {
1926

@@ -25,50 +32,64 @@ public static JwtVerifiableCredential toJwtVerifiableCredential(VerifiableCreden
2532

2633
JWTClaimsSet.Builder jwtPayloadBuilder = new JWTClaimsSet.Builder();
2734

28-
VerifiableCredential.Builder payloadVerifiableCredentialBuilder = VerifiableCredential.builder()
35+
VerifiableCredential payloadVerifiableCredential = VerifiableCredential.builder()
2936
.defaultContexts(false)
3037
.defaultTypes(false)
31-
.contexts(verifiableCredential.getContexts())
32-
.types(verifiableCredential.getTypes());
33-
// .template(verifiableCredential);
38+
.build();
39+
40+
JsonLDUtils.jsonLdAddAll(payloadVerifiableCredential, verifiableCredential.getJsonObject());
3441

3542
URI id = verifiableCredential.getId();
3643
if (id != null) {
3744
jwtPayloadBuilder.jwtID(id.toString());
38-
// payloadVerifiableCredentialBuilder.id(null);
45+
JsonLDUtils.jsonLdRemove(payloadVerifiableCredential, JsonLDKeywords.JSONLD_TERM_ID);
3946
}
4047

4148
CredentialSubject credentialSubject = verifiableCredential.getCredentialSubject();
4249
if (credentialSubject != null) {
43-
if (credentialSubject.getId() != null) jwtPayloadBuilder.subject(credentialSubject.getId().toString());
44-
// payloadVerifiableCredentialBuilder.credentialSubject(null);
50+
if (credentialSubject.getId() != null) {
51+
jwtPayloadBuilder.subject(credentialSubject.getId().toString());
52+
}
53+
CredentialSubject payloadCredentialSubject = CredentialSubject.builder()
54+
.base(credentialSubject)
55+
.build();
56+
JsonLDUtils.jsonLdRemove(payloadCredentialSubject, JsonLDKeywords.JSONLD_TERM_ID);
57+
CredentialSubject.removeFromJsonLdObject(payloadVerifiableCredential);
58+
payloadCredentialSubject.addToJsonLDObject(payloadVerifiableCredential);
4559
}
4660

4761
URI issuer = verifiableCredential.getIssuer();
4862
if (issuer != null) {
4963
jwtPayloadBuilder.issuer(issuer.toString());
50-
// payloadVerifiableCredentialBuilder.issuer(null);
64+
JsonLDUtils.jsonLdRemove(payloadVerifiableCredential, VerifiableCredentialKeywords.JSONLD_TERM_ISSUER);
5165
}
5266

5367
Date issuanceDate = verifiableCredential.getIssuanceDate();
5468
if (issuanceDate != null) {
5569
jwtPayloadBuilder.notBeforeTime(issuanceDate);
56-
// payloadVerifiableCredentialBuilder.issuanceDate(null);
70+
JsonLDUtils.jsonLdRemove(payloadVerifiableCredential, VerifiableCredentialKeywords.JSONLD_TERM_ISSUANCEDATE);
5771
}
5872

5973
Date expirationDate = verifiableCredential.getExpirationDate();
6074
if (expirationDate != null) {
6175
jwtPayloadBuilder.expirationTime(expirationDate);
62-
// payloadVerifiableCredentialBuilder.expirationDate(null);
76+
JsonLDUtils.jsonLdRemove(payloadVerifiableCredential, VerifiableCredentialKeywords.JSONLD_TERM_EXPIRATIONDATE);
6377
}
6478

6579
if (aud != null) {
6680
jwtPayloadBuilder.audience(aud);
6781
}
6882

69-
VerifiableCredential payloadVerifiableCredential = payloadVerifiableCredentialBuilder.build();
70-
71-
jwtPayloadBuilder.claim(JwtKeywords.JWT_CLAIM_VC, payloadVerifiableCredential.getJsonObject());
83+
try {
84+
Map<String, Object> vcClaimValue = new ObjectMapper().readValue(payloadVerifiableCredential.toJson(), Map.class);
85+
jwtPayloadBuilder.claim(JwtKeywords.JWT_CLAIM_VC, vcClaimValue);
86+
} catch (RuntimeException ex) {
87+
throw new RuntimeException(ex);
88+
} catch (JsonParseException e) {
89+
e.printStackTrace();
90+
} catch (IOException e) {
91+
e.printStackTrace();
92+
}
7293

7394
JWTClaimsSet jwtPayload = jwtPayloadBuilder.build();
7495

src/main/java/com/danubetech/verifiablecredentials/proof/BlockchainHashProof2020.java renamed to src/main/java/com/danubetech/verifiablecredentials/proof/BlockchainHashProof2020.java.bak

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,20 @@
11
package com.danubetech.verifiablecredentials.proof;
22

3-
import java.io.Reader;
4-
import java.net.URI;
5-
6-
import com.danubetech.verifiablecredentials.CredentialSubject;
7-
import com.danubetech.verifiablecredentials.credentialstatus.RevocationQuery2020Status;
83
import com.danubetech.verifiablecredentials.jsonld.VerifiableCredentialContexts;
94
import com.danubetech.verifiablecredentials.jsonld.VerifiableCredentialKeywords;
105
import foundation.identity.jsonld.JsonLDObject;
11-
import foundation.identity.jsonld.JsonLDUtils;
126
import info.weboftrust.ldsignatures.LdProof;
7+
import info.weboftrust.ldsignatures.jsonld.LDSecurityKeywords;
138

149
import javax.json.JsonObject;
10+
import java.io.Reader;
11+
import java.net.URI;
1512

1613
public class BlockchainHashProof2020 extends LdProof {
1714

1815
public static final URI[] DEFAULT_JSONLD_CONTEXTS = { VerifiableCredentialContexts.JSONLD_CONTEXT_W3C_2018_CREDENTIALS_V1 };
1916
public static final String[] DEFAULT_JSONLD_TYPES = { VerifiableCredentialKeywords.JSONLD_TERM_BLOCKCHAIN_HASH_PROOF_2020 };
20-
public static final String DEFAULT_JSONLD_PREDICATE = VerifiableCredentialKeywords.JSONLD_TERM_CREDENTIALSUBJECT;
17+
public static final String DEFAULT_JSONLD_PREDICATE = LDSecurityKeywords.JSONLD_TERM_PROOF;
2118

2219
private BlockchainHashProof2020() {
2320
super(VerifiableCredentialContexts.DOCUMENT_LOADER);

src/main/java/com/danubetech/verifiablecredentials/w3ctestsuite/Generator.java

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,24 @@
11
package com.danubetech.verifiablecredentials.w3ctestsuite;
22

3-
import java.io.BufferedReader;
4-
import java.io.File;
5-
import java.io.FileReader;
6-
import java.security.GeneralSecurityException;
7-
import java.text.ParseException;
8-
import java.util.Arrays;
9-
import java.util.List;
10-
11-
import com.danubetech.verifiablecredentials.jwt.FromJwtConverter;
12-
import com.danubetech.verifiablecredentials.jwt.ToJwtConverter;
13-
import org.apache.commons.codec.binary.Base64;
14-
153
import com.danubetech.verifiablecredentials.VerifiableCredential;
4+
import com.danubetech.verifiablecredentials.jwt.FromJwtConverter;
165
import com.danubetech.verifiablecredentials.jwt.JwtVerifiableCredential;
176
import com.danubetech.verifiablecredentials.jwt.JwtVerifiablePresentation;
7+
import com.danubetech.verifiablecredentials.jwt.ToJwtConverter;
188
import com.nimbusds.jose.JOSEException;
199
import com.nimbusds.jose.jwk.JWK;
2010
import com.nimbusds.jose.jwk.RSAKey;
2111
import com.nimbusds.jose.util.JSONObjectUtils;
12+
import org.apache.commons.codec.binary.Base64;
2213

23-
import net.minidev.json.JSONObject;
14+
import java.io.BufferedReader;
15+
import java.io.File;
16+
import java.io.FileReader;
17+
import java.security.GeneralSecurityException;
18+
import java.text.ParseException;
19+
import java.util.Arrays;
20+
import java.util.List;
21+
import java.util.Map;
2422

2523
public class Generator {
2624

@@ -82,7 +80,7 @@ public static void main(String[] args) throws Exception {
8280

8381
if (argNoJws) {
8482

85-
output = jwtVerifiableCredential.getPayload().toJSONObject().toJSONString();
83+
output = JSONObjectUtils.toJSONString(jwtVerifiableCredential.getPayload().toJSONObject());
8684
} else {
8785

8886
output = jwtVerifiableCredential.sign_RSA_RS256(rsaKey);
@@ -139,8 +137,8 @@ static String argInput(List<String> argsList) {
139137

140138
static RSAKey readRSAKey(String jwt) throws ParseException, JOSEException {
141139

142-
JSONObject jsonObject = JSONObjectUtils.parse(new String(Base64.decodeBase64(jwt)));
143-
JSONObject rs256PrivateKeyJwk = (JSONObject) jsonObject.get("rs256PrivateKeyJwk");
140+
Map<String, Object> jsonObject = JSONObjectUtils.parse(new String(Base64.decodeBase64(jwt)));
141+
Map<String, Object> rs256PrivateKeyJwk = (Map<String, Object>) jsonObject.get("rs256PrivateKeyJwk");
144142

145143
RSAKey jwk = (RSAKey) JWK.parse(rs256PrivateKeyJwk);
146144

0 commit comments

Comments
 (0)