//* 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.verifier;
import java.io.File;
import java.math.BigInteger;
import java.net.URI;
import java.util.ArrayList;
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.BeforeClass;
import org.junit.Test;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource.Builder;
import eu.abc4trust.returnTypes.IssuMsgOrCredDesc;
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.smartcard.SoftwareSmartcardGenerator;
import eu.abc4trust.ri.servicehelper.user.UserHelper;
import eu.abc4trust.smartcard.SoftwareSmartcard;
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 ITVerifier {
@BeforeClass
public static void resetHelpers() {
IssuanceHelper.resetInstance();
UserHelper.resetInstance();
}
public ITVerifier() {}
static ObjectFactory of = new ObjectFactory();
public static final String UNIVERSITY_IDEMIX = "UNIVERSITY_IDEMIX";
public static final String UNIVERSITY_UPROVE = "UNIVERSITY_UPROVE";
private static final String USERNAME = "defaultUser";
public static final SpecAndPolicy universityIdemix = new SpecAndPolicy(UNIVERSITY_IDEMIX,
CryptoTechnology.IDEMIX, 6, 0,
"/eu/abc4trust/sampleXml/patras/credentialSpecificationPatrasUniversity.xml",
"/eu/abc4trust/sampleXml/patras/issuancePolicyPatrasUniversity.xml");
public static final SpecAndPolicy universityUProve = new SpecAndPolicy(UNIVERSITY_UPROVE,
CryptoTechnology.UPROVE, 6, 10,
"/eu/abc4trust/sampleXml/patras/credentialSpecificationPatrasUniversity.xml",
"/eu/abc4trust/sampleXml/patras/issuancePolicyPatrasUniversity.xml");
public void initIssuer() throws Exception {
if (IssuanceHelper.isInit()) {
System.out.println("initIssuer - already setup..");
return;
}
System.out.println("setup IssuanceHelper");
IssuanceHelper.resetInstance();
String issuer_fileStoragePrefix;
if (new File("target").exists()) {
issuer_fileStoragePrefix = "target/issuer_";
} else {
issuer_fileStoragePrefix = "integration-test-verifier/target/issuer_";
}
IssuanceHelper.initInstance(1024, issuer_fileStoragePrefix, issuer_fileStoragePrefix,
new SpecAndPolicy[] {universityIdemix, universityUProve},
new ArrayList<RevocationAuthorityParameters>());
System.out.println("IssuanceHelper - done!");
}
private void initHelper(CryptoTechnology cryptoTechnology, String user) {
try {
UserHelper.resetInstance();
String targetFolderName;
if (new File("target").exists()) {
targetFolderName = "target/";
} else {
targetFolderName = "integration-test-verifier/target/";
}
String fileStoragePrefix =
targetFolderName + "user_" + user + "_" + cryptoTechnology.toString().toLowerCase() + "_";
String[] credSpecResourceList =
{"/eu/abc4trust/sampleXml/patras/credentialSpecificationPatrasUniversity.xml"};
String systemParamsResource = targetFolderName + "issuer_system_params.xml";
SystemParameters systemParameters = FileSystem.loadXmlFromResource(systemParamsResource);
List<IssuerParameters> issuerParamsList =
FileSystem.findAndLoadXmlResourcesInDir(targetFolderName, "issuer_params");
List<InspectorPublicKey> inspectorPublicKeyList = null;
List<RevocationAuthorityParameters> revocationAuthorityParametersList = null;
List<CredentialSpecification> credSpecList =
FileSystem.loadXmlListFromResources(credSpecResourceList);
UserHelper.initInstance(systemParameters, issuerParamsList, fileStoragePrefix, credSpecList,
inspectorPublicKeyList, revocationAuthorityParametersList);
URI scope = URI.create("urn:patras:registration");
SoftwareSmartcard softwareSmartcard =
SoftwareSmartcardGenerator.initSmartCard(1234, scope, systemParameters, issuerParamsList,
null, 0);
BigInteger pseValue = softwareSmartcard.computeScopeExclusivePseudonym(1234, scope);
// add to mangager
UserHelper.getInstance().cardStorage.addSmartcard(softwareSmartcard, 1234);
IssuanceHelper.getInstance().registerSmartcardScopeExclusivePseudonym(pseValue);
System.out.println("UserHelper Done");
System.out.println("UserService init ! DONE");
} catch (Exception e) {
throw new IllegalStateException("Could not start up!", e);
}
}
final static String baseUrl = "http://localhost:9091/integration-test-verifier";
public void initVerifier() throws Exception {
Client client = Client.create();
Builder initResource = client.resource(baseUrl + "/init").accept(MediaType.TEXT_PLAIN);
String response = initResource.get(String.class);
System.out.println("INIT OK !" + response);
}
@Test
public void testVerify_Patras_Idemix() throws Exception {
System.out.println("---- test Patras University Idemix----");
initIssuer();
initVerifier();
initHelper(CryptoTechnology.IDEMIX, "student_42");
issueCredential(universityIdemix);
runVerification("presentationPolicyPatrasUniversityLogin.xml");
}
@Test
public void testVerify_Patras_UProve() throws Exception {
System.out.println("---- test Patras University UProve----");
initIssuer();
initVerifier();
initHelper(CryptoTechnology.UPROVE, "student_42");
issueCredential(universityUProve);
runVerification("presentationPolicyPatrasUniversityLogin.xml");
}
private void issueCredential(SpecAndPolicy specAndPolicy) throws Exception {
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", 42);
attributeValueMap.put("urn:patras:credspec:credUniv:firstname", "Stewart");
attributeValueMap.put("urn:patras:credspec:credUniv:lastname", "Dent");
IssuanceMessage service_im =
IssuanceHelper.getInstance().initIssuance(specAndPolicy.key, attributeValueMap);
while (true) {
IssuMsgOrCredDesc resp = null;
// invoke user
resp = UserHelper.getInstance().getEngine().issuanceProtocolStepFirstChoice(USERNAME, service_im);
System.out.println(" - user im : " + resp);
if (resp.im == null) {
System.out.println(" - user cd : " + resp);
break;
}
System.out.println(" - user im : " + resp);
// invoke issuer!
System.out.println(" - invoke ABCE - next step!");
IssuanceMessageAndBoolean im_and_boolean = IssuanceHelper.getInstance().issueStep(resp.im);
service_im = im_and_boolean.getIssuanceMessage();
}
System.out.println("User now has Credential!");
}
public void runVerification(String policy) throws Exception {
System.out.println("---- runVerification : " + policy);
System.out.println("ITVerifier - getPolicy from server...");
Client client = Client.create();
Builder policyResource =
client.resource(ITVerifier.baseUrl + "/policy/" + policy).accept(MediaType.TEXT_XML);;
PresentationPolicyAlternatives pp = ((JAXBElement<PresentationPolicyAlternatives>) (Object)
policyResource.get(PresentationPolicyAlternatives.class)).getValue();
System.out.println("ITVerifier - Policy From Server : " + pp);
System.out.println("USER SIDE PresentationPolicyAlternatives : " + pp);
// System.out.println("- original size of application data : " +
// pp.getPresentationPolicy().get(0).getMessage().getApplicationData().getContent().size());
System.out.println("- XML " + XmlUtils.toXml(of.createPresentationPolicyAlternatives(pp)));
System.out.println("ITVerifier - call ABCE...");
// try {
// boolean satisfy = UserHelper.getInstance().getEngine().canBeSatisfied(pp);
// System.out.println("WE CAN CREATE PRESENTATION TOKEN !!! " + satisfy);
// } catch (Throwable e) {
// System.err.println("Call to ABCE Failed...");
// throw new Exception("Userengine failed to create Presentation Token : ", e);
// }
PresentationToken pt;
try {
pt = UserHelper.getInstance().getEngine().createPresentationTokenFirstChoice(USERNAME, pp);
System.out.println("WE HAVE A PRESENTATION TOKEN !!! " + pt);
System.out.println("- " + XmlUtils.toXml(of.createPresentationToken(pt)));
} catch (Throwable e) {
System.err.println("Call to ABCE Failed...");
throw new Exception("Userengine failed to create Presentation Token : ", e);
}
if (pt == null) {
throw new Exception("Presentation policy cannot be satisfied");
}
System.out.println("ITVerifier - present PresentationToken..." + pt);
Builder verifyResource =
client.resource(ITVerifier.baseUrl + "/verify/" + policy).type(MediaType.APPLICATION_XML)
.accept(MediaType.TEXT_XML);
JAXBElement<PresentationToken> request = of.createPresentationToken(pt);
verifyResource.post(request);
System.out.println("ITVerifier - DONE...");
}
}