/**************************************************************************** * Copyright (C) 2012-2014 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.common.sal.state.cif; import iso.std.iso_iec._24727.tech.schema.ApplicationCapabilitiesType; import iso.std.iso_iec._24727.tech.schema.CardApplicationType; import iso.std.iso_iec._24727.tech.schema.CardInfoType; import iso.std.iso_iec._24727.tech.schema.DIDInfoType; import iso.std.iso_iec._24727.tech.schema.DIDMarkerType; import iso.std.iso_iec._24727.tech.schema.DIDScopeType; import iso.std.iso_iec._24727.tech.schema.DIDStructureType; import iso.std.iso_iec._24727.tech.schema.DSIType; import iso.std.iso_iec._24727.tech.schema.DataSetInfoType; import iso.std.iso_iec._24727.tech.schema.DataSetNameListType; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.openecard.common.util.ByteArrayWrapper; /** * This class wraps a single card info in order to make the access to attributes more efficient * and more user friendly. * * @author Tobias Wich * @author Dirk Petrautzki * @author Hans-Martin Haase */ public class CardInfoWrapper { private final CardInfoType cif; private Map<ByteArrayWrapper, CardApplicationWrapper> cardApplications = new HashMap<ByteArrayWrapper, CardApplicationWrapper>(); List<byte[]> cardApplicationNames = new ArrayList<byte[]>(); /** * * @param cif the CardInfo that should be wrapped */ public CardInfoWrapper(CardInfoType cif) { this.cif = cif; } /** * * @return the object identifier of this card */ public String getCardType() { return cif.getCardType().getObjectIdentifier(); } /** * * @return the implicitly selected application of this card */ public byte[] getImplicitlySelectedApplication() { return cif.getApplicationCapabilities().getImplicitlySelectedApplication(); } /** * * @return the application capabilities of this card */ public ApplicationCapabilitiesType getApplicationCapabilities() { return cif.getApplicationCapabilities(); } /** * * @return a map that maps ByteArrayWrapper keys (the application identifier) to CardApplicationWrapper (the card * applications) */ public Map<ByteArrayWrapper, CardApplicationWrapper> getCardApplications() { if (cardApplications.isEmpty()) { for (CardApplicationType cardApplication : cif.getApplicationCapabilities().getCardApplication()) { cardApplications.put(new ByteArrayWrapper(cardApplication.getApplicationIdentifier()), new CardApplicationWrapper(cardApplication)); } } return cardApplications; } /** * * @param didName name of the did to get the DIDInfo for * @param applicationIdentifier identifier of the application the DID belongs to * @return the DIDInfo of the specified DID or null, if either the card application or the DID do not exist */ public DIDInfoType getDIDInfo(String didName, byte[] applicationIdentifier) { CardApplicationWrapper application = this.getCardApplications().get(new ByteArrayWrapper(applicationIdentifier)); if (application == null) { return null; } DIDInfoWrapper didInfo = application.getDIDInfo(didName); if (didInfo == null) { return null; } else { return didInfo.getDIDInfo(); } } /** * * @param didName name of the did to get the DIDInfo for * @param didScope Scope of the DID * @return the DIDInfo of the specified DID or null, if either the card application or the DID do not exist */ public DIDInfoType getDIDInfo(String didName, DIDScopeType didScope) { List<CardApplicationType> cardApps = cif.getApplicationCapabilities().getCardApplication(); for (CardApplicationType cardApp : cardApps) { for (DIDInfoType did : cardApp.getDIDInfo()) { if (did.getDifferentialIdentity().getDIDName().equals(didName)) { if (did.getDifferentialIdentity().getDIDScope() != null) { if (didScope != null) { if (didScope.value().equals(did.getDifferentialIdentity().getDIDScope().value())) { return did; } } } else { return did; } } } } return null; } /** * * @param cardApplication identifier of the application to get the list of data set names from * @return list of data set names contained in this application or null, if no such card application exists */ public DataSetNameListType getDataSetNameList(byte[] cardApplication) { CardApplicationWrapper wrapper = cardApplications.get(new ByteArrayWrapper(cardApplication)); if (wrapper == null) { return null; } else { return wrapper.getDataSetNameList(); } } /** * * @param dataSetName * name of the data set to get the datasetinfo for * @param applicationIdentifier * identifier of the application containing the data set * @return the DataSetInfo for the specified data set or null, if no such data set exists in the specified * application */ public DataSetInfoType getDataSet(String dataSetName, byte[] applicationIdentifier) { CardApplicationWrapper application = cardApplications.get(new ByteArrayWrapper(applicationIdentifier)); if (application == null) { return null; } DataSetInfoWrapper dataSet = application.getDataSetInfo(dataSetName); if (dataSet == null) { return null; } else { return dataSet.getDataSetInfo(); } } /** * * @param applicationIdentifier identifier of the application to return * @return CardApplication for the specified applicationIdentifier or null, if no application with this identifier * exists. */ public CardApplicationWrapper getCardApplication(byte[] applicationIdentifier) { return this.getCardApplications().get(new ByteArrayWrapper(applicationIdentifier)); } /** * * @param didName Name of the DID to get the structure for * @param cardApplication Identifier of the card application * @return DIDStructure for the specified didName and card application or null, if no such did exists. */ public DIDStructureType getDIDStructure(String didName, byte[] cardApplication) { DIDInfoType didInfo = this.getDIDInfo(didName, cardApplication); if (didInfo == null) { return null; } DIDStructureType didStructure = new DIDStructureType(); didStructure.setDIDName(didInfo.getDifferentialIdentity().getDIDName()); didStructure.setDIDScope(didInfo.getDifferentialIdentity().getDIDScope()); if (didStructure.getDIDScope() == null) { // no scope is equal to local didStructure.setDIDScope(DIDScopeType.LOCAL); } DIDMarkerType didMarker = didInfo.getDifferentialIdentity().getDIDMarker(); if (didMarker.getCAMarker() != null) { didStructure.setDIDMarker(didMarker.getCAMarker()); } else if (didMarker.getCryptoMarker() != null) { didStructure.setDIDMarker(didMarker.getCryptoMarker()); } else if (didMarker.getEACMarker() != null) { didStructure.setDIDMarker(didMarker.getEACMarker()); } else if (didMarker.getMutualAuthMarker() != null) { didStructure.setDIDMarker(didMarker.getMutualAuthMarker()); } else if (didMarker.getPACEMarker() != null) { didStructure.setDIDMarker(didMarker.getPACEMarker()); } else if (didMarker.getPinCompareMarker() != null) { didStructure.setDIDMarker(didMarker.getPinCompareMarker()); } else if (didMarker.getRIMarker() != null) { didStructure.setDIDMarker(didMarker.getRIMarker()); } else if (didMarker.getRSAAuthMarker() != null) { didStructure.setDIDMarker(didMarker.getRSAAuthMarker()); } else if (didMarker.getTAMarker() != null) { didStructure.setDIDMarker(didMarker.getTAMarker()); } didStructure.setDIDQualifier(didInfo.getDifferentialIdentity().getDIDQualifier()); return didStructure; } /** * * @param didName Name of the DID to get the structure for * @param didScope Scope of the DID * @return DIDStructure for the specified didName and card application or null, if no such did exists. */ public DIDStructureType getDIDStructure(String didName, DIDScopeType didScope) { DIDInfoType didInfo = this.getDIDInfo(didName, didScope); if (didInfo == null) { return null; } DIDStructureType didStructure = new DIDStructureType(); didStructure.setDIDName(didInfo.getDifferentialIdentity().getDIDName()); didStructure.setDIDScope(didInfo.getDifferentialIdentity().getDIDScope()); if (didStructure.getDIDScope() == null) { // no scope is equal to local didStructure.setDIDScope(DIDScopeType.LOCAL); } DIDMarkerType didMarker = didInfo.getDifferentialIdentity().getDIDMarker(); if (didMarker.getCAMarker() != null) { didStructure.setDIDMarker(didMarker.getCAMarker()); } else if (didMarker.getCryptoMarker() != null) { didStructure.setDIDMarker(didMarker.getCryptoMarker()); } else if (didMarker.getEACMarker() != null) { didStructure.setDIDMarker(didMarker.getEACMarker()); } else if (didMarker.getMutualAuthMarker() != null) { didStructure.setDIDMarker(didMarker.getMutualAuthMarker()); } else if (didMarker.getPACEMarker() != null) { didStructure.setDIDMarker(didMarker.getPACEMarker()); } else if (didMarker.getPinCompareMarker() != null) { didStructure.setDIDMarker(didMarker.getPinCompareMarker()); } else if (didMarker.getRIMarker() != null) { didStructure.setDIDMarker(didMarker.getRIMarker()); } else if (didMarker.getRSAAuthMarker() != null) { didStructure.setDIDMarker(didMarker.getRSAAuthMarker()); } else if (didMarker.getTAMarker() != null) { didStructure.setDIDMarker(didMarker.getTAMarker()); } didStructure.setDIDQualifier(didInfo.getDifferentialIdentity().getDIDQualifier()); return didStructure; } /** * * @return list of application identifiers in this cardinfo */ public List<byte[]> getCardApplicationNameList() { if (cardApplicationNames.isEmpty()) { for (CardApplicationType cardApplication : cif.getApplicationCapabilities().getCardApplication()) { cardApplicationNames.add(cardApplication.getApplicationIdentifier()); } } return cardApplicationNames; } /** * The method searches a specific DSI by name. * * @param dsiName The name of the DSI to look for. * @return A DSIType object which contains the given DSI name or null if no DSI with such a name was found. */ public DSIType getDSIbyName(String dsiName) { for (CardApplicationWrapper cardAppWrapper : cardApplications.values()) { for (DataSetInfoType dSetInfoWrapper : cardAppWrapper.getDataSetInfoList()) { if (dSetInfoWrapper.getDSI() != null) { for (DSIType dsi : dSetInfoWrapper.getDSI()) { if (dsi.getDSIName().equals(dsiName)) { return dsi; } } } } } return null; } /** * The method searches a specific data set by the DSI name. * * @param fileIdentifier The DSIName which shall be found in a data set. * @return A DataSetInfoType object containing which contains the DSI which is referenced by the given dsiName. The * method returns NULL if no data set was found. */ public DataSetInfoType getDataSetByFid(byte[] fileIdentifier) { for (CardApplicationWrapper cardAppWrapper : cardApplications.values()) { for (DataSetInfoType dSetInfoWrapper : cardAppWrapper.getDataSetInfoList()) { byte[] dataSetPath = dSetInfoWrapper.getDataSetPath().getEfIdOrPath(); int pathLength = dataSetPath.length; if (dataSetPath[pathLength - 2] == fileIdentifier[0] && dataSetPath[pathLength - 1] == fileIdentifier[1]) { return dSetInfoWrapper; } } } return null; } /** * The method searches an application ID by a DIDName and a DIDScope. * * @param didName Name of the DID to search. * @param didScope Scope of the DID to look for. * @return The application ID of the application which contains the DID with DIDName and DIDScope or NULL if no * such application was found. NOTE: If the parameter didScope is NULL then the application ID of the application * with the first occurrence of didName is returned. */ public byte[] getApplicationIdByDidName(String didName, DIDScopeType didScope) { List<CardApplicationType> cardApps = cif.getApplicationCapabilities().getCardApplication(); for (CardApplicationType cardApp : cardApps) { for (DIDInfoType did : cardApp.getDIDInfo()) { if (did.getDifferentialIdentity().getDIDName().equals(didName)) { if (did.getDifferentialIdentity().getDIDScope() != null) { if (didScope != null) { if (didScope.value().equals(did.getDifferentialIdentity().getDIDScope().value())) { return cardApp.getApplicationIdentifier(); } } else { return cardApp.getApplicationIdentifier(); } } else { return cardApp.getApplicationIdentifier(); } } } } return null; } public DataSetInfoType getDataSetByDsiName(String dsiName) { for (CardApplicationWrapper cardAppWrapper : cardApplications.values()) { for (DataSetInfoType dSetInfoWrapper : cardAppWrapper.getDataSetInfoList()) { if (dSetInfoWrapper.getDSI() != null) { for (DSIType dsi : dSetInfoWrapper.getDSI()) { if (dsi.getDSIName().equals(dsiName)) { return dSetInfoWrapper; } } } } } return null; } public DataSetInfoType getDataSetByName(String dataSetName) { for (CardApplicationWrapper cardAppWrapper : cardApplications.values()) { for (DataSetInfoType dSetInfoWrapper : cardAppWrapper.getDataSetInfoList()) { if (dSetInfoWrapper.getDataSetName().equals(dataSetName)) { return dSetInfoWrapper; } } } return null; } }