//* Licensed Materials - Property of *
//* IBM *
//* Miracle A/S *
//* Alexandra Instituttet A/S *
//* *
//* eu.abc4trust.pabce.1.34 *
//* *
//* (C) Copyright IBM Corp. 2014. All Rights Reserved. *
//* (C) Copyright Miracle A/S, Denmark. 2014. All Rights Reserved. *
//* (C) Copyright Alexandra Instituttet A/S, Denmark. 2014. All *
//* Rights Reserved. *
//* US Government Users Restricted Rights - Use, duplication or *
//* disclosure restricted by GSA ADP Schedule Contract with IBM Corp. *
//* *
//* This file is licensed under the Apache License, Version 2.0 (the *
//* "License"); you may not use this file except in compliance with *
//* the License. You may obtain a copy of the License at: *
//* http://www.apache.org/licenses/LICENSE-2.0 *
//* Unless required by applicable law or agreed to in writing, *
//* software distributed under the License is distributed on an *
//* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
//* KIND, either express or implied. See the License for the *
//* specific language governing permissions and limitations *
//* under the License. *
//*/**/****************************************************************
package eu.abc4trust.ri.service.it.user;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.StringReader;
import java.math.BigInteger;
import java.net.URI;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ws.rs.core.MediaType;
import javax.xml.bind.JAXBElement;
import org.junit.After;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.UniformInterfaceException;
import com.sun.jersey.api.client.WebResource.Builder;
import eu.abc4trust.ri.servicehelper.FileSystem;
import eu.abc4trust.ri.servicehelper.issuer.CryptoTechnology;
import eu.abc4trust.ri.servicehelper.issuer.IssuanceHelper;
import eu.abc4trust.ri.servicehelper.issuer.SpecAndPolicy;
import eu.abc4trust.ri.servicehelper.user.UserHelper;
import eu.abc4trust.ri.servicehelper.verifier.VerificationHelper;
import eu.abc4trust.xml.CredentialDescription;
import eu.abc4trust.xml.CredentialSpecification;
import eu.abc4trust.xml.InspectorPublicKey;
import eu.abc4trust.xml.IssuanceMessage;
import eu.abc4trust.xml.IssuanceMessageAndBoolean;
import eu.abc4trust.xml.IssuerParameters;
import eu.abc4trust.xml.ObjectFactory;
import eu.abc4trust.xml.PresentationPolicyAlternatives;
import eu.abc4trust.xml.PresentationToken;
import eu.abc4trust.xml.RevocationAuthorityParameters;
import eu.abc4trust.xml.SystemParameters;
import eu.abc4trust.xml.util.XmlUtils;
public class ITUser {
private static final String IDCARD_ISSUANCE_WITH_KEY = "idcardIssuanceWithKey";
private static final String CREDITCARD_VISA = "CREDITCARD_VISA";
private static final String CREDITCARD_AMEX = "CREDITCARD_AMEX";
private static final String PASSPORT_CH = "PASSPORT_CH";
private static final String STUDENT_CARD = "STUDENT_CARD";
private static final String SODERHAMN_SCHOOL_IDEMIX = "SODERHAMN_SCHOOL_IDEMIX";
private static final String SODERHAMN_SCHOOL_UPROVE = "SODERHAMN_SCHOOL_UPROVE";
private static final String SODERHAMN_SUBJECT_IDEMIX = "SODERHAMN_SUBJECT_IDEMIX";
private static final String SODERHAMN_SUBJECT_UPROVE = "SODERHAMN_SUBJECT_UPROVE";
private static final String PATRAS_UNIVERSITY_IDEMIX = "PATRAS_UNIVERSITY_IDEMIX";
private static final String PATRAS_UNIVERSITY_UPROVE = "PATRAS_UNIVERSITY_UPROVE";
private static final String PATRAS_COURSE_IDEMIX = "PATRAS_COURSE_IDEMIX";
private static final String PATRAS_COURSE_UPROVE = "PATRAS_COURSE_UPROVE";
static ObjectFactory of = new ObjectFactory();
// static String issuer_fileStoragePrefix = null;
public ITUser() throws Exception {
System.out.println("ITUser");
}
public void initIssuerAndVerifier() throws Exception {
if (IssuanceHelper.isInit()) {
return;
}
System.out.println("initIssuerAndVerifier...");
System.out.println("setup IssuanceHelper");
IssuanceHelper.resetInstance();
File folder;
String issuer_fileStoragePrefix;
String verifier_fileStoragePrefix;
if (new File("target").exists()) {
issuer_fileStoragePrefix = "target/issuer_";
verifier_fileStoragePrefix = "target/verifier_";
folder = new File("target");
} else {
issuer_fileStoragePrefix = "integration-test-user/target/issuer_";
verifier_fileStoragePrefix = "integration-test-user/target/verifier_";
folder = new File("integration-test-user/target");
}
// SpecAndPolicy soderhamn_school_idemix = new SpecAndPolicy(SODERHAMN_SCHOOL_IDEMIX,
// CryptoTechnology.IDEMIX, 0,
// "/eu/abc4trust/sampleXml/soderhamn/credentialSpecificationSoderhamnSchool.xml","/eu/abc4trust/sampleXml/soderhamn/issuancePolicySoderhamnSchool.xml");
// SpecAndPolicy soderhamn_school_uprove = new SpecAndPolicy(SODERHAMN_SCHOOL_UPROVE,
// CryptoTechnology.UPROVE, 0,
// "/eu/abc4trust/sampleXml/soderhamn/credentialSpecificationSoderhamnSchool.xml","/eu/abc4trust/sampleXml/soderhamn/issuancePolicySoderhamnSchool.xml");
// SpecAndPolicy soderhamn_subject_idemix = new SpecAndPolicy(SODERHAMN_SUBJECT_IDEMIX,
// CryptoTechnology.IDEMIX, 0,
// "/eu/abc4trust/sampleXml/soderhamn/credentialSpecificationSoderhamnSubject.xml","/eu/abc4trust/sampleXml/soderhamn/issuancePolicySoderhamnSubject.xml");
// SpecAndPolicy soderhamn_subject_uprove = new SpecAndPolicy(SODERHAMN_SUBJECT_UPROVE,
// CryptoTechnology.UPROVE, 0,
// "/eu/abc4trust/sampleXml/soderhamn/credentialSpecificationSoderhamnSubject.xml","/eu/abc4trust/sampleXml/soderhamn/issuancePolicySoderhamnSubject.xml");
SpecAndPolicy patras_university_idemix =
new SpecAndPolicy(PATRAS_UNIVERSITY_IDEMIX, CryptoTechnology.IDEMIX, 6, 0,
"/eu/abc4trust/sampleXml/patras/credentialSpecificationPatrasUniversity.xml",
"/eu/abc4trust/sampleXml/patras/issuancePolicyPatrasUniversity.xml");
SpecAndPolicy patras_university_uprove =
new SpecAndPolicy(PATRAS_UNIVERSITY_UPROVE, CryptoTechnology.UPROVE, 6, 10,
"/eu/abc4trust/sampleXml/patras/credentialSpecificationPatrasUniversity.xml",
"/eu/abc4trust/sampleXml/patras/issuancePolicyPatrasUniversity.xml");
SpecAndPolicy patras_cource_idemix =
new SpecAndPolicy(PATRAS_COURSE_IDEMIX, CryptoTechnology.IDEMIX, 2, 0,
"/eu/abc4trust/sampleXml/patras/credentialSpecificationPatrasCourse.xml",
"/eu/abc4trust/sampleXml/patras/issuancePolicyPatrasCourse.xml");
SpecAndPolicy patras_cource_uprove =
new SpecAndPolicy(PATRAS_COURSE_UPROVE, CryptoTechnology.UPROVE, 2, 1,
"/eu/abc4trust/sampleXml/patras/credentialSpecificationPatrasCourse.xml",
"/eu/abc4trust/sampleXml/patras/issuancePolicyPatrasCourse.xml");
SpecAndPolicy[] specAndPolicyList =
new SpecAndPolicy[] {
// soderhamn_school_idemix, soderhamn_school_uprove, soderhamn_subject_idemix,
// soderhamn_subject_uprove,
patras_university_idemix, patras_university_uprove, patras_cource_idemix,
patras_cource_uprove};
IssuanceHelper.initInstance(1024, issuer_fileStoragePrefix, issuer_fileStoragePrefix,
specAndPolicyList, new ArrayList<RevocationAuthorityParameters>());
System.out.println("IssuanceHelper - done!");
System.out.println("Setup VerificationHelper");
VerificationHelper.resetInstance();
String[] presentationPolicyResources =
{"/eu/abc4trust/sampleXml/presentationPolicies/presentationPolicySimpleIdentitycard.xml",
"/eu/abc4trust/sampleXml/soderhamn/presentationPolicySoderhamnSchool.xml",
"/eu/abc4trust/sampleXml/soderhamn/presentationPolicyRASubjectMustBeFrench.xml",
"/eu/abc4trust/sampleXml/soderhamn/presentationPolicyRASubjectMustBeEnglish.xml",
"/eu/abc4trust/sampleXml/patras/presentationPolicyPatrasCourseEvaluation.xml",
"/eu/abc4trust/sampleXml/patras/presentationPolicyPatrasUniversityLogin.xml"};
String[] credSpecResourceList =
{"/eu/abc4trust/sampleXml/credspecs/credentialSpecificationSimpleIdentitycard.xml",
"/eu/abc4trust/sampleXml/soderhamn/credentialSpecificationSoderhamnSchool.xml",
"/eu/abc4trust/sampleXml/soderhamn/credentialSpecificationSoderhamnSubject.xml",
"/eu/abc4trust/sampleXml/patras/credentialSpecificationPatrasUniversity.xml",
"/eu/abc4trust/sampleXml/patras/credentialSpecificationPatrasCourse.xml"};
List<CredentialSpecification> credSpecList =
FileSystem.loadXmlListFromResources(credSpecResourceList);
List<IssuerParameters> issuerParamsList =
FileSystem.findAndLoadXmlResoucesInDir(folder, "issuer_params");
List<InspectorPublicKey> inspectorPublicKeyList = null;
List<RevocationAuthorityParameters> revAuthParamsList = null;
String systemParamResource = issuer_fileStoragePrefix + UserHelper.SYSTEM_PARAMS_XML_NAME;
SystemParameters systemParams = FileSystem.loadXmlFromResource(systemParamResource);
VerificationHelper.initInstance(systemParams, issuerParamsList, credSpecList,
inspectorPublicKeyList, revAuthParamsList, verifier_fileStoragePrefix,
presentationPolicyResources);
}
final static String baseUrl = "http://localhost:9119/integration-test-user";
public void initUser(CryptoTechnology cryptoTechnology, String user) throws Exception {
Client client = Client.create();
Builder initResource =
client.resource(baseUrl + "/init/" + cryptoTechnology.toString() + "?user=" + user).accept(
MediaType.TEXT_PLAIN);
String response = initResource.get(String.class);
System.out.println("INIT OK - pseudonymValue!" + response);
BigInteger pseValue = new BigInteger(response);
IssuanceHelper.getInstance().registerSmartcardScopeExclusivePseudonym(pseValue);
}
// @After
// public void resetIssuerEngine() throws Exception {
// Client client = Client.create();
// Builder initResource = client.resource(baseUrl + "/reset/").accept(MediaType.TEXT_PLAIN);
//
// String response = initResource.get(String.class);
// System.out.println("Reset OK !" + response);
//
// IssuanceHelper.resetInstance();
// UserHelper.resetInstance();
// VerificationHelper.resetInstance();
// }
//
// ***************************************************************************************
// @Test
public void test_Soderhamn_Emil_Idemix() throws Exception {
this.soderhamn_Emil_IssueCredentials(CryptoTechnology.IDEMIX, "emil_idemix");
this.soderhamn_Emil_PresentCredentials(CryptoTechnology.IDEMIX, "emil_idemix");
}
// @Test
public void test_Soderhamn_Emil_UProve() throws Exception {
this.soderhamn_Emil_IssueCredentials(CryptoTechnology.IDEMIX, "emil_uprove");
this.soderhamn_Emil_PresentCredentials(CryptoTechnology.IDEMIX, "emil_uprove");
}
private void soderhamn_Emil_IssueCredentials(CryptoTechnology cryptTechnology, String user)
throws Exception {
System.out.println("START : soderhamn_Emil_IssueCredentials : " + cryptTechnology);
this.initIssuerAndVerifier();
this.initUser(cryptTechnology, user);
// School credential
System.out.println("Issue Soderhamn School Credential!");
Map<String, Object> attributeValueMap = new HashMap<String, Object>();
attributeValueMap.put("urn:soderhamn:credspec:credSchool:firstname", "Emil");
attributeValueMap.put("urn:soderhamn:credspec:credSchool:lastname", "von Katthult Svensson");
attributeValueMap.put("urn:soderhamn:credspec:credSchool:civicRegistrationNumber", "42");
attributeValueMap.put("urn:soderhamn:credspec:credSchool:gender", "M");
attributeValueMap.put("urn:soderhamn:credspec:credSchool:schoolname", "L\u00f6nneberga");
Calendar cal = Calendar.getInstance();
cal.set(2000, 01, 10);
attributeValueMap.put("urn:soderhamn:credspec:credSchool:birthdate", cal);
// call issuer
IssuanceMessage im_with_policy =
IssuanceHelper.getInstance().initIssuance("SODERHAMN_SCHOOL_" + cryptTechnology,
attributeValueMap);
this.finishIssuing(im_with_policy);
// Subject credential
System.out.println("Issue Soderhamn School Credential!");
attributeValueMap = new HashMap<String, Object>();
String subject = "French";
// attributeValueMap.put("urn:soderhamn:credspec:credSubject:subject", "French");
attributeValueMap.put("urn:soderhamn:credspec:credSubject:maths", "maths".equals(subject));
attributeValueMap.put("urn:soderhamn:credspec:credSubject:physics", "physics".equals(subject));
attributeValueMap.put("urn:soderhamn:credspec:credSubject:English", "English".equals(subject));
attributeValueMap.put("urn:soderhamn:credspec:credSubject:French", "French".equals(subject));
attributeValueMap
.put("urn:soderhamn:credspec:credSubject:subject1", "subject1".equals(subject));
attributeValueMap
.put("urn:soderhamn:credspec:credSubject:subject2", "subject2".equals(subject));
attributeValueMap
.put("urn:soderhamn:credspec:credSubject:subject3", "subject3".equals(subject));
attributeValueMap
.put("urn:soderhamn:credspec:credSubject:subject4", "subject4".equals(subject));
attributeValueMap
.put("urn:soderhamn:credspec:credSubject:subject5", "subject5".equals(subject));
// call issuer
im_with_policy =
IssuanceHelper.getInstance().initIssuance("SODERHAMN_SUBJECT_" + cryptTechnology,
attributeValueMap);
this.finishIssuing(im_with_policy);
System.out.println("DONE : soderhamn_Emil_IssueCredentials..");
}
private void soderhamn_Emil_PresentCredentials(CryptoTechnology cryptTechnology, String user)
throws Exception {
this.initIssuerAndVerifier();
this.initUser(cryptTechnology, user);
// School credential
System.out.println("Present Soderhamn Smartcard Pseudonym!");
this.runVerification("presentationPolicySoderhamnSchool.xml", true);
// Subject credential
System.out.println("Present Soderhamn Subject Credential - pseudonym being established!");
this.runVerification("presentationPolicyRASubjectMustBeFrench.xml", true);
// Subject pseudonym
System.out.println("Present Soderhamn Subject Credential - pseudonym is used!");
this.runVerification("presentationPolicyRASubjectMustBeFrench.xml", true);
// Subject credential - english not satisfied
System.out.println("Present Soderhamn Subject Credential - Not Satisfied!!");
this.runVerification("presentationPolicyRASubjectMustBeEnglish.xml", false);
}
// ***************************************************************************************
@Test
public void test_Patras_Student_Idemix() throws Exception {
this.initIssuerAndVerifier();
this.initUser(CryptoTechnology.IDEMIX, "student_idemix");
this.patras_Student_IssueCredentials(CryptoTechnology.IDEMIX, "student_idemix", 42);
this.patras_Student_PresentCredentials(CryptoTechnology.IDEMIX, "student_idemix", 42);
}
// @Test
public void test_Patras_Student_UProve() throws Exception {
this.initIssuerAndVerifier();
this.initUser(CryptoTechnology.UPROVE, "student_idemix");
this.patras_Student_IssueCredentials(CryptoTechnology.UPROVE, "student_uprove", 42);
this.patras_Student_PresentCredentials(CryptoTechnology.UPROVE, "student_uprove", 42);
}
private void patras_Student_IssueCredentials(CryptoTechnology cryptoTechnology, String user,
int matriculationnumber) throws Exception {
// University credential
System.out.println("Issue Patras University Credential!");
Map<String, Object> attributeValueMap = new HashMap<String, Object>();
attributeValueMap.put("urn:patras:credspec:credUniv:university", "Patras");
attributeValueMap.put("urn:patras:credspec:credUniv:department", "CTI");
attributeValueMap.put("urn:patras:credspec:credUniv:matriculationnr", matriculationnumber);
if (matriculationnumber == 42) {
attributeValueMap.put("urn:patras:credspec:credUniv:firstname", "Stewart");
attributeValueMap.put("urn:patras:credspec:credUniv:lastname", "Dent");
} else if (matriculationnumber == 1235332) {
attributeValueMap.put("urn:patras:credspec:credUniv:firstname", "John");
attributeValueMap.put("urn:patras:credspec:credUniv:lastname", "Doe");
} else if (matriculationnumber == 666) {
attributeValueMap.put("urn:patras:credspec:credUniv:firstname", "Eve");
attributeValueMap.put("urn:patras:credspec:credUniv:lastname", "Cheater");
} else {
throw new IllegalStateException(
"Matriculationnumber issuance only defined for john(1235332), stewart (42) + Eve (666)!");
}
// call issuer
IssuanceMessage im_with_policy =
IssuanceHelper.getInstance().initIssuance("PATRAS_UNIVERSITY_" + cryptoTechnology,
attributeValueMap);
this.finishIssuing(im_with_policy);
// Course credential
System.out.println("Issue Patras Course Credential!");
attributeValueMap.clear();
attributeValueMap.put("urn:patras:credspec:credCourse:courseid", "The-very-cool-course");
// attributeValueMap.put("urn:patras:credspec:credCourse:matriculationnr", matriculationnumber);
// call issuer
im_with_policy =
IssuanceHelper.getInstance().initIssuance("PATRAS_COURSE_" + cryptoTechnology,
attributeValueMap);
this.finishIssuing(im_with_policy);
}
private void patras_Student_PresentCredentials(CryptoTechnology cryptoTechnology, String user,
int matriculationnumber) throws Exception {
// School credential
System.out.println("Present Patras Smartcard Pseudonym!");
this.runVerification("presentationPolicyPatrasUniversityLogin.xml", true);
// Course credential
System.out.println("Present Patras Course Credential - pseudonym is established!");
this.runVerification("presentationPolicyPatrasCourseEvaluation.xml", true);
// Course credential
System.out.println("Present Patras Course Credential - pseudonym is used!");
this.runVerification("presentationPolicyPatrasCourseEvaluation.xml", true);
}
// ***************************************************************************************
// @Test
public void testIssuance_Alice_SimpleIdentitycard() throws Exception {
// testListCredentials();
this.initUser(CryptoTechnology.IDEMIX, "alice");
Map<String, Object> attributeValueMap = new HashMap<String, Object>();
attributeValueMap.put("Firstname", "Alice");
attributeValueMap.put("Lastname", "Nexdoor");
Calendar bd = Calendar.getInstance();
bd.set(1970, 1, 1, 0, 0, 0);
attributeValueMap.put("Birthday", bd);
// call issuer
System.out.println(" - invoke ABCE - using IssuanceHelper!");
IssuanceMessage im_with_policy =
IssuanceHelper.getInstance().initIssuance(IDCARD_ISSUANCE_WITH_KEY, attributeValueMap);
this.finishIssuing(im_with_policy);
}
// @Test
public void testVerification_simpleIdcard() throws Exception {
System.out.println("---- testVerification_simpleIdcard ----");
this.runVerification("presentationPolicySimpleIdentitycard.xml", true);
}
// NOTE ONLY ONE TEST CAN RUN AGAINST USER - for now - needs to changes 'storage'
// @Test
public void testIssuance_Stewart_IDCardAndCreditcards() throws Exception {
Map<String, Object> attributeValueMap = new HashMap<String, Object>();
attributeValueMap.put("Firstname", "Stewart");
attributeValueMap.put("Lastname", "Dent");
Calendar bd = Calendar.getInstance();
bd.set(1995, 1, 1, 0, 0, 0);
attributeValueMap.put("Birthday", bd);
// call issuer
System.out.println(" - invoke ABCE - using IssuanceHelper!");
IssuanceMessage idcard_im =
IssuanceHelper.getInstance().initIssuance(IDCARD_ISSUANCE_WITH_KEY, attributeValueMap);
this.finishIssuing(idcard_im);
this.issuePassport("stewart");
this.issueStudentCard();
}
// NOTE ONLY ONE TEST CAN RUN AGAINST USER - for now - needs to changes 'storage'
// @Test
public void testIssuance_JohnDow_Creditcards() throws Exception {
this.testListCredentials();
this.issueCreditCard("johndow", CREDITCARD_VISA);
this.issueCreditCard("johndow", CREDITCARD_AMEX);
}
private void issueCreditCard(String user, String card) throws Exception {
System.out.println("issueCreditCard " + card);
Map<String, Object> attributeValueMap = new HashMap<String, Object>();
int cardNumber = 42;
if (CREDITCARD_VISA.equals(card)) {
attributeValueMap.put("http://abc4trust.eu/wp2/abcschemav1.0/revocationhandle",
"http://visa.com/creditcard/revocation/parameters");
} else {
attributeValueMap.put("http://abc4trust.eu/wp2/abcschemav1.0/revocationhandle",
"http://amex.com/amexcard/revocation/parameters");
cardNumber += 1000;
}
Calendar cal = Calendar.getInstance();
if ("alice".equals(user)) {
attributeValueMap.put("Name", "Alice");
attributeValueMap.put("LastName", "Nextdoor");
cal.set(2014, 1, 1, 0, 0, 0);
attributeValueMap.put("CardType", "Gold");
} else if ("johndow".equals(user)) {
cardNumber += 20000;
attributeValueMap.put("Name", "John");
attributeValueMap.put("LastName", "Dow");
cal.set(2016, 1, 1, 0, 0, 0);
attributeValueMap.put("CardType", "Black");
}
attributeValueMap.put("CardNumber", BigInteger.valueOf(cardNumber));
attributeValueMap.put("ExpirationDate", cal.getTime());
attributeValueMap.put("SecurityCode", 1);
attributeValueMap.put("Status", "status");
System.out.println(" - invoke ABCE - using IssuanceHelper!");
IssuanceMessage im_with_policy =
IssuanceHelper.getInstance().initIssuance(card, attributeValueMap);
this.finishIssuing(im_with_policy);
}
private void issuePassport(String user) throws Exception {
System.out.println("issuePassport " + user);
Map<String, Object> attributeValueMap = new HashMap<String, Object>();
if ("stewart".equals(user)) {
attributeValueMap.put("http://abc4trust.eu/wp2/abcschemav1.0/revocationhandle",
"http://admin.ch/passport/revocation/parameters");
attributeValueMap.put("Name", "Stewart");
attributeValueMap.put("LastName", "Dent");
attributeValueMap.put("PassportNumber", 1);
Calendar cal = Calendar.getInstance();
cal.set(2012, 1, 1, 0, 0, 0);
attributeValueMap.put("Issued", cal.getTime());
cal.set(2015, 1, 1, 0, 0, 0);
attributeValueMap.put("Expires", cal.getTime());
attributeValueMap.put("IssuedBy", "service_issuer_integration_test");
} else if ("alice".equals(user)) {
attributeValueMap.put("http://abc4trust.eu/wp2/abcschemav1.0/revocationhandle",
"http://admin.ch/passport/revocation/parameters");
attributeValueMap.put("Name", "Alice");
attributeValueMap.put("LastName", "Nextdoor");
attributeValueMap.put("PassportNumber", 42);
Calendar cal = Calendar.getInstance();
cal.set(2011, 1, 1, 0, 0, 0);
attributeValueMap.put("Issued", cal.getTime());
cal.set(2014, 1, 1, 0, 0, 0);
attributeValueMap.put("Expires", cal.getTime());
attributeValueMap.put("IssuedBy", "service_issuer_integration_test");
} else {
throw new IllegalStateException("Passport - user not defined in testcase : " + user);
}
System.out.println(" - invoke ABCE - using IssuanceHelper!");
IssuanceMessage im_with_policy =
IssuanceHelper.getInstance().initIssuance(PASSPORT_CH, attributeValueMap);
this.finishIssuing(im_with_policy);
}
private void issueStudentCard() throws Exception {
System.out.println("issueStudentCard ");
Map<String, Object> attributeValueMap = new HashMap<String, Object>();
/*
* <abc:AttributeDescription Type="Name" DataType="xs:string"
* Encoding="urn:abc4trust:1.0:encoding:string:sha-256"/> <abc:AttributeDescription
* Type="LastName" DataType="xs:string" Encoding="urn:abc4trust:1.0:encoding:string:sha-256"/>
* <abc:AttributeDescription Type="StudentNumber" DataType="xs:integer"
* Encoding="urn:abc4trust:1.0:encoding:integer:signed"/> <abc:AttributeDescription
* Type="Issued" DataType="xs:date" Encoding="urn:abc4trust:1.0:encoding:date:unix:signed"/>
* <abc:AttributeDescription Type="Expires" DataType="xs:date"
* Encoding="urn:abc4trust:1.0:encoding:date:unix:signed"/> <abc:AttributeDescription
* Type="IssuedBy" DataType="xs:string" Encoding="urn:abc4trust:1.0:encoding:string:sha-256"/>
*/
int studentNumber = 42;
attributeValueMap.put("http://abc4trust.eu/wp2/abcschemav1.0/revocationhandle",
"http://visa.com/creditcard/revocation/parameters");
attributeValueMap.put("Name", "Stewart");
attributeValueMap.put("LastName", "Dent");
attributeValueMap.put("StudentNumber", BigInteger.valueOf(studentNumber));
Calendar calIss = Calendar.getInstance();
calIss.set(2012, 1, 1, 0, 0, 0);
Calendar calExpr = Calendar.getInstance();
calExpr.set(2014, 1, 1, 0, 0, 0);
attributeValueMap.put("Issued", calIss.getTime());
attributeValueMap.put("Expires", calExpr.getTime());
attributeValueMap.put("IssuedBy", "service_issuer_integration_test");
System.out.println(" - invoke ABCE - using IssuanceHelper!");
IssuanceMessage im_with_policy =
IssuanceHelper.getInstance().initIssuance(STUDENT_CARD, attributeValueMap);
this.finishIssuing(im_with_policy);
}
private void finishIssuing(IssuanceMessage service_im) throws Exception {
// simulates plugin
Client client = Client.create();
Builder issuanceProtocolStep =
client.resource(ITUser.baseUrl + "/user/issuanceProtocolStep")
.type(MediaType.APPLICATION_XML).accept(MediaType.TEXT_XML);
while (true) {
IssuanceMessage resp = null;
// invoke user
try {
resp = ((JAXBElement<IssuanceMessage>)(Object)
issuanceProtocolStep.post(IssuanceMessage.class, of.createIssuanceMessage(service_im))).getValue();
System.out.println(" - response : " + resp);
} catch (UniformInterfaceException e) {
if (e.getResponse().getStatus() == 204) {
System.out.println("Status 204 from user service !!");
System.out.println(" - done...");
return;
} else {
System.err.println(" - UniformInterfaceException : " + e.getResponse());
System.err.println(" - UniformInterfaceException : " + e.getResponse().getStatus());
throw new Exception("Unexpected responce from UserService : "
+ e.getResponse().getStatus());
}
}
// invoke issuer!
System.out.println(" - invoke ABCE - next step!");
IssuanceMessageAndBoolean im_and_boolean = IssuanceHelper.getInstance().issueStep(resp);
service_im = im_and_boolean.getIssuanceMessage();
}
}
private void runVerification(String policy, boolean satisfiesPresentationPolicy) throws Exception {
System.out.println("---- runVerification : " + policy);
byte[] nonce = VerificationHelper.getInstance().generateNonce();
// get presentation policy
PresentationPolicyAlternatives presentationPolicyAlternatives =
VerificationHelper.getInstance().createPresentationPolicy(policy, nonce, null, null);
//
Client client = Client.create();
Builder verificationStartResource =
client.resource(ITUser.baseUrl + "/user/createPresentationToken")
.type(MediaType.APPLICATION_XML).accept(MediaType.TEXT_XML);
// post to UserService
PresentationToken pt_object;
try {
pt_object = ((JAXBElement<PresentationToken>) (Object)
verificationStartResource.post(PresentationToken.class,
of.createPresentationPolicyAlternatives(presentationPolicyAlternatives))).getValue();
} catch (UniformInterfaceException e) {
if (e.getResponse().getStatus() == 406) {
if (satisfiesPresentationPolicy) {
Assert.assertTrue("Policy : " + policy + " - could not be satisfied - NOT EXPECTED",
false);
} else {
System.out.println("Policy : " + policy + " - could not be satisfied - AS EXPECTED ");
Assert
.assertTrue("Policy : " + policy + " - could not be satisfied - AS EXPECTED ", true);
}
return;
} else {
throw e;
}
}
// verify response
System.out.println(" - response from UserService : " + pt_object);
try {
System.out.println(" - response from UserService : "
+ XmlUtils.toXml(of.createPresentationToken(pt_object)));
} catch (Exception e) {
System.err.println(" - could not validate PresentationToken XML!");
e.printStackTrace();
}
PresentationToken presentationToken;
if (pt_object instanceof PresentationToken) {
presentationToken = pt_object;
// VerificationHelper.getInstance().verifyToken(policy, nonce, null, presentationToken);
VerificationHelper.getInstance().verifyToken(presentationPolicyAlternatives,
presentationToken);
System.out.println("OK From Verification Helper !");
} else {
System.out.println("Wrong Response from UserService");
throw new Exception("Wrong Response from UserService");
}
System.out.println(" - done...");
}
// @Test
public void testUpdateNonRevocationEvidence() throws Exception {
System.out.println("---- testUpdateNonRevocationEvidence ----");
Client client = Client.create();
Builder updateNonRevocationEvidence =
client.resource(ITUser.baseUrl + "/user/updateNonRevocationEvidence")
.type(MediaType.APPLICATION_XML).accept(MediaType.TEXT_XML);
try {
updateNonRevocationEvidence.post();
System.out.println("- OK");
} catch (Exception e) {
System.err.println("- FAILED");
e.printStackTrace();
}
}
static URI firstCredential = null;
// @Test
public void testListCredentials() throws Exception {
System.out.println("---- testListCredentials ----");
Client client = Client.create();
Builder listCredentials =
client.resource(ITUser.baseUrl + "/user/listCredentials").type(MediaType.APPLICATION_XML)
.accept(MediaType.TEXT_PLAIN);
try {
String resp = listCredentials.post(String.class);
System.out.println("Credentials in UserEngine : \n" + resp);
BufferedReader reader = new BufferedReader(new StringReader(resp));
List<URI> list = new ArrayList<URI>();
String line = null;
while ((line = reader.readLine()) != null) {
URI credential = new URI(line);
this.printCredentialDescription(credential);
if (firstCredential == null) {
firstCredential = credential;
}
list.add(credential);
}
System.out.println("- OK " + list);
} catch (Exception e) {
System.err.println("- FAILED");
e.printStackTrace();
}
System.out.println("- First credential used in other tests ! " + firstCredential);
}
// @Test
public void testGetCredentialDescription() throws Exception {
URI uri;
if (firstCredential != null) {
uri = firstCredential;
} else {
uri = new URI("http://asdf.gh/jkl");
}
this.printCredentialDescription(uri);
}
private void printCredentialDescription(URI credentialUID) throws Exception {
System.out.println("---- testGetCredentialDescription ---- credential : " + firstCredential);
Client client = Client.create();
Builder getCredentialDescription =
client.resource(ITUser.baseUrl + "/user/getCredentialDescription")
.type(MediaType.TEXT_PLAIN).accept(MediaType.TEXT_XML);
CredentialDescription resp =
getCredentialDescription.post(CredentialDescription.class, credentialUID.toString());
System.out.println("- OK " + resp);
System.out.println("- OK " + XmlUtils.toXml(of.createCredentialDescription(resp), true));
}
// @Test
public void testDeleteCredentialDescription() throws Exception {
System.out.println("---- testDeleteCredential ----");
Client client = Client.create();
Builder deleteCredentialDescription =
client.resource(ITUser.baseUrl + "/user/deleteCredential").type(MediaType.TEXT_PLAIN)
.accept(MediaType.TEXT_XML);
URI uri;
if (firstCredential != null) {
uri = firstCredential;
} else {
uri = new URI("http://asdf.gh/jkl");
}
deleteCredentialDescription.post(uri.toString());
System.out.println("- OK");
}
protected void copySystemParameters() throws IOException {
this.copySystemParameters("issuer_system_params");
this.copySystemParameters("issuer_system_params_bridged_human_readable_only_for_reference.xml");
}
private void copySystemParameters(String filename) throws IOException {
File file = null;
file =
new File("src" + File.separatorChar + "test" + File.separatorChar + "resources"
+ File.separatorChar + filename);
if (!file.exists()) {
throw new FileNotFoundException("File does not exist on path: \"" + filename + "\"");
}
// new File().mkdirs();
FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(new File("target" + File.separatorChar + filename));
byte[] bytes = new byte[1];
while (fis.read(bytes) != -1) {
fos.write(bytes);
}
fis.close();
fos.close();
}
}