You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@gobblin.apache.org by hu...@apache.org on 2017/10/19 18:26:24 UTC
incubator-gobblin git commit: [GOBBLIN-289] fix the issue that PGP
file only partially depcrypted
Repository: incubator-gobblin
Updated Branches:
refs/heads/master 6dd36a506 -> 8f32ab4c1
[GOBBLIN-289] fix the issue that PGP file only partially depcrypted
Closes #2141 from jerrybai2009/master
Project: http://git-wip-us.apache.org/repos/asf/incubator-gobblin/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-gobblin/commit/8f32ab4c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-gobblin/tree/8f32ab4c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-gobblin/diff/8f32ab4c
Branch: refs/heads/master
Commit: 8f32ab4c16e6832a1a156cfd16e4f54e8d8c1dce
Parents: 6dd36a5
Author: jbai <jb...@linkedin.com>
Authored: Thu Oct 19 11:26:19 2017 -0700
Committer: Hung Tran <hu...@linkedin.com>
Committed: Thu Oct 19 11:26:19 2017 -0700
----------------------------------------------------------------------
.../apache/gobblin/crypto/GPGFileDecryptor.java | 34 ++++++++++++++------
1 file changed, 25 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-gobblin/blob/8f32ab4c/gobblin-modules/gobblin-crypto/src/main/java/org/apache/gobblin/crypto/GPGFileDecryptor.java
----------------------------------------------------------------------
diff --git a/gobblin-modules/gobblin-crypto/src/main/java/org/apache/gobblin/crypto/GPGFileDecryptor.java b/gobblin-modules/gobblin-crypto/src/main/java/org/apache/gobblin/crypto/GPGFileDecryptor.java
index ec28273..7d62439 100644
--- a/gobblin-modules/gobblin-crypto/src/main/java/org/apache/gobblin/crypto/GPGFileDecryptor.java
+++ b/gobblin-modules/gobblin-crypto/src/main/java/org/apache/gobblin/crypto/GPGFileDecryptor.java
@@ -16,6 +16,8 @@
*/
package org.apache.gobblin.crypto;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.Security;
@@ -34,6 +36,7 @@ import org.bouncycastle.openpgp.PGPPrivateKey;
import org.bouncycastle.openpgp.PGPPublicKeyEncryptedData;
import org.bouncycastle.openpgp.PGPSecretKey;
import org.bouncycastle.openpgp.PGPSecretKeyRingCollection;
+import org.bouncycastle.openpgp.PGPSignatureList;
import org.bouncycastle.openpgp.PGPUtil;
import org.bouncycastle.openpgp.jcajce.JcaPGPObjectFactory;
import org.bouncycastle.openpgp.operator.bc.BcKeyFingerprintCalculator;
@@ -41,6 +44,7 @@ import org.bouncycastle.openpgp.operator.jcajce.JcaPGPDigestCalculatorProviderBu
import org.bouncycastle.openpgp.operator.jcajce.JcePBEDataDecryptorFactoryBuilder;
import org.bouncycastle.openpgp.operator.jcajce.JcePBESecretKeyDecryptorBuilder;
import org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyDataDecryptorFactoryBuilder;
+import org.bouncycastle.util.io.Streams;
/**
@@ -113,23 +117,35 @@ public class GPGFileDecryptor {
throw new IllegalArgumentException("secret key for message not found.");
}
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+
try (InputStream clear = pbe.getDataStream(
new JcePublicKeyDataDecryptorFactoryBuilder().setProvider(BouncyCastleProvider.PROVIDER_NAME).build(sKey))) {
JcaPGPObjectFactory pgpFact = new JcaPGPObjectFactory(clear);
Object pgpfObject = pgpFact.nextObject();
- if (pgpfObject instanceof PGPCompressedData) {
- PGPCompressedData cData = (PGPCompressedData) pgpfObject;
- pgpFact = new JcaPGPObjectFactory(cData.getDataStream());
+ while (pgpfObject != null) {
+ if (pgpfObject instanceof PGPCompressedData) {
+ PGPCompressedData cData = (PGPCompressedData) pgpfObject;
+ pgpFact = new JcaPGPObjectFactory(cData.getDataStream());
+ pgpfObject = pgpFact.nextObject();
+ }
+
+ if (pgpfObject instanceof PGPLiteralData) {
+ Streams.pipeAll(((PGPLiteralData) pgpfObject).getInputStream(), outputStream);
+ } else if (pgpfObject instanceof PGPOnePassSignatureList) {
+ throw new PGPException("encrypted message contains PGPOnePassSignatureList message - not literal data.");
+ } else if (pgpfObject instanceof PGPSignatureList) {
+ throw new PGPException("encrypted message contains PGPSignatureList message - not literal data.");
+ } else {
+ throw new PGPException("message is not a simple encrypted file - type unknown.");
+ }
pgpfObject = pgpFact.nextObject();
- PGPLiteralData ld = (PGPLiteralData) pgpfObject;
- return ld.getInputStream();
- } else if (pgpfObject instanceof PGPOnePassSignatureList) {
- throw new PGPException("encrypted message contains a signed message - not literal data.");
- } else {
- throw new PGPException("message is not a simple encrypted file - type unknown.");
}
+ return new ByteArrayInputStream(outputStream.toByteArray());
+ } finally {
+ outputStream.close();
}
}