Skip to content

Commit 26bd862

Browse files
committed
feat: Jwt vc converters
1 parent b8a5cf7 commit 26bd862

File tree

3 files changed

+179
-0
lines changed

3 files changed

+179
-0
lines changed

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

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

33
import com.danubetech.verifiablecredentials.CredentialSubject;
44
import com.danubetech.verifiablecredentials.VerifiableCredential;
5+
import com.danubetech.verifiablecredentials.VerifiableCredentialV2;
56
import com.danubetech.verifiablecredentials.VerifiablePresentation;
67
import com.danubetech.verifiablecredentials.jsonld.VerifiableCredentialKeywords;
78
import com.nimbusds.jwt.JWTClaimsSet;
@@ -107,4 +108,56 @@ public static VerifiablePresentation fromJwtVerifiableCredentialToVerifiablePres
107108

108109
return verifiablePresentation;
109110
}
111+
112+
113+
public static VerifiableCredentialV2 fromJwtVerifiableCredential(JwtVerifiableCredentialV2 jwtVerifiableCredential) {
114+
115+
VerifiableCredentialV2 payloadVerifiableCredential = VerifiableCredentialV2.fromJson(jwtVerifiableCredential.getPayloadObject().toString());
116+
CredentialSubject payloadCredentialSubject = payloadVerifiableCredential.getCredentialSubject();
117+
CredentialSubject.removeFromJsonLdObject(payloadVerifiableCredential);
118+
119+
VerifiableCredentialV2.Builder<? extends VerifiableCredentialV2.Builder<?>> verifiableCredentialBuilder = VerifiableCredentialV2.builder()
120+
.base(payloadVerifiableCredential)
121+
.defaultContexts(false)
122+
.defaultTypes(false);
123+
124+
JWTClaimsSet payload = jwtVerifiableCredential.getPayload();
125+
126+
String jwtId = payload.getJWTID();
127+
if (jwtId != null && payloadVerifiableCredential.getId() == null) {
128+
verifiableCredentialBuilder.id(URI.create(jwtId));
129+
}
130+
131+
if (payloadCredentialSubject != null) {
132+
133+
CredentialSubject.Builder<? extends CredentialSubject.Builder<?>> credentialSubjectBuilder = CredentialSubject.builder()
134+
.base(payloadCredentialSubject);
135+
136+
String subject = payload.getSubject();
137+
if (subject != null && payloadCredentialSubject.getId() == null) {
138+
credentialSubjectBuilder.id(URI.create(subject));
139+
}
140+
141+
CredentialSubject credentialSubject = credentialSubjectBuilder.build();
142+
143+
verifiableCredentialBuilder.credentialSubject(credentialSubject);
144+
}
145+
146+
String issuer = payload.getIssuer();
147+
if (issuer != null && payloadVerifiableCredential.getIssuer() == null) {
148+
verifiableCredentialBuilder.issuer(URI.create(issuer));
149+
}
150+
151+
Date notBeforeTime = payload.getNotBeforeTime();
152+
if (notBeforeTime != null && payloadVerifiableCredential.getValidFrom() == null) {
153+
verifiableCredentialBuilder.validFrom(notBeforeTime);
154+
}
155+
156+
Date expirationTime = payload.getExpirationTime();
157+
if (expirationTime != null && payloadVerifiableCredential.getValidUntil() == null) {
158+
verifiableCredentialBuilder.validUntil(expirationTime);
159+
}
160+
161+
return verifiableCredentialBuilder.build();
162+
}
110163
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.danubetech.verifiablecredentials.jwt;
2+
3+
4+
import com.danubetech.verifiablecredentials.VerifiableCredentialV2;
5+
import com.nimbusds.jose.JWSObject;
6+
import com.nimbusds.jwt.JWTClaimsSet;
7+
import com.nimbusds.jwt.SignedJWT;
8+
9+
import java.text.ParseException;
10+
import java.util.LinkedHashMap;
11+
import java.util.Map;
12+
13+
public class JwtVerifiableCredentialV2 extends JwtWrappingObject<VerifiableCredentialV2> {
14+
15+
public JwtVerifiableCredentialV2(JWTClaimsSet payload, VerifiableCredentialV2 payloadObject, JWSObject jwsObject, String compactSerialization) {
16+
17+
super(payload, payloadObject, jwsObject, compactSerialization);
18+
}
19+
20+
/*
21+
* Factory methods
22+
*/
23+
24+
public static JwtVerifiableCredentialV2 fromCompactSerialization(String compactSerialization) throws ParseException {
25+
26+
SignedJWT signedJWT = SignedJWT.parse(compactSerialization);
27+
28+
JWTClaimsSet jwtPayload = signedJWT.getJWTClaimsSet();
29+
Map<String, Object> jsonObject = (Map<String, Object>) jwtPayload.getClaims().get(JwtKeywords.JWT_CLAIM_VC);
30+
if (jsonObject == null) return null;
31+
32+
VerifiableCredentialV2 payloadVerifiableCredential = VerifiableCredentialV2.fromJsonObject(new LinkedHashMap<>(jsonObject));
33+
34+
return new JwtVerifiableCredentialV2(jwtPayload, payloadVerifiableCredential, signedJWT, compactSerialization);
35+
}
36+
}

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

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

33
import com.danubetech.verifiablecredentials.CredentialSubject;
44
import com.danubetech.verifiablecredentials.VerifiableCredential;
5+
import com.danubetech.verifiablecredentials.VerifiableCredentialV2;
56
import com.danubetech.verifiablecredentials.VerifiablePresentation;
67
import com.danubetech.verifiablecredentials.jsonld.VerifiableCredentialKeywords;
78
import com.nimbusds.jwt.JWTClaimsSet;
@@ -147,4 +148,93 @@ public static JwtVerifiablePresentation toJwtVerifiablePresentation(VerifiablePr
147148

148149
return toJwtVerifiablePresentation(verifiablePresentation, null);
149150
}
151+
152+
153+
/*
154+
* from JSON-LD to JWT VCDM V2
155+
*/
156+
157+
public static JwtVerifiableCredentialV2 toJwtVerifiableCredentialV2(VerifiableCredentialV2 verifiableCredential, String aud, boolean preserveVerifiableCredentialProperties, boolean includeIat) {
158+
159+
JWTClaimsSet.Builder jwtPayloadBuilder = new JWTClaimsSet.Builder();
160+
161+
VerifiableCredentialV2 payloadVerifiableCredential = VerifiableCredentialV2.builder()
162+
.defaultContexts(false)
163+
.defaultTypes(false)
164+
.build();
165+
166+
JsonLDUtils.jsonLdAddAll(payloadVerifiableCredential, verifiableCredential.getJsonObject());
167+
168+
URI id = verifiableCredential.getId();
169+
if (id != null) {
170+
jwtPayloadBuilder.jwtID(id.toString());
171+
if (!preserveVerifiableCredentialProperties) {
172+
JsonLDUtils.jsonLdRemove(payloadVerifiableCredential, JsonLDKeywords.JSONLD_TERM_ID);
173+
}
174+
}
175+
176+
CredentialSubject credentialSubject = verifiableCredential.getCredentialSubject();
177+
if (credentialSubject != null && credentialSubject.getId() != null) {
178+
jwtPayloadBuilder.subject(credentialSubject.getId().toString());
179+
if (!preserveVerifiableCredentialProperties) {
180+
CredentialSubject payloadCredentialSubject = CredentialSubject.builder()
181+
.base(credentialSubject)
182+
.build();
183+
JsonLDUtils.jsonLdRemove(payloadCredentialSubject, JsonLDKeywords.JSONLD_TERM_ID);
184+
CredentialSubject.removeFromJsonLdObject(payloadVerifiableCredential);
185+
payloadCredentialSubject.addToJsonLDObject(payloadVerifiableCredential);
186+
}
187+
}
188+
189+
URI issuer = verifiableCredential.getIssuerUri();
190+
if (issuer != null) {
191+
jwtPayloadBuilder.issuer(issuer.toString());
192+
if (!preserveVerifiableCredentialProperties) {
193+
JsonLDUtils.jsonLdRemove(payloadVerifiableCredential, VerifiableCredentialKeywords.JSONLD_TERM_ISSUER);
194+
}
195+
}
196+
197+
Date issuanceDate = verifiableCredential.getValidFrom();
198+
if (issuanceDate != null) {
199+
jwtPayloadBuilder.notBeforeTime(issuanceDate);
200+
if (includeIat) jwtPayloadBuilder.issueTime(issuanceDate);
201+
if (!preserveVerifiableCredentialProperties) {
202+
JsonLDUtils.jsonLdRemove(payloadVerifiableCredential, VerifiableCredentialKeywords.JSONLD_TERM_ISSUANCEDATE);
203+
}
204+
}
205+
206+
Date expirationDate = verifiableCredential.getValidUntil();
207+
if (expirationDate != null) {
208+
jwtPayloadBuilder.expirationTime(expirationDate);
209+
if (!preserveVerifiableCredentialProperties) {
210+
JsonLDUtils.jsonLdRemove(payloadVerifiableCredential, VerifiableCredentialKeywords.JSONLD_TERM_EXPIRATIONDATE);
211+
}
212+
}
213+
214+
if (aud != null) {
215+
jwtPayloadBuilder.audience(aud);
216+
}
217+
218+
Map<String, Object> vcContent = new LinkedHashMap<>(payloadVerifiableCredential.getJsonObject());
219+
jwtPayloadBuilder.claim(JwtKeywords.JWT_CLAIM_VC, vcContent);
220+
221+
JWTClaimsSet jwtPayload = jwtPayloadBuilder.build();
222+
223+
return new JwtVerifiableCredentialV2(jwtPayload, payloadVerifiableCredential, null, null);
224+
}
225+
226+
public static JwtVerifiableCredentialV2 toJwtVerifiableCredentialV2(VerifiableCredentialV2 verifiableCredential, String aud) {
227+
228+
return toJwtVerifiableCredentialV2(verifiableCredential, null, false, false);
229+
}
230+
231+
public static JwtVerifiableCredentialV2 toJwtVerifiableCredentialV2(VerifiableCredentialV2 verifiableCredential, boolean preserveVerifiableCredentialProperties, boolean includeIat) {
232+
233+
return toJwtVerifiableCredentialV2(verifiableCredential, null, preserveVerifiableCredentialProperties, includeIat);
234+
}
235+
236+
public static JwtVerifiableCredentialV2 toJwtVerifiableCredentialV2(VerifiableCredentialV2 verifiableCredential) {
237+
238+
return toJwtVerifiableCredentialV2(verifiableCredential, null, false, false);
239+
}
150240
}

0 commit comments

Comments
 (0)