Example #1
0
  protected void engineInit(int opmode, Key key, AlgorithmParameterSpec params, SecureRandom random)
      throws InvalidKeyException, InvalidAlgorithmParameterException {
    CipherParameters param;

    this.pbeSpec = null;
    this.pbeAlgorithm = null;

    this.engineParams = null;

    //
    // basic key check
    //
    if (!(key instanceof SecretKey)) {
      throw new InvalidKeyException(
          "Key for algorithm " + key.getAlgorithm() + " not suitable for symmetric enryption.");
    }

    if (key instanceof BCPBEKey) {
      BCPBEKey k = (BCPBEKey) key;

      if (k.getOID() != null) {
        pbeAlgorithm = k.getOID().getId();
      } else {
        pbeAlgorithm = k.getAlgorithm();
      }

      if (k.getParam() != null) {
        param = k.getParam();
        pbeSpec = new PBEParameterSpec(k.getSalt(), k.getIterationCount());
      } else if (params instanceof PBEParameterSpec) {
        param = PBE.Util.makePBEParameters(k, params, cipher.getAlgorithmName());
        pbeSpec = (PBEParameterSpec) params;
      } else {
        throw new InvalidAlgorithmParameterException("PBE requires PBE parameters to be set.");
      }

      if (k.getIvSize() != 0) {
        ivParam = (ParametersWithIV) param;
      }
    } else if (params == null) {
      param = new KeyParameter(key.getEncoded());
    } else if (params instanceof IvParameterSpec) {
      param =
          new ParametersWithIV(
              new KeyParameter(key.getEncoded()), ((IvParameterSpec) params).getIV());
      ivParam = (ParametersWithIV) param;
    } else {
      throw new IllegalArgumentException("unknown parameter type.");
    }

    if ((ivLength != 0) && !(param instanceof ParametersWithIV)) {
      SecureRandom ivRandom = random;

      if (ivRandom == null) {
        ivRandom = new SecureRandom();
      }

      if ((opmode == Cipher.ENCRYPT_MODE) || (opmode == Cipher.WRAP_MODE)) {
        byte[] iv = new byte[ivLength];

        ivRandom.nextBytes(iv);
        param = new ParametersWithIV(param, iv);
        ivParam = (ParametersWithIV) param;
      } else {
        throw new InvalidAlgorithmParameterException("no IV set when one expected");
      }
    }

    switch (opmode) {
      case Cipher.ENCRYPT_MODE:
      case Cipher.WRAP_MODE:
        cipher.init(true, param);
        break;
      case Cipher.DECRYPT_MODE:
      case Cipher.UNWRAP_MODE:
        cipher.init(false, param);
        break;
      default:
        System.out.println("eeek!");
    }
  }