private Cipher createCipher()

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;
    }