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