/**
* Copyright 2005-2010 hdiv.org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.hdiv.cipher;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hdiv.exception.HDIVException;
import org.hdiv.util.HDIVUtil;
/**
* The principal class related with cryptography. It has the responsability to
* encrypt and decrypt data.
*
* @author Roberto Velasco
* @see javax.crypto.Cipher
* @see javax.crypto.spec.IvParameterSpec
*/
public class CipherHTTP implements ICipherHTTP {
/**
* Universal version identifier. Deserialization uses this number to ensure that
* a loaded class corresponds exactly to a serialized object.
*/
private static final long serialVersionUID = -1731737465730669951L;
/**
* Commons Logging instance.
*/
private Log log = LogFactory.getLog(CipherHTTP.class);
/**
* Name of the default cipher algorithm
*/
private static final String DEFAULT_ALGORITHM = "AES/CBC/PKCS5Padding";
/**
* Algorithm name of cipher object
*/
private String transformation = DEFAULT_ALGORITHM;
/**
* Provider name
*/
private String provider;
/**
* This object provides the functionality of a cryptographic cipher for
* encryption and decryption
*/
private Cipher cipher;
private IvParameterSpec ivSpec;
private boolean encryptMode;
/**
* Generates a Cipher object that implements the specified transformation.
*/
public void init() {
try {
if (this.provider == null) {
this.cipher = Cipher.getInstance(this.transformation);
} else {
this.cipher = Cipher.getInstance(this.transformation, this.provider);
}
} catch (NoSuchProviderException e) {
throw new HDIVException(e.getMessage());
} catch (NoSuchAlgorithmException e) {
throw new HDIVException(e.getMessage());
} catch (NoSuchPaddingException e) {
throw new HDIVException(e.getMessage());
}
}
/**
* <p>Generates a Cipher object that implements the specified
* <code>transformation</code>, initializes cipher vector and initializes
* cipher to encryption mode with a key and a set of algorithm parameters.</p>
* <p>
* The name of the transformation, e.g., DES/CBC/PKCS5Padding. See Appendix A in
* the <a href="../../../guide/security/jce/JCERefGuide.html#AppA"> Java
* Cryptography Extension Reference Guide for information about standard
* transformation names.
* </p>
*
* @param key the encryption key
* @throws HDIVException if there is an initialization error.
*/
public void initEncryptMode(Key key) {
try {
// vector initialization
this.ivSpec = new IvParameterSpec(key.getInitVector());
// Constant used to initialize cipher to encryption mode
this.cipher.init(Cipher.ENCRYPT_MODE, key.getKey(), this.ivSpec);
this.encryptMode = true;
} catch (Exception e) {
String errorMessage = HDIVUtil.getMessage("cipher.init.encrypt", e.getMessage());
throw new HDIVException(errorMessage, e);
}
}
/**
* Generates a Cipher object that implements the specified
* <code>transformation</code>, initializes cipher vector and initializes
* cipher to decryption mode with a key and a set of algorithm parameters.
*
* @param key the encryption key
* @throws HDIVException if there is an initialization error.
*/
public void initDecryptMode(Key key) {
try {
// vector initialization
this.ivSpec = new IvParameterSpec(key.getInitVector());
this.cipher.init(Cipher.DECRYPT_MODE, key.getKey(), this.ivSpec);
this.encryptMode = false;
} catch (Exception e) {
String errorMessage = HDIVUtil.getMessage("cipher.init.decrypt", e.getMessage());
throw new HDIVException(errorMessage, e);
}
}
/**
* Encrypts <code>data</code> in a single-part operation, or finishes a
* multiple-part operation. The data is encrypted depending on how this cipher
* was initialized.
* <p>
* The bytes in the input buffer, and any input bytes that may have been buffered
* during a previous update operation, are processed, with padding (if requested)
* being applied. The result is stored in a new buffer.
* </p>
* <p>
* if any exception is thrown, this cipher object may need to be reset before it
* can be used again.
* </p>
* @param data The input buffer to encrypt
* @return The new buffer with the result
* @throws HDIVException if any exception is thrown in encryption process.
*/
public byte[] encrypt(byte[] data) {
try {
return cipher.doFinal(data);
} catch (Exception e) {
String errorMessage = HDIVUtil.getMessage("cipher.encrypt", e.getMessage());
throw new HDIVException(errorMessage, e);
}
}
/**
* Decrypts <code>data</code> in a single-part operation, or finishes a
* multiple-part operation. The data is decrypted depending on how this cipher
* was initialized.
* <p>
* The bytes in the input buffer, and any input bytes that may have been buffered
* during a previous update operation, are processed, with padding (if requested)
* being applied. The result is stored in a new buffer.
* </p>
* <p>
* if any exception is thrown, this cipher object may need to be reset before it
* can be used again.
* </p>
* @param data The input buffer to decrypt
* @return The new buffer with the result
* @throws HDIVException if any exception is thrown in decryption process.
*/
public byte[] decrypt(byte[] data) {
try {
return cipher.doFinal(data);
} catch (Exception e) {
String errorMessage = HDIVUtil.getMessage("cipher.decrypt", e.getMessage());
throw new HDIVException(errorMessage, e);
}
}
/**
* @param transformation The transformation to set for the cipher factory bean.
*/
public void setTransformation(String transformation) {
this.transformation = transformation;
}
/**
* @param provider The provider to set.
*/
public void setProvider(String provider) {
this.provider = provider;
}
public boolean isEncryptMode() {
return encryptMode;
}
public void setEncryptMode(boolean encryptMode) {
this.encryptMode = encryptMode;
}
}