| package org.bouncycastle.crypto.generators; |
| |
| import org.bouncycastle.crypto.KeyGenerationParameters; |
| import org.bouncycastle.crypto.params.DESedeParameters; |
| |
| public class DESedeKeyGenerator |
| extends DESKeyGenerator |
| { |
| /** |
| * initialise the key generator - if strength is set to zero |
| * the key generated will be 192 bits in size, otherwise |
| * strength can be 128 or 192 (or 112 or 168 if you don't count |
| * parity bits), depending on whether you wish to do 2-key or 3-key |
| * triple DES. |
| * |
| * @param param the parameters to be used for key generation |
| */ |
| public void init( |
| KeyGenerationParameters param) |
| { |
| this.random = param.getRandom(); |
| this.strength = (param.getStrength() + 7) / 8; |
| |
| if (strength == 0 || strength == (168 / 8)) |
| { |
| strength = DESedeParameters.DES_EDE_KEY_LENGTH; |
| } |
| else if (strength == (112 / 8)) |
| { |
| strength = 2 * DESedeParameters.DES_KEY_LENGTH; |
| } |
| else if (strength != DESedeParameters.DES_EDE_KEY_LENGTH |
| && strength != (2 * DESedeParameters.DES_KEY_LENGTH)) |
| { |
| throw new IllegalArgumentException("DESede key must be " |
| + (DESedeParameters.DES_EDE_KEY_LENGTH * 8) + " or " |
| + (2 * 8 * DESedeParameters.DES_KEY_LENGTH) |
| + " bits long."); |
| } |
| } |
| |
| public byte[] generateKey() |
| { |
| byte[] newKey = new byte[strength]; |
| |
| do |
| { |
| random.nextBytes(newKey); |
| |
| DESedeParameters.setOddParity(newKey); |
| } |
| while (DESedeParameters.isWeakKey(newKey, 0, newKey.length)); |
| |
| return newKey; |
| } |
| } |