mirror of
https://github.com/pgpainless/pgpainless.git
synced 2025-12-05 03:41:07 +01:00
41 KiB
41 KiB
PGPainless Changelog
2.0.2-SNAPSHOT
- Add
PGPainless.asciiArmor(Collection<OpenPGPCertificate>, PacketFormat) SigningOptions: Add missing@JvmOverloadsannotations toaddInlineSignature()andaddDetachedSignature()OpenPGPComponentKey: Add extension methodgetSecretKey()OpenPGPKey: Add extension methodsisFullyDecrypted(),isFullyEncrypted()KeyRingBuilder: Properly respect custom key creation time on subkeys and signaturesWeakRSAKeyTest: Disable test if test vector key is expired at testing time
2.0.1
- Fix subkey signatures on generate keys (#486, thanks to @agrahn for reporting)
2.0.0
- Add support for OpenPGP v6
PGPainlessis no longer intended for singleton use- See the migration guide for more details
- Internally make use of BCs new high-level API
- Bump
sop-javato14.0.1- Implement new
sop update-keycommand to refresh old keys to a usable state - Implement new
sop merge-certscommand to merge certificate copies - Implement new
sop certify-useridcommand to certify third-party certificates - Implement new
sop validate-useridcommand to validate userids on keys sop generate-key: Add profilerfc9580-curve25519for generating v6 keys over curve25519sop generate-key: Add profilerfc9580-curve448for generating v6 keys over curve448sop encrypt: Add profilerfc9580for v6-style symmetric message encryption
- Implement new
1.7.7
- Bump bcpg-jdk8on to 1.82
- Bump bcprov-jdk18on to 1.82
- Fix handling of passphrases and user-ids containing leading/trailing whitespace
1.7.6
- Fix
RevocationSignatureBuilderproperly calculating third-party signatures of typeKeyRevocation(delegation revocations) - Enable support for native images
- Re-enable shadow plugin and build fat-jar
1.7.5
- Actually attempt to fix Kotlin desugaring.
- Bump javaSourceCompatibility and javaTargetCompatibility to 11
- Bump gradle-wrapper to 8.8
1.7.4
- Fix proper Kotlin desugaring for Java 8
1.7.3
- Bump
bcpg-jdk8onto1.80 - Bump
bcprov-jdk18onto1.80 - Add dependency on
bcutil-jdk18onas a workaround - Ignore unknown type signatures on certificates
- Fix typo on signature creation bounds check (thanks @elduffy)
- Fix superfluous newline added in CRLF encoding (thanks @bjansen)
- Bump
sop-javato1.10.0- SOP inline-sign: Do not apply compression
1.7.2
- Fix bug in
KeyRingInfo.lastModified(thanks to @Jerbell, @sosnovsky for reporting) - Bump
sop-javato10.0.3- allow multiple arguments
--with-key-passwordinrevoke-keycommand - Properly pass
--old-key-passwordand--new-key-passwordoptions as indirect arguments inchange-key-passwordcommand
- allow multiple arguments
1.7.1
- Bump
sop-javato10.0.2 - Downgrade
logback-coreandlogback-classicto1.2.13(fix CLI spam)
1.7.0
- Bump
bcpg-jdk8onto1.78.1 - Bump
bcprov-jdk18onto1.78.1 - Bump
logback-coreandlogback-classicto1.4.14 pgpainless-core- Rewrote most of the codebase in Kotlin
- Removed
OpenPgpMetadata(decryptionStream.getResult()) in favor ofMessageMetadata(decryptionStream.getMetadata()) - Removed support for generating EC keys over non-standard curve
secp256k1 - Properly feed EOS tokens to the pushdown automaton when reaching the end of stream (thanks @iNPUTmice)
- Do not choke on unknown signature subpackets (thanks @Jerbell)
- Prevent timing issues resulting in subkey binding signatures predating the subkey (@thanks Jerbell)
- Rename LibrePGP-related
Featureenums:GNUPG_AEAD_ENCRYPTED_DATA->LIBREPGP_OCB_ENCRYPTED_DATAGNUPG_VERSION_5_PUBLIC_KEY->LIBREPGP_VERSION_5_PUBLIC_KEY
- Properly reject signatures by non-signing primary keys
- Add
EncryptionBuilder.discardOutput()(useful for detached signing) - Remove support for generation of keys over non-standard
secp256k1curve - Add base support for padding packets
- Do not choke on LibrePGP OED packets
- Supersede
addPassphrase()/addDecryptionPassphrase()methods with more clearaddMessagePassphrase()
pgpainless-sop,pgpainless-cli- Bump
sop-javato10.0.1, implementing SOP Spec Revision 10 - Change API of
sop.encryptto return aReadyWithResult<EncryptionResult>to expose the session key decrypt --verify-with: Fix to not throwNoSignatureexception (exit code 3) ifVERIFICATIONSis empty- Separate signature verification operations into
SOPVinterface - Add
version --sopvoption - Throw
BadDataerror when passing KEYS where CERTS are expected. armor: Remove--labeloption
- Bump
1.6.8
- Bump
sop-javato7.0.2 - SOP
change-key-password: Fix reading password from indirect parameter instead of erroneously passing filename (fixes #453) - SOP
revoke-key: Allow for multiple--with-key-passwordoptions
1.6.7
- SOP: Fix OOM error when detached-signing large amounts of data (fix #432)
- Move
CachingBcPublicKeyDataDecryptorFactoryfromorg.bouncycastlepacket toorg.pgpainless.decryption_verificationto avoid package split (partially addresses #428) - Basic support for Java Modules for
pgpainless-coreandpgpainless-sop- Added
Automatic-Module-Namedirective to gradle build files
- Added
1.6.6
- Downgrade
logback-coreandlogback-classicto1.2.13to fix #426
1.6.5
- Add
SecretKeyRingEditor.setExpirationDateOfSubkey()
1.6.4
- Bump
bcpg-jdk8onto1.77 - Bump
bcprov-jdk18onto1.77 - Bump
logback-coreandlogback-classicto1.4.13 - Properly feed EOS tokens to the pushdown automaton when reaching the end of stream (thanks @iNPUTmice)
- Do not choke on unknown signature subpackets (thanks @Jerbell)
- Prevent timing issues resuting in subkey binding signatures predating the subkey (@thanks Jerbell)
1.6.3
- Bump
sop-javato7.0.1 decrypt --verify-with: Fix to not throwNoSignatureexception (exit code 3) ifVERIFICATIONSis empty
1.6.2
- Switch
bcpgandbcprovartifacts from-jdk15to18variant to-jdk18on - Bump
bcpg-jdk8onto1.76 - Bump
bcprov-jdk18onto1.76 - Add
EncryptionOptions.setAllowEncryptionWithMissingKeyFlags()to properly allow encrypting to legacy keys which do not carry any key flags. - Allow overriding of reference time in
EncryptionOptionsandSigningOptions.
1.6.1
KeyRingBuilder: Require UTF8 when adding user-ID viaaddUserId(byte[])pgpainless-sop: Remove dependency on jetbrains annotations- Add
CertificateAuthorityinterface to allow integration withpgpainless-wot- Add
EncryptionOptions.addAuthenticatableRecipients()method - Add
MessageMetadata.isAuthenticatablySignedBy()method
- Add
1.6.0
- Bump
sop-javato7.0.0, implementing SOP Spec Revision 07- Implement
revoke-keysubcommand and API - Implement
change-key-passwordsubcommand and API generate-key: Add support for new--signing-onlyoption
- Implement
- Move some methods related to password changing from
SecretKeyRingEditortoKeyRingUtils
1.5.7
- Bump
sop-javato6.1.1 decrypt --verify-with: Fix to not throwNoSignatureexception (exit code 3) ifVERIFICATIONSis empty
1.5.6
- Bump
jacocoto0.8.8(thanks @hkos) - Ignore malformed, non-UTF8 user-IDs on certificates
KeyRingReader.readPublicKeyRingCollection(): Extract and return public keys from encountered secret keys- Add some utility methods to
KeyRingInfo:getValidSubkeys()only returns validly bound sub-keys
- Add some utility methods to
SignatureUtils:getDelegations()returns all third-party signatures made over the primary keyget3rdPartyCertificationsFor(userId)returns all third-party certification signatures made over the given user-id
- Add some utility methods to
SignatureSubpacketsUtil:isExportable()will return true if the signature is not marked as non-exportablegetTrustDepthOr()returns the signatures trust-depth, or a default value if there is no trust-signature subpacketgetTrustAmountOr()returns the signatures trust-amount, or a default value if there is no trust-signature subpacket
1.5.5
- Bump
bcpg-jdk15to18to1.75 - Bump
bcprov-jdk15to18to1.75 - Bump
checkstyleto10.12.1to fix build dependency on vulnerable guava. SecretKeyRingEditor:- Rename
createRevocationCertificate()tocreateRevocation() - Add
createMinimalRevocationCertificate()method to generate OpenPGP v6-style self-certifying revocation certificates
- Rename
1.5.4
- Bump
bcpg-jdk15to18to1.74 - Bump
bcprov-jdk15to18to1.74 - Remove unused methods from
SignatureUtils - Encryption: Allow anonymous recipients using wildcard key-IDs
- Add
SignatureSubpacketsUtil.getRegularExpressions() - Tests, tests, tests
1.5.3
- Fix minimal bit-strength check for signing-subkeys accidentally comparing the bit-strength of the primary key
SigningOptions: Add new methods to add signatures using a single, chosen signing subkey
1.5.2
- Bugfix: Create proper direct-key signatures
KeyRingTemplates:- Add
rsaKeyRing()for generating RSA keys with primary key and dedicated signing, encryption subkeys - Reduce number of template methods by replacing
UserId,Stringarguments withCharSequence
- Add
- Add
MessageMetadata.getRecipientKeyIds() - Work towards more null-safe API by annotating methods in
EncryptionOptions,SigningOptions,KeyRingInfo,PGPainlesswith@Nonnull,@Nullable KeyRingUtils: RemovedremoveSecretKey()in favour ofstripSecretKey()- General code cleanup
- SOP: generating keys with
rfc4880profile now generates key with primary key and subkeys - Deprecate ElGamal key type
- Key generation: Set expiration period of 5 years by default
- Set AES-128 as default fallback symmetric algorithm
ProducerOptions: Allow setting custom version header when encrypting/signing message
1.5.2-rc1
- Bump
sop-javato6.1.0 - Normalize
OpenPgpMessageInputStream.read()behaviour when reading past the stream- Instead of throwing a
MalformedOpenPgpMessageExceptionwhich could throw off unsuspecting parsers, we now simply return-1like every otherInputStream.
- Instead of throwing a
1.5.1
- SOP: Emit signature
mode:{binary|text}inVerificationresults - core: Relax constraints on decryption subkeys to improve interoperability with broken clients
- Allow decryption with revoked keys
- Allow decryption with expired keys
- Allow decryption with erroneously addressed keys without encryption key flags
1.5.0
- Bump
bcpg-jdk15to18to1.73 - Bump
bcprov-jdk15to18to1.73 - Introduce
OpenPgpv6Fingerprintclass - Bump
sop-javato5.0.0, implementing SOP Spec Revision 05- Add support for
list-profilessubcommand (generate-keyonly for now) generate-key: Add support for--profile=option- Add profile
draft-koch-eddsa-for-openpgp-00which represents status quo. - Add profile
rfc4880which generates keys based on 4096-bit RSA.
- Add profile
- Add support for
- Bump
sop-javato6.0.0, implementing SOP Spec Revision 06encrypt: Add support for--profile=option- Add profile
rfc4880to reflect status quo
- Add profile
version: Add support for--sop-specoption
1.4.6
- Bump
sop-javato4.1.2 - Fix
decrypt --verify-withto not throwNoSignatureexception (exit code 3) ifVERIFICAIONSis empty.
1.4.5
- Bugfix: Direct-Key signatures are calculated over the signee key only, not the signer key + signee key
- Security: Fix faulty bit-strength policy check for signing subkeys
1.4.4
- Fix expectations on subpackets of v3 signatures (thanks @bjansen)
- Properly verify v3 signatures, which do not yet have signature subpackets, yet we required them to have
a hashed creation date subpacket.
- Properly verify v3 signatures, which do not yet have signature subpackets, yet we required them to have
1.4.3
- Bump
sop-javato4.1.1 - Reuse shared test suite of
sop-java - Add
EncryptionOptions.hasEncryptionMethod() - SOP
encrypt: ThrowMissingArgexception if no encryption method was provided - Fix redundant dot in exception message (thanks @DenBond7)
1.4.2
- Properly decrypt messages without MDC packets when
ConsumerOptions.setIgnoreMDCErrors(true)is set - Fix crash in
sop generate-key --with-key-passwordwhen more than one user-id is given - Revert integration with
pgp-certificate-store - Bump
sop-javato4.1.0
1.4.1
- Add
UserId.parse()method to parse user-ids into their components
1.4.0
sop generate-key: Add support for keys without user-idssop inline-sign --as=clearsigned: Make signature in TEXT mode- Make countermeasures against KOpenPGP attacks configurable
- Countermeasures are now disabled by default since they are costly and have a specific threat model
- Can be enabled by calling
Policy.setEnableKeyParameterValidation(true)
1.4.0-rc2
- Bump
bcpg-jdk15to18to1.72.3 - Use BCs
PGPEncryptedDataList.extractSessionKeyEncryptedData()method to do decryption using session keys. This enables decryption of messages without encrypted session key packets. - Use BCs
PGPEncryptedDataList.isIntegrityProtected()to check for integrity protection - Depend on
pgp-certificate-store - Add
ConsumerOptions.addVerificationCerts(PGPCertificateStore)to allow sourcing certificates from e.g. a certificate store implementation. - Make
DecryptionStream.getMetadata()first class- Deprecate
DecryptionStream.getResult()
- Deprecate
1.4.0-rc1
- Reimplement message consumption via new
OpenPgpMessageInputStream- Fix validation of prepended signatures (#314)
- Fix validation of nested signatures (#319)
- Reject malformed messages (#237)
- Utilize new
PDAsyntax verifier class - Allow for custom message syntax via
Syntaxclass
- Utilize new
- Gracefully handle
UnsupportedPacketVersionExceptionfor signatures - Allow plugin decryption code (e.g. to add support for hardware-backed keys (see #318))
- Add
HardwareSecurityutility class - Add
GnuPGDummyKeyUtilwhich can be used to mimic GnuPGs proprietary S2K extensions for keys which were placed on hardware tokens
- Add
- Add
OpenPgpPacketenum class to enumerate available packet tags - Remove old decryption classes in favor of new implementation
- Removed
DecryptionStreamclass and replaced with new abstract class - Removed
DecryptionStreamFactory - Removed
FinalIOException - Removed
MissingLiteralDataException(replaced byMalformedOpenPgpMessageException)
- Removed
- Introduce
MessageMetadataclass as potential future replacement forOpenPgpMetadata.- can be obtained via
((OpenPgpMessageInputStream) decryptionStream).getMetadata();
- can be obtained via
- Add
CachingBcPublicKeyDataDecryptorFactorywhich can be extended to prevent costly decryption of session keys - Fix: Only verify message integrity once
- Remove unnecessary
@throwsdeclarations onKeyRingReadermethods - Remove unnecessary
@throwsdeclarations onKeyRingUtilsmethods - Add
KeyIdUtil.formatKeyId(long id)to format hexadecimal key-ids. - Add
KeyRingUtils.publicKeys(PGPKeyRing keys) - Remove
BCUtilclass
1.3.18
- Bump
sop-javato4.1.2 - Fix
decrypt --verify-with XYZnot throwingNoSignatureexception (exit code 3) ifVERIFICATIONSis empty (#415)
1.3.17
- Bugfix: Direct-Key signatures are calculated over the signee key only, not the signer key + signee key
- Security: Fix faulty bit-strength policy check for signing subkeys
1.3.16
- Bump
sop-javato4.1.0 - Bump
gradlewto7.5
1.3.15
- Fix crash in
sop generate-key --with-key-passwordwhen more than one user-id is given sop generate-key: Allow key generation without user-idssop inline-sign --as=clearsigned: Make signatures of type 'text' instead of 'binary'
1.3.14
- Bump
bcpgto1.72.3 - Fix DSA key parameter check
- Use proper method to unlock private signing keys when creating detached signatures
1.3.13
- Bump
sop-javato4.0.7
1.3.12
- Bump
sop-javato4.0.5 - Fix:
sop inline-sign: Adopt--as=clearsignedinstead of--as=cleartextsigned - SOP: Hide
Version: PGPainlessarmor header in all armored outputs - Fix:
sop armor: Do not re-armor already armored data
1.3.11
- Fix: When verifying subkey binding signatures with embedded recycled primary key binding signatures, do not reject signature if primary key binding predates subkey binding
- SOP
verify: Forcefully expectdata()to be non-OpenPGP data - SOP
sign: Fix matching of keys and passphrases - CLI: Added tons of tests \o/
1.3.10
- Bump
sop-javato4.0.3 - Fix: Fix NPE when verifying signature made by key without key flags on direct-key signature
1.3.9
- Bump
sop-javato4.0.2 - SOP: Improve exception handling
1.3.8
- Bump
bcprovto1.72 - Bump
bcpgto1.72.1 - Add
ProducerOptions.setHideArmorHeaders(boolean)to hide automatically added armor headers in encrypted messages
1.3.7
- Bugfix: Fix signature verification when
DecryptionStreamis drained byte-by-byte usingread()call - Add
KeyRingUtils.injectCertification(keys, certification) - Add
PGPainless.asciiArmor(key, outputStream) - Add
PGPainless.asciiArmor(signature)
1.3.6
- Remove deprecated methods
ArmorUtils.createArmoredOutputStreamFor()-> useArmorUtils.toAsciiArmoredStream()insteadEncryptionResult.getSymmetricKeyAlgorithm()-> useEncryptionResult.getEncryptionAlgorithm()instead
- Add
KeyRingInfo.getRevocationState()- Better way to determine whether a key is revoked
- Add
SigningOptions.addDetachedSignature(protector, key)shortcut method - Add
EncryptionOptions.get(),ConsumerOptions.get()factory methods - Add support for generating keys without user-id (only using
PGPainless.buildKeyRing()for now) - Switch to
SHA256as defaultS2Khash algorithm for secret key protection - Allow to set custom reference time when modifying secret keys
- Add diagnostic test to explore system PRNG performance
1.3.5
- Add
KeyRingInfo.isCapableOfSigning() - Add
KeyRingReader.readKeyRing(*)methods that can take both secret- and public keys - Add manpages
- Add script to generate manpages from sop-java-picocli
- Build website from main branch
1.3.4
- Fix
KeyRingInfo.isUsableForEncryption(),KeyRingInfo.isUsableForSigning()not detecting revoked primary keys - Bump
sop-javaandsop-java-picoclito4.0.1- Fixes help text strings being resolved properly while allowing to override executable name
1.3.3
- Improve test compatibility against older JUnit versions
- Fix tests that read from jar-embedded resources (thanks @jcharaoui)
pgpainless-cli help: Fix i18n strings
1.3.2
- Add
KeyRingInfo(Policy)constructor - Delete unused
KeyRingValidatorclass - Add
PGPainless.certify()APIcertify().userIdOnCertificate()can be used to certify other users User-IDscertify().certificate()can be used to create direct-key signatures on other users keys
- We now have a User Guide!
- Fixed build script
pgpainless-clisgradle buildtask no longer builds fat jar- Fat jars are now built by dedicated shadow plugin
- Fix third-party assigned user-ids on keys to accidentally get picked up as primary user-id
- Add
KeyRingUtils.publicKeyRingCollectionFrom(PGPSecretKeyRingCollection) - Add
SecretKeyRingEditor.replaceUserId(oldUid, newUid, protector) - Prevent adding
SymmetricKeyAlgorithm.NULL(unencrypted) as encryption algo preference when generating keys
1.3.1
- Fix reproducibility of builds by setting fixed file permissions in archive task
- Improve encryption performance by buffering streams
- Fix
OpenPgpMetadata.isEncrypted()to also return true for symmetrically encrypted messages - SOP changes
- decrypt: Do not throw
NoSignaturesif no signatures found - decrypt: Throw
BadDatawhen ciphertext is not encrypted
- decrypt: Do not throw
1.3.0
- Add
RevokedKeyException KeyRingUtils.stripSecretKey(): Disallow stripping of primary secret key- Remove support for reading compressed detached signatures
- Add
PGPainless.generateKeyRing().modernKeyRing(userId)shortcut method without passphrase - Add
CollectionUtils.addAll(Iterator, Collection) - Add
SignatureUtils.getSignaturesForUserIdBy(key, userId, keyId) - Add
OpenPgpFingerprint.parseFromBinary(bytes) SignatureUtils.wasIssuedBy(): Add support for V5 fingerprints- Prevent integer overflows when setting expiration dates
- SOP: Properly throw
KeyCannotDecryptexception - Fix performance issues of encrypt and sign operations by using buffering
- Fix performance issues of armor and dearmor operations
- Bump dependency
sop-javato4.0.0 - Add support for SOP specification version 04
- Implement
inline-sign - Implement
inline-verify - Rename
DetachInbandSignatureAndMessageImpltoInlineDetachImpl - Rename
SignImpltoDetachedSignImpl - Rename
VerifyImpltoDetachedVerifyImpl - Add support for
--with-key-passwordoption inGenerateKeyImpl,DetachedSignImpl,DecryptImpl,EncryptImpl. InlineDetachImplnow supports 3 different message types:- Messages using Cleartext Signature Framework
- OpenPGP messages using OnePassSignatures
- OpenPGP messages without OnePassSignatures
- Implement
- Introduce
OpenPgpMetadata.isCleartextSigned()
1.2.2
EncryptionOptions.addRecipients(collection): Disallow empty collections to prevent misuse from resulting in unencrypted messages- Deprecate default policy factory methods in favor of policy factory methods with expressive names
- Another fix for OpenPGP data detection
- We now inspect the first packet of the data stream to figure out, whether it is plausible OpenPGP data, without exhausting the stream
1.2.1
- Bump
sop-javadependency to1.2.3 - Bump
slf4jdependency to1.7.36 - Bump
logbackdependency to1.2.11 - Add experimental support for creating signatures over pre-calculated
MessageDigestobjects.BcHashContextSigner.signHashContext()can be used to create OpenPGP signatures over manually hashed data.
This allows applications to do the hashing themselves.
- Harden detection of binary/ascii armored/non-OpenPGP data
- Add
ConsumerOptions.forceNonOpenPgpData()to force PGPainless to handle data as non-OpenPGP data- This is a workaround for when PGPainless accidentally mistakes non-OpenPGP data for binary OpenPGP data
- Implement "smart" hash algorithm policies, which take the 'usage-date' for algorithms into account
- This allows for fine-grained signature hash algorithm policing with usage termination dates
- Switch to smart signature hash algorithm policies by default
- PGPainless now accepts SHA-1 signatures if they were made before 2013-02-01
- We also now accept RIPEMD160 signatures if they were made before 2013-02-01
- We further accept MD5 signatures made prior to 1997-02-01
1.2.0
- Improve exception hierarchy for key-related exceptions
- See PR for more information on how to migrate.
- Bump Bouncy Castle to
1.71- Switch from
bcpg-jdk15on:1.70tobcpg-jdk15to18:1.71 - Switch from
bcprov-jdk15on:1.70tobcprov-jdk15to18:1.71
- Switch from
- Implement merging of certificate copies
- can be used to implement updating certificates from key servers
- Fix
KeyRingUtils.keysPlusPublicKey() - Add support for adding
PolicyURIandRegularExpressionsignature subpackets on signatures
1.1.5
- SOP encrypt: match signature type when using
encrypt --as=option ProducerOptions.setEncoding(): The encoding is henceforth only considered metadata and will no longer trigger CRLF encoding.- This fixes broken signature generation for mismatching (
StreamEncoding,DocumentSignatureType) tuples. - Applications that rely on CRLF-encoding can request PGPainless to apply this encoding by calling
ProducerOptions.applyCRLFEncoding(true).
- This fixes broken signature generation for mismatching (
- Rename
KeyRingUtils.removeSecretKey()tostripSecretKey(). - Add handy
SignatureOptions.addSignature()method. - Fix
ClassCastExceptionwhen evaluating a certificate with third party signatures. Thanks @p-barabas for the initial report and bug fix!
1.1.4
- Add utility method
KeyRingUtils.removeSecretKey()to remove secret key part from key ring- This can come in handy when using primary keys stored offline
- Add
EncryptionResult.isEncryptedFor(certificate) ArmorUtils.toAsciiArmoredString()methods now print out primary user-id and brief information about further user-ids (thanks @bratkartoffel for the patch)- Methods of
KeyRingUtilsandArmorUtilsclasses are now annotated with@Nonnull/@Nullable - Enums
fromId(code)methods are now annotated with@Nullableand there are nowrequireFromId(code)counterparts which are@Nonnull. ProducerOptions.setForYourEyesOnly()is now deprecated (reason is deprecation in the- crypto-refresh-05 document)
- Add
SessionKey.toString() - Partially fix generation of malformed signature packets when using different combinations of
StreamEncodingandDocumentSignatureTypevalues- Unfortunately PGPainless still produces broken signatures when using either
StreamEncoding.TEXTorStreamEncoding.UTF8in combination withDocumentSignatureType.BINARY_DOCUMENT.
- Unfortunately PGPainless still produces broken signatures when using either
- Deprecate
ProducerOptions.setEncoding(StreamEncoding)- Will be removed in a future release
- Remove
StreamEncoding.MIME(was removed from the standard)
1.1.3
- Make
SigningOptions.getSigningMethods()part of internal API - Fix crash when trying to do verification of unmatched
SignersUserIdsignature subpacket- For now, verification of
SignersUserIdis disabled but can be enabled viaPolicy.setSignerUserIdValidationLevel()
- For now, verification of
- Initial support for
OpenPgpV5Fingerprint - Add
OpenPgpFingerprint.parse(string) - Security: Fix
KeyRingInfo.getValidAndExpiredUserIds()accidentally including unbound user-ids
1.0.5
- Security: Fix
KeyRingInfo.getValidAndExpiredUserIds()accidentally including unbound user-ids
1.1.2
- Fix
keyRingInfo.getEmailAddresses()incorrectly matching some mail addresses (thanks @bratkartoffel for reporting and initial patch proposal) - Fix generic type of
CertificationSubpackets.Callback - Add
KeyRingInfo.isUsableForEncryption() - Add
PGPainless.inspectKeyRing(key, date) - Allow custom key creation dates during key generation
- Reject subkeys with bindings that predate key generation
EncryptionOptions.addRecipient(): TransformNoSuchElementExceptionintoIllegalArgumentExceptionwith proper error message- Fix
ClassCastExceptionby preventing accidental verification of 3rd-party-issued user-id revocation with primary key. - Fix
NullPointerExceptionwhen trying to verify malformed signature
1.1.1
- Add
producerOptions.setComment(string)to allow adding ASCII armor comments when creating OpenPGP messages (thanks @ferenc-hechler) - Simplify consumption of cleartext-signed data
- Change default criticality of signature subpackets
- Issuer Fingerprint: critical -> non-critical
- Revocable: non-critical -> critical
- Issuer KeyID: critical -> non-critical
- Preferred Algorithms: critical -> non-critical
- Revocation Reason: critical -> non-critical
1.1.0
pgpainless-sop: Updatesop-javato version 1.2.0- Treat passwords and session keys as indirect parameters This means they are no longer treated as string input, but pointers to files or env variables
1.0.4
- Yet another patch for faulty ASCII armor detection 😒
1.0.3
- Fix detection of unarmored data in signature verification
1.0.2
- Update SOP implementation to specification revision 03
- Move
sop-javaandsop-java-picoclimodules to its own repository OpenPGPV4Fingerprint: Hex decode bytes in constructor- Add
ArmorUtils.toAsciiArmoredString()for single key - Fix
ClassCastExceptionwhen retrievingRevocationKeysubpackets from signatures - Fix
pgpainless-sopgradle script- it now automatically pulls in transitive dependencies
1.0.1
- Fix sourcing of preferred algorithms by primary user-id when key is located via key-id
1.0.0
- Introduce
DateUtil.toSecondsPrecision() - Clean JUnit tests, fix code style issues and fix typos in documentation
1.0.0-rc9
- When key has both direct-key sig + primary user-id sig: resolve expiration date to the earliest expiration
- Add
SecretKeyRingEditor.removeUserId()convenience methods that do soft-revoke the user-id. - Add
SelectUserId.byEmail()which also matches the plain email address
1.0.0-rc8
KeyRingInfo.getPrimaryUserId(): return first user-id when no primary user-id is found- Rename method
getBoundButPossiblyExpiredUserIdstogetValidAndExpiredUserIds() - Remove audit resource material
1.0.0-rc7
- Make
Passphrasecomparison constant time - Bump Bouncycastle to 1.70
- Use new
PGPCanonicalizedDataGeneratorwhere applicable - Implement decryption with user-provided session key
- Remove workaround for invalid signature processing
- Use new
- Remove Blowfish from default symmetric decryption/encryption policy
- When adding/generating keys: Check compliance to
PublicKeyAlgorithmPolicy - Fix
BaseSecretKeyRingProtectormisinterpreting empty passphrases - SOP: Fix NPE when attempting to sign with key with missing signing subkey
- Describe Threat Model in [pgpainless-core/README.md]
- Fix NPE when attempting to decrypt GNU_DUMMY_S2K key
- Validate public key parameters when unlocking secret keys
- Introduce iteration limits to prevent resource exhaustion when
- reading signatures
- reading keys
CachingSecretKeyRingProtector: Prevent accidental passphrase overriding viaaddPassphrase()EncryptionOptions: replace method argument typePGPPublicKeyRingCollectionwithIterable<PGPPublicKeyRing>to allow forCollection<PGPPublicKeyRing>as argumentSigningOptions: replace method argument typePGPSecretKeyRingCollectionwithIterable<PGPSecretKeyRing>to allow forCollection<PGPSecretKeyRing>as argument- Prevent message decryption with non-encryption subkey
- Rework key modification API to fix inconsistency problems with expiration and primary user-ids.
- Remove methods to change expiration dates of subkeys and specific user-ids
- Rework primary user-id marking logic to unmark non-primary ids
- Added Cure53 Security Audit Report to the website
- Reworked tests for cryptographic backend to use custom
InvocationContextProviderimplementation - Source
PGPObjectFactoryobjects fromImplementationProvider - Fix typo
getCommendHeader() -> getCommentHeader()
1.0.0-rc6
- Restructure method arguments in
SecretKeyRingEditor - Add explanations of revocation reasons to
RevocationAttributes - Rename
CertificationSignatureBuildertoThirdPartyCertificationSignatureBuilder KeyAccessor.ViaKeyId: Differentiate between primary key (rely on direct-key sig) and subkey (subkey binding sig)- Expose
SignatureSubpacketsUtil.getKeyLifetimeInSeconds - Various cleanup steps and new tests
1.0.0-rc5
- Fix invalid cursor mark in
BufferedInputStreamwhen processing large cleartext signed messages - Add
SecretKeyRingEditor.revokeUserIds(SelectUserId, SecretKeyRingProtector, RevocationSignatureSubpackets.Callback)
1.0.0-rc4
- Fix bug where
KeyRingBuilderwould mark additional user-ids as primary
1.0.0-rc3
- New Signature builder API for more fine-grained control over key-signatures:
- Introduce
CertificationSignatureSubpacketsbuilder class to wrapPGPSignatureSubpacketGeneratorfor certification style signatures. - Introduce
SelfSignatureSubpacketsbuilder class for self-signatures. - Introduce
RevocationSignatureSubpacketsbuilder class for revocation signatures. - Introduce
CertificationSignatureSubpackets.Callback,SelfSignatureSubpackets.CallbackandRevocationSignatureSubpackets.Callbackto allow modification of signature subpackets by the user. - Incorporate
*SignatureSubpackets.Callbackclasses as arguments inSecretKeyRingEditorandKeyRingBuildermethods.
- Introduce
- Start working on
ProofUtilto create KeyOxide style identity proofs (WIP) - Move Signature verification related code to
org.pgpainless.signature.consumerpackage - Ensure keyflags and other common subpackets are set in new signatures when adding user-ids
- Ensure subkey can carry keyflag when adding it to a key
- Refactor
SecretKeyRingProtectormethods and code
1.0.0-rc2
SecretKeyRingEditor: Remove support for user-id- and subkey deletion in favor of revocation- Deletion causes all sorts of problems. Most notably, receiving implementations will not honor deletion of user-ids/subkeys.
If you really need to delete user-ids there now is
KeyRingUtils.deleteUserId(keys, userid), but its use is highly discouraged and should only (if ever) be used for local manipulations of keys.
- Deletion causes all sorts of problems. Most notably, receiving implementations will not honor deletion of user-ids/subkeys.
If you really need to delete user-ids there now is
pgpainless-core&pgpainless-sop: Fix accidental compile scope dependency onlogback-classicKeyRingInfo: Sensible arguments for methods to get preferred algorithms
1.0.0-rc1
- First release candidate for a 1.0.0 release! \o/
- Rename
EncryptionPurpose.STORAGE_AND_COMMUNICATIONStoEncryptionPurpose.ANY - Hide
PGPainless.verifyCleartextSignedMessage()behindPGPainless.decryptAndVerify().- the latter now checks whether the message is cleartext-signed or not and automatically calls the proper API
MultiPassStrategyobjects are now set throughConsumerOptions.setMultiPassStrategy().
- Separate key ring generation through templates from custom key ring builder
PGPainless.generateKeyRing()now offers to generate keys from templatesPGPainless.buildKeyRing()offers a detailed API to build custom keys
- Fix detection of non-armored data
0.2.19
- Some preparations for OpenPGP V5 keys:
OpenPgpV4Fingerprintis now an implementation ofOpenPgpFingerprint SignatureVerificationandFailurenow havetoString()implementations- Logging:
logback-classicis now an optional runtime dependency
0.2.18
- Fix compatibility with PGPainless < 0.2.10
- Fix interoperability with Kleopatra
- Decryption: Do not skip over first PKESKs when we have a matching decryption key
- MessageInspector: Break from object factory loop after encountering encrypted data (we cannot go deeper)
- Move hash algorithm negotiation to own class
- Change return value of
EncryptionOptions.overrideEncryptionAlgorithm()
0.2.17
- Fix prematurely throwing
MissingPassphraseExceptionwhen decrypting message with multiple possible keys and passphrases
0.2.16
- Fix handling of subkey revocation signatures
- SOP: improve API usage with byte arrays
- Fix
AssertionErrorwhen determining encryption subkeys from set containing unbound key - Add
ConsumerOptions.setMissingKeyPassphraseStrategy(strategy)to modify behavior when missing key passphrases are encountered during decryption
0.2.15
- Add
ConsumerOptions.setIgnoreMDCErrors()which can be used to consume broken messages. Not recommended! - Add
MessageInspector.isSignedOnly()which can be used to identify messages created viagpg --sign --armor - Workaround for BCs
PGPUtil.getDecoderStreammistaking plaintext for base64 encoded data - Cleanup of unused internal methods
- SOP: Fix
ArmorImplwriting data to provided output stream instead ofSystem.out - Fix hen and egg problem with streams in signature detaching implementation of SOP
- Make code REUSE compliant
0.2.14
- Export dependency on Bouncycastle's
bcprov-jdk15on - Rework Key Generation API
- Replace builder-chain structure with single
KeyRingBuilderclass
- Replace builder-chain structure with single
- Change return value of
CleartextSignatureProcessor.process()toDecryptionStream - Rename
CleartextSignatureProcessor.process()toCleartextSignatureProcessor.getVerificationStream() - Add support for creating cleartext signed messages by calling
ProducerOptions.setCleartextSigned() - Add examples for signing messages in the
examplespackage.
0.2.13
- Add
MessageInspectorclass to determine IDs of recipient keys. - PGPainless now tries decryption using keys with available passphrases first and only then request key passphrases using callbacks.
0.2.12
- Fix: Add workaround for BC defaulting to S2K
USAGE_CHECKSUMby changing S2K usage toUSAGE_SHA1 - Repair keys with
USAGE_CHECKSUMwhen changing passphrase
0.2.11
- Fix: When changing expiration date of keys, also consider generic and casual certifications
0.2.10
- Cleartext Signature Framework
- Reuse
ConsumerOptionsclass for verification - Return
OpenPgpMetadataobject as result of verification
- Reuse
- Change default compression algorithm from
UNCOMPRESSEDtoZIP - Cleanup: Move Signature Verification code to dedicated internal stream
0.2.9
- Allow customization of ASCII armor comment and version headers
- Small bug fixes of SOP implementation
- Readability fixes
- Switch from JUL to slf4j for logging
- SOP: Native support for verify-not-before and verify-not-after
- SOP: Adopt changes for SOP spec version 2
- Add
detach-inband-signatures-and-messagesubcommand - Add support for environment variables
- Remove
-allow-nested
- Add
- Cleartext Signature Framework: Fix handling of trailing newlines
0.2.8
- Encrypt to all capable subkeys by default
- Ignore missing CRC checksums in ASCII Armor
0.2.7
- Fix writing data to standard out in the
java-sop-picoclimodule - Improve handling of signatures with missing issuer-key-id packets
- Properly ignore marker packets
- Add issuer-fingerprint packets to message signatures by default
- Fix ordering (bracketing) and nested-ness of one-pass-signatures
- Fix interoperability issue with Thunderbird
- Some keys caused wrong partial-length encodings for integrity protected session packets
0.2.6
- Actually properly detect CRC checksum errors in ASCII armor
0.2.5
- Explicitly reject non-self-signatures when picking user-id self-signatures
- pgpainless-cli: Set executable name in help text
- Properly detect CRC checksum errors in ASCII armor
0.2.4
- Java based Stateless OpenPGP Protocol
- Introduce
sop-javamodule
Contains Java interfaces modelling the Stateless OpenPGP Protocol - Introduce
sop-java-picocli
Command Line Interface frontend forsop-javabased OpenPGP implementations pgpainless-sopnow contains an implementation ofsop-javausingpgpainless-corepgpainless-clinow contains a ready to use OpenPGP command line application
It simply plugspgpainless-sopintosop-java-picocli.
- Introduce
- Remove deprecated encryption API
- Remove deprecated decryption API
- Add
PGPainless.extractCertificate()andPGPainless.asciiArmor()methods OpenPgpMetadata:getDecryptionKey()andgetVerifiedSignatures()now returnSubkeyIdentifierobjectsKeyRingReadernow properly ignores marker packets- Encryption: File-related metadata (e.g. file name) moved to
ProducerOptions pgpainless-cli/pgpainless-cliexecutable script: Fix piping and parameter passingsop-java-picocli: Addhelpcommand- When changing passphrases: Subkeys with
GNU_DUMMY_S2Kwill now be ignored
0.2.3
- Introduce new simplified decryption API
The new API (withOptions(ConsumerOptions)) resembles the encryption API and is more friendly to dynamic construction of decryption properties
The old API has been deprecated and will be removed in a future release - Add
examplepackage in the JUnit tests
This package contains always-up-to-date usage examples for the PGPainless' API and various use cases - Add
KeyRingInfo.getVersion - Add
CachingSecretKeyRingProtector.addPassphrase(OpenPgpV4Fingerprint, Passphrase) - Make builds of all jars reproducible
- Fix
NullPointerExceptioninKeyRingInfo.getExpirationDateForUse()
0.2.2
- Fix bug where adding a subkey would ignore the user-requested key flags
This would cause subkeys to erroneously carry the certify-others key flag
0.2.1
- Bump Bouncycastle dependency to
1.69
This fixes a number of issues (#70, #72, #84). As a result the test suite should now run more smoothly \o/ - Remove Android SDK build dependency
We can now build PGPainless without the need to have the Android SDK installed SignatureUtils: AddgetSignatureDigestPrefix()method- Add
KeyIdUtilwhich allows converting 16 digit hex fingerprints to key-ids SignatureSubpacketsUtil: Add methods to get notations by name- Add public key algorithm policy to reject signatures made by weak signing keys