in microprofile-extensions/microprofile-extensions-config/secured-string-converter/src/main/java/org/apache/geronimo/microprofile/extensions/config/converter/secure/PBECipher.java [121:166]
private Cipher createCipher(final byte[] pwdAsBytes, final byte[] inputSalt, final int mode)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
InvalidAlgorithmParameterException {
digester.reset();
final byte[] keyAndIv = new byte[SPICE_SIZE * 2];
final byte[] salt;
if (inputSalt == null || inputSalt.length == 0) {
salt = null; // no salt, likely bad
} else {
salt = inputSalt;
}
byte[] result;
int currentPos = 0;
while (currentPos < keyAndIv.length) {
digester.update(pwdAsBytes);
if (salt != null) {
digester.update(salt, 0, 8);
}
result = digester.digest();
final int stillNeed = keyAndIv.length - currentPos;
if (result.length > stillNeed) {
final byte[] b = new byte[stillNeed];
System.arraycopy(result, 0, b, 0, b.length);
result = b;
}
System.arraycopy(result, 0, keyAndIv, currentPos, result.length);
currentPos += result.length;
if (currentPos < keyAndIv.length) {
digester.reset();
digester.update(result);
}
}
final byte[] key = new byte[SPICE_SIZE];
final byte[] iv = new byte[SPICE_SIZE];
System.arraycopy(keyAndIv, 0, key, 0, key.length);
System.arraycopy(keyAndIv, key.length, iv, 0, iv.length);
final Cipher cipher = Cipher.getInstance(CIPHER_ALG);
cipher.init(mode, new SecretKeySpec(key, KEY_ALG), new IvParameterSpec(iv));
return cipher;
}