package gnu.crypto.jce.cipher; // -*- c-basic-offset: 3; -*- // -------------------------------------------------------------------------- // $Id: PBES2.java,v 1.3 2005/10/06 04:24:14 rsdio Exp $ // // Copyright (C) 2003 Free Software Foundation, Inc. // // This file is part of GNU Crypto. // // GNU Crypto is free software; you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the // Free Software Foundation; either version 2 of the License, or (at // your option) any later version. // // GNU Crypto 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 for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the // // Free Software Foundation, Inc., // 51 Franklin Street, Fifth Floor, // Boston, MA 02110-1301 // USA // // Linking this library statically or dynamically with other modules is // making a combined work based on this library. Thus, the terms and // conditions of the GNU General Public License cover the whole // combination. // // As a special exception, the copyright holders of this library give // you permission to link this library with independent modules to // produce an executable, regardless of the license terms of these // independent modules, and to copy and distribute the resulting // executable under terms of your choice, provided that you also meet, // for each linked independent module, the terms and conditions of the // license of that module. An independent module is a module which is // not derived from or based on this library. If you modify this // library, you may extend this exception to your version of the // library, but you are not obligated to do so. If you do not wish to // do so, delete this exception statement from your version. // // --------------------------------------------------------------------------- import gnu.crypto.prng.IPBE; import gnu.crypto.prng.IRandom; import gnu.crypto.prng.LimitReachedException; import gnu.crypto.prng.PRNGFactory; import java.security.AlgorithmParameters; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.Key; import java.security.SecureRandom; import java.security.spec.AlgorithmParameterSpec; import java.util.HashMap; import javax.crypto.interfaces.PBEKey; import javax.crypto.spec.SecretKeySpec; /** * <p>.</p> * * @version $Revision: 1.3 $ */ public abstract class PBES2 extends CipherAdapter { // Constants and variables // ------------------------------------------------------------------------- /** The HMac (PRF) algorithm name. */ protected String macName; // Constructor(s) // ------------------------------------------------------------------------- protected PBES2(String cipherName, int blockLen, String macName) { super(cipherName, blockLen); this.macName = macName; } protected PBES2(String cipherName, String macName) { super(cipherName); this.macName = macName; } // Instance methods // ------------------------------------------------------------------------- protected void engineInit(int opmode, Key key, SecureRandom random) throws InvalidKeyException { if (!(key instanceof PBEKey)) throw new InvalidKeyException("not a PBE key"); super.engineInit(opmode, genkey((PBEKey) key), random); } protected void engineInit(int opmode, Key key, AlgorithmParameterSpec params, SecureRandom random) throws InvalidKeyException, InvalidAlgorithmParameterException { if (!(key instanceof PBEKey)) throw new InvalidKeyException("not a PBE key"); super.engineInit(opmode, genkey((PBEKey) key), params, random); } protected void engineInit(int opmode, Key key, AlgorithmParameters params, SecureRandom random) throws InvalidKeyException, InvalidAlgorithmParameterException { if (!(key instanceof PBEKey)) throw new InvalidKeyException("not a PBE key"); super.engineInit(opmode, genkey((PBEKey) key), params, random); } private SecretKeySpec genkey(PBEKey key) throws InvalidKeyException { IRandom kdf = PRNGFactory.getInstance("PBKDF2-" + macName); if (kdf == null) { throw new IllegalArgumentException("no such KDF: PBKDF2-" + macName); } HashMap attrib = new HashMap(); attrib.put(IPBE.ITERATION_COUNT, new Integer(key.getIterationCount())); attrib.put(IPBE.PASSWORD, key.getPassword()); attrib.put(IPBE.SALT, key.getSalt()); try { kdf.init(attrib); } catch (IllegalArgumentException iae) { throw new InvalidKeyException(iae.toString()); } byte[] dk = new byte[mode.defaultKeySize()]; try { kdf.nextBytes(dk, 0, dk.length); } catch (LimitReachedException shouldNotHappen) { // throw new Error(shouldNotHappen); throw new Error(String.valueOf(shouldNotHappen)); } return new SecretKeySpec(dk, cipher.name()); } // Inner classe(s) // ========================================================================= public static class HMacSHA1 extends PBES2 { // Constructor(s) // --------------------------------------------------------------------- public HMacSHA1(String cipher, int blockLen) { super(cipher, blockLen, "HMAC-SHA1"); } public HMacSHA1(String cipher) { super(cipher, "HMAC-SHA1"); } // Inner classe(s) // ====================================================================== public static class AES extends HMacSHA1 { public AES() { super("AES"); } } public static class Anubis extends HMacSHA1 { public Anubis() { super("Anubis"); } } public static class Blowfish extends HMacSHA1 { public Blowfish() { super("Blowfish"); } } public static class Cast5 extends HMacSHA1 { public Cast5() { super("Cast5"); } } public static class DES extends HMacSHA1 { public DES() { super("DES"); } } public static class Khazad extends HMacSHA1 { public Khazad() { super("Khazad"); } } public static class Serpent extends HMacSHA1 { public Serpent() { super("Serpent"); } } public static class Square extends HMacSHA1 { public Square() { super("Square"); } } public static class TripleDES extends HMacSHA1 { public TripleDES() { super("TripleDES"); } } public static class Twofish extends HMacSHA1 { public Twofish() { super("Twofish"); } } } public static class HMacMD5 extends PBES2 { // Constructor(s) // ---------------------------------------------------------------------- public HMacMD5(String cipher, int blockLen) { super(cipher, blockLen, "HMAC-MD5"); } public HMacMD5(String cipher) { super(cipher, "HMAC-MD5"); } // Inner classe(s) // ====================================================================== public static class AES extends HMacMD5 { public AES() { super("AES"); } } public static class Anubis extends HMacMD5 { public Anubis() { super("Anubis"); } } public static class Blowfish extends HMacMD5 { public Blowfish() { super("Blowfish"); } } public static class Cast5 extends HMacMD5 { public Cast5() { super("Cast5"); } } public static class DES extends HMacMD5 { public DES() { super("DES"); } } public static class Khazad extends HMacMD5 { public Khazad() { super("Khazad"); } } public static class Serpent extends HMacMD5 { public Serpent() { super("Serpent"); } } public static class Square extends HMacMD5 { public Square() { super("Square"); } } public static class TripleDES extends HMacMD5 { public TripleDES() { super("TripleDES"); } } public static class Twofish extends HMacMD5 { public Twofish() { super("Twofish"); } } } public static class HMacMD2 extends PBES2 { // Constructor(s) // ---------------------------------------------------------------------- public HMacMD2(String cipher, int blockLen) { super(cipher, blockLen, "HMAC-MD2"); } public HMacMD2(String cipher) { super(cipher, "HMAC-MD2"); } // Inner classe(s) // ====================================================================== public static class AES extends HMacMD2 { public AES() { super("AES"); } } public static class Anubis extends HMacMD2 { public Anubis() { super("Anubis"); } } public static class Blowfish extends HMacMD2 { public Blowfish() { super("Blowfish"); } } public static class Cast5 extends HMacMD2 { public Cast5() { super("Cast5"); } } public static class DES extends HMacMD2 { public DES() { super("DES"); } } public static class Khazad extends HMacMD2 { public Khazad() { super("Khazad"); } } public static class Serpent extends HMacMD2 { public Serpent() { super("Serpent"); } } public static class Square extends HMacMD2 { public Square() { super("Square"); } } public static class TripleDES extends HMacMD2 { public TripleDES() { super("TripleDES"); } } public static class Twofish extends HMacMD2 { public Twofish() { super("Twofish"); } } } public static class HMacMD4 extends PBES2 { // Constructor(s) // ---------------------------------------------------------------------- public HMacMD4(String cipher, int blockLen) { super(cipher, blockLen, "HMAC-MD4"); } public HMacMD4(String cipher) { super(cipher, "HMAC-MD4"); } // Inner classe(s) // ====================================================================== public static class AES extends HMacMD4 { public AES() { super("AES"); } } public static class Anubis extends HMacMD4 { public Anubis() { super("Anubis"); } } public static class Blowfish extends HMacMD4 { public Blowfish() { super("Blowfish"); } } public static class Cast5 extends HMacMD4 { public Cast5() { super("Cast5"); } } public static class DES extends HMacMD4 { public DES() { super("DES"); } } public static class Khazad extends HMacMD4 { public Khazad() { super("Khazad"); } } public static class Serpent extends HMacMD4 { public Serpent() { super("Serpent"); } } public static class Square extends HMacMD4 { public Square() { super("Square"); } } public static class TripleDES extends HMacMD4 { public TripleDES() { super("TripleDES"); } } public static class Twofish extends HMacMD4 { public Twofish() { super("Twofish"); } } } public static class HMacHaval extends PBES2 { // Constructor(s) // --------------------------------------------------------------------- public HMacHaval(String cipher, int blockLen) { super(cipher, blockLen, "HMAC-HAVAL"); } public HMacHaval(String cipher) { super(cipher, "HMAC-HAVAL"); } // Inner classe(s) // ====================================================================== public static class AES extends HMacHaval { public AES() { super("AES"); } } public static class Anubis extends HMacHaval { public Anubis() { super("Anubis"); } } public static class Blowfish extends HMacHaval { public Blowfish() { super("Blowfish"); } } public static class Cast5 extends HMacHaval { public Cast5() { super("Cast5"); } } public static class DES extends HMacHaval { public DES() { super("DES"); } } public static class Khazad extends HMacHaval { public Khazad() { super("Khazad"); } } public static class Serpent extends HMacHaval { public Serpent() { super("Serpent"); } } public static class Square extends HMacHaval { public Square() { super("Square"); } } public static class TripleDES extends HMacHaval { public TripleDES() { super("TripleDES"); } } public static class Twofish extends HMacHaval { public Twofish() { super("Twofish"); } } } public static class HMacRipeMD128 extends PBES2 { // Constructor(s) // ---------------------------------------------------------------------- public HMacRipeMD128(String cipher, int blockLen) { super(cipher, blockLen, "HMAC-RIPEMD128"); } public HMacRipeMD128(String cipher) { super(cipher, "HMAC-RIPEMD128"); } // Inner classe(s) // ====================================================================== public static class AES extends HMacRipeMD128 { public AES() { super("AES"); } } public static class Anubis extends HMacRipeMD128 { public Anubis() { super("Anubis"); } } public static class Blowfish extends HMacRipeMD128 { public Blowfish() { super("Blowfish"); } } public static class Cast5 extends HMacRipeMD128 { public Cast5() { super("Cast5"); } } public static class DES extends HMacRipeMD128 { public DES() { super("DES"); } } public static class Khazad extends HMacRipeMD128 { public Khazad() { super("Khazad"); } } public static class Serpent extends HMacRipeMD128 { public Serpent() { super("Serpent"); } } public static class Square extends HMacRipeMD128 { public Square() { super("Square"); } } public static class TripleDES extends HMacRipeMD128 { public TripleDES() { super("TripleDES"); } } public static class Twofish extends HMacRipeMD128 { public Twofish() { super("Twofish"); } } } public static class HMacRipeMD160 extends PBES2 { // Constructor(s) // ---------------------------------------------------------------------- public HMacRipeMD160(String cipher, int blockLen) { super(cipher, blockLen, "HMAC-RIPEMD160"); } public HMacRipeMD160(String cipher) { super(cipher, "HMAC-RIPEMD160"); } // Inner classe(s) // ====================================================================== public static class AES extends HMacRipeMD160 { public AES() { super("AES"); } } public static class Anubis extends HMacRipeMD160 { public Anubis() { super("Anubis"); } } public static class Blowfish extends HMacRipeMD160 { public Blowfish() { super("Blowfish"); } } public static class Cast5 extends HMacRipeMD160 { public Cast5() { super("Cast5"); } } public static class DES extends HMacRipeMD160 { public DES() { super("DES"); } } public static class Khazad extends HMacRipeMD160 { public Khazad() { super("Khazad"); } } public static class Serpent extends HMacRipeMD160 { public Serpent() { super("Serpent"); } } public static class Square extends HMacRipeMD160 { public Square() { super("Square"); } } public static class TripleDES extends HMacRipeMD160 { public TripleDES() { super("TripleDES"); } } public static class Twofish extends HMacRipeMD160 { public Twofish() { super("Twofish"); } } } public static class HMacSHA256 extends PBES2 { // Constructor(s) // --------------------------------------------------------------------- public HMacSHA256(String cipher, int blockLen) { super(cipher, blockLen, "HMAC-SHA-256"); } public HMacSHA256(String cipher) { super(cipher, "HMAC-SHA-256"); } // Inner classe(s) // ====================================================================== public static class AES extends HMacSHA256 { public AES() { super("AES"); } } public static class Anubis extends HMacSHA256 { public Anubis() { super("Anubis"); } } public static class Blowfish extends HMacSHA256 { public Blowfish() { super("Blowfish"); } } public static class Cast5 extends HMacSHA256 { public Cast5() { super("Cast5"); } } public static class DES extends HMacSHA256 { public DES() { super("DES"); } } public static class Khazad extends HMacSHA256 { public Khazad() { super("Khazad"); } } public static class Serpent extends HMacSHA256 { public Serpent() { super("Serpent"); } } public static class Square extends HMacSHA256 { public Square() { super("Square"); } } public static class TripleDES extends HMacSHA256 { public TripleDES() { super("TripleDES"); } } public static class Twofish extends HMacSHA256 { public Twofish() { super("Twofish"); } } } public static class HMacSHA384 extends PBES2 { // Constructor(s) // --------------------------------------------------------------------- public HMacSHA384(String cipher, int blockLen) { super(cipher, blockLen, "HMAC-SHA-384"); } public HMacSHA384(String cipher) { super(cipher, "HMAC-SHA-384"); } // Inner classe(s) // ====================================================================== public static class AES extends HMacSHA384 { public AES() { super("AES"); } } public static class Anubis extends HMacSHA384 { public Anubis() { super("Anubis"); } } public static class Blowfish extends HMacSHA384 { public Blowfish() { super("Blowfish"); } } public static class Cast5 extends HMacSHA384 { public Cast5() { super("Cast5"); } } public static class DES extends HMacSHA384 { public DES() { super("DES"); } } public static class Khazad extends HMacSHA384 { public Khazad() { super("Khazad"); } } public static class Serpent extends HMacSHA384 { public Serpent() { super("Serpent"); } } public static class Square extends HMacSHA384 { public Square() { super("Square"); } } public static class TripleDES extends HMacSHA384 { public TripleDES() { super("TripleDES"); } } public static class Twofish extends HMacSHA384 { public Twofish() { super("Twofish"); } } } public static class HMacSHA512 extends PBES2 { // Constructor(s) // --------------------------------------------------------------------- public HMacSHA512(String cipher, int blockLen) { super(cipher, blockLen, "HMAC-SHA-512"); } public HMacSHA512(String cipher) { super(cipher, "HMAC-SHA-512"); } // Inner classe(s) // ====================================================================== public static class AES extends HMacSHA512 { public AES() { super("AES"); } } public static class Anubis extends HMacSHA512 { public Anubis() { super("Anubis"); } } public static class Blowfish extends HMacSHA512 { public Blowfish() { super("Blowfish"); } } public static class Cast5 extends HMacSHA512 { public Cast5() { super("Cast5"); } } public static class DES extends HMacSHA512 { public DES() { super("DES"); } } public static class Khazad extends HMacSHA512 { public Khazad() { super("Khazad"); } } public static class Serpent extends HMacSHA512 { public Serpent() { super("Serpent"); } } public static class Square extends HMacSHA512 { public Square() { super("Square"); } } public static class TripleDES extends HMacSHA512 { public TripleDES() { super("TripleDES"); } } public static class Twofish extends HMacSHA512 { public Twofish() { super("Twofish"); } } } public static class HMacTiger extends PBES2 { // Constructor(s) // --------------------------------------------------------------------- public HMacTiger(String cipher, int blockLen) { super(cipher, blockLen, "HMAC-TIGER"); } public HMacTiger(String cipher) { super(cipher, "HMAC-TIGER"); } // Inner classe(s) // ====================================================================== public static class AES extends HMacTiger { public AES() { super("AES"); } } public static class Anubis extends HMacTiger { public Anubis() { super("Anubis"); } } public static class Blowfish extends HMacTiger { public Blowfish() { super("Blowfish"); } } public static class Cast5 extends HMacTiger { public Cast5() { super("Cast5"); } } public static class DES extends HMacTiger { public DES() { super("DES"); } } public static class Khazad extends HMacTiger { public Khazad() { super("Khazad"); } } public static class Serpent extends HMacTiger { public Serpent() { super("Serpent"); } } public static class Square extends HMacTiger { public Square() { super("Square"); } } public static class TripleDES extends HMacTiger { public TripleDES() { super("TripleDES"); } } public static class Twofish extends HMacTiger { public Twofish() { super("Twofish"); } } } public static class HMacWhirlpool extends PBES2 { // Constructor(s) // ---------------------------------------------------------------------- public HMacWhirlpool(String cipher, int blockLen) { super(cipher, blockLen, "HMAC-WHIRLPOOL"); } public HMacWhirlpool(String cipher) { super(cipher, "HMAC-WHIRLPOOL"); } // Inner classe(s) // ====================================================================== public static class AES extends HMacWhirlpool { public AES() { super("AES"); } } public static class Anubis extends HMacWhirlpool { public Anubis() { super("Anubis"); } } public static class Blowfish extends HMacWhirlpool { public Blowfish() { super("Blowfish"); } } public static class Cast5 extends HMacWhirlpool { public Cast5() { super("Cast5"); } } public static class DES extends HMacWhirlpool { public DES() { super("DES"); } } public static class Khazad extends HMacWhirlpool { public Khazad() { super("Khazad"); } } public static class Serpent extends HMacWhirlpool { public Serpent() { super("Serpent"); } } public static class Square extends HMacWhirlpool { public Square() { super("Square"); } } public static class TripleDES extends HMacWhirlpool { public TripleDES() { super("TripleDES"); } } public static class Twofish extends HMacWhirlpool { public Twofish() { super("Twofish"); } } } }