Updated Branches: refs/heads/camel-2.12.x 1218ef5e8 -> be72f2cf2
CAMEL-6906 PGPDataFormat: Enable Streaming during Unmarshaling with thanks to Franz Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/be72f2cf Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/be72f2cf Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/be72f2cf Branch: refs/heads/camel-2.12.x Commit: be72f2cf2c25d899cffbcde6e824909a12418821 Parents: 1218ef5 Author: Willem Jiang <ningji...@apache.org> Authored: Tue Oct 29 11:39:10 2013 +0800 Committer: Willem Jiang <willem.ji...@gmail.com> Committed: Tue Oct 29 11:41:41 2013 +0800 ---------------------------------------------------------------------- .../camel/converter/crypto/PGPDataFormat.java | 61 ++++++++++++-------- .../converter/crypto/PGPDataFormatTest.java | 7 +-- 2 files changed, 39 insertions(+), 29 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/be72f2cf/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/PGPDataFormat.java ---------------------------------------------------------------------- diff --git a/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/PGPDataFormat.java b/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/PGPDataFormat.java index c14c5c8..db3deb0 100644 --- a/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/PGPDataFormat.java +++ b/components/camel-crypto/src/main/java/org/apache/camel/converter/crypto/PGPDataFormat.java @@ -17,7 +17,7 @@ package org.apache.camel.converter.crypto; import java.io.BufferedOutputStream; -import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -29,12 +29,12 @@ import java.security.SignatureException; import java.util.Date; import org.apache.camel.Exchange; +import org.apache.camel.converter.stream.CachedOutputStream; import org.apache.camel.spi.DataFormat; import org.apache.camel.support.ServiceSupport; import org.apache.camel.util.ExchangeHelper; import org.apache.camel.util.IOHelper; import org.apache.camel.util.ObjectHelper; -import org.apache.commons.io.IOUtils; import org.bouncycastle.bcpg.ArmoredOutputStream; import org.bouncycastle.bcpg.CompressionAlgorithmTags; import org.bouncycastle.bcpg.HashAlgorithmTags; @@ -65,7 +65,6 @@ import org.bouncycastle.openpgp.operator.jcajce.JcePBESecretKeyDecryptorBuilder; import org.bouncycastle.openpgp.operator.jcajce.JcePGPDataEncryptorBuilder; import org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyDataDecryptorFactoryBuilder; import org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyKeyEncryptionMethodGenerator; -import org.bouncycastle.util.io.Streams; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -125,7 +124,7 @@ public class PGPDataFormat extends ServiceSupport implements DataFormat { private int algorithm = SymmetricKeyAlgorithmTags.CAST5; /** - * If no passpharase can be found from the parameter <tt>password</tt> or + * If no passphrase can be found from the parameter <tt>password</tt> or * <tt>signaturePassword</tt> or from the header * {@link #SIGNATURE_KEY_PASSWORD} or {@link #KEY_PASSWORD} then we try to * get the password from the passphrase accessor. This is especially useful @@ -281,32 +280,21 @@ public class PGPDataFormat extends ServiceSupport implements DataFormat { return sigGen; } + @SuppressWarnings("resource") public Object unmarshal(Exchange exchange, InputStream encryptedStream) throws Exception { if (encryptedStream == null) { return null; } - - InputStream in; - try { - byte[] encryptedData = IOUtils.toByteArray(encryptedStream); - //TODO why do we need a byte array input stream? --> streaming not possible? - InputStream byteStream = new ByteArrayInputStream(encryptedData); - in = PGPUtil.getDecoderStream(byteStream); - } finally { - IOUtils.closeQuietly(encryptedStream); - } - + InputStream in = PGPUtil.getDecoderStream(encryptedStream); PGPObjectFactory pgpFactory = new PGPObjectFactory(in); Object o = pgpFactory.nextObject(); - - // the first object might be a PGP marker packet + // the first object might be a PGP marker packet PGPEncryptedDataList enc; if (o instanceof PGPEncryptedDataList) { enc = (PGPEncryptedDataList) o; } else { enc = (PGPEncryptedDataList) pgpFactory.nextObject(); } - IOHelper.close(in); PGPPublicKeyEncryptedData pbe = null; PGPPrivateKey key = null; @@ -337,23 +325,46 @@ public class PGPDataFormat extends ServiceSupport implements DataFormat { PGPLiteralData ld = (PGPLiteralData) object; InputStream litData = ld.getInputStream(); - //TODO we should enable streaming here with CashedOutputStream!! - byte[] answer; + // enable streaming via OutputStreamCache + CachedOutputStream cos; + ByteArrayOutputStream bos; + OutputStream os; + if (exchange.getContext().getStreamCachingStrategy().isEnabled()) { + cos = new CachedOutputStream(exchange); + bos = null; + os = cos; + } else { + cos = null; + bos = new ByteArrayOutputStream(); + os = bos; + } + try { - answer = Streams.readAll(litData); + byte[] buffer = new byte[BUFFER_SIZE]; + int bytesRead; + while ((bytesRead = litData.read(buffer)) != -1) { + os.write(buffer, 0, bytesRead); + if (signature != null) { + signature.update(buffer, 0, bytesRead); + } + os.flush(); + } } finally { - IOHelper.close(litData, encData, in); + IOHelper.close(os, litData, encData, in); } if (signature != null) { - signature.update(answer); PGPSignatureList sigList = (PGPSignatureList) pgpFactory.nextObject(); if (!signature.verify(getSignatureWithKeyId(signature.getKeyID(), sigList))) { throw new SignatureException("Cannot verify PGP signature"); } } - - return answer; + + if (cos != null) { + return cos.newStreamCache(); + } else { + return bos.toByteArray(); + } } protected PGPSignature getSignatureWithKeyId(long keyID, PGPSignatureList sigList) { http://git-wip-us.apache.org/repos/asf/camel/blob/be72f2cf/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatTest.java ---------------------------------------------------------------------- diff --git a/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatTest.java b/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatTest.java index a739a42..20413c8 100644 --- a/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatTest.java +++ b/components/camel-crypto/src/test/java/org/apache/camel/converter/crypto/PGPDataFormatTest.java @@ -121,7 +121,6 @@ public class PGPDataFormatTest extends AbstractPGPDataFormatTest { PGPDataFormat pgpDecrypt = new PGPDataFormat(); pgpDecrypt.setKeyFileName(keyFileNameSec); - // pgpDecrypt.setKeyUserid(keyUserid); pgpDecrypt.setPassword(keyPassword); pgpDecrypt.setProvider(getProvider()); @@ -176,7 +175,7 @@ public class PGPDataFormatTest extends AbstractPGPDataFormatTest { pgpDecryptByteArray.setPassphraseAccessor(passphraseAccessor); pgpDecryptByteArray.setProvider(getProvider()); - from("direct:key-ring-byte-array").marshal(pgpEncryptByteArray).to("mock:encrypted").unmarshal(pgpDecryptByteArray) + from("direct:key-ring-byte-array").streamCaching().marshal(pgpEncryptByteArray).to("mock:encrypted").unmarshal(pgpDecryptByteArray) .to("mock:unencrypted"); // END SNIPPET: pgp-format-key-ring-byte-array @@ -195,7 +194,7 @@ public class PGPDataFormatTest extends AbstractPGPDataFormatTest { pgpVerifyAndDecryptByteArray.setEncryptionKeyRing(getSecKeyRing()); pgpVerifyAndDecryptByteArray.setProvider(getProvider()); - from("direct:sign-key-ring-byte-array") + from("direct:sign-key-ring-byte-array").streamCaching() // encryption key ring can also be set as header .setHeader(PGPDataFormat.ENCRYPTION_KEY_RING).constant(getPublicKeyRing()).marshal(pgpSignAndEncryptByteArray) // it is recommended to remove the header immediately when it is no longer needed @@ -207,7 +206,7 @@ public class PGPDataFormatTest extends AbstractPGPDataFormatTest { // END SNIPPET: pgp-format-signature-key-ring-byte-array } - + }; }