private byte[] encrypt(final String name, final Date date, final byte[] rawText)
      throws NoSuchProviderException, PGPException, IOException {
    final byte[] zText = compress(name, date, rawText);
    final PGPEncryptedDataGenerator cpk =
        new PGPEncryptedDataGenerator(PGPEncryptedData.CAST5, true, prng, "BC");
    cpk.addMethod(dest);

    final ByteArrayOutputStream buf = new ByteArrayOutputStream();
    final ArmoredOutputStream aout = new ArmoredOutputStream(buf);
    final OutputStream cout = cpk.open(aout, zText.length);
    cout.write(zText);
    cout.close();
    aout.close();

    return buf.toByteArray();
  }
  void createEncryptedNonCompressedData(ByteArrayOutputStream bos, String keyringPath)
      throws Exception, IOException, PGPException, UnsupportedEncodingException {
    PGPEncryptedDataGenerator encGen =
        new PGPEncryptedDataGenerator(
            new JcePGPDataEncryptorBuilder(SymmetricKeyAlgorithmTags.CAST5)
                .setSecureRandom(new SecureRandom())
                .setProvider(getProvider()));
    encGen.addMethod(new JcePublicKeyKeyEncryptionMethodGenerator(readPublicKey(keyringPath)));
    OutputStream encOut = encGen.open(bos, new byte[512]);
    PGPLiteralDataGenerator litData = new PGPLiteralDataGenerator();
    OutputStream litOut =
        litData.open(
            encOut, PGPLiteralData.BINARY, PGPLiteralData.CONSOLE, new Date(), new byte[512]);

    try {
      litOut.write("Test Message Without Compression".getBytes("UTF-8"));
      litOut.flush();
    } finally {
      IOHelper.close(litOut);
      IOHelper.close(encOut, bos);
    }
  }
  @Test
  public void testExceptionDecryptorIncorrectInputFormatSymmetricEncryptedData() throws Exception {

    byte[] payload = "Not Correct Format".getBytes("UTF-8");
    ByteArrayOutputStream bos = new ByteArrayOutputStream();

    PGPEncryptedDataGenerator encGen =
        new PGPEncryptedDataGenerator(
            new JcePGPDataEncryptorBuilder(SymmetricKeyAlgorithmTags.CAST5)
                .setSecureRandom(new SecureRandom())
                .setProvider(getProvider()));

    encGen.addMethod(new JcePBEKeyEncryptionMethodGenerator("pw".toCharArray()));

    OutputStream encOut = encGen.open(bos, new byte[1024]);
    PGPCompressedDataGenerator comData =
        new PGPCompressedDataGenerator(CompressionAlgorithmTags.ZIP);
    OutputStream comOut = new BufferedOutputStream(comData.open(encOut));
    PGPLiteralDataGenerator litData = new PGPLiteralDataGenerator();
    OutputStream litOut =
        litData.open(
            comOut, PGPLiteralData.BINARY, PGPLiteralData.CONSOLE, new Date(), new byte[1024]);
    litOut.write(payload);
    litOut.flush();
    litOut.close();
    comOut.close();
    encOut.close();
    MockEndpoint mock = getMockEndpoint("mock:exception");
    mock.expectedMessageCount(1);
    template.sendBody("direct:subkeyUnmarshal", bos.toByteArray());
    assertMockEndpointsSatisfied();

    checkThrownException(
        mock,
        IllegalArgumentException.class,
        null,
        "The input message body has an invalid format.");
  }
  public TestResult perform() {
    try {
      String file = null;
      KeyFactory fact = KeyFactory.getInstance("DSA", "BC");
      PGPPublicKey pubKey = null;
      PrivateKey privKey = null;

      PGPUtil.setDefaultProvider("BC");

      //
      // Read the public key
      //
      PGPObjectFactory pgpFact = new PGPObjectFactory(testPubKeyRing);

      PGPPublicKeyRing pgpPub = (PGPPublicKeyRing) pgpFact.nextObject();

      pubKey = pgpPub.getPublicKey();

      //
      // Read the private key
      //
      PGPSecretKeyRing sKey = new PGPSecretKeyRing(testPrivKeyRing);
      PGPPrivateKey pgpPrivKey = sKey.getSecretKey().extractPrivateKey(pass, "BC");

      //
      // signature generation
      //
      String data = "hello world!";
      ByteArrayOutputStream bOut = new ByteArrayOutputStream();
      ByteArrayInputStream testIn = new ByteArrayInputStream(data.getBytes());
      PGPSignatureGenerator sGen = new PGPSignatureGenerator(PGPPublicKey.DSA, PGPUtil.SHA1, "BC");

      sGen.initSign(PGPSignature.BINARY_DOCUMENT, pgpPrivKey);

      PGPCompressedDataGenerator cGen = new PGPCompressedDataGenerator(PGPCompressedData.ZIP);

      BCPGOutputStream bcOut = new BCPGOutputStream(cGen.open(bOut));

      sGen.generateOnePassVersion(false).encode(bcOut);

      PGPLiteralDataGenerator lGen = new PGPLiteralDataGenerator();
      OutputStream lOut =
          lGen.open(bcOut, PGPLiteralData.BINARY, "_CONSOLE", data.getBytes().length, new Date());
      int ch;

      while ((ch = testIn.read()) >= 0) {
        lOut.write(ch);
        sGen.update((byte) ch);
      }

      sGen.generate().encode(bcOut);

      lGen.close();

      cGen.close();

      //
      // verify generated signature
      //
      pgpFact = new PGPObjectFactory(bOut.toByteArray());

      PGPCompressedData c1 = (PGPCompressedData) pgpFact.nextObject();

      pgpFact = new PGPObjectFactory(c1.getDataStream());

      PGPOnePassSignatureList p1 = (PGPOnePassSignatureList) pgpFact.nextObject();

      PGPOnePassSignature ops = p1.get(0);

      PGPLiteralData p2 = (PGPLiteralData) pgpFact.nextObject();

      InputStream dIn = p2.getInputStream();

      ops.initVerify(pubKey, "BC");

      while ((ch = dIn.read()) >= 0) {
        ops.update((byte) ch);
      }

      PGPSignatureList p3 = (PGPSignatureList) pgpFact.nextObject();

      if (!ops.verify(p3.get(0))) {
        return new SimpleTestResult(false, getName() + ": Failed generated signature check");
      }

      //
      // test encryption
      //

      //
      // find a key sutiable for encryption
      //
      long pgpKeyID = 0;
      PublicKey pKey = null;

      Iterator it = pgpPub.getPublicKeys();
      while (it.hasNext()) {
        PGPPublicKey pgpKey = (PGPPublicKey) it.next();

        if (pgpKey.getAlgorithm() == PGPPublicKey.ELGAMAL_ENCRYPT
            || pgpKey.getAlgorithm() == PGPPublicKey.ELGAMAL_GENERAL) {
          pKey = pgpKey.getKey("BC");
          pgpKeyID = pgpKey.getKeyID();

          //
          // verify the key
          //

        }
      }

      Cipher c = Cipher.getInstance("ElGamal/None/PKCS1Padding", "BC");

      c.init(Cipher.ENCRYPT_MODE, pKey);

      byte[] in = "hello world".getBytes();

      byte[] out = c.doFinal(in);

      pgpPrivKey = sKey.getSecretKey(pgpKeyID).extractPrivateKey(pass, "BC");

      c.init(Cipher.DECRYPT_MODE, pgpPrivKey.getKey());

      out = c.doFinal(out);

      if (notEqual(in, out)) {
        return new SimpleTestResult(false, getName() + ": decryption failed.");
      }

      //
      // encrypted message
      //
      byte[] text = {
        (byte) 'h',
        (byte) 'e',
        (byte) 'l',
        (byte) 'l',
        (byte) 'o',
        (byte) ' ',
        (byte) 'w',
        (byte) 'o',
        (byte) 'r',
        (byte) 'l',
        (byte) 'd',
        (byte) '!',
        (byte) '\n'
      };

      PGPObjectFactory pgpF = new PGPObjectFactory(encMessage);

      PGPEncryptedDataList encList = (PGPEncryptedDataList) pgpF.nextObject();

      PGPPublicKeyEncryptedData encP = (PGPPublicKeyEncryptedData) encList.get(0);

      InputStream clear = encP.getDataStream(pgpPrivKey, "BC");

      pgpFact = new PGPObjectFactory(clear);

      c1 = (PGPCompressedData) pgpFact.nextObject();

      pgpFact = new PGPObjectFactory(c1.getDataStream());

      PGPLiteralData ld = (PGPLiteralData) pgpFact.nextObject();

      bOut = new ByteArrayOutputStream();

      if (!ld.getFileName().equals("test.txt")) {
        throw new RuntimeException("wrong filename in packet");
      }

      InputStream inLd = ld.getDataStream();

      while ((ch = inLd.read()) >= 0) {
        bOut.write(ch);
      }

      if (notEqual(bOut.toByteArray(), text)) {
        return new SimpleTestResult(false, getName() + ": wrong plain text in decrypted packet");
      }

      //
      // signed and encrypted message
      //
      pgpF = new PGPObjectFactory(signedAndEncMessage);

      encList = (PGPEncryptedDataList) pgpF.nextObject();

      encP = (PGPPublicKeyEncryptedData) encList.get(0);

      clear = encP.getDataStream(pgpPrivKey, "BC");

      pgpFact = new PGPObjectFactory(clear);

      c1 = (PGPCompressedData) pgpFact.nextObject();

      pgpFact = new PGPObjectFactory(c1.getDataStream());

      p1 = (PGPOnePassSignatureList) pgpFact.nextObject();

      ops = p1.get(0);

      ld = (PGPLiteralData) pgpFact.nextObject();

      bOut = new ByteArrayOutputStream();

      if (!ld.getFileName().equals("test.txt")) {
        throw new RuntimeException("wrong filename in packet");
      }

      inLd = ld.getDataStream();

      //
      // note: we use the DSA public key here.
      //
      ops.initVerify(pgpPub.getPublicKey(), "BC");

      while ((ch = inLd.read()) >= 0) {
        ops.update((byte) ch);
        bOut.write(ch);
      }

      p3 = (PGPSignatureList) pgpFact.nextObject();

      if (!ops.verify(p3.get(0))) {
        return new SimpleTestResult(false, getName() + ": Failed signature check");
      }

      if (notEqual(bOut.toByteArray(), text)) {
        return new SimpleTestResult(false, getName() + ": wrong plain text in decrypted packet");
      }

      //
      // encrypt
      //
      ByteArrayOutputStream cbOut = new ByteArrayOutputStream();
      PGPEncryptedDataGenerator cPk =
          new PGPEncryptedDataGenerator(
              SymmetricKeyAlgorithmTags.TRIPLE_DES, new SecureRandom(), "BC");
      PGPPublicKey puK = sKey.getSecretKey(pgpKeyID).getPublicKey();

      cPk.addMethod(puK);

      OutputStream cOut = cPk.open(cbOut, bOut.toByteArray().length);

      cOut.write(text);

      cOut.close();

      pgpF = new PGPObjectFactory(cbOut.toByteArray());

      encList = (PGPEncryptedDataList) pgpF.nextObject();

      encP = (PGPPublicKeyEncryptedData) encList.get(0);

      pgpPrivKey = sKey.getSecretKey(pgpKeyID).extractPrivateKey(pass, "BC");

      clear = encP.getDataStream(pgpPrivKey, "BC");

      bOut.reset();

      while ((ch = clear.read()) >= 0) {
        bOut.write(ch);
      }

      out = bOut.toByteArray();

      if (notEqual(out, text)) {
        return new SimpleTestResult(false, getName() + ": wrong plain text in generated packet");
      }

      return new SimpleTestResult(true, getName() + ": Okay");
    } catch (Exception e) {
      e.printStackTrace();
      if (e instanceof PGPException) {
        ((PGPException) e).getUnderlyingException().printStackTrace();
      }
      return new SimpleTestResult(false, getName() + ": exception - " + e.toString());
    }
  }