Skip to content
This repository was archived by the owner on Sep 22, 2019. It is now read-only.

Commit 0238a13

Browse files
committed
Add issuance /getproof endpoint for retrieving session result in case of combined sessions
1 parent 5379020 commit 0238a13

File tree

5 files changed

+64
-35
lines changed

5 files changed

+64
-35
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ apply plugin: 'war'
22
apply plugin: 'org.akhikhl.gretty'
33
apply plugin: 'eclipse-wtp'
44

5-
version = "2.1.1"
5+
version = "2.2.0"
66

77
import org.gradle.internal.os.OperatingSystem;
88

src/main/java/org/irmacard/api/web/resources/BaseResource.java

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package org.irmacard.api.web.resources;
22

3-
import io.jsonwebtoken.Claims;
4-
import io.jsonwebtoken.JwsHeader;
5-
import io.jsonwebtoken.SigningKeyResolverAdapter;
3+
import io.jsonwebtoken.*;
64
import org.irmacard.api.common.*;
5+
import org.irmacard.api.common.JwtParser;
6+
import org.irmacard.api.common.disclosure.DisclosureProofResult;
77
import org.irmacard.api.common.disclosure.ServiceProviderRequest;
88
import org.irmacard.api.common.exceptions.ApiError;
99
import org.irmacard.api.common.exceptions.ApiException;
@@ -20,6 +20,8 @@
2020

2121
import java.math.BigInteger;
2222
import java.security.Key;
23+
import java.security.KeyManagementException;
24+
import java.util.Calendar;
2325
import java.util.HashMap;
2426

2527
public abstract class BaseResource
@@ -203,4 +205,25 @@ protected void fail(ApiError error, SessionClass session) throws ApiException {
203205
session.setStatusCancelled();
204206
throw new ApiException(error);
205207
}
208+
209+
protected String signResultJwt(DisclosureProofResult result, int validity, String subject) throws KeyManagementException {
210+
Calendar now = Calendar.getInstance();
211+
Calendar expiry = Calendar.getInstance();
212+
expiry.add(Calendar.SECOND, validity);
213+
214+
JwtBuilder builder = Jwts.builder()
215+
.setClaims(result.getAsMap())
216+
.setIssuedAt(now.getTime())
217+
.setExpiration(expiry.getTime())
218+
.setSubject(subject);
219+
220+
String jwt_issuer = ApiConfiguration.getInstance().getJwtIssuer();
221+
if (jwt_issuer != null)
222+
builder = builder.setIssuer(jwt_issuer);
223+
224+
return builder
225+
.signWith(ApiConfiguration.getInstance().getJwtAlgorithm(),
226+
ApiConfiguration.getInstance().getJwtPrivateKey())
227+
.compact();
228+
}
206229
}

src/main/java/org/irmacard/api/web/resources/IssueResource.java

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.irmacard.api.web.resources;
22

3+
import io.jsonwebtoken.JwtBuilder;
34
import io.jsonwebtoken.JwtException;
5+
import io.jsonwebtoken.Jwts;
46
import org.irmacard.api.common.*;
57
import org.irmacard.api.common.disclosure.DisclosureProofRequest;
68
import org.irmacard.api.common.disclosure.DisclosureProofResult;
@@ -13,6 +15,7 @@
1315
import org.irmacard.api.web.sessions.IrmaSession;
1416
import org.irmacard.api.web.sessions.IssueSession;
1517
import org.irmacard.api.web.sessions.Sessions;
18+
import org.irmacard.api.web.sessions.VerificationSession;
1619
import org.irmacard.credentials.Attributes;
1720
import org.irmacard.credentials.CredentialsException;
1821
import org.irmacard.credentials.idemix.IdemixIssuer;
@@ -30,7 +33,9 @@
3033
import javax.inject.Inject;
3134
import javax.ws.rs.*;
3235
import javax.ws.rs.core.MediaType;
36+
import java.security.KeyManagementException;
3337
import java.util.ArrayList;
38+
import java.util.Calendar;
3439
import java.util.HashMap;
3540
import javax.ws.rs.core.Context;
3641
import javax.servlet.http.HttpServletRequest;
@@ -77,13 +82,7 @@ public JwtSessionRequest getJwt(@PathParam("sessiontoken") String sessiontoken,
7782
@Produces(MediaType.APPLICATION_JSON)
7883
@Override
7984
public IrmaSession.Status getStatus(@PathParam("sessiontoken") String sessiontoken) {
80-
IrmaSession.Status status = super.getStatus(sessiontoken);
81-
82-
IssueSession session = sessions.getNonNullSession(sessiontoken);
83-
if (status == IrmaSession.Status.DONE || status == IrmaSession.Status.CANCELLED)
84-
session.close();
85-
86-
return status;
85+
return super.getStatus(sessiontoken);
8786
}
8887

8988
@DELETE @Path("/{sessiontoken}")
@@ -218,9 +217,10 @@ public ArrayList<IssueSignatureMessage> getSignatureMessages(IssueCommitmentMess
218217
if (request.getRequiredAttributes().size() > 0) {
219218
DisclosureProofRequest disclosureRequest = new DisclosureProofRequest(
220219
request.getNonce(), request.getContext(), request.getRequiredAttributes());
221-
DisclosureProofResult.Status status = disclosureRequest.verify(proofs).getStatus();
220+
DisclosureProofResult res = disclosureRequest.verify(proofs);
221+
session.setDisclosed(res);
222222

223-
switch (status) {
223+
switch (res.getStatus()) {
224224
case EXPIRED:
225225
fail(ApiError.ATTRIBUTES_EXPIRED, session);
226226
case MISSING_ATTRIBUTES:
@@ -277,4 +277,20 @@ public ArrayList<IssueSignatureMessage> getSignatureMessages(IssueCommitmentMess
277277
return null;
278278
}
279279
}
280+
281+
public DisclosureProofResult getproof(String sessiontoken) {
282+
IssueSession session = sessions.getNonNullSession(sessiontoken);
283+
DisclosureProofResult result = session.getDisclosed();
284+
if (result == null)
285+
throw new ApiException(ApiError.UNEXPECTED_REQUEST, "No attributes were disclosed in this session");
286+
result.setServiceProviderData(session.getClientRequest().getData());
287+
return result;
288+
}
289+
290+
@GET @Path("/{sessiontoken}/getproof")
291+
@Produces(MediaType.TEXT_PLAIN)
292+
public String gettoken(@PathParam("sessiontoken") String sessiontoken) throws KeyManagementException {
293+
return signResultJwt(getproof(sessiontoken), 120, "issue_result");
294+
}
295+
280296
}

src/main/java/org/irmacard/api/web/resources/VerificationResource.java

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -196,33 +196,12 @@ public DisclosureProofResult getproof(@PathParam("sessiontoken") String sessiont
196196
return result;
197197
}
198198

199-
// TODO: This seems to also return (signed) data even if the proof does not
200-
// verify, maybe we want to refuse this method if that is the case, need to
201-
// change workflow to allow this.
202199
@GET @Path("/{sessiontoken}/getproof")
203200
@Produces(MediaType.TEXT_PLAIN)
204201
public String gettoken(@PathParam("sessiontoken") String sessiontoken) throws KeyManagementException {
205202
VerificationSession session = sessions.getNonNullSession(sessiontoken);
206203
DisclosureProofResult result = getproof(sessiontoken);
207-
208-
Calendar now = Calendar.getInstance();
209-
Calendar expiry = Calendar.getInstance();
210-
expiry.add(Calendar.SECOND, session.getClientRequest().getValidity());
211-
212-
JwtBuilder builder = Jwts.builder()
213-
.setClaims(result.getAsMap())
214-
.setIssuedAt(now.getTime())
215-
.setExpiration(expiry.getTime())
216-
.setSubject("disclosure_result");
217-
218-
String jwt_issuer = ApiConfiguration.getInstance().getJwtIssuer();
219-
if (jwt_issuer != null)
220-
builder = builder.setIssuer(jwt_issuer);
221-
222-
return builder
223-
.signWith(ApiConfiguration.getInstance().getJwtAlgorithm(),
224-
ApiConfiguration.getInstance().getJwtPrivateKey())
225-
.compact();
204+
return signResultJwt(result, session.getClientRequest().getValidity(), "disclosure_result");
226205
}
227206

228207
// TODO: move to some kind of 'util class'?

src/main/java/org/irmacard/api/web/sessions/IssueSession.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.irmacard.api.web.sessions;
22

3+
import org.irmacard.api.common.disclosure.DisclosureProofResult;
34
import org.irmacard.api.common.issuing.IdentityProviderRequest;
45
import org.irmacard.api.common.issuing.IssuingRequest;
56
import org.irmacard.credentials.idemix.messages.IssueCommitmentMessage;
@@ -8,6 +9,8 @@ public class IssueSession extends IrmaSession<IdentityProviderRequest, IssuingRe
89
private IssueCommitmentMessage commitments;
910
private boolean isDistributed;
1011

12+
private DisclosureProofResult disclosed;
13+
1114
public IssueSession(boolean isDistributed) {
1215
super();
1316
this.isDistributed = isDistributed;
@@ -28,4 +31,12 @@ public void setCommitments(IssueCommitmentMessage commitments) {
2831
public boolean isDistributed() {
2932
return isDistributed;
3033
}
34+
35+
public DisclosureProofResult getDisclosed() {
36+
return disclosed;
37+
}
38+
39+
public void setDisclosed(DisclosureProofResult disclosed) {
40+
this.disclosed = disclosed;
41+
}
3142
}

0 commit comments

Comments
 (0)