001 /*
002 * Cumulus4j - Securing your data in the cloud - http://cumulus4j.org
003 * Copyright (C) 2011 NightLabs Consulting GmbH
004 *
005 * This program is free software: you can redistribute it and/or modify
006 * it under the terms of the GNU Affero General Public License as
007 * published by the Free Software Foundation, either version 3 of the
008 * License, or (at your option) any later version.
009 *
010 * This program is distributed in the hope that it will be useful,
011 * but WITHOUT ANY WARRANTY; without even the implied warranty of
012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
013 * GNU Affero General Public License for more details.
014 *
015 * You should have received a copy of the GNU Affero General Public License
016 * along with this program. If not, see <http://www.gnu.org/licenses/>.
017 */
018 package org.cumulus4j.crypto;
019
020 import java.security.SecureRandom;
021
022 import org.bouncycastle.crypto.params.KeyParameter;
023 import org.bouncycastle.crypto.params.ParametersWithIV;
024
025 /**
026 * <p>
027 * Abstract base class for implementing a {@link MACCalculatorFactory}.
028 * </p><p>
029 * Implementors should subclass this class instead of directly implementing the interface
030 * <code>MACCalculatorFactory</code>.
031 * </p>
032 *
033 * @author Marco หงุ่ยตระกูล-Schulze - marco at nightlabs dot de
034 */
035 public abstract class AbstractMACCalculatorFactory implements MACCalculatorFactory
036 {
037 private String algorithmName;
038
039 @Override
040 public String getAlgorithmName() {
041 return algorithmName;
042 }
043
044 @Override
045 public void setAlgorithmName(String algorithmName)
046 {
047 if (this.algorithmName != null && !this.algorithmName.equals(algorithmName))
048 throw new IllegalStateException("this.algorithmName is already assigned! Cannot modify!");
049
050 if (algorithmName == null)
051 throw new IllegalArgumentException("algorithmName == null");
052
053 this.algorithmName = algorithmName;
054 }
055
056 @Override
057 public MACCalculator createMACCalculator(boolean initWithDefaults)
058 {
059 MACCalculator macCalculator = _createMACCalculator();
060
061 if (initWithDefaults) {
062 SecureRandom random = new SecureRandom();
063 byte[] key = new byte[macCalculator.getKeySize()];
064 random.nextBytes(key);
065 if (macCalculator.getIVSize() > 0) {
066 byte[] iv = new byte[macCalculator.getIVSize()];
067 random.nextBytes(iv);
068 macCalculator.init(new ParametersWithIV(new KeyParameter(key), iv));
069 }
070 else
071 macCalculator.init(new KeyParameter(key));
072 }
073
074 macCalculator.setAlgorithmName(getAlgorithmName());
075
076 return macCalculator;
077 }
078
079 protected abstract MACCalculator _createMACCalculator();
080 }