package de.persosim.simulator.cardobjects;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import de.persosim.simulator.exception.AccessDeniedException;
import de.persosim.simulator.protocols.RoleOid;
import de.persosim.simulator.protocols.auxVerification.AuxOid;
import de.persosim.simulator.protocols.ta.AuthenticatedAuxiliaryData;
import de.persosim.simulator.protocols.ta.Authorization;
import de.persosim.simulator.protocols.ta.TerminalAuthenticationMechanism;
import de.persosim.simulator.protocols.ta.TerminalType;
import de.persosim.simulator.secstatus.EffectiveAuthorizationMechanism;
import de.persosim.simulator.secstatus.SecMechanism;
import de.persosim.simulator.secstatus.SecStatus.SecContext;
import de.persosim.simulator.utils.Utils;
public class ByteDataAuxObject extends AuxDataObject {
byte [] data;
public ByteDataAuxObject(OidIdentifier identifier, byte [] data) {
super(identifier);
this.data = Arrays.copyOf(data, data.length);
}
/**
* @return the data
*/
public byte[] getData() {
return data;
}
@Override
public boolean verify(AuthenticatedAuxiliaryData current) throws AccessDeniedException {
//get necessary information stored in TA
//XXX access conditions should be stored separately and evaluated in a more generic way
Collection<Class<? extends SecMechanism>> previousMechanisms = new HashSet<>();
previousMechanisms.add(TerminalAuthenticationMechanism.class);
previousMechanisms.add(EffectiveAuthorizationMechanism.class);
Collection<SecMechanism> currentMechanisms = securityStatus.getCurrentMechanisms(SecContext.APPLICATION, previousMechanisms);
TerminalAuthenticationMechanism taMechanism = null;
EffectiveAuthorizationMechanism authMechanism = null;
if (currentMechanisms.size() >= 2){
for(SecMechanism secmechanism:currentMechanisms) {
if(secmechanism instanceof TerminalAuthenticationMechanism) {
taMechanism = (TerminalAuthenticationMechanism) secmechanism;
}
if(secmechanism instanceof EffectiveAuthorizationMechanism) {
authMechanism = (EffectiveAuthorizationMechanism) secmechanism;
}
}
if((taMechanism == null) || (authMechanism == null)) {
throw new AccessDeniedException("Community ID verification not allowed");
}
if (taMechanism.getTerminalType().equals(TerminalType.ST)) {
throw new AccessDeniedException("Community ID verification not allowed");
}
if(taMechanism.getTerminalType().equals(TerminalType.AT)) {
Authorization auth = authMechanism.getAuthorization(RoleOid.id_AT);
if(auth == null) {
throw new AccessDeniedException("Community ID verification not allowed");
}
if(!auth.getAuthorization().getBit(1)) {
throw new AccessDeniedException("Community ID verification not allowed");
}
}
if (identifier.getOid().equals(AuxOid.id_CommunityID)){
return Utils.arrayHasPrefix(data, current.getDiscretionaryData());
}
}
return false;
}
}