package de.persosim.simulator.securemessaging; import javax.crypto.Cipher; import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import de.persosim.simulator.processing.UpdatePropagation; /** * Static implementation of the{@link SmDataProvider} interface. * * This class simply stores the required data statically and provides it on * every request. If not all fields are filled upon * {@link #init(SmDataProvider)} the previous provider must not be null. Every * request for a field which has no value is forwarded to the predecessor. * * @author amay * */ public class SmDataProviderContainerProxy implements SmDataProvider { @Override public Class<? extends UpdatePropagation> getKey() { return SmDataProvider.class; } private Cipher cipher; private IvParameterSpec encIv; private SecretKey keyEnc; private Mac mac; private byte[] macAuxiliaryData; private SecretKey keyMAC; private Integer macLength = -1; private SmDataProvider predecessor; @Override public Cipher getCipher() { if (cipher == null) { return predecessor.getCipher(); } return cipher; } @Override public IvParameterSpec getCipherIv() { if (encIv == null) { return predecessor.getCipherIv(); } return encIv; } @Override public SecretKey getKeyEnc() { if (keyEnc == null) { return predecessor.getKeyEnc(); } return keyEnc; } @Override public SecretKey getKeyMac() { if (keyMAC == null) { return predecessor.getKeyMac(); } return keyMAC; } @Override public Mac getMac() { if (mac == null) { return predecessor.getMac(); } return mac; } @Override public byte[] getMacAuxiliaryData() { if (macAuxiliaryData == null) { return predecessor.getMacAuxiliaryData(); } return macAuxiliaryData; } @Override public Integer getMacLength() { if (macLength < 0) { return predecessor.getMacLength(); } return macLength; } public void setCipher(Cipher newCipher) { cipher = newCipher; } public void setEncIv(IvParameterSpec newEncIv) { encIv = newEncIv; } public void setKeyEnc(SecretKey keyEnc) { this.keyEnc = keyEnc; } public void setKeySpecMAC(SecretKey keySpecMAC) { this.keyMAC = keySpecMAC; } public void setMac(Mac mac) { this.mac = mac; } public void setMacAuxiliaryData(byte[] macAuxiliaryData) { this.macAuxiliaryData = macAuxiliaryData; } public void setMacLength(Integer macLength) { this.macLength = macLength; } @Override public void init(SmDataProvider prev) { if ((cipher == null) || (encIv == null) || (keyEnc == null) || (keyMAC == null) || (mac == null) || (macAuxiliaryData == null) || (macLength < 0) ) { if (prev == null) { throw new IllegalArgumentException("predecessor must not be null, when not all fields are initialized"); } else { predecessor = prev; } } else { predecessor = null; } } @Override public void nextIncoming() { //forward to predecessor if present if (predecessor != null) { predecessor.nextIncoming(); } } @Override public void nextOutgoing() { //forward to predecessor if present if (predecessor != null) { predecessor.nextOutgoing();; } } @Override public SmDataProviderGenerator getSmDataProviderGenerator() { // IMPL implement method when needed // currently objects of these class are only used for tests not relying on this function return null; } }