package de.persosim.simulator.securemessaging; import javax.crypto.spec.SecretKeySpec; import de.persosim.simulator.crypto.SendSequenceCounter; import de.persosim.simulator.secstatus.AbstractSecMechanism; import de.persosim.simulator.secstatus.SecMechanism; import de.persosim.simulator.utils.Serialized; import de.persosim.simulator.utils.Serializer; /** * This class represents an immutable representation of an {@link SmDataProviderTr03110}. * * @author slutters * */ public class SmDataProviderTr03110Generator extends AbstractSecMechanism implements SmDataProviderGenerator { private Serialized<SecretKeySpec> serializedKeyEnc; private Serialized<SecretKeySpec> serializedKeyMac; private Serialized<SendSequenceCounter> serializedSsc; private boolean pendingCommandApdu; public SmDataProviderTr03110Generator(SecretKeySpec keyEnc, SecretKeySpec keyMac, SendSequenceCounter ssc, boolean pendingCommandApdu) { serializedKeyEnc = Serializer.serialize(keyEnc); serializedKeyMac = Serializer.serialize(keyMac); serializedSsc = Serializer.serialize(ssc); this.pendingCommandApdu = pendingCommandApdu; } public SmDataProviderTr03110Generator(SmDataProviderTr03110 smDataProviderTr03110) { this(smDataProviderTr03110.getKeyEnc(), smDataProviderTr03110.getKeyMac(), smDataProviderTr03110.getSsc(), smDataProviderTr03110.isPendingCommandApdu()); } @Override public SmDataProviderTr03110 generateSmDataProvider() { SecretKeySpec keyEncNew = Serializer.deserialize(serializedKeyEnc); SecretKeySpec keyMacNew = Serializer.deserialize(serializedKeyMac); SendSequenceCounter sscNew = Serializer.deserialize(serializedSsc); if(pendingCommandApdu) { sscNew.increment(); } return new SmDataProviderTr03110(keyEncNew, keyMacNew, sscNew); } @Override public Class<? extends SecMechanism> getKey() { return SmDataProviderGenerator.class; } }