package scotty.transformer.impl;
import org.apache.commons.codec.binary.Base64;
import org.apache.log4j.Logger;
import org.owasp.webscarab.model.Request;
import scotty.crypto.AESEncryption;
import scotty.crypto.CryptoException;
import scotty.crypto.KeyManager;
import scotty.transformer.RequestTransformer;
/**
* Default request transformer, which is encrypting the request.
*
* @author flo
*
*/
public class DefaultRequestTransformer implements RequestTransformer {
private static Logger log = Logger.getLogger(DefaultRequestTransformer.class);
private KeyManager keyManager;
public DefaultRequestTransformer(KeyManager keyManager) {
this.keyManager = keyManager;
}
@Override
public byte[] transformRequest(Request request) {
if ( log.isTraceEnabled()) {
log.trace("Entering transformRequest: " + request.getURL() );
}
try {
// content as byte array
byte[] plainRequest = request.toString().getBytes();
// get current token and aes password
String aesPassword = "";
byte[] token = null;
synchronized (keyManager) {
token = keyManager.getCurrentToken();
aesPassword = keyManager.getCurrentAESPassword();
}
// encrypt request with AES
byte[] encryptedRequest = AESEncryption.encrypt(plainRequest,
aesPassword);
// base64 encode all
Base64 base64 = new Base64();
byte[] separator = new String("|").getBytes();
byte[] base64EncryptedRequest = base64.encode(encryptedRequest);
byte[] base64Request = merge(token, separator);
base64Request = merge(base64Request, base64EncryptedRequest);
return base64Request;
} catch (CryptoException e) {
log.error("Error transforming request: " + request.getURL(), e);
if ( log.isTraceEnabled()) {
log.trace("Error transforming request: " + request.getURL() + ", content: " + new String(request.getContent()));
}
return new byte[] {};
}
}
/**
* merge two array into one
*
* @param array1
* @param array2
* @return merged array
*/
public static byte[] merge(byte[] array1, byte[] array2) {
byte[] merged = new byte[array1.length + array2.length];
System.arraycopy(array1, 0, merged, 0, array1.length);
System.arraycopy(array2, 0, merged, array1.length, array2.length);
return merged;
}
}