/* * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* * @test * @bug 6383200 * @summary PBE: need new algorithm support in password based encryption */ import java.security.*; import java.util.Arrays; import javax.crypto.*; import javax.crypto.spec.*; public class PBES2Test { private static final String[] algos = { "PBEWithHmacSHA1AndAES_128", "PBEWithHmacSHA224AndAES_128", "PBEWithHmacSHA256AndAES_128", "PBEWithHmacSHA384AndAES_128", "PBEWithHmacSHA512AndAES_128" }; private static final byte[] ivBytes = { 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18, 0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20, }; public static final void main(String[] args) throws Exception { for (String algo : algos) { test(algo, true); // salt, ic, IV supplied by the application test(algo, false); // salt, ic, IV generated by the implementation } } private static final void test(String algo, boolean suppliedParams) throws Exception { System.out.println("***********************************************"); System.out.println(algo + (suppliedParams ? " [algorithm parameters are supplied]\n" : " [algorithm parameters are generated]\n")); int iterationCount = 1000; byte[] salt = new byte[]{ 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08 }; // Create PBE key PBEKeySpec pbeKeySpec = new PBEKeySpec("mypassword".toCharArray()); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(algo); SecretKey pbeKey = keyFactory.generateSecret(pbeKeySpec); byte[] pbeKeyBytes = pbeKey.getEncoded(); System.out.println(" key[" + pbeKeyBytes.length + "]: " + String.format("0x%0" + (pbeKeyBytes.length * 2) + "x", new java.math.BigInteger(1, pbeKeyBytes))); // Create PBE cipher System.out.println("Encrypting..."); Cipher pbeCipher = Cipher.getInstance(algo); if (suppliedParams) { pbeCipher.init(Cipher.ENCRYPT_MODE, pbeKey, new PBEParameterSpec(salt, iterationCount, new IvParameterSpec(ivBytes))); } else { pbeCipher.init(Cipher.ENCRYPT_MODE, pbeKey); } // Encrypt byte[] cleartext = "This is just an example".getBytes(); System.out.println(" text[" + cleartext.length + "]: " + String.format("0x%0" + (cleartext.length * 2) + "x", new java.math.BigInteger(1, cleartext))); byte[] ciphertext = pbeCipher.doFinal(cleartext); System.out.println("c'text[" + ciphertext.length + "]: " + String.format("0x%0" + (ciphertext.length * 2) + "x", new java.math.BigInteger(1, ciphertext))); AlgorithmParameters aps = pbeCipher.getParameters(); byte[] iv; if (suppliedParams) { iv = ivBytes; } else { PBEParameterSpec pbeSpec = aps.getParameterSpec(PBEParameterSpec.class); salt = pbeSpec.getSalt(); iterationCount = pbeSpec.getIterationCount(); IvParameterSpec ivSpec = (IvParameterSpec) pbeSpec.getParameterSpec(); iv = ivSpec.getIV(); } System.out.println(" salt[" + salt.length + "]: " + String.format("0x%0" + (salt.length * 2) + "x", new java.math.BigInteger(1, salt))); System.out.println("iterationCount=" + iterationCount); System.out.println(" iv[" + iv.length + "]: " + String.format("0x%0" + (iv.length * 2) + "x", new java.math.BigInteger(1, iv))); // Decrypt System.out.println("Decrypting..."); Cipher pbeCipher2 = Cipher.getInstance(algo); pbeCipher2.init(Cipher.DECRYPT_MODE, pbeKey, aps); byte[] cleartext2 = pbeCipher2.doFinal(ciphertext); System.out.println(" text[" + cleartext2.length + "]: " + String.format("0x%0" + (cleartext2.length * 2) + "x", new java.math.BigInteger(1, cleartext2))); if (Arrays.equals(cleartext, cleartext2)) { System.out.println( "\nPass: decrypted ciphertext matches the original text\n"); } else { throw new Exception( "Fail: decrypted ciphertext does NOT match the original text"); } } }