package io.ebeaninternal.server.type;
import io.ebean.config.EncryptKey;
import io.ebean.config.Encryptor;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
/**
* Simple AES based encryption and decryption.
*/
public class SimpleAesEncryptor implements Encryptor {
private static final String AES_CIPHER = "AES/CBC/PKCS5Padding";
private static final String padding = "asldkalsdkadsdfkjsldfjl";
public SimpleAesEncryptor() {
}
private String paddKey(EncryptKey encryptKey) {
String key = encryptKey.getStringValue();
int addChars = 16 - key.length();
if (addChars < 0) {
return key.substring(0, 16);
} else if (addChars > 0) {
return key + padding.substring(0, addChars);
}
return key;
}
private byte[] getKeyBytes(String skey) {
try {
return skey.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
private IvParameterSpec getIvParameterSpec(String initialVector) {
return new IvParameterSpec(initialVector.getBytes());
}
@Override
public byte[] decrypt(byte[] data, EncryptKey encryptKey) {
if (data == null) {
return null;
}
String key = paddKey(encryptKey);
try {
byte[] keyBytes = getKeyBytes(key);
IvParameterSpec iv = getIvParameterSpec(key);
SecretKeySpec sks = new SecretKeySpec(keyBytes, "AES");
Cipher c = Cipher.getInstance(AES_CIPHER);
c.init(Cipher.DECRYPT_MODE, sks, iv);
return c.doFinal(data);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public byte[] encrypt(byte[] data, EncryptKey encryptKey) {
if (data == null) {
return null;
}
String key = paddKey(encryptKey);
try {
byte[] keyBytes = getKeyBytes(key);
IvParameterSpec iv = getIvParameterSpec(key);
SecretKeySpec sks = new SecretKeySpec(keyBytes, "AES");
Cipher c = Cipher.getInstance(AES_CIPHER);
c.init(Cipher.ENCRYPT_MODE, sks, iv);
return c.doFinal(data);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public String decryptString(byte[] data, EncryptKey key) {
if (data == null) {
return null;
}
byte[] bytes = decrypt(data, key);
try {
return new String(bytes, "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
@Override
public byte[] encryptString(String valueFormatValue, EncryptKey key) {
if (valueFormatValue == null) {
return null;
}
try {
byte[] d = valueFormatValue.getBytes("UTF-8");
return encrypt(d, key);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
}