1
0
Fork 0
mirror of https://github.com/pgpainless/pgpainless.git synced 2025-09-09 18:29:39 +02:00

Make secret key protection settings customizable via policy

This commit is contained in:
Paul Schaub 2025-03-13 16:12:43 +01:00
parent 671dde0de9
commit b1855d0a13
Signed by: vanitasvitae
GPG key ID: 62BEE9264BF17311
4 changed files with 8 additions and 7 deletions

View file

@ -19,7 +19,6 @@ import org.pgpainless.algorithm.KeyFlag
import org.pgpainless.algorithm.OpenPGPKeyVersion
import org.pgpainless.algorithm.SignatureType
import org.pgpainless.bouncycastle.extensions.unlock
import org.pgpainless.key.protection.KeyRingProtectionSettings
import org.pgpainless.policy.Policy
import org.pgpainless.signature.subpackets.SelfSignatureSubpackets
import org.pgpainless.signature.subpackets.SignatureSubpackets
@ -93,7 +92,7 @@ class KeyRingBuilder(
requireNotNull(primaryKeySpec) { "Primary Key spec required." }
val certKey = generateKeyPair(primaryKeySpec!!, version)
val secretKeyEncryptor = buildSecretKeyEncryptor(certKey.publicKey, false)
val secretKeyEncryptor = buildSecretKeyEncryptor(certKey.publicKey)
val secretKeyDecryptor = buildSecretKeyDecryptor()
passphrase.clear() // Passphrase was used above, so we can get rid of it
@ -229,15 +228,14 @@ class KeyRingBuilder(
private fun buildSecretKeyEncryptor(
publicKey: PGPPublicKey,
aead: Boolean
): PBESecretKeyEncryptor? {
check(passphrase.isValid) { "Passphrase was cleared." }
val protectionSettings = KeyRingProtectionSettings.secureDefaultSettings()
val protectionSettings = PGPainless.getPolicy().keyProtectionSettings
return if (passphrase.isEmpty) null
else
OpenPGPImplementation.getInstance()
.pbeSecretKeyEncryptorFactory(
aead,
protectionSettings.aead,
protectionSettings.encryptionAlgorithm.algorithmId,
protectionSettings.s2kCount)
.build(passphrase.getChars(), publicKey.publicKeyPacket)

View file

@ -49,7 +49,7 @@ open class BaseSecretKeyRingProtector(
else
OpenPGPImplementation.getInstance()
.pbeSecretKeyEncryptorFactory(
false,
protectionSettings.aead,
protectionSettings.encryptionAlgorithm.algorithmId,
protectionSettings.s2kCount)
.build(it.getChars(), key.publicKeyPacket)

View file

@ -509,7 +509,7 @@ class KeyRingUtils {
return PGPSecretKey.copyWithNewPassword(
secretKey,
oldProtector.getDecryptor(secretKey.keyID),
oldProtector.getDecryptor(secretKey.keyIdentifier),
newProtector.getEncryptor(secretKey.publicKey))
}

View file

@ -6,6 +6,7 @@ package org.pgpainless.policy
import java.util.*
import org.pgpainless.algorithm.*
import org.pgpainless.key.protection.KeyRingProtectionSettings
import org.pgpainless.util.DateUtil
import org.pgpainless.util.NotationRegistry
@ -17,6 +18,7 @@ class Policy(
var symmetricKeyDecryptionAlgorithmPolicy: SymmetricKeyAlgorithmPolicy,
var compressionAlgorithmPolicy: CompressionAlgorithmPolicy,
var publicKeyAlgorithmPolicy: PublicKeyAlgorithmPolicy,
var keyProtectionSettings: KeyRingProtectionSettings,
var notationRegistry: NotationRegistry
) {
@ -29,6 +31,7 @@ class Policy(
SymmetricKeyAlgorithmPolicy.symmetricKeyDecryptionPolicy2022(),
CompressionAlgorithmPolicy.anyCompressionAlgorithmPolicy(),
PublicKeyAlgorithmPolicy.bsi2021PublicKeyAlgorithmPolicy(),
KeyRingProtectionSettings.secureDefaultSettings(),
NotationRegistry())
var keyGenerationAlgorithmSuite = AlgorithmSuite.defaultAlgorithmSuite