Skip to content

Commit ccaa02e

Browse files
authored
[CSL3-2693] OpenPGP BouncyCastle Java implementation (#606)
1 parent 950d43c commit ccaa02e

File tree

8 files changed

+2180
-0
lines changed

8 files changed

+2180
-0
lines changed

larky/pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
<libstarlark.version>1.0.0-SNAPSHOT</libstarlark.version>
3737

3838
<apache.commons-text.version>1.13.1</apache.commons-text.version>
39+
<commons-io.version>2.19.0</commons-io.version>
3940
<google.crypto.tink>1.6.1</google.crypto.tink>
4041
<google.errorprone.version>2.38.0</google.errorprone.version>
4142
<google.flogger.version>0.8</google.flogger.version>
@@ -108,6 +109,12 @@
108109
<version>${apache.commons-text.version}</version>
109110
</dependency>
110111

112+
<dependency>
113+
<groupId>commons-io</groupId>
114+
<artifactId>commons-io</artifactId>
115+
<version>${commons-io.version}</version>
116+
</dependency>
117+
111118
<!-- cryptography -->
112119
<dependency>
113120
<groupId>com.google.crypto.tink</groupId>

larky/src/main/java/com/verygood/security/larky/ModuleSupplier.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import com.verygood.security.larky.modules.X509Module;
4242
import com.verygood.security.larky.modules.XMLModule;
4343
import com.verygood.security.larky.modules.ZLibModule;
44+
import com.verygood.security.larky.modules.vgs.PGPModule;
4445
import com.verygood.security.larky.modules.globals.LarkyGlobals;
4546
import com.verygood.security.larky.modules.globals.PythonBuiltins;
4647
import com.verygood.security.larky.modules.vgs.jks.JKSModule;
@@ -102,6 +103,7 @@ public class ModuleSupplier {
102103
JKSModule.INSTANCE,
103104
MetricsModule.INSTANCE,
104105
NetworkTokenModule.INSTANCE,
106+
PGPModule.INSTANCE,
105107
VaultModule.INSTANCE
106108
);
107109

larky/src/main/java/com/verygood/security/larky/modules/vgs/PGPModule.java

Lines changed: 758 additions & 0 deletions
Large diffs are not rendered by default.

larky/src/test/resources/quick_tests/test_pgp_sign_encrypt.star

Lines changed: 411 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 236 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,236 @@
1+
load("@vendor//asserts", "asserts")
2+
load("@stdlib//unittest", "unittest")
3+
load("@vgs//pgp", "pgp")
4+
5+
def _test_encryption_algorithms():
6+
"""Test encryption with different algorithms"""
7+
8+
# Test key from BouncyCastle examples - do not use in production
9+
public_key = """-----BEGIN PGP PUBLIC KEY BLOCK-----
10+
11+
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
69+
gmNtylgnstPHygBV8Qmryh+tF8bOwi0QjTsrvlA=
70+
=F8Ao
71+
-----END PGP PUBLIC KEY BLOCK-----"""
72+
73+
# nosemgrep: secrets.misc.generic_private_key_pgp.generic_private_key_pgp
74+
private_key = """-----BEGIN PGP PRIVATE KEY BLOCK-----
75+
76+
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
188+
AFXxCavKH60Xxs7CLRCNOyu+UA==
189+
=obP3
190+
-----END PGP PRIVATE KEY BLOCK-----"""
191+
192+
# Test with all supported symmetric algorithms
193+
algorithms = [
194+
"AES-128", "AES128",
195+
"AES-192", "AES192",
196+
"AES-256", "AES256",
197+
"BLOWFISH",
198+
"CAMELLIA-128", "CAMELLIA128",
199+
"CAMELLIA-192", "CAMELLIA192",
200+
"CAMELLIA-256", "CAMELLIA256",
201+
"TWOFISH"
202+
]
203+
204+
message = bytes("Test encryption with different algorithms", "utf-8")
205+
206+
# Test each algorithm
207+
for algo in algorithms:
208+
print("Testing algorithm: " + algo)
209+
210+
# Encrypt with the algorithm
211+
encrypted = pgp.encrypt(
212+
message,
213+
public_key,
214+
# file_name="test.txt",
215+
armor=True,
216+
algorithm=algo
217+
)
218+
219+
# Decrypt and verify
220+
decrypted = pgp.decrypt(
221+
encrypted,
222+
private_key,
223+
passphrase=None
224+
)
225+
226+
# Verify the decryption worked
227+
asserts.assert_that(decrypted).is_equal_to(message)
228+
229+
def _suite():
230+
_suite = unittest.TestSuite()
231+
_suite.addTest(unittest.FunctionTestCase(_test_encryption_algorithms))
232+
233+
return _suite
234+
235+
_runner = unittest.TextTestRunner()
236+
_runner.run(_suite())
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
load("@vendor//asserts", "asserts")
2+
load("@stdlib//unittest", "unittest")
3+
load("@vgs//pgp", "pgp")
4+
5+
def test_hash_algorithms():
6+
"""Test the hash algorithm string to constant conversion"""
7+
8+
# Define test cases: algorithm name and expected output (non-zero)
9+
test_cases = {
10+
"SHA-1": "SHA1",
11+
"SHA-224": "SHA224",
12+
"SHA-256": "SHA256",
13+
"SHA-384": "SHA384",
14+
"SHA-512": "SHA512",
15+
# Test different case and formats
16+
"sha1": "SHA1",
17+
"sha-1": "SHA1",
18+
"SHA384": "SHA384"
19+
}
20+
21+
# Test each algorithm
22+
for algo_name, expected_name in test_cases.items():
23+
# Get the algorithm ID
24+
algo_id = pgp.get_hash_algorithm(algo_name)
25+
26+
# Verify it's a valid ID (non-zero)
27+
asserts.assert_that(algo_id).is_instance_of(int)
28+
asserts.assert_that(algo_id).is_not_equal_to(0)
29+
30+
# Test that different formats work (case insensitive)
31+
if algo_name != expected_name:
32+
expected_id = pgp.get_hash_algorithm(expected_name)
33+
asserts.assert_that(algo_id).is_equal_to(expected_id)
34+
35+
def _suite():
36+
_suite = unittest.TestSuite()
37+
_suite.addTest(unittest.FunctionTestCase(test_hash_algorithms))
38+
39+
return _suite
40+
41+
_runner = unittest.TextTestRunner()
42+
_runner.run(_suite())

0 commit comments

Comments
 (0)