//* Licensed Materials - Property of * //* Alexandra Instituttet A/S * //* * //* eu.abc4trust.pabce.1.34 * //* * //* (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.abce.integrationtests; import static org.junit.Assert.assertNotNull; import java.io.UnsupportedEncodingException; import java.net.URI; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.xml.bind.JAXBException; import org.junit.Test; import org.xml.sax.SAXException; import com.google.inject.Injector; import com.ibm.zurich.idmx.interfaces.util.Pair; import eu.abc4trust.TestConfiguration; import eu.abc4trust.abce.external.issuer.IssuerAbcEngine; import eu.abc4trust.abce.testharness.IssuanceHelper; import eu.abc4trust.cryptoEngine.CryptoEngineException; import eu.abc4trust.keyManager.KeyManager; import eu.abc4trust.keyManager.KeyManagerException; import eu.abc4trust.xml.CredentialSpecification; import eu.abc4trust.xml.FriendlyDescription; import eu.abc4trust.xml.IssuancePolicy; import eu.abc4trust.xml.IssuerParameters; import eu.abc4trust.xml.PresentationPolicyAlternatives; import eu.abc4trust.xml.PresentationToken; import eu.abc4trust.xml.PresentationTokenDescription; import eu.abc4trust.xml.SystemParameters; import eu.abc4trust.xml.util.XmlUtils; /** * This test checks that a user can get issued a device bound credential and * a device unbound credential. */ public class DeviceBoundAndUnboundTest { static public final String CREDENTIAL_SPECIFICATION_ID_CARD = "/eu/abc4trust/sampleXml/credspecs/credentialSpecificationSimpleIdentitycard.xml"; static public final String CREDENTIAL_SPECIFICATION_STUDENT_CARD = "/eu/abc4trust/sampleXml/credspecs/credentialSpecificationStudentCardForHotelBooking.xml"; static public final String ISSUANCE_POLICY_ID_CARD = "/eu/abc4trust/sampleXml/issuance/issuancePolicySimpleIdentitycard.xml"; static public final String ISSUANCE_POLICY_STUDENT_CARD = "/eu/abc4trust/sampleXml/issuance/issuancePolicyStudentCard.xml"; static public final String PRESENTATION_POLICY_CREDENTIALS = "/eu/abc4trust/sampleXml/presentationPolicies/presentationPolicyBoundAndUnbound.xml"; private static final String USERNAME = "defaultUser"; @Test(timeout = TestConfiguration.TEST_TIMEOUT) public void boundAndUnboundTest() throws Exception { URI cl_technology = Helper.getSignatureTechnologyURI("cl"); int keyLength = 1024; Entities entities = new Entities(); entities.addEntity("GOVERNMENT", cl_technology, false); entities.addEntity("UNIVERSITY", cl_technology, false); entities.addEntity("USER"); entities.addEntity("VERIFIER"); runScenario(keyLength, entities); } private void runScenario(int keyLength, Entities entities) throws Exception{ Collection<Injector> injectors = createEntities(entities); SystemParameters systemParameters = Entities.setupSystemParameters(entities, keyLength); List<Object> parametersList = new ArrayList<Object>(); // Setup issuers URI credentialTechnology = entities.getTechnology("UNIVERSITY"); URI issuerParametersUniversityUID = getIssuanceParametersUIDFromIssuancePolicy(ISSUANCE_POLICY_STUDENT_CARD); parametersList.add(setupIssuer(entities.getInjector("UNIVERSITY"), systemParameters, credentialTechnology, issuerParametersUniversityUID, 9)); URI issuerParametersGovernmentUID = getIssuanceParametersUIDFromIssuancePolicy(ISSUANCE_POLICY_ID_CARD); parametersList.add(setupIssuer(entities.getInjector("GOVERNMENT"), systemParameters, credentialTechnology, issuerParametersGovernmentUID, 3)); // Store all issuer parameters to all key managers entities.storePublicParametersToKeyManagers(parametersList); // Store all credential specifications to all key managers storeCredentialSpecificationToKeyManagers(injectors, CREDENTIAL_SPECIFICATION_ID_CARD); storeCredentialSpecificationToKeyManagers(injectors, CREDENTIAL_SPECIFICATION_STUDENT_CARD); IssuanceHelper issuanceHelper = new IssuanceHelper(); // Step 1. Issue credentials. this.issueAndStoreStudentCardCredential(entities.getInjector("UNIVERSITY"), entities.getInjector("USER"), issuanceHelper); this.issueAndStoreIdCardCredential(entities.getInjector("GOVERNMENT"), entities.getInjector("USER"), issuanceHelper); // Step 2. Perform presentation. System.out.println(">> Presentation."); PresentationToken pt = this.performPresentation(issuanceHelper, entities.getInjector("VERIFIER"), entities.getInjector("USER")); assertNotNull(pt); // Step 3. Perform verification PresentationTokenDescription presentationTokenDescription = this.performVerification(pt, entities.getInjector("VERIFIER"), issuanceHelper); assertNotNull(presentationTokenDescription); } private Map<String, Object> populateStudentCard() { Map<String, Object> atts = new HashMap<String, Object>(); atts.put("Name", "John"); atts.put("LastName", "Doe"); atts.put("StudentNumber", 333); atts.put("Issued", "1995-05-05Z"); atts.put("Expires", "2015-05-05Z"); atts.put("IssuedBy", "some one"); return atts; } private Collection<Injector> createEntities(Entities entities) { // Assert that required entities are present assert (entities.contains("UNIVERSITY")); assert (entities.contains("GOVERNMENT")); assert (entities.contains("USER")); assert (entities.contains("VERIFIER")); entities.initInjectors(null); return entities.getInjectors(); } private URI getIssuanceParametersUIDFromIssuancePolicy(String pathToIssuancePolicy) throws UnsupportedEncodingException, JAXBException, SAXException { // Load issuance policy IssuancePolicy issuancePolicy = (IssuancePolicy) XmlUtils.getObjectFromXML( this.getClass().getResourceAsStream(pathToIssuancePolicy), true); // Get issuer parameters UID from credential template return issuancePolicy.getCredentialTemplate().getIssuerParametersUID(); } private IssuerParameters setupIssuer(Injector issuerInjector, SystemParameters systemParameters, URI credentialTechnology, URI issuanceParametersUID, int maximalNumberOfAttributes) throws CryptoEngineException { // Generate issuer parameters. IssuerAbcEngine issuerEngine = issuerInjector.getInstance(IssuerAbcEngine.class); IssuerParameters issuerParameters = issuerEngine.setupIssuerParameters(systemParameters, maximalNumberOfAttributes, credentialTechnology, issuanceParametersUID, null, new LinkedList<FriendlyDescription>()); return issuerParameters; } private void storeCredentialSpecificationToKeyManagers(Collection<Injector> injectors, String pathToCredentialSpecification) throws KeyManagerException, UnsupportedEncodingException, JAXBException, SAXException { // Load credential specifications. CredentialSpecification universityCredSpec = (CredentialSpecification) XmlUtils.getObjectFromXML( this.getClass().getResourceAsStream(pathToCredentialSpecification), true); // Store credential specifications. URI universitySpecificationUID = universityCredSpec.getSpecificationUID(); for (Injector injector : injectors) { KeyManager keyManager = injector.getInstance(KeyManager.class); keyManager.storeCredentialSpecification(universitySpecificationUID, universityCredSpec); } } private void issueAndStoreStudentCardCredential(Injector issuerInjector, Injector userInjector, IssuanceHelper issuanceHelper) throws Exception { Map<String, Object> atts = this.populateStudentCard(); issuanceHelper.issueCredential(USERNAME, issuerInjector, userInjector, CREDENTIAL_SPECIFICATION_STUDENT_CARD, ISSUANCE_POLICY_STUDENT_CARD, atts, null); } private void issueAndStoreIdCardCredential(Injector issuerInjector, Injector userInjector, IssuanceHelper issuanceHelper) throws Exception { Map<String, Object> atts = IntegrationTestUtil.populateIdCard("1995-05-05Z"); issuanceHelper.issueCredential(USERNAME, issuerInjector, userInjector, CREDENTIAL_SPECIFICATION_ID_CARD, ISSUANCE_POLICY_ID_CARD, atts, null); } private PresentationToken performPresentation(IssuanceHelper issuanceHelper, Injector verifierInjector, Injector userInjector) throws Exception { Pair<PresentationToken, PresentationPolicyAlternatives> p = issuanceHelper.createPresentationToken(USERNAME, userInjector, PRESENTATION_POLICY_CREDENTIALS, null, null); return p.first; } private PresentationTokenDescription performVerification( PresentationToken presentationToken, Injector verifierInjector, IssuanceHelper issuanceHelper) throws Exception { return issuanceHelper.verify(verifierInjector, PRESENTATION_POLICY_CREDENTIALS, presentationToken).getPresentationTokenDescription(); } }