/****************************************************************************
* Copyright (C) 2012 ecsec GmbH.
* 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.crypto.common.asn1.eac.ef;
import org.openecard.bouncycastle.asn1.ASN1Sequence;
import org.openecard.bouncycastle.asn1.ASN1Set;
import org.openecard.crypto.common.asn1.eac.CADomainParameterInfo;
import org.openecard.crypto.common.asn1.eac.CAInfo;
import org.openecard.crypto.common.asn1.eac.CASecurityInfos;
import org.openecard.crypto.common.asn1.eac.CardInfoLocator;
import org.openecard.crypto.common.asn1.eac.PACEDomainParameterInfo;
import org.openecard.crypto.common.asn1.eac.PACEInfo;
import org.openecard.crypto.common.asn1.eac.PACESecurityInfos;
import org.openecard.crypto.common.asn1.eac.PrivilegedTerminalInfo;
import org.openecard.crypto.common.asn1.eac.SecurityInfos;
import org.openecard.crypto.common.asn1.eac.TAInfo;
import org.openecard.crypto.common.asn1.eac.TASecurityInfos;
import org.openecard.crypto.common.asn1.eac.oid.EACObjectIdentifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Implements a EF.CardAccess file.
* See BSI-TR-03110, version 2.10, part 3, section A.1.2.1.
*
* @author Moritz Horsch <horsch@cdc.informatik.tu-darmstadt.de>
*/
public final class EFCardAccess {
private static final Logger _logger = LoggerFactory.getLogger(EFCardAccess.class);
private SecurityInfos sis;
private PACESecurityInfos psi;
private TASecurityInfos tsi;
private CASecurityInfos csi;
private CardInfoLocator cil;
private PrivilegedTerminalInfo pti;
/**
* Creates a new EF.CardAccess.
*
* @param sis SecurityInfos
*/
public EFCardAccess(SecurityInfos sis) {
this.sis = sis;
decodeSecurityInfos();
}
/**
* Creates a new EF.CardAccess.
*
* @param sis SecurityInfos
*/
public EFCardAccess(byte[] sis) {
this.sis = SecurityInfos.getInstance(sis);
decodeSecurityInfos();
}
/**
* Decode the SecurityInfos.
*/
private void decodeSecurityInfos() {
final ASN1Set securityinfos = sis.getSecurityInfos();
final int length = securityinfos.size();
psi = new PACESecurityInfos();
tsi = new TASecurityInfos();
csi = new CASecurityInfos();
for (int i = 0; i < length; i++) {
ASN1Sequence securityInfo = (ASN1Sequence) securityinfos.getObjectAt(i);
String oid = securityInfo.getObjectAt(0).toString();
// PACEInfo (REQUIRED)
if (PACEInfo.isPACEObjectIdentifer(oid)) {
_logger.debug("Found PACEInfo object identifier");
PACEInfo pi = new PACEInfo(securityInfo);
psi.addPACEInfo(pi);
} // PACEDoaminParameterInfo (CONDITIONAL)
else if (PACEDomainParameterInfo.isPACEObjectIdentifer(oid)) {
_logger.debug("Found PACEDomainParameterInfo object identifier");
PACEDomainParameterInfo pdp = new PACEDomainParameterInfo(securityInfo);
psi.addPACEDomainParameterInfo(pdp);
} // ChipAuthenticationInfo (CONDITIONAL)
else if (CAInfo.isObjectIdentifier(oid)) {
_logger.debug("Found ChipAuthenticationInfo object identifier");
CAInfo ci = new CAInfo(securityInfo);
csi.addCAInfo(ci);
} // ChipAuthenticationDomainParameterInfo (CONDITIONAL)
else if (CADomainParameterInfo.isObjectIdentifier(oid)) {
_logger.debug("Found ChipAuthenticationDomainParameterInfo object identifier");
CADomainParameterInfo cdp = new CADomainParameterInfo(securityInfo);
csi.addCADomainParameterInfo(cdp);
} // TerminalAuthenticationInfo (CONDITIONAL)
else if (EACObjectIdentifier.id_TA.equals(oid)) {
_logger.debug("Found TerminalAuthenticationInfo object identifier");
TAInfo ta = new TAInfo(securityInfo);
tsi.addTAInfo(ta);
} // CardInfoLocator (RECOMMENDED)
else if (EACObjectIdentifier.id_CI.equals(oid)) {
_logger.debug("Found CardInfoLocator object identifier");
cil = CardInfoLocator.getInstance(securityInfo);
} // PrivilegedTerminalInfo (CONDITIONAL)
else if (EACObjectIdentifier.id_PT.equals(oid)) {
_logger.debug("Found PrivilegedTerminalInfo object identifier");
pti = PrivilegedTerminalInfo.getInstance(securityInfo);
} else {
_logger.debug("Found unknown object identifier: {}", oid.toString());
}
}
}
/**
* Gets the PACESecurityInfos.
*
* @return PACESecurityInfos
*/
public PACESecurityInfos getPACESecurityInfos() {
return psi;
}
/**
* Gets the TASecurityInfos.
*
* @return TASecurityInfos
*/
public TASecurityInfos getTASecurityInfos() {
return tsi;
}
/**
* Gets the CASecurityInfos.
*
* @return CASecurityInfos
*/
public CASecurityInfos getCASecurityInfos() {
return csi;
}
/**
* Gets the CardInfoLocator.
*
* @return CardInfoLocator
*/
public CardInfoLocator getCardInfoLocator() {
return cil;
}
/**
* Gets the PrivilegedTerminalInfo.
*
* @return PrivilegedTerminalInfo
*/
public PrivilegedTerminalInfo getPrivilegedTerminalInfo() {
return pti;
}
}