//* 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.revocation;
import java.io.File;
import java.math.BigInteger;
import java.net.URI;
import java.net.URLEncoder;
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.Ignore;
import org.junit.Test;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource.Builder;
import com.sun.jersey.api.client.filter.LoggingFilter;
import eu.abc4trust.abce.internal.revocation.RevocationConstants;
import eu.abc4trust.returnTypes.IssuMsgOrCredDesc;
import eu.abc4trust.ri.service.revocation.RevocationService;
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.ri.servicehelper.verifier.VerificationHelper;
import eu.abc4trust.smartcard.SoftwareSmartcard;
import eu.abc4trust.xml.Attribute;
import eu.abc4trust.xml.AttributeList;
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.RevocationInformation;
import eu.abc4trust.xml.SystemParameters;
import eu.abc4trust.xml.util.XmlUtils;
public class ITRevocation {
final static String baseUrl = "http://localhost:9094/integration-test-revocation";
private static final String USERNAME = "defaultUser";
public ITRevocation() {}
ObjectFactory of = new ObjectFactory();
// @Test
public void verifyPresentationTokenWithRevocation() throws Exception {
System.out.println("---- verifyPresentationTokenWithRevocation ----");
this.initIssuer();
System.out.println("-- init revocation authority in service");
Client client = Client.create();
client.addFilter(new LoggingFilter());
Builder initResource = client.resource(baseUrl + "/init/patras").accept(MediaType.TEXT_PLAIN);
String response = initResource.get(String.class);
System.out.println("-- init revocation authority in service DONE" + response);
// re-init Issuer With RevocationAuthorities
this.initIssuer();
System.out.println("-- init local engines for issuer, verifier and user");
this.initVerifierAndUser(CryptoTechnology.IDEMIX);
CredentialDescription credentialDescription = null;
Map<String, Object> attributeValueMap = new HashMap<String, Object>();
IssuanceMessage service_im;
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");
service_im = IssuanceHelper.getInstance().initIssuance(UNIVERSITY_IDEMIX, attributeValueMap);
// }
while (true) {
// System.out.println("ISSUER IM : \n"
// + XmlUtils.toXml(new ObjectFactory().createIssuanceMessage((service_im))));
System.out.println("ISSUER IM : " + service_im);
IssuMsgOrCredDesc user_im = null;
// invoke user
user_im = UserHelper.getInstance().getEngine().issuanceProtocolStepFirstChoice(USERNAME, service_im);
System.out.println(" - user im : " + user_im);
if (user_im.im == null) {
System.out.println(" - protocol finished... BREAK : " + user_im);
System.out.println(" - protocol finished... BREAK : " + user_im.im);
System.out.println(" - protocol finished... BREAK : " + user_im.cd);
credentialDescription = user_im.cd;
break;
}
// System.out.println("USER IM : \n"
// + XmlUtils.toXml(new ObjectFactory().createIssuanceMessage((user_im.im))));
System.out.println("USER IM : " + user_im.im);
// invoke issuer!
System.out.println(" - invoke ABCE - next step!");
IssuanceMessageAndBoolean im_and_boolean = IssuanceHelper.getInstance().issueStep(user_im.im);
service_im = im_and_boolean.getIssuanceMessage();
if (im_and_boolean.isLastMessage()) {
System.out.println("LastMessage ON SERVER ! " + service_im.getContext() + " ; "
+ im_and_boolean.getIssuanceLogEntryURI() + " : "
+ im_and_boolean.getIssuanceMessage().getContent());
for (Object o : service_im.getContent()) {
if (o instanceof JAXBElement<?>) {
Object abc = ((JAXBElement<?>) o).getValue();
System.out.println(" - " + abc);
if (abc instanceof CredentialDescription) {
credentialDescription = (CredentialDescription) abc;
}
} else {
System.out.println(" - " + o);
}
}
} else {
System.out.println("NOT LAST!");
}
}
System.out.println("User now has Credential! " + credentialDescription);
System.out.println(" :: " + UserHelper.getInstance().credentialManager.listCredentials(USERNAME));
URI credUri = UserHelper.getInstance().credentialManager.listCredentials(USERNAME).get(0);
credentialDescription =
UserHelper.getInstance().credentialManager.getCredentialDescription(USERNAME, credUri);
System.out.println("credentialDescription : "
+ XmlUtils.toXml(of.createCredentialDescription(credentialDescription)));
// run presentation with Revokable Credential...
this.runPresenationWithRevokableCredential(true);
// DO REVOCATION!
Attribute attribute = null;
for (Attribute a : credentialDescription.getAttribute()) {
if (a.getAttributeDescription().getType().compareTo(RevocationConstants.REVOCATION_HANDLE) == 0) {
attribute = a;
}
}
RevocationInformation riFromRevocation = null;
if (attribute != null) {
System.out.println("Revoke Credential - by Attribute ! : " + attribute);
AttributeList list = new AttributeList();
list.getAttributes().add(attribute);
Builder revokeResource =
client.resource(
baseUrl
+ "/revocation/revokeAttribute/"
+ URLEncoder.encode(RevocationService.patrasRevocationAuthority.toString(),
"UTF-8")).accept(MediaType.APPLICATION_XML);
riFromRevocation = ((JAXBElement<RevocationInformation>)(Object)
revokeResource.post(RevocationInformation.class, this.of.createAttribute(attribute))).getValue();
System.out.println("XXX GET RI 1 " + riFromRevocation.getRevocationInformationUID());
}
this.runPresenationWithRevokableCredential(false);
System.out.println("Revocation Test ! OK ");
}
private void runPresenationWithRevokableCredential(
/* RevocationInformation revocationInformation, */boolean verify_ok) throws Exception {
// create presentation token!
System.out.println("#####################################################");
System.out.println("Create PresentationPolicy");
String applicationData = null;
// String policyName = "presentationPolicySoderhamnSchoolWithInspection.xml";
String policyName = "presentationPolicyPatrasUniversityForRevocation.xml";
byte[] nonce = VerificationHelper.getInstance().generateNonce();
PresentationPolicyAlternatives policy =
VerificationHelper.getInstance().createPresentationPolicy(policyName, nonce,
applicationData, null);
System.out.println("Created PresentationPolicy " + policy);
System.out.println("Created PresentationPolicy "
+ XmlUtils.toXml(this.of.createPresentationPolicyAlternatives(policy)));
//
PresentationToken presentationToken =
UserHelper.getInstance().getEngine().createPresentationTokenFirstChoice(USERNAME, policy);
if (!verify_ok && (presentationToken == null)) {
System.out.println("Could not create presentationToken - this was expected!");
return;
}
System.out.println("Created PresentationToken " + presentationToken);
System.out.println("Created PresentationToken "
+ XmlUtils.toXml(this.of.createPresentationToken(presentationToken)));
Exception failure = null;
try {
VerificationHelper.getInstance().verifyToken(policy, // policyName, nonce, applicationData,
presentationToken);
} catch (Exception e) {
failure = e;
}
if (verify_ok) {
if (failure == null) {
System.out.println("Verify OK!");
} else {
throw new Exception("Verification Should not Fail ??", failure);
}
} else {
if (failure == null) {
System.out.println("Verify Should Fail!");
throw new IllegalStateException("Verify Should Fail!");
} else {
System.out.println("Verify Failed as expected!");
}
}
}
public static final String UNIVERSITY_IDEMIX = "UNIVERSITY_IDEMIX";
public static final SpecAndPolicy universityIdemix = new SpecAndPolicy(UNIVERSITY_IDEMIX,
CryptoTechnology.IDEMIX, null, 6, 0,
"/eu/abc4trust/sampleXml/patras/credentialSpecificationPatrasUniversityWithRevocation.xml",
"/eu/abc4trust/sampleXml/patras/issuancePolicyPatrasUniversity.xml",
RevocationService.patrasRevocationAuthority.toString());
public void initIssuer() throws Exception {
System.out.println("initIssuer(CryptoEngine...");
System.out.println("setup IssuanceHelper");
IssuanceHelper.resetInstance();
// File folder;
String issuer_fileStoragePrefix;
File folder;
if (new File("target").exists()) {
issuer_fileStoragePrefix = "target/issuer_";
folder = new File("target");
} else {
issuer_fileStoragePrefix = "integration-test-user/target/issuer_";
folder = new File("integration-test-user/target");
}
List<RevocationAuthorityParameters> revocationAuthorityParameters =
FileSystem.findAndLoadXmlResoucesInDir(folder, "revocation_revocation_authority");
IssuanceHelper.initInstance(1024, issuer_fileStoragePrefix, issuer_fileStoragePrefix,
new SpecAndPolicy[] {universityIdemix}, revocationAuthorityParameters);
System.out.println("IssuanceHelper - done!");
}
public void initVerifierAndUser(CryptoTechnology cryptoTechnology) throws Exception {
System.out.println("initIssuerAndUser : " + cryptoTechnology);
File folder;
// String issuer_fileStoragePrefix;
String verifier_fileStoragePrefix;
String user_fileStoragePrefix;
if (new File("target").exists()) {
verifier_fileStoragePrefix = "target/verifier_";
user_fileStoragePrefix = "target/user_";
folder = new File("target");
} else {
verifier_fileStoragePrefix = "integration-test-inspector/target/verifier_";
user_fileStoragePrefix = "integration-test-inspector/target/user_";
folder = new File("integration-test-inspector/target");
}
user_fileStoragePrefix += cryptoTechnology.toString().toLowerCase() + "_";
List<InspectorPublicKey> inspectorPublicKeyList =
FileSystem.findAndLoadXmlResoucesInDir(folder, "inspector_inspector_publickey");
System.out.println("Setup VerificationHelper");
VerificationHelper.resetInstance();
String[] presentationPolicyResources = {
"/eu/abc4trust/sampleXml/patras/presentationPolicyPatrasUniversityForRevocation.xml"};
String[] credSpecResourceList = {
"/eu/abc4trust/sampleXml/patras/credentialSpecificationPatrasUniversityWithRevocation.xml"};
List<CredentialSpecification> credSpecList =
FileSystem.loadXmlListFromResources(credSpecResourceList);
String systemParamsResource =
folder.getName() + "/issuer_" + VerificationHelper.SYSTEM_PARAMS_XML_NAME;
SystemParameters systemParams = FileSystem.loadXmlFromResource(systemParamsResource);
List<IssuerParameters> issuerParamsList =
FileSystem.findAndLoadXmlResoucesInDir(folder, "issuer_issuer_params_", "idemix");
List<RevocationAuthorityParameters> revocationAuthorityParameters =
FileSystem.findAndLoadXmlResoucesInDir(folder, "revocation_revocation_authority");
VerificationHelper.initInstance(systemParams, issuerParamsList, credSpecList,
inspectorPublicKeyList, revocationAuthorityParameters, verifier_fileStoragePrefix,
presentationPolicyResources);
System.out.println("VerificationHelper - Done");
System.out.println("Setup UserHelper");
UserHelper.resetInstance();
// todo Inspector keys must be added to init of UserHelper...
UserHelper.initInstance(systemParams, issuerParamsList, user_fileStoragePrefix, credSpecList,
inspectorPublicKeyList, revocationAuthorityParameters);
URI scope = URI.create("urn:patras:registration");
SoftwareSmartcard softwareSmartcard =
SoftwareSmartcardGenerator.initSmartCard(1234, scope, systemParams, 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");
}
}