Add pem-api module: PEMDecoder/PEMEncoder (JEP 538 preview on JDK 27, JEP 542 final in JDK 28) for JWT keys, TLS, encrypted keys and BouncyCastle migration

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01CifR2BE7PBvRy5hT8TS9oz
This commit is contained in:
2026-10-26 01:50:05 +00:00
co-authored by Claude Sonnet 5.5
parent c3cc57f482
commit 2e25042a68
34 changed files with 895 additions and 0 deletions
+20
View File
@@ -0,0 +1,20 @@
$ java --enable-preview -cp ... EncryptedKeys (27.0.1.0.2+1)
== write an encrypted key with the defaults
[-----BEGIN ENCRYPTED PRIVATE KEY-----, -----END ENCRYPTED PRIVATE KEY-----]
default algorithm: PBEWithHmacSHA256AndAES_128
default iteration count: 4096, salt bytes: 20
== read it back
ok: withDecryption(password) returns the original key
== choose the algorithm and cost yourself
PBEWithHmacSHA512AndAES_256, iterations 600000
ok: getKey(password) on the decoded EncryptedPrivateKeyInfo works too
== a file written by openssl pkcs8 -topk8 -v2 aes-256-cbc
PBEWithHmacSHA256AndAES_256
ok: decrypts to the same key as the unencrypted file
== failures
no password, ask for PrivateKey !! java.lang.ClassCastException: Cannot cast javax.crypto.EncryptedPrivateKeyInfo to java.security.PrivateKey
no password, no class -> EncryptedPrivateKeyInfo PBEWithHmacSHA256AndAES_256
wrong password !! javax.crypto.CryptoException: java.security.InvalidKeyException: Cannot retrieve the PKCS8EncodedKeySpec
password on a key that is not encrypted -> PrivateKey RSA
openssl 'traditional' encrypted (Proc-Type: 4,ENCRYPTED) !! java.lang.IllegalArgumentException: java.security.InvalidKeyException: Invalid PKCS#1 encoding
exit=0