Skip to content

Commit 7936b9a

Browse files
committed
WIP support for JWT with Verifiable Presentation.
Signed-off-by: Markus Sabadello <[email protected]>
1 parent 4fe55ad commit 7936b9a

File tree

3 files changed

+103
-9
lines changed

3 files changed

+103
-9
lines changed

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

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,16 @@ public class JwtVerifiableCredential {
2424
private final JwtClaims payload;
2525
private final VerifiableCredential payloadVerifiableCredential;
2626

27-
private JwtVerifiableCredential(JwtClaims payload, VerifiableCredential payloadVerifiableCredential) {
27+
private String compactSerialization;
28+
29+
private JwtVerifiableCredential(JwtClaims payload, VerifiableCredential payloadVerifiableCredential, String compactSerialization) {
2830

2931
if (payload == null) throw new NullPointerException();
3032
if (payloadVerifiableCredential == null) throw new NullPointerException();
3133

3234
this.payload = payload;
3335
this.payloadVerifiableCredential = payloadVerifiableCredential;
36+
this.compactSerialization = compactSerialization;
3437
}
3538

3639
public static JwtVerifiableCredential fromJwt(String jwt, String algorithm, PublicKey publicKey, boolean doValidate) throws JoseException, GeneralSecurityException, InvalidJwtException {
@@ -57,7 +60,7 @@ public static JwtVerifiableCredential fromJwt(String jwt, String algorithm, Publ
5760
LinkedHashMap<String, Object> jsonLdObject = (LinkedHashMap<String, Object>) jwtPayload.getClaimValue(JWT_CLAIM_VC);
5861
VerifiableCredential payloadVerifiableCredential = VerifiableCredential.fromJsonLdObject(jsonLdObject, false);
5962

60-
return new JwtVerifiableCredential(jwtPayload, payloadVerifiableCredential);
63+
return new JwtVerifiableCredential(jwtPayload, payloadVerifiableCredential, jwt);
6164
}
6265

6366
public static JwtVerifiableCredential fromJwt(String jwt, String algorithm, PublicKey publicKey) throws JoseException, GeneralSecurityException, InvalidJwtException {
@@ -116,7 +119,7 @@ public static JwtVerifiableCredential fromVerifiableCredential(VerifiableCredent
116119

117120
payload.setClaim(JWT_CLAIM_VC, payloadVerifiableCredential.getJsonLdObject());
118121

119-
return new JwtVerifiableCredential(payload, payloadVerifiableCredential);
122+
return new JwtVerifiableCredential(payload, payloadVerifiableCredential, null);
120123
}
121124

122125
public static JwtVerifiableCredential fromVerifiableCredential(VerifiableCredential verifiableCredential) {
@@ -134,6 +137,11 @@ public VerifiableCredential getPayloadVerifiableCredential() {
134137
return this.payloadVerifiableCredential;
135138
}
136139

140+
public String getCompactSerialization() {
141+
142+
return this.compactSerialization;
143+
}
144+
137145
public String toJwt(String algorithm, PrivateKey privateKey) throws JoseException {
138146

139147
String payload = this.getPayload().toJson();
@@ -144,7 +152,8 @@ public String toJwt(String algorithm, PrivateKey privateKey) throws JoseExceptio
144152

145153
jws.setKey(privateKey);
146154

147-
return jws.getCompactSerialization();
155+
this.compactSerialization = jws.getCompactSerialization();
156+
return compactSerialization;
148157
}
149158

150159
public VerifiableCredential toVerifiableCredential() throws MalformedClaimException {
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package com.danubetech.verifiablecredentials.jwt;
2+
3+
import java.security.PrivateKey;
4+
5+
import org.jose4j.jws.JsonWebSignature;
6+
import org.jose4j.jwt.JwtClaims;
7+
import org.jose4j.lang.JoseException;
8+
9+
public class JwtVerifiablePresentation {
10+
11+
public static final String JWT_CLAIM_VP = "vp";
12+
13+
private final JwtClaims payload;
14+
private final JwtVerifiableCredential payloadJwtVerifiableCredential;
15+
16+
private String compactSerialization;
17+
18+
private JwtVerifiablePresentation(JwtClaims payload, JwtVerifiableCredential payloadJwtVerifiableCredential, String compactSerialization) {
19+
20+
if (payload == null) throw new NullPointerException();
21+
if (payloadJwtVerifiableCredential == null) throw new NullPointerException();
22+
23+
this.payload = payload;
24+
this.payloadJwtVerifiableCredential = payloadJwtVerifiableCredential;
25+
this.compactSerialization = compactSerialization;
26+
}
27+
28+
public static JwtVerifiablePresentation fromJwtVerifiableCredential(JwtVerifiableCredential jwtVerifiableCredential, String aud) {
29+
30+
JwtVerifiableCredential payloadJwtVerifiableCredential = jwtVerifiableCredential;
31+
32+
JwtClaims payload = new JwtClaims();
33+
34+
if (aud != null) {
35+
36+
payload.setAudience(aud);
37+
}
38+
39+
payload.setClaim(JWT_CLAIM_VP, payloadJwtVerifiableCredential.getCompactSerialization());
40+
41+
return new JwtVerifiablePresentation(payload, payloadJwtVerifiableCredential, null);
42+
}
43+
44+
public static JwtVerifiablePresentation fromJwtVerifiableCredential(JwtVerifiableCredential jwtVerifiableCredential) {
45+
46+
return fromJwtVerifiableCredential(jwtVerifiableCredential, null);
47+
}
48+
49+
public JwtClaims getPayload() {
50+
51+
return this.payload;
52+
}
53+
54+
public JwtVerifiableCredential getPayloadJwtVerifiableCredential() {
55+
56+
return this.payloadJwtVerifiableCredential;
57+
}
58+
59+
public String getCompactSerialization() {
60+
61+
return this.compactSerialization;
62+
}
63+
64+
public String toJwt(String algorithm, PrivateKey privateKey) throws JoseException {
65+
66+
String payload = this.getPayload().toJson();
67+
68+
JsonWebSignature jws = new JsonWebSignature();
69+
jws.setAlgorithmHeaderValue(algorithm);
70+
jws.setPayload(payload);
71+
72+
jws.setKey(privateKey);
73+
74+
this.compactSerialization = jws.getCompactSerialization();
75+
return compactSerialization;
76+
}
77+
}

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

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import com.danubetech.verifiablecredentials.VerifiableCredential;
2020
import com.danubetech.verifiablecredentials.jwt.JwtVerifiableCredential;
21+
import com.danubetech.verifiablecredentials.jwt.JwtVerifiablePresentation;
2122
import com.fasterxml.jackson.core.JsonParseException;
2223
import com.github.jsonldjava.utils.JsonUtils;
2324

@@ -59,8 +60,6 @@ public static void main(String[] args) throws Exception {
5960
PrivateKey privateKey = readPrivateKey(argJwt);
6061
PublicKey publicKey = readPublicKey(argJwt);
6162

62-
if (argPresentation) throw new RuntimeException("--jwt-presentation not supported.");
63-
6463
if (argDecode) {
6564

6665
JwtVerifiableCredential jwtVerifiableCredential = JwtVerifiableCredential.fromJwt(input, AlgorithmIdentifiers.RSA_USING_SHA256, publicKey, false);
@@ -72,12 +71,21 @@ public static void main(String[] args) throws Exception {
7271
VerifiableCredential verifiableCredential = VerifiableCredential.fromJsonString(input);
7372
JwtVerifiableCredential jwtVerifiableCredential = JwtVerifiableCredential.fromVerifiableCredential(verifiableCredential, argAud);
7473

75-
if (argNoJws) {
74+
if (argPresentation) {
75+
76+
jwtVerifiableCredential.toJwt(AlgorithmIdentifiers.RSA_USING_SHA256, privateKey);
77+
JwtVerifiablePresentation jwtVerifiablePresentation = JwtVerifiablePresentation.fromJwtVerifiableCredential(jwtVerifiableCredential, argAud);
7678

77-
output = jwtVerifiableCredential.getPayload().toJson();
79+
output = jwtVerifiablePresentation.toJwt(AlgorithmIdentifiers.RSA_USING_SHA256, privateKey);
7880
} else {
7981

80-
output = jwtVerifiableCredential.toJwt(AlgorithmIdentifiers.RSA_USING_SHA256, privateKey);
82+
if (argNoJws) {
83+
84+
output = jwtVerifiableCredential.getPayload().toJson();
85+
} else {
86+
87+
output = jwtVerifiableCredential.toJwt(AlgorithmIdentifiers.RSA_USING_SHA256, privateKey);
88+
}
8189
}
8290
}
8391
}

0 commit comments

Comments
 (0)