/****************************************************************************
* Copyright (C) 2012 HS Coburg.
* All rights reserved.
* Contact: ecsec GmbH (info@ecsec.de)
*
* This file is part of the Open eCard App.
*
* GNU General Public License Usage
* This file may be used under the terms of the GNU General Public
* License version 3.0 as published by the Free Software Foundation
* and appearing in the file LICENSE.GPL included in the packaging of
* this file. Please review the following information to ensure the
* GNU General Public License version 3.0 requirements will be met:
* http://www.gnu.org/copyleft/gpl.html.
*
* Other Usage
* Alternatively, this file may be used in accordance with the terms
* and conditions contained in a signed written agreement between
* you and ecsec GmbH.
*
***************************************************************************/
package org.openecard.sal.protocol.abc4trustprover;
import iso.std.iso_iec._24727.tech.schema.CardApplicationConnect;
import iso.std.iso_iec._24727.tech.schema.CardApplicationConnectResponse;
import iso.std.iso_iec._24727.tech.schema.CardApplicationPath;
import iso.std.iso_iec._24727.tech.schema.CardApplicationPathResponse;
import iso.std.iso_iec._24727.tech.schema.CardApplicationPathType;
import iso.std.iso_iec._24727.tech.schema.Connect;
import iso.std.iso_iec._24727.tech.schema.ConnectResponse;
import iso.std.iso_iec._24727.tech.schema.ConnectionHandleType;
import iso.std.iso_iec._24727.tech.schema.ConnectionHandleType.RecognitionInfo;
import iso.std.iso_iec._24727.tech.schema.DIDAuthenticate;
import iso.std.iso_iec._24727.tech.schema.DIDAuthenticateResponse;
import iso.std.iso_iec._24727.tech.schema.DIDAuthenticationDataType;
import iso.std.iso_iec._24727.tech.schema.DIDGet;
import iso.std.iso_iec._24727.tech.schema.DIDGetResponse;
import iso.std.iso_iec._24727.tech.schema.DIDScopeType;
import iso.std.iso_iec._24727.tech.schema.DIDUpdate;
import iso.std.iso_iec._24727.tech.schema.DIDUpdateDataType;
import iso.std.iso_iec._24727.tech.schema.DIDUpdateResponse;
import iso.std.iso_iec._24727.tech.schema.Encipher;
import iso.std.iso_iec._24727.tech.schema.EncipherResponse;
import iso.std.iso_iec._24727.tech.schema.EstablishContext;
import iso.std.iso_iec._24727.tech.schema.EstablishContextResponse;
import iso.std.iso_iec._24727.tech.schema.ListIFDs;
import iso.std.iso_iec._24727.tech.schema.ListIFDsResponse;
import iso.std.iso_iec._24727.tech.schema.PinCompareMarkerType;
import java.math.BigInteger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.openecard.addon.AddonManager;
import org.openecard.bouncycastle.util.encoders.Hex;
import org.openecard.common.ClientEnv;
import org.openecard.common.ECardConstants;
import org.openecard.common.enums.EventType;
import org.openecard.common.interfaces.Dispatcher;
import org.openecard.common.sal.anytype.ABC4TrustProverMarkerType;
import org.openecard.common.sal.state.CardStateMap;
import org.openecard.common.sal.state.SALStateCallback;
import org.openecard.common.util.ByteUtils;
import org.openecard.common.util.StringUtils;
import org.openecard.event.EventManager;
import org.openecard.gui.UserConsent;
import org.openecard.gui.swing.SwingDialogWrapper;
import org.openecard.gui.swing.SwingUserConsent;
import org.openecard.ifd.scio.IFD;
import org.openecard.recognition.CardRecognition;
import org.openecard.sal.TinySAL;
import org.openecard.transport.dispatcher.MessageDispatcher;
import org.testng.SkipException;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import static org.testng.Assert.*;
import java.util.Random;
import java.util.Map;
import java.util.HashMap;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import javax.smartcardio.CardException;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.TerminalFactory;
import java.util.TreeMap;
import java.util.List;
import java.util.ArrayList;
import com.google.gson.Gson;
public class ABC4TrustProverProtocolTest {
private static ClientEnv env;
private static TinySAL instance;
private static CardStateMap states;
private static EventManager em;
byte[] appIdentifier_ABC4Trust = Hex.decode("F84142433474727573");
@BeforeClass
public static void setUp() throws Exception {
env = new ClientEnv();
Dispatcher d = new MessageDispatcher(env);
env.setDispatcher(d);
IFD ifd = new IFD();
ifd.setGUI(new SwingUserConsent(new SwingDialogWrapper()));
env.setIFD(ifd);
states = new CardStateMap();
EstablishContextResponse ecr = env.getIFD().establishContext(new EstablishContext());
CardRecognition cr = new CardRecognition(ifd, ecr.getContextHandle());
em = new EventManager(cr, env, ecr.getContextHandle());
env.setEventManager(em);
ListIFDs listIFDs = new ListIFDs();
listIFDs.setContextHandle(ecr.getContextHandle());
ListIFDsResponse listIFDsResponse = ifd.listIFDs(listIFDs);
RecognitionInfo recognitionInfo = cr.recognizeCard(listIFDsResponse.getIFDName().get(0), new BigInteger("0"));
SALStateCallback salCallback = new SALStateCallback(cr, states);
Connect c = new Connect();
c.setContextHandle(ecr.getContextHandle());
c.setIFDName(listIFDsResponse.getIFDName().get(0));
c.setSlot(new BigInteger("0"));
ConnectResponse connectResponse = env.getIFD().connect(c);
ConnectionHandleType connectionHandleType = new ConnectionHandleType();
connectionHandleType.setContextHandle(ecr.getContextHandle());
connectionHandleType.setRecognitionInfo(recognitionInfo);
connectionHandleType.setIFDName(listIFDsResponse.getIFDName().get(0));
connectionHandleType.setSlotIndex(new BigInteger("0"));
connectionHandleType.setSlotHandle(connectResponse.getSlotHandle());
salCallback.signalEvent(EventType.CARD_RECOGNIZED, connectionHandleType);
instance = new TinySAL(env, states);
// init AddonManager
UserConsent uc = new SwingUserConsent(new SwingDialogWrapper());
AddonManager manager = new AddonManager(d, uc, states, cr, em);
instance.setAddonManager(manager);
}
/**
* Test of didAuthenticate method, of class TinySAL.
*
* @throws ParserConfigurationException
*/
@Test(priority = 1)
public void testDidAuthenticate1() throws ParserConfigurationException, CardException, IOException {
/* Example presentation policy sent by a certain SP */
String presentationPolicy = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><PresentationPolicyAlternatives xmlns=\"http://abc4trust.eu/wp2/abcschemav1.0\" Version=\"1.0\"><PresentationPolicy PolicyUID=\"http://MyFavoriteSoccerTeam/policies/match/842/vip\"><Message><Nonce>2Hkb+I0tbst/dA==</Nonce><TokenGeneratorlicationData> MyFavoriteSoccerTeam vs. OtherTeam </TokenGeneratorlicationData></Message><Credential Alias=\"#ticket\"><CredentialSpecAlternatives><CredentialSpecUID>http://MyFavoriteSoccerTeam/tickets/vip</CredentialSpecUID></CredentialSpecAlternatives><IssuerAlternatives><IssuerParametersUID RevocationInformationUID=\"urn:abc4trust:1.0:revocation:information/4hjqwl0htcw1hbc\">http://ticketcompany/MyFavoriteSoccerTeam/issuance:idemix</IssuerParametersUID></IssuerAlternatives><DisclosedAttribute AttributeType=\"City\" DataHandlingPolicy=\"http://www.sweetdreamsuites.com/policies/creditcards\"/><DisclosedAttribute AttributeType=\"State\" DataHandlingPolicy=\"http://www.sweetdreamsuites.com/policies/creditcards\"/></Credential><AttributePredicate Function=\"urn:oasis:names:tc:xacml:1.0:function:date-equal\"><Attribute CredentialAlias=\"#ticket\" AttributeType=\"IDValidFrom\"/><ConstantValue xmlns:abc=\"http://abc4trust.eu/wp2/abcschemav1.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">2002-11-01Z</ConstantValue></AttributePredicate></PresentationPolicy></PresentationPolicyAlternatives>";
// get path to ABC4Trust
CardApplicationPath cardApplicationPath = new CardApplicationPath();
CardApplicationPathType cardApplicationPathType = new CardApplicationPathType();
cardApplicationPathType.setCardApplication(appIdentifier_ABC4Trust);
cardApplicationPath.setCardAppPathRequest(cardApplicationPathType);
CardApplicationPathResponse cardApplicationPathResponse = instance.cardApplicationPath(cardApplicationPath);
// connect to ABC4Trust
CardApplicationConnect cardApplicationConnect = new CardApplicationConnect();
cardApplicationConnect.setCardApplicationPath(cardApplicationPathResponse.getCardAppPathResultSet().getCardApplicationPathResult()
.get(0));
CardApplicationConnectResponse result = instance.cardApplicationConnect(cardApplicationConnect);
assertEquals(ECardConstants.Major.OK, result.getResult().getResultMajor());
DIDAuthenticate parameters = new DIDAuthenticate();
parameters.setDIDName("ABC4Trust.PROVER");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document d = builder.newDocument();
Element elemPresentationPolicy = d.createElementNS("urn:iso:std:iso-iec:24727:tech:schema", "PresentationPolicy");
elemPresentationPolicy.setTextContent(presentationPolicy);
DIDAuthenticationDataType didAuthenticationData = new DIDAuthenticationDataType();
didAuthenticationData.getAny().add(elemPresentationPolicy);
parameters.setAuthenticationProtocolData(didAuthenticationData);
parameters.setConnectionHandle(result.getConnectionHandle());
didAuthenticationData.setProtocol(ECardConstants.Protocol.ABC4Trust_PROVER);
parameters.setAuthenticationProtocolData(didAuthenticationData);
DIDAuthenticateResponse result1 = instance.didAuthenticate(parameters);
assertEquals(result1.getAuthenticationProtocolData().getProtocol(), ECardConstants.Protocol.ABC4Trust_PROVER);
assertEquals(ECardConstants.Major.OK, result1.getResult().getResultMajor());
}
}