1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.crypto.generators; 2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 3b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.crypto.KeyGenerationParameters; 4b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.crypto.params.DESedeParameters; 5b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 6b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class DESedeKeyGenerator 7b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam extends DESKeyGenerator 8b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{ 9b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam /** 10b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * initialise the key generator - if strength is set to zero 11b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * the key generated will be 192 bits in size, otherwise 12b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * strength can be 128 or 192 (or 112 or 168 if you don't count 13b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * parity bits), depending on whether you wish to do 2-key or 3-key 14b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * triple DES. 15b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * 16b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * @param param the parameters to be used for key generation 17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */ 18b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public void init( 19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam KeyGenerationParameters param) 20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 21c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom this.random = param.getRandom(); 22c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom this.strength = (param.getStrength() + 7) / 8; 23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam if (strength == 0 || strength == (168 / 8)) 25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam strength = DESedeParameters.DES_EDE_KEY_LENGTH; 27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam else if (strength == (112 / 8)) 29b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 30b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam strength = 2 * DESedeParameters.DES_KEY_LENGTH; 31b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 32b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam else if (strength != DESedeParameters.DES_EDE_KEY_LENGTH 33b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam && strength != (2 * DESedeParameters.DES_KEY_LENGTH)) 34b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 35b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam throw new IllegalArgumentException("DESede key must be " 36b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam + (DESedeParameters.DES_EDE_KEY_LENGTH * 8) + " or " 37b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam + (2 * 8 * DESedeParameters.DES_KEY_LENGTH) 38b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam + " bits long."); 39b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 40b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 41b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 42b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam public byte[] generateKey() 43b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 44b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam byte[] newKey = new byte[strength]; 45b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam do 47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam { 48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam random.nextBytes(newKey); 49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 50b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam DESedeParameters.setOddParity(newKey); 51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam while (DESedeParameters.isWeakKey(newKey, 0, newKey.length)); 53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam 54b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam return newKey; 55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam } 56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam} 57