jruby-pgp 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.rbenv-version +1 -0
- data/README.md +23 -5
- data/ext/org/sgonyea/pgp/Decryptor.java +7 -2
- data/ext/org/sgonyea/pgp/PGPExampleUtil.java +153 -0
- data/ext/org/sgonyea/pgp/Signer.java +133 -0
- data/ext/org/sgonyea/pgp/VerificationFailedException.java +7 -0
- data/ext/org/sgonyea/pgp/Verifier.java +104 -0
- data/lib/pgp.rb +3 -1
- data/lib/pgp/signer.rb +39 -0
- data/lib/pgp/verifier.rb +38 -0
- data/lib/pgp/version.rb +1 -1
- data/spec/lib/pgp/decryptor_spec.rb +17 -0
- data/spec/lib/pgp/signer_spec.rb +44 -0
- data/spec/lib/pgp/verifier_spec.rb +33 -0
- data/spec/spec_helper.rb +2 -4
- data/spec/support/fixtures/encrypted_with_passphrase_key.txt +1 -0
- data/spec/support/fixtures/encrypted_with_passphrase_key.txt.asc +13 -0
- data/spec/support/fixtures/private_key_with_passphrase.asc +59 -0
- data/spec/support/fixtures/public_key_with_passphrase.asc +30 -0
- data/spec/support/fixtures/signed_file.txt +1 -0
- data/spec/support/fixtures/signed_file.txt.asc +14 -0
- data/spec/support/fixtures/wrong_private_key_for_signature.asc +63 -0
- data/spec/support/fixtures/wrong_public_key_for_signature.asc +36 -0
- metadata +170 -119
data/.rbenv-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
jruby-1.7.2
|
data/README.md
CHANGED
@@ -27,20 +27,26 @@ The feature set is very bare, and restricted to the following operations:
|
|
27
27
|
|
28
28
|
- Public and Private keys may be read in from disk or from memory.
|
29
29
|
|
30
|
-
|
30
|
+
- Verify the signature of a file that you are decrypting. (thanks, @superchris)
|
31
31
|
|
32
|
-
-
|
32
|
+
- Use password-protected Private Keys. (thanks, @superchris)
|
33
33
|
|
34
|
-
- Sign a file
|
34
|
+
- Sign a file from the file system. (thanks, @superchris)
|
35
35
|
|
36
|
-
|
36
|
+
Currently, you **cannot** do the following (These are TODO items):
|
37
37
|
|
38
|
-
-
|
38
|
+
- Verify any signatures of public / private keys.
|
39
|
+
|
40
|
+
- Create new Private Keys / generate public keys from a given Private Key.
|
41
|
+
|
42
|
+
- Sign a file that you are encrypting.
|
39
43
|
|
40
44
|
- Obtain the name of the file that was encrypted. (Should be an easy feature to add.)
|
41
45
|
|
42
46
|
- Obtain the "modificationTime" (timestamp) of the encrypted data / file.
|
43
47
|
|
48
|
+
- Verify a public key based on information from a key server.
|
49
|
+
|
44
50
|
## Notes
|
45
51
|
|
46
52
|
This gem currently features everything I need and nothing I don't. Pull requests are very much welcome;
|
@@ -62,6 +68,10 @@ For usage examples, see the below test files:
|
|
62
68
|
Encryption: spec/lib/pgp/encryptor_spec.rb
|
63
69
|
Decryption: spec/lib/pgp/decryptor_spec.rb
|
64
70
|
|
71
|
+
## Contributors
|
72
|
+
|
73
|
+
@superchris
|
74
|
+
|
65
75
|
## Contributing
|
66
76
|
|
67
77
|
1. Fork it
|
@@ -69,3 +79,11 @@ For usage examples, see the below test files:
|
|
69
79
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
70
80
|
4. Push to the branch (`git push origin my-new-feature`)
|
71
81
|
5. Create new Pull Request
|
82
|
+
|
83
|
+
## Testing:
|
84
|
+
|
85
|
+
Just run:
|
86
|
+
|
87
|
+
$ rake spec
|
88
|
+
|
89
|
+
And it will compile the Java extensions prior to running the tests.
|
@@ -48,6 +48,8 @@ public class Decryptor {
|
|
48
48
|
|
49
49
|
private PGPSecretKeyRingCollection _privateKeys;
|
50
50
|
|
51
|
+
private String passphrase;
|
52
|
+
|
51
53
|
public Decryptor() { }
|
52
54
|
public Decryptor(PGPSecretKeyRingCollection privateKeys) {
|
53
55
|
setPrivateKeys(privateKeys);
|
@@ -64,6 +66,10 @@ public class Decryptor {
|
|
64
66
|
_privateKeys = privateKeys;
|
65
67
|
}
|
66
68
|
|
69
|
+
public void setPassphrase(String passphrase) {
|
70
|
+
this.passphrase = passphrase;
|
71
|
+
}
|
72
|
+
|
67
73
|
public PGPPrivateKey findPrivateKey(long keyID)
|
68
74
|
throws PGPException, NoSuchProviderException {
|
69
75
|
PGPSecretKey pgpSecKey = getPrivateKeys().getSecretKey(keyID);
|
@@ -71,8 +77,7 @@ public class Decryptor {
|
|
71
77
|
if (pgpSecKey == null)
|
72
78
|
return null;
|
73
79
|
|
74
|
-
|
75
|
-
return pgpSecKey.extractPrivateKey(null, "BC");
|
80
|
+
return pgpSecKey.extractPrivateKey((passphrase == null ? null : passphrase.toCharArray()), "BC");
|
76
81
|
}
|
77
82
|
|
78
83
|
/** End Accessor Methods **/
|
@@ -0,0 +1,153 @@
|
|
1
|
+
package org.sgonyea.pgp;
|
2
|
+
|
3
|
+
import java.io.BufferedInputStream;
|
4
|
+
import java.io.ByteArrayOutputStream;
|
5
|
+
import java.io.File;
|
6
|
+
import java.io.FileInputStream;
|
7
|
+
import java.io.IOException;
|
8
|
+
import java.io.InputStream;
|
9
|
+
import java.security.NoSuchProviderException;
|
10
|
+
import java.util.Iterator;
|
11
|
+
|
12
|
+
import org.bouncycastle.openpgp.PGPCompressedDataGenerator;
|
13
|
+
import org.bouncycastle.openpgp.PGPException;
|
14
|
+
import org.bouncycastle.openpgp.PGPLiteralData;
|
15
|
+
import org.bouncycastle.openpgp.PGPPrivateKey;
|
16
|
+
import org.bouncycastle.openpgp.PGPPublicKey;
|
17
|
+
import org.bouncycastle.openpgp.PGPPublicKeyRing;
|
18
|
+
import org.bouncycastle.openpgp.PGPPublicKeyRingCollection;
|
19
|
+
import org.bouncycastle.openpgp.PGPSecretKey;
|
20
|
+
import org.bouncycastle.openpgp.PGPSecretKeyRing;
|
21
|
+
import org.bouncycastle.openpgp.PGPSecretKeyRingCollection;
|
22
|
+
import org.bouncycastle.openpgp.PGPUtil;
|
23
|
+
|
24
|
+
class PGPExampleUtil
|
25
|
+
{
|
26
|
+
static byte[] compressFile(String fileName, int algorithm) throws IOException
|
27
|
+
{
|
28
|
+
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
|
29
|
+
PGPCompressedDataGenerator comData = new PGPCompressedDataGenerator(algorithm);
|
30
|
+
PGPUtil.writeFileToLiteralData(comData.open(bOut), PGPLiteralData.BINARY,
|
31
|
+
new File(fileName));
|
32
|
+
comData.close();
|
33
|
+
return bOut.toByteArray();
|
34
|
+
}
|
35
|
+
|
36
|
+
/**
|
37
|
+
* Search a secret key ring collection for a secret key corresponding to keyID if it
|
38
|
+
* exists.
|
39
|
+
*
|
40
|
+
* @param pgpSec a secret key ring collection.
|
41
|
+
* @param keyID keyID we want.
|
42
|
+
* @param pass passphrase to decrypt secret key with.
|
43
|
+
* @return
|
44
|
+
* @throws PGPException
|
45
|
+
* @throws NoSuchProviderException
|
46
|
+
*/
|
47
|
+
static PGPPrivateKey findSecretKey(PGPSecretKeyRingCollection pgpSec, long keyID, char[] pass)
|
48
|
+
throws PGPException, NoSuchProviderException
|
49
|
+
{
|
50
|
+
PGPSecretKey pgpSecKey = pgpSec.getSecretKey(keyID);
|
51
|
+
|
52
|
+
if (pgpSecKey == null)
|
53
|
+
{
|
54
|
+
return null;
|
55
|
+
}
|
56
|
+
|
57
|
+
return pgpSecKey.extractPrivateKey(pass, "BC");
|
58
|
+
}
|
59
|
+
|
60
|
+
static PGPPublicKey readPublicKey(String fileName) throws IOException, PGPException
|
61
|
+
{
|
62
|
+
InputStream keyIn = new BufferedInputStream(new FileInputStream(fileName));
|
63
|
+
PGPPublicKey pubKey = readPublicKey(keyIn);
|
64
|
+
keyIn.close();
|
65
|
+
return pubKey;
|
66
|
+
}
|
67
|
+
|
68
|
+
/**
|
69
|
+
* A simple routine that opens a key ring file and loads the first available key
|
70
|
+
* suitable for encryption.
|
71
|
+
*
|
72
|
+
* @param input
|
73
|
+
* @return
|
74
|
+
* @throws IOException
|
75
|
+
* @throws PGPException
|
76
|
+
*/
|
77
|
+
static PGPPublicKey readPublicKey(InputStream input) throws IOException, PGPException
|
78
|
+
{
|
79
|
+
PGPPublicKeyRingCollection pgpPub = new PGPPublicKeyRingCollection(
|
80
|
+
PGPUtil.getDecoderStream(input));
|
81
|
+
|
82
|
+
//
|
83
|
+
// we just loop through the collection till we find a key suitable for encryption, in the real
|
84
|
+
// world you would probably want to be a bit smarter about this.
|
85
|
+
//
|
86
|
+
|
87
|
+
Iterator keyRingIter = pgpPub.getKeyRings();
|
88
|
+
while (keyRingIter.hasNext())
|
89
|
+
{
|
90
|
+
PGPPublicKeyRing keyRing = (PGPPublicKeyRing)keyRingIter.next();
|
91
|
+
|
92
|
+
Iterator keyIter = keyRing.getPublicKeys();
|
93
|
+
while (keyIter.hasNext())
|
94
|
+
{
|
95
|
+
PGPPublicKey key = (PGPPublicKey)keyIter.next();
|
96
|
+
|
97
|
+
if (key.isEncryptionKey())
|
98
|
+
{
|
99
|
+
return key;
|
100
|
+
}
|
101
|
+
}
|
102
|
+
}
|
103
|
+
|
104
|
+
throw new IllegalArgumentException("Can't find encryption key in key ring.");
|
105
|
+
}
|
106
|
+
|
107
|
+
static PGPSecretKey readSecretKey(String fileName) throws IOException, PGPException
|
108
|
+
{
|
109
|
+
InputStream keyIn = new BufferedInputStream(new FileInputStream(fileName));
|
110
|
+
PGPSecretKey secKey = readSecretKey(keyIn);
|
111
|
+
keyIn.close();
|
112
|
+
return secKey;
|
113
|
+
}
|
114
|
+
|
115
|
+
/**
|
116
|
+
* A simple routine that opens a key ring file and loads the first available key
|
117
|
+
* suitable for signature generation.
|
118
|
+
*
|
119
|
+
* @param input stream to read the secret key ring collection from.
|
120
|
+
* @return a secret key.
|
121
|
+
* @throws IOException on a problem with using the input stream.
|
122
|
+
* @throws PGPException if there is an issue parsing the input stream.
|
123
|
+
*/
|
124
|
+
static PGPSecretKey readSecretKey(InputStream input) throws IOException, PGPException
|
125
|
+
{
|
126
|
+
PGPSecretKeyRingCollection pgpSec = new PGPSecretKeyRingCollection(
|
127
|
+
PGPUtil.getDecoderStream(input));
|
128
|
+
|
129
|
+
//
|
130
|
+
// we just loop through the collection till we find a key suitable for encryption, in the real
|
131
|
+
// world you would probably want to be a bit smarter about this.
|
132
|
+
//
|
133
|
+
|
134
|
+
Iterator keyRingIter = pgpSec.getKeyRings();
|
135
|
+
while (keyRingIter.hasNext())
|
136
|
+
{
|
137
|
+
PGPSecretKeyRing keyRing = (PGPSecretKeyRing)keyRingIter.next();
|
138
|
+
|
139
|
+
Iterator keyIter = keyRing.getSecretKeys();
|
140
|
+
while (keyIter.hasNext())
|
141
|
+
{
|
142
|
+
PGPSecretKey key = (PGPSecretKey)keyIter.next();
|
143
|
+
|
144
|
+
if (key.isSigningKey())
|
145
|
+
{
|
146
|
+
return key;
|
147
|
+
}
|
148
|
+
}
|
149
|
+
}
|
150
|
+
|
151
|
+
throw new IllegalArgumentException("Can't find signing key in key ring.");
|
152
|
+
}
|
153
|
+
}
|
@@ -0,0 +1,133 @@
|
|
1
|
+
/**
|
2
|
+
* Much of this code was stolen from this Stack Overflow post:
|
3
|
+
* http://stackoverflow.com/questions/3939447/how-to-encrypt-a-string-stream-with-bouncycastle-pgp-without-starting-with-a-fil
|
4
|
+
*
|
5
|
+
* In addition to the java versions of this lump of code, that have been floating around on the internet:
|
6
|
+
* https://gist.github.com/1954648
|
7
|
+
*
|
8
|
+
* Thanks to everyone who has posted on the topic of Bouncy Castle's PGP Library.
|
9
|
+
*/
|
10
|
+
|
11
|
+
package org.sgonyea.pgp;
|
12
|
+
|
13
|
+
import java.io.ByteArrayInputStream;
|
14
|
+
import java.io.ByteArrayOutputStream;
|
15
|
+
import java.io.File;
|
16
|
+
import java.io.FileInputStream;
|
17
|
+
import java.io.FileOutputStream;
|
18
|
+
import java.io.IOException;
|
19
|
+
import java.io.InputStream;
|
20
|
+
import java.io.OutputStream;
|
21
|
+
import java.security.NoSuchProviderException;
|
22
|
+
import java.security.SecureRandom;
|
23
|
+
import java.security.Security;
|
24
|
+
import java.util.Date;
|
25
|
+
import java.util.Iterator;
|
26
|
+
|
27
|
+
import org.bouncycastle.bcpg.BCPGOutputStream;
|
28
|
+
import org.bouncycastle.bcpg.ArmoredOutputStream;
|
29
|
+
import org.bouncycastle.jce.provider.BouncyCastleProvider;
|
30
|
+
import org.bouncycastle.openpgp.*;
|
31
|
+
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPContentSignerBuilder;
|
32
|
+
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPContentVerifierBuilderProvider;
|
33
|
+
import org.bouncycastle.openpgp.operator.jcajce.JcePBESecretKeyDecryptorBuilder;
|
34
|
+
|
35
|
+
public class Signer {
|
36
|
+
|
37
|
+
private PGPSecretKeyRingCollection _privateKeys;
|
38
|
+
|
39
|
+
private String passphrase;
|
40
|
+
|
41
|
+
public Signer() { }
|
42
|
+
public Signer(PGPSecretKeyRingCollection privateKeys) {
|
43
|
+
setPrivateKeys(privateKeys);
|
44
|
+
}
|
45
|
+
|
46
|
+
/**
|
47
|
+
* Accessor and Attribute Helper Methods
|
48
|
+
**/
|
49
|
+
public PGPSecretKeyRingCollection getPrivateKeys() {
|
50
|
+
return _privateKeys;
|
51
|
+
}
|
52
|
+
|
53
|
+
public void setPrivateKeys(PGPSecretKeyRingCollection privateKeys) {
|
54
|
+
_privateKeys = privateKeys;
|
55
|
+
}
|
56
|
+
|
57
|
+
public void setPassphrase(String passphrase) {
|
58
|
+
this.passphrase = passphrase;
|
59
|
+
}
|
60
|
+
|
61
|
+
private PGPSecretKey findSecretKey()
|
62
|
+
throws PGPException, NoSuchProviderException {
|
63
|
+
Iterator keyRingIter = _privateKeys.getKeyRings();
|
64
|
+
while (keyRingIter.hasNext())
|
65
|
+
{
|
66
|
+
PGPSecretKeyRing keyRing = (PGPSecretKeyRing)keyRingIter.next();
|
67
|
+
|
68
|
+
Iterator keyIter = keyRing.getSecretKeys();
|
69
|
+
while (keyIter.hasNext())
|
70
|
+
{
|
71
|
+
PGPSecretKey key = (PGPSecretKey)keyIter.next();
|
72
|
+
|
73
|
+
if (key.isSigningKey())
|
74
|
+
{
|
75
|
+
return key;
|
76
|
+
}
|
77
|
+
}
|
78
|
+
}
|
79
|
+
|
80
|
+
throw new IllegalArgumentException("Can't find signing key in key ring.");
|
81
|
+
}
|
82
|
+
|
83
|
+
public byte[] signData(byte[] clearData)
|
84
|
+
throws Exception {
|
85
|
+
String fileName = "something.txt";
|
86
|
+
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
87
|
+
ArmoredOutputStream out = new ArmoredOutputStream(bos);
|
88
|
+
|
89
|
+
PGPSecretKey pgpSec = findSecretKey();
|
90
|
+
PGPPrivateKey pgpPrivKey = pgpSec.extractPrivateKey(new JcePBESecretKeyDecryptorBuilder().setProvider("BC").build(passphrase.toCharArray()));
|
91
|
+
PGPSignatureGenerator sGen = new PGPSignatureGenerator(new JcaPGPContentSignerBuilder(pgpSec.getPublicKey().getAlgorithm(), PGPUtil.SHA1).setProvider("BC"));
|
92
|
+
|
93
|
+
sGen.init(PGPSignature.BINARY_DOCUMENT, pgpPrivKey);
|
94
|
+
|
95
|
+
Iterator it = pgpSec.getPublicKey().getUserIDs();
|
96
|
+
if (it.hasNext())
|
97
|
+
{
|
98
|
+
PGPSignatureSubpacketGenerator spGen = new PGPSignatureSubpacketGenerator();
|
99
|
+
|
100
|
+
spGen.setSignerUserID(false, (String)it.next());
|
101
|
+
sGen.setHashedSubpackets(spGen.generate());
|
102
|
+
}
|
103
|
+
|
104
|
+
PGPCompressedDataGenerator cGen = new PGPCompressedDataGenerator(
|
105
|
+
PGPCompressedData.ZLIB);
|
106
|
+
|
107
|
+
BCPGOutputStream bOut = new BCPGOutputStream(cGen.open(out));
|
108
|
+
|
109
|
+
sGen.generateOnePassVersion(false).encode(bOut);
|
110
|
+
|
111
|
+
File file = new File(fileName);
|
112
|
+
PGPLiteralDataGenerator lGen = new PGPLiteralDataGenerator();
|
113
|
+
OutputStream lOut = lGen.open(bOut,
|
114
|
+
PGPLiteralData.BINARY, PGPLiteralDataGenerator.CONSOLE,
|
115
|
+
clearData.length, PGPLiteralDataGenerator.NOW);
|
116
|
+
int ch;
|
117
|
+
|
118
|
+
lOut.write(clearData);
|
119
|
+
sGen.update(clearData);
|
120
|
+
|
121
|
+
lGen.close();
|
122
|
+
|
123
|
+
sGen.generate().encode(bOut);
|
124
|
+
|
125
|
+
cGen.close();
|
126
|
+
|
127
|
+
out.close();
|
128
|
+
|
129
|
+
return bos.toByteArray();
|
130
|
+
}
|
131
|
+
|
132
|
+
|
133
|
+
}
|
@@ -0,0 +1,104 @@
|
|
1
|
+
/**
|
2
|
+
* Much of this code was stolen from this Stack Overflow post:
|
3
|
+
* http://stackoverflow.com/questions/3939447/how-to-encrypt-a-string-stream-with-bouncycastle-pgp-without-starting-with-a-fil
|
4
|
+
*
|
5
|
+
* In addition to the java versions of this lump of code, that have been floating around on the internet:
|
6
|
+
* https://gist.github.com/1954648
|
7
|
+
*
|
8
|
+
* Thanks to everyone who has posted on the topic of Bouncy Castle's PGP Library.
|
9
|
+
*/
|
10
|
+
|
11
|
+
package org.sgonyea.pgp;
|
12
|
+
|
13
|
+
import org.sgonyea.pgp.VerificationFailedException;
|
14
|
+
|
15
|
+
import java.io.ByteArrayInputStream;
|
16
|
+
import java.io.ByteArrayOutputStream;
|
17
|
+
import java.io.File;
|
18
|
+
import java.io.FileInputStream;
|
19
|
+
import java.io.FileOutputStream;
|
20
|
+
import java.io.IOException;
|
21
|
+
import java.io.InputStream;
|
22
|
+
import java.io.OutputStream;
|
23
|
+
import java.security.NoSuchProviderException;
|
24
|
+
import java.security.SecureRandom;
|
25
|
+
import java.security.Security;
|
26
|
+
import java.util.Date;
|
27
|
+
import java.util.Iterator;
|
28
|
+
|
29
|
+
import org.bouncycastle.bcpg.ArmoredOutputStream;
|
30
|
+
import org.bouncycastle.jce.provider.BouncyCastleProvider;
|
31
|
+
import org.bouncycastle.openpgp.*;
|
32
|
+
|
33
|
+
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPContentSignerBuilder;
|
34
|
+
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPContentVerifierBuilderProvider;
|
35
|
+
import org.bouncycastle.openpgp.operator.jcajce.JcePBESecretKeyDecryptorBuilder;
|
36
|
+
|
37
|
+
public class Verifier {
|
38
|
+
|
39
|
+
private PGPPublicKeyRingCollection _publicKeys;
|
40
|
+
|
41
|
+
public Verifier() { }
|
42
|
+
/**
|
43
|
+
* Accessor and Attribute Helper Methods
|
44
|
+
**/
|
45
|
+
public PGPPublicKeyRingCollection getPublicKeys() {
|
46
|
+
return _publicKeys;
|
47
|
+
}
|
48
|
+
|
49
|
+
public void setPublicKeys(PGPPublicKeyRingCollection keys) {
|
50
|
+
_publicKeys = keys;
|
51
|
+
}
|
52
|
+
|
53
|
+
|
54
|
+
public byte[] verifyStream(InputStream inStream)
|
55
|
+
throws Exception, VerificationFailedException
|
56
|
+
{
|
57
|
+
InputStream in = PGPUtil.getDecoderStream(inStream);
|
58
|
+
|
59
|
+
PGPObjectFactory pgpFact = new PGPObjectFactory(in);
|
60
|
+
|
61
|
+
PGPCompressedData c1 = (PGPCompressedData)pgpFact.nextObject();
|
62
|
+
|
63
|
+
pgpFact = new PGPObjectFactory(c1.getDataStream());
|
64
|
+
|
65
|
+
PGPOnePassSignatureList p1 = (PGPOnePassSignatureList)pgpFact.nextObject();
|
66
|
+
|
67
|
+
PGPOnePassSignature ops = p1.get(0);
|
68
|
+
|
69
|
+
PGPLiteralData p2 = (PGPLiteralData)pgpFact.nextObject();
|
70
|
+
|
71
|
+
InputStream dIn = p2.getInputStream();
|
72
|
+
int ch;
|
73
|
+
|
74
|
+
PGPPublicKey key = _publicKeys.getPublicKey(ops.getKeyID());
|
75
|
+
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
76
|
+
|
77
|
+
if(key == null) {
|
78
|
+
throw new VerificationFailedException("Error: Signature could not be verified.");
|
79
|
+
}
|
80
|
+
|
81
|
+
ops.init(new JcaPGPContentVerifierBuilderProvider().setProvider("BC"), key);
|
82
|
+
|
83
|
+
while ((ch = dIn.read()) >= 0)
|
84
|
+
{
|
85
|
+
ops.update((byte)ch);
|
86
|
+
out.write(ch);
|
87
|
+
}
|
88
|
+
|
89
|
+
out.close();
|
90
|
+
|
91
|
+
PGPSignatureList p3 = (PGPSignatureList)pgpFact.nextObject();
|
92
|
+
|
93
|
+
if (!ops.verify(p3.get(0))) {
|
94
|
+
throw new VerificationFailedException("Error: Signature could not be verified.");
|
95
|
+
}
|
96
|
+
|
97
|
+
byte[] returnBytes = out.toByteArray();
|
98
|
+
out.close();
|
99
|
+
|
100
|
+
return returnBytes;
|
101
|
+
|
102
|
+
}
|
103
|
+
|
104
|
+
}
|
data/lib/pgp.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
require 'java'
|
2
|
-
require 'pgp/jars/bcprov-jdk15on-147.jar'
|
2
|
+
require 'pgp/jars/bcprov-jdk15on-147.jar'
|
3
3
|
require 'pgp/jars/bcpg-jdk15on-147.jar'
|
4
4
|
require 'pgp/jruby-pgp.jar'
|
5
5
|
|
6
6
|
require 'pgp/decryptor'
|
7
7
|
require 'pgp/encryptor'
|
8
|
+
require 'pgp/verifier'
|
9
|
+
require 'pgp/signer'
|
8
10
|
require 'pgp/private_key'
|
9
11
|
|
10
12
|
module PGP
|
data/lib/pgp/signer.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
module PGP
|
2
|
+
class Signer < org.sgonyea.pgp.Signer
|
3
|
+
include_package "org.bouncycastle.openpgp"
|
4
|
+
|
5
|
+
def add_keys(key_string)
|
6
|
+
self.private_keys = keyring_from_string(key_string)
|
7
|
+
end
|
8
|
+
|
9
|
+
def add_keys_from_file(filename)
|
10
|
+
self.private_keys = keyring_from_file(filename)
|
11
|
+
end
|
12
|
+
|
13
|
+
def sign(data)
|
14
|
+
signed_data = sign_data(data.to_java_bytes)
|
15
|
+
String.from_java_bytes(signed_data)
|
16
|
+
end
|
17
|
+
|
18
|
+
def sign_file(file_path)
|
19
|
+
sign File.read(file_path)
|
20
|
+
end
|
21
|
+
|
22
|
+
protected
|
23
|
+
def keyring_from_file(filename)
|
24
|
+
file = File.open(filename)
|
25
|
+
keyring_from_stream(file.to_inputstream)
|
26
|
+
end
|
27
|
+
|
28
|
+
def keyring_from_string(string)
|
29
|
+
input_stream = PGP.string_to_bais(string)
|
30
|
+
keyring_from_stream(input_stream)
|
31
|
+
end
|
32
|
+
|
33
|
+
def keyring_from_stream(stream)
|
34
|
+
yafs = PGPUtil.get_decoder_stream(stream)
|
35
|
+
PGPSecretKeyRingCollection.new(yafs)
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
data/lib/pgp/verifier.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
module PGP
|
2
|
+
class Verifier < org.sgonyea.pgp.Verifier
|
3
|
+
include_package "org.bouncycastle.openpgp"
|
4
|
+
|
5
|
+
def add_keys(key_string)
|
6
|
+
self.public_keys = keyring_from_string(key_string)
|
7
|
+
end
|
8
|
+
|
9
|
+
def add_keys_from_file(filename)
|
10
|
+
self.public_keys = keyring_from_file(filename)
|
11
|
+
end
|
12
|
+
|
13
|
+
def verify(signed_data)
|
14
|
+
input_stream = PGP.string_to_bais(signed_data)
|
15
|
+
verified_data = verify_stream(input_stream)
|
16
|
+
String.from_java_bytes(verified_data)
|
17
|
+
end
|
18
|
+
|
19
|
+
def decrypt_file(file_path)
|
20
|
+
decrypt File.read(file_path)
|
21
|
+
end
|
22
|
+
|
23
|
+
def keyring_from_file(filename)
|
24
|
+
file = File.open(filename)
|
25
|
+
keyring_from_stream(file.to_inputstream)
|
26
|
+
end
|
27
|
+
|
28
|
+
def keyring_from_string(key_string)
|
29
|
+
keyring_from_stream PGP.string_to_bais(key_string)
|
30
|
+
end
|
31
|
+
|
32
|
+
def keyring_from_stream(stream)
|
33
|
+
yafs = PGPUtil.get_decoder_stream(stream)
|
34
|
+
PGPPublicKeyRingCollection.new(yafs)
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
data/lib/pgp/version.rb
CHANGED
@@ -20,4 +20,21 @@ describe PGP::Decryptor do
|
|
20
20
|
decryptor.decrypt(encrypted_text).should == unencrypted_text
|
21
21
|
end
|
22
22
|
end
|
23
|
+
|
24
|
+
describe "decrypt with private key and passphrase" do
|
25
|
+
let(:private_key_with_passphrase_path) { Fixtures_Path.join('private_key_with_passphrase.asc') }
|
26
|
+
let(:encrypted_with_passphrase_file) { Fixtures_Path.join('encrypted_with_passphrase_key.txt.asc') }
|
27
|
+
let(:encrypted_text) { File.read(encrypted_with_passphrase_file) }
|
28
|
+
let(:unencrypted_text) { File.read(Fixtures_Path.join('encrypted_with_passphrase_key.txt'))}
|
29
|
+
let(:passphrase) { "testingpgp" }
|
30
|
+
before do
|
31
|
+
decryptor.passphrase = passphrase
|
32
|
+
decryptor.add_keys_from_file(private_key_with_passphrase_path)
|
33
|
+
end
|
34
|
+
it "should decrypt" do
|
35
|
+
decryptor.decrypt(encrypted_text).should == unencrypted_text
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
23
40
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PGP::Signer do
|
4
|
+
let(:private_key_path) { Fixtures_Path.join('private_key_with_passphrase.asc').to_s }
|
5
|
+
let(:public_key_path) { Fixtures_Path.join('public_key_with_passphrase.asc').to_s }
|
6
|
+
|
7
|
+
let(:signer) do
|
8
|
+
signer = PGP::Signer.new
|
9
|
+
signer.passphrase = "testingpgp"
|
10
|
+
signer.add_keys_from_file(private_key_path)
|
11
|
+
signer
|
12
|
+
end
|
13
|
+
|
14
|
+
let(:unsigned_file) { Fixtures_Path.join('signed_file.txt') }
|
15
|
+
let(:unsigned_data) { File.read(unsigned_file)}
|
16
|
+
let(:signed_file) { Fixtures_Path.join('signed_file.txt.asc') }
|
17
|
+
let(:verifier) do
|
18
|
+
verifier = PGP::Verifier.new
|
19
|
+
verifier.add_keys_from_file(public_key_path)
|
20
|
+
verifier
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '#sign' do
|
24
|
+
|
25
|
+
it "signs" do
|
26
|
+
verifier.verify(signer.sign(unsigned_data)).should == unsigned_data
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "encrypting and signing" do
|
32
|
+
let(:encryptor) { PGP::Encryptor.new(File.read public_key_path) }
|
33
|
+
let(:decryptor) do
|
34
|
+
decryptor = PGP::Decryptor.new
|
35
|
+
decryptor.passphrase = "testingpgp"
|
36
|
+
decryptor.add_keys_from_file(private_key_path)
|
37
|
+
decryptor
|
38
|
+
end
|
39
|
+
it "can decrypt and verify something that has been signed and encrypted" do
|
40
|
+
verifier.verify(decryptor.decrypt(encryptor.encrypt(signer.sign("something fabulous")))).should == "something fabulous"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe PGP::Verifier do
|
4
|
+
let(:public_key_path) { Fixtures_Path.join('public_key_with_passphrase.asc').to_s }
|
5
|
+
|
6
|
+
let(:verifier) { PGP::Verifier.new }
|
7
|
+
let(:unsigned_file) { Fixtures_Path.join('signed_file.txt') }
|
8
|
+
let(:signed_file) { Fixtures_Path.join('signed_file.txt.asc') }
|
9
|
+
|
10
|
+
describe '#verify' do
|
11
|
+
before do
|
12
|
+
verifier.add_keys_from_file(public_key_path)
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'When the Public Key is from a file' do
|
16
|
+
it "verifies" do
|
17
|
+
verifier.verify(File.read(signed_file)).should == File.read(unsigned_file)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
context 'When the public key cannot verify a signature' do
|
23
|
+
let(:public_key_path) { Fixtures_Path.join('wrong_public_key_for_signature.asc').to_s }
|
24
|
+
|
25
|
+
it "should raise an exception" do
|
26
|
+
expect {
|
27
|
+
verifier.verify(File.read(signed_file))
|
28
|
+
}.to raise_exception(org.sgonyea.pgp.VerificationFailedException, /Signature could not be verified/)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
here is some unencrypted stuff, yo
|
@@ -0,0 +1,13 @@
|
|
1
|
+
-----BEGIN PGP MESSAGE-----
|
2
|
+
Version: BCPG v1.48
|
3
|
+
|
4
|
+
hQEMA5U54ioziO4kAQf+NdzYMb6XwRHg52pbuknrDmQeW6qJBwdtn0rsG6eUTVtr
|
5
|
+
LoR3NEXNmBd+Hk2kPd10cQTQ6nVSvaJvgiu+9pVf6j/GGiNEWDNKqsLPokHN5uwv
|
6
|
+
5VsRxNdfkChs7fYJf97fiSxt3I7OyCTx9r2R2Gy1kEx3+wwGfBZm+ZDUCs8W/TMs
|
7
|
+
lmGxliFqJ8MNWr7bbFvlDB5FPpeWFW6U2bYMGYAXx5bzIGM8a+CyglShdz6lLlLv
|
8
|
+
831wGM1kK4eBHtyEKQa0bMqQ2y4p8BAToyMJTef1OFg4kDw4W6MgSlIgJcCCpUhN
|
9
|
+
oPLMqNLRv9SKqi+3GN8YmUmDjREBClb8jewAnnz9GMlT1s48T6KESXqwXwAZmF7o
|
10
|
+
LHTmCnW3HOKy0aUgZuEDjJPCinEI21gZ7hW35XIKIJQ/hIxar1C9bDbYXboo9uIt
|
11
|
+
Jwk/lT3994V3Pw763v6SeaXMcCw=
|
12
|
+
=xYIS
|
13
|
+
-----END PGP MESSAGE-----
|
@@ -0,0 +1,59 @@
|
|
1
|
+
-----BEGIN PGP PRIVATE KEY BLOCK-----
|
2
|
+
Version: GnuPG v1.4.12 (Darwin)
|
3
|
+
|
4
|
+
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
|
57
|
+
ZhNj/9kNlvnmMIxQ334RF3HfP0mNhFrhnoc=
|
58
|
+
=KOPk
|
59
|
+
-----END PGP PRIVATE KEY BLOCK-----
|
@@ -0,0 +1,30 @@
|
|
1
|
+
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
2
|
+
Version: GnuPG v1.4.12 (Darwin)
|
3
|
+
|
4
|
+
mQENBFE1G+YBCACbAxhkShGGLEvCcA60zD1ozlgE2Ed0U92/iCVQBkY05Y8F0sxq
|
5
|
+
NwaJfi+IbSeGq4PVrqEzOsD7pPGRwAkZ9dkzYJVC6jnflQPEYdF12HePQasQovWX
|
6
|
+
GMdHmTGAiEe4MrA/y10smF6jF5ft7U0J/xh6/VobiLyX961FSjOQtaE3io5kmqRT
|
7
|
+
juc6E2pxkk9QGF13/6wvxW85SlqHz+4KimqFlWwx3bp2kqgQEu9bH+uKE+BQOcMN
|
8
|
+
1nGgz7cSt8iXQg7fP2xHPoxuUfSlRGPp8/bHPmUKqo2LYInQq1Phpwf9WT+d0hBA
|
9
|
+
uehvDUxWfF2vcNS7x+VvTgHT08wDzfPGjNblABEBAAG0KUNocmlzIE5lbHNvbiA8
|
10
|
+
c3VwZXJjaHJpc25lbHNvbkBnbWFpbC5jb20+iQE4BBMBAgAiBQJRNRvmAhsDBgsJ
|
11
|
+
CAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRCVOeIqM4juJCZsB/4+U6EJH0O8nTV4
|
12
|
+
+isStuZES2+o4lHGiHUyaZF18ucL6disNK0JmZwyg8tCE6EFAdi9j+K79+MR1aqv
|
13
|
+
EHnm2QdhBnee5F7sjEbQdmNx9hSUFE2Zwl6jSp+TWTt8f5IYYtH7Cl7Txl9NKwZU
|
14
|
+
/0VFCegeBvOjPfgDECcqb+CiA7y+lLaRXhAQLcqPNTUo2PrzOVesk3T6k8/RMEH0
|
15
|
+
R0zzAlb2YeUHZj/8U0YOYhd84O88YD2kjVx/dpAgN78czbVDHhRYYNaX5ey2juVu
|
16
|
+
KD4D8SFkvQolAXR3lUrYJOewuWrp5V33U6Eqes+7wiV4FSdfuzv5CAKJfMzQ9XOt
|
17
|
+
gLDF8ouKuQENBFE1G+YBCACqkPuusUI9h+g4CRKYDPWBeQsRkexK7v3LNcnSVTmu
|
18
|
+
ukFe0tpZoJ1W1mKeS8fUYJq3uBg2IOFJ9XwOn0HqOLJIebI310gzpWiU4zFcNkWQ
|
19
|
+
EdNRfMoGG+xplobu8fUGAruaM/a8f8096/GmaeIgFB2ZCzUCURof5f0carL1yXrJ
|
20
|
+
bD0avZjQe9CMQMeLWLVC2tSH9si72hKgOeTMka9kTJSpigFsxft2S6NIBv50nHi8
|
21
|
+
3X7qWN6WceR6MZwVM2LpBQTitOBjqT+FFyPQfqSLXP3848P/Ql50yzS+tLCuGylv
|
22
|
+
HL+mtAVf5Erbay7tehGxXW/xbEypKj8HGYAUAP+45ya5ABEBAAGJAR8EGAECAAkF
|
23
|
+
AlE1G+YCGwwACgkQlTniKjOI7iTL4gf/XHIqADZH1bfmLDvNZJ9V1EevxewZ4tzH
|
24
|
+
49e0woHB4tUwmvCtipP4fidhH6L1oWrKTh49DHsA+gWLVH5dvhIxTlCR6dj80pvP
|
25
|
+
U5+okyWvvuYO3KaCOsBBUyS6YY7T0l5uWCkKPNXr3zU0hcHa8D+4T0ftiKktbNyy
|
26
|
+
4hmB1YYWQWYv1fTkv5WcKsikpJ+Z+7QKhMCxjlRsTRm+QWm9whtcmxCE3eS+3BDi
|
27
|
+
ifE1SCYMKrFHt/Lniu81tJ4P5smquLe2jWyXc5ITe9kcc2a8U5c4SqYjFocKh7w5
|
28
|
+
jrTovElsR6L3q65JU11mE2P/2Q2W+eYwjFDffhEXcd8/SY2EWuGehw==
|
29
|
+
=OnFp
|
30
|
+
-----END PGP PUBLIC KEY BLOCK-----
|
@@ -0,0 +1 @@
|
|
1
|
+
Here is some stuff to sign, yo
|
@@ -0,0 +1,14 @@
|
|
1
|
+
-----BEGIN PGP MESSAGE-----
|
2
|
+
Version: BCPG v1.48
|
3
|
+
|
4
|
+
owJ4nJvAy8zAxDjV8pGWccc7FcbTJkn8xZnpeakp8WmZOal6JRUlgZZ8azxSi1IV
|
5
|
+
MosVivNzUxWKS0rT0hRK8hVACnUUKvO5OhndWRgYmRgMWZmAqk9oyThnFAFV+6Xm
|
6
|
+
FOfnKdgUlxakFiWDhPLAIg7puYmZOXrJ+bl2DFycAjDLS5LY//sEH7GKr3Pd8+aW
|
7
|
+
0zNBkWiVPxF2z+xketdnJzsebj/NvvLN6pV/9P1+VmjMj7jdrnK51iTz397Y5loF
|
8
|
+
BWfLyWed/v8q6J57U/7k+dbXauaCW/7um/RuGr+Iamc895Yr5g23r4jPebDDb3Z6
|
9
|
+
7B6bcIW1KzOOHXXNcdo2jcv8OLPVh5im7CUSNyY3vH5TUdfA2bn9SIqqpEHq6eM7
|
10
|
+
BL3EzT86FSf9ivXk32lq3vzGn+1wtsOsKSsMBD9bHbG+VOggefpm0vx/ejcny3xM
|
11
|
+
Xlh20G1mnNnPzezvrvueO3HW2UF12op1E9VWBxmofnHbtXbe5nPzeG64tk9W9lq4
|
12
|
+
8sjOm3ZaD1aWBu8R4K2cfrH7hgEAwrOvhQ==
|
13
|
+
=nUp1
|
14
|
+
-----END PGP MESSAGE-----
|
@@ -0,0 +1,63 @@
|
|
1
|
+
-----BEGIN PGP PRIVATE KEY BLOCK-----
|
2
|
+
Version: GnuPG/MacGPG2 v2.0.18 (Darwin)
|
3
|
+
|
4
|
+
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
|
62
|
+
=vjEq
|
63
|
+
-----END PGP PRIVATE KEY BLOCK-----
|
@@ -0,0 +1,36 @@
|
|
1
|
+
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
2
|
+
Version: GnuPG/MacGPG2 v2.0.18 (Darwin)
|
3
|
+
|
4
|
+
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
|
35
|
+
=66YG
|
36
|
+
-----END PGP PUBLIC KEY BLOCK-----
|
metadata
CHANGED
@@ -1,134 +1,185 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: jruby-pgp
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
version: 0.
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.3.0
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
8
|
-
|
9
|
-
autorequire:
|
7
|
+
authors:
|
8
|
+
- Scott Gonyea
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
12
|
+
date: 2013-03-09 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: jruby-openssl
|
16
|
+
version_requirements: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: !binary |-
|
21
|
+
MA==
|
22
|
+
none: false
|
23
|
+
requirement: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: !binary |-
|
28
|
+
MA==
|
29
|
+
none: false
|
30
|
+
prerelease: false
|
31
|
+
type: :runtime
|
32
|
+
- !ruby/object:Gem::Dependency
|
33
|
+
name: rake
|
34
|
+
version_requirements: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ">="
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: !binary |-
|
39
|
+
MA==
|
40
|
+
none: false
|
41
|
+
requirement: !ruby/object:Gem::Requirement
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: !binary |-
|
46
|
+
MA==
|
47
|
+
none: false
|
48
|
+
prerelease: false
|
49
|
+
type: :development
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
name: rspec
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: !binary |-
|
57
|
+
MA==
|
58
|
+
none: false
|
59
|
+
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: !binary |-
|
64
|
+
MA==
|
65
|
+
none: false
|
66
|
+
prerelease: false
|
67
|
+
type: :development
|
68
|
+
- !ruby/object:Gem::Dependency
|
69
|
+
name: rake-compiler
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: !binary |-
|
75
|
+
MA==
|
76
|
+
none: false
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: !binary |-
|
82
|
+
MA==
|
83
|
+
none: false
|
84
|
+
prerelease: false
|
85
|
+
type: :development
|
59
86
|
description: PGP for JRuby
|
60
|
-
email:
|
61
|
-
|
62
|
-
executables:
|
63
|
-
|
87
|
+
email:
|
88
|
+
- me@sgonyea.com
|
89
|
+
executables:
|
90
|
+
- jrpgp
|
64
91
|
extensions: []
|
65
|
-
|
66
92
|
extra_rdoc_files: []
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
93
|
+
files:
|
94
|
+
- ".gitignore"
|
95
|
+
- ".rbenv-version"
|
96
|
+
- ".rspec"
|
97
|
+
- Gemfile
|
98
|
+
- LICENSE.txt
|
99
|
+
- README.md
|
100
|
+
- Rakefile
|
101
|
+
- bin/jrpgp
|
102
|
+
- ext/org/sgonyea/pgp/Decryptor.java
|
103
|
+
- ext/org/sgonyea/pgp/Encryptor.java
|
104
|
+
- ext/org/sgonyea/pgp/PGPExampleUtil.java
|
105
|
+
- ext/org/sgonyea/pgp/Signer.java
|
106
|
+
- ext/org/sgonyea/pgp/VerificationFailedException.java
|
107
|
+
- ext/org/sgonyea/pgp/Verifier.java
|
108
|
+
- jruby-pgp.gemspec
|
109
|
+
- lib/jruby-pgp.rb
|
110
|
+
- lib/pgp.rb
|
111
|
+
- lib/pgp/cli.rb
|
112
|
+
- lib/pgp/cli/runner.rb
|
113
|
+
- lib/pgp/decryptor.rb
|
114
|
+
- lib/pgp/encryptor.rb
|
115
|
+
- lib/pgp/jars/bcpg-jdk15on-147.jar
|
116
|
+
- lib/pgp/jars/bcprov-jdk15on-147.jar
|
117
|
+
- lib/pgp/private_key.rb
|
118
|
+
- lib/pgp/ruby_decryptor.rb
|
119
|
+
- lib/pgp/signer.rb
|
120
|
+
- lib/pgp/verifier.rb
|
121
|
+
- lib/pgp/version.rb
|
122
|
+
- spec/lib/pgp/cli_spec.rb
|
123
|
+
- spec/lib/pgp/decryptor_spec.rb
|
124
|
+
- spec/lib/pgp/encryptor_spec.rb
|
125
|
+
- spec/lib/pgp/signer_spec.rb
|
126
|
+
- spec/lib/pgp/verifier_spec.rb
|
127
|
+
- spec/spec_helper.rb
|
128
|
+
- spec/support/fixtures/encrypted_with_passphrase_key.txt
|
129
|
+
- spec/support/fixtures/encrypted_with_passphrase_key.txt.asc
|
130
|
+
- spec/support/fixtures/private_key.asc
|
131
|
+
- spec/support/fixtures/private_key_with_passphrase.asc
|
132
|
+
- spec/support/fixtures/public_key.asc
|
133
|
+
- spec/support/fixtures/public_key_with_passphrase.asc
|
134
|
+
- spec/support/fixtures/signed_file.txt
|
135
|
+
- spec/support/fixtures/signed_file.txt.asc
|
136
|
+
- spec/support/fixtures/unencrypted_file.txt
|
137
|
+
- spec/support/fixtures/unencrypted_file.txt.asc
|
138
|
+
- spec/support/fixtures/wrong_private_key_for_signature.asc
|
139
|
+
- spec/support/fixtures/wrong_public_key_for_signature.asc
|
140
|
+
- lib/pgp/jruby-pgp.jar
|
99
141
|
homepage: https://github.com/sgonyea/jruby-pgp
|
100
142
|
licenses: []
|
101
|
-
|
102
|
-
post_install_message:
|
143
|
+
post_install_message:
|
103
144
|
rdoc_options: []
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
145
|
+
require_paths:
|
146
|
+
- lib
|
147
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
148
|
+
requirements:
|
149
|
+
- - ">="
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: !binary |-
|
152
|
+
MA==
|
108
153
|
none: false
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
154
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
155
|
+
requirements:
|
156
|
+
- - ">="
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: !binary |-
|
159
|
+
MA==
|
114
160
|
none: false
|
115
|
-
requirements:
|
116
|
-
- - ">="
|
117
|
-
- !ruby/object:Gem::Version
|
118
|
-
version: "0"
|
119
161
|
requirements: []
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
signing_key:
|
162
|
+
rubyforge_project:
|
163
|
+
rubygems_version: 1.8.24
|
164
|
+
signing_key:
|
124
165
|
specification_version: 3
|
125
166
|
summary: This is a Java+JRuby wrapper around the Bouncy Castle PGP APIs
|
126
|
-
test_files:
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
167
|
+
test_files:
|
168
|
+
- spec/lib/pgp/cli_spec.rb
|
169
|
+
- spec/lib/pgp/decryptor_spec.rb
|
170
|
+
- spec/lib/pgp/encryptor_spec.rb
|
171
|
+
- spec/lib/pgp/signer_spec.rb
|
172
|
+
- spec/lib/pgp/verifier_spec.rb
|
173
|
+
- spec/spec_helper.rb
|
174
|
+
- spec/support/fixtures/encrypted_with_passphrase_key.txt
|
175
|
+
- spec/support/fixtures/encrypted_with_passphrase_key.txt.asc
|
176
|
+
- spec/support/fixtures/private_key.asc
|
177
|
+
- spec/support/fixtures/private_key_with_passphrase.asc
|
178
|
+
- spec/support/fixtures/public_key.asc
|
179
|
+
- spec/support/fixtures/public_key_with_passphrase.asc
|
180
|
+
- spec/support/fixtures/signed_file.txt
|
181
|
+
- spec/support/fixtures/signed_file.txt.asc
|
182
|
+
- spec/support/fixtures/unencrypted_file.txt
|
183
|
+
- spec/support/fixtures/unencrypted_file.txt.asc
|
184
|
+
- spec/support/fixtures/wrong_private_key_for_signature.asc
|
185
|
+
- spec/support/fixtures/wrong_public_key_for_signature.asc
|