diff options
author | Harsh Shandilya <me@msfjarvis.dev> | 2024-05-27 20:59:20 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-27 15:29:20 +0000 |
commit | 0f9540a645ef66f3cf67294f75ba2c5d9d80078e (patch) | |
tree | 1f6e94f6565de5ee147b1fdcd694343cc6004d20 /crypto/pgpainless/src/main | |
parent | 1877c6ab5a987e08797b13e4dc619294d03d4c02 (diff) |
feat(pgpainless): add detection for passphrase-less messages (#3069)
* WIP: feat(pgpainless): add detection for passphrase-less messages
* refactor: test keys instead of the message
This makes more logical sense
Diffstat (limited to 'crypto/pgpainless/src/main')
-rw-r--r-- | crypto/pgpainless/src/main/kotlin/app/passwordstore/crypto/PGPainlessCryptoHandler.kt | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/crypto/pgpainless/src/main/kotlin/app/passwordstore/crypto/PGPainlessCryptoHandler.kt b/crypto/pgpainless/src/main/kotlin/app/passwordstore/crypto/PGPainlessCryptoHandler.kt index 1aabe54f..b3f2a64b 100644 --- a/crypto/pgpainless/src/main/kotlin/app/passwordstore/crypto/PGPainlessCryptoHandler.kt +++ b/crypto/pgpainless/src/main/kotlin/app/passwordstore/crypto/PGPainlessCryptoHandler.kt @@ -11,6 +11,7 @@ import app.passwordstore.crypto.errors.NoKeysProvidedException import app.passwordstore.crypto.errors.NonStandardAEAD import app.passwordstore.crypto.errors.UnknownError import com.github.michaelbull.result.Result +import com.github.michaelbull.result.mapBoth import com.github.michaelbull.result.mapError import com.github.michaelbull.result.runCatching import java.io.InputStream @@ -140,4 +141,14 @@ public class PGPainlessCryptoHandler @Inject constructor() : public override fun canHandle(fileName: String): Boolean { return fileName.substringAfterLast('.', "") == "gpg" } + + public override fun isPassphraseProtected(keys: List<PGPKey>): Boolean = + keys + .mapNotNull { key -> PGPainless.readKeyRing().secretKeyRing(key.contents) } + .map(::keyringHasPassphrase) + .all { it } + + internal fun keyringHasPassphrase(keyRing: PGPSecretKeyRing) = + runCatching { keyRing.secretKey.extractPrivateKey(null) } + .mapBoth(success = { false }, failure = { true }) } |