From fb668ff51405296a776bb00c4b98c8c7ec4981d6 Mon Sep 17 00:00:00 2001 From: jlouie Date: Tue, 20 Aug 2013 16:22:45 -0700 Subject: [PATCH 1/5] search for literal data --- ext/org/sgonyea/pgp/Decryptor.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/ext/org/sgonyea/pgp/Decryptor.java b/ext/org/sgonyea/pgp/Decryptor.java index 0a863d5..c3fc670 100644 --- a/ext/org/sgonyea/pgp/Decryptor.java +++ b/ext/org/sgonyea/pgp/Decryptor.java @@ -135,7 +135,18 @@ public byte[] decryptStream(InputStream encryptedStream) pgpFactory = new PGPObjectFactory(compressedData.getDataStream()); - literallyTheRealFuckingData = (PGPLiteralData) pgpFactory.nextObject(); + while (true) { + + Object obj = pgpFactory.nextObject(); + if (obj == null) { + throw new NullPointerException("no more objects"); + } + if (obj instanceof PGPLiteralData) { + literallyTheRealFuckingData = (PGPLiteralData) obj; + break; + } + + } decryptedDataStream = literallyTheRealFuckingData.getInputStream(); From ef8ad99c0bc84da22d1996c8b343a1481d9d704d Mon Sep 17 00:00:00 2001 From: jlouie Date: Tue, 20 Aug 2013 17:09:55 -0700 Subject: [PATCH 2/5] verify signature, if present --- ext/org/sgonyea/pgp/Decryptor.java | 68 ++++++++++++++++++------------ lib/pgp/decryptor.rb | 23 ++++++++++ 2 files changed, 63 insertions(+), 28 deletions(-) diff --git a/ext/org/sgonyea/pgp/Decryptor.java b/ext/org/sgonyea/pgp/Decryptor.java index c3fc670..f1f7901 100644 --- a/ext/org/sgonyea/pgp/Decryptor.java +++ b/ext/org/sgonyea/pgp/Decryptor.java @@ -19,6 +19,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.security.NoSuchProviderException; +import java.security.SignatureException; import java.security.SecureRandom; import java.security.Security; import java.util.Date; @@ -26,27 +27,13 @@ import org.bouncycastle.bcpg.ArmoredOutputStream; import org.bouncycastle.jce.provider.BouncyCastleProvider; -import org.bouncycastle.openpgp.PGPCompressedData; -import org.bouncycastle.openpgp.PGPCompressedDataGenerator; -import org.bouncycastle.openpgp.PGPEncryptedData; -import org.bouncycastle.openpgp.PGPEncryptedDataGenerator; -import org.bouncycastle.openpgp.PGPEncryptedDataList; -import org.bouncycastle.openpgp.PGPException; -import org.bouncycastle.openpgp.PGPLiteralData; -import org.bouncycastle.openpgp.PGPLiteralDataGenerator; -import org.bouncycastle.openpgp.PGPObjectFactory; -import org.bouncycastle.openpgp.PGPPrivateKey; -import org.bouncycastle.openpgp.PGPPublicKey; -import org.bouncycastle.openpgp.PGPPublicKeyEncryptedData; -import org.bouncycastle.openpgp.PGPPublicKeyRing; -import org.bouncycastle.openpgp.PGPPublicKeyRingCollection; -import org.bouncycastle.openpgp.PGPSecretKey; -import org.bouncycastle.openpgp.PGPSecretKeyRingCollection; -import org.bouncycastle.openpgp.PGPUtil; +import org.bouncycastle.openpgp.*; +import org.bouncycastle.openpgp.operator.jcajce.JcaPGPContentVerifierBuilderProvider; public class Decryptor { private PGPSecretKeyRingCollection _privateKeys; + private PGPPublicKeyRingCollection _publicKeys; private String passphrase; @@ -66,6 +53,10 @@ public void setPrivateKeys(PGPSecretKeyRingCollection privateKeys) { _privateKeys = privateKeys; } + public void setPublicKeys(PGPPublicKeyRingCollection publicKeys) { + _publicKeys = publicKeys; + } + public void setPassphrase(String passphrase) { this.passphrase = passphrase; } @@ -87,13 +78,13 @@ public PGPPrivateKey findPrivateKey(long keyID) **/ public byte[] decryptBytes(byte[] encryptedBytes) - throws IOException, PGPException, NoSuchProviderException { + throws IOException, PGPException, NoSuchProviderException, SignatureException, VerificationFailedException { InputStream stream = new ByteArrayInputStream(encryptedBytes); return decryptStream(stream); } public byte[] decryptStream(InputStream encryptedStream) - throws IOException, PGPException, NoSuchProviderException { + throws IOException, PGPException, NoSuchProviderException, SignatureException, VerificationFailedException { InputStream decoderStream = PGPUtil.getDecoderStream(encryptedStream); @@ -135,28 +126,49 @@ public byte[] decryptStream(InputStream encryptedStream) pgpFactory = new PGPObjectFactory(compressedData.getDataStream()); - while (true) { - - Object obj = pgpFactory.nextObject(); - if (obj == null) { - throw new NullPointerException("no more objects"); + PGPOnePassSignatureList opsList = null; + PGPOnePassSignature ops = null; + PGPPublicKey signingKey = null; + Object obj = pgpFactory.nextObject(); + if (obj instanceof PGPOnePassSignatureList) { + opsList = (PGPOnePassSignatureList) obj; + ops = opsList.get(0); + if (_publicKeys != null) { + signingKey = _publicKeys.getPublicKey(ops.getKeyID()); + // TODO warn on key not found } - if (obj instanceof PGPLiteralData) { - literallyTheRealFuckingData = (PGPLiteralData) obj; - break; + // TODO warn on no public keys set + if (signingKey != null) { + ops.init(new JcaPGPContentVerifierBuilderProvider().setProvider("BC"), signingKey); } + literallyTheRealFuckingData = (PGPLiteralData) pgpFactory.nextObject(); + } else if (obj instanceof PGPLiteralData) { + literallyTheRealFuckingData = (PGPLiteralData) obj; + } else { + throw new RuntimeException("unexpected object"); } decryptedDataStream = literallyTheRealFuckingData.getInputStream(); int ch; - while ((ch = decryptedDataStream.read()) >= 0) + while ((ch = decryptedDataStream.read()) >= 0) { + if (signingKey != null) { + ops.update((byte)ch); + } outputStream.write(ch); + } returnBytes = outputStream.toByteArray(); outputStream.close(); + if (signingKey != null) { + PGPSignatureList sigList = (PGPSignatureList) pgpFactory.nextObject(); + if (!ops.verify(sigList.get(0))) { + throw new VerificationFailedException("Error: Signature could not be verified."); + } + } + return returnBytes; } diff --git a/lib/pgp/decryptor.rb b/lib/pgp/decryptor.rb index 2965eac..88eb569 100644 --- a/lib/pgp/decryptor.rb +++ b/lib/pgp/decryptor.rb @@ -10,6 +10,14 @@ def add_keys_from_file(filename) self.private_keys = keyring_from_file(filename) end + def add_public_keys(key_string) + self.public_keys = public_keyring_from_string(key_string) + end + + def add_public_keys_from_file(filename) + self.public_keys = public_keyring_from_file(filename) + end + def decrypt(encrypted_data) input_stream = PGP.string_to_bais(encrypted_data) decrypted_data = decrypt_stream(input_stream) @@ -36,5 +44,20 @@ def keyring_from_stream(stream) PGPSecretKeyRingCollection.new(yafs) end + def public_keyring_from_file(filename) + file = File.open(filename) + public_keyring_from_stream(file.to_inputstream) + end + + def public_keyring_from_string(string) + input_stream = PGP.string_to_bais(string) + public_keyring_from_stream(input_stream) + end + + def public_keyring_from_stream(stream) + yafs = PGPUtil.get_decoder_stream(stream) + PGPPublicKeyRingCollection.new(yafs) + end + end end From ed52c59d0a4f2d2a4365421a80f6d062387aa1b1 Mon Sep 17 00:00:00 2001 From: jlouie Date: Wed, 21 Aug 2013 10:45:37 -0700 Subject: [PATCH 3/5] commit jar so that pointing Gemfile at git works --- .gitignore | 2 +- jruby-pgp.gemspec | 2 +- lib/pgp/jruby-pgp.jar | Bin 0 -> 10584 bytes 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 lib/pgp/jruby-pgp.jar diff --git a/.gitignore b/.gitignore index c2debe9..5308050 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,4 @@ test/version_tmp tmp # Skip our compiled jruby-pgp.jar -lib/pgp/jruby-pgp.jar +#lib/pgp/jruby-pgp.jar diff --git a/jruby-pgp.gemspec b/jruby-pgp.gemspec index 0abdc9c..1519edb 100644 --- a/jruby-pgp.gemspec +++ b/jruby-pgp.gemspec @@ -13,7 +13,7 @@ Gem::Specification.new do |gem| gem.summary = %q{This is a Java+JRuby wrapper around the Bouncy Castle PGP APIs} gem.homepage = 'https://github.com/sgonyea/jruby-pgp' - gem.files = `git ls-files`.split($/) + %w[lib/pgp/jruby-pgp.jar] + gem.files = `git ls-files`.split($/) gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) } gem.test_files = gem.files.grep(%r{^(test|spec|features)/}) gem.require_paths = ['lib'] diff --git a/lib/pgp/jruby-pgp.jar b/lib/pgp/jruby-pgp.jar new file mode 100644 index 0000000000000000000000000000000000000000..42830fae7feb249c1a8f3de393541e9e8ff3e43a GIT binary patch literal 10584 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 Date: Wed, 21 Aug 2013 18:42:32 -0700 Subject: [PATCH 4/5] increase version --- lib/pgp/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pgp/version.rb b/lib/pgp/version.rb index f90a8f7..7e1a7ca 100644 --- a/lib/pgp/version.rb +++ b/lib/pgp/version.rb @@ -1,3 +1,3 @@ module PGP - VERSION = '0.3.0' + VERSION = '0.4.0' end From 9f53650d955d8fcc15d59c027fc67361d16f256a Mon Sep 17 00:00:00 2001 From: jlouie Date: Thu, 22 Aug 2013 11:20:21 -0700 Subject: [PATCH 5/5] remove jruby-openssl dependency --- jruby-pgp.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jruby-pgp.gemspec b/jruby-pgp.gemspec index 1519edb..28b2958 100644 --- a/jruby-pgp.gemspec +++ b/jruby-pgp.gemspec @@ -18,7 +18,7 @@ Gem::Specification.new do |gem| gem.test_files = gem.files.grep(%r{^(test|spec|features)/}) gem.require_paths = ['lib'] - gem.add_dependency 'jruby-openssl' + #gem.add_dependency 'jruby-openssl' gem.add_development_dependency 'rake' gem.add_development_dependency 'rspec'