From 4b25d04509371664883e344aaa9fbf2f403529f3 Mon Sep 17 00:00:00 2001 From: Koni Marti Date: Tue, 6 Aug 2024 22:37:29 +0200 Subject: crypto: add pinentry support to gpg Add pinentry support to GPG for signing, enrypting and decrypting messages. Signed-off-by: Koni Marti Acked-by: Robin Jarry --- lib/crypto/gpg/gpgbin/gpgbin.go | 3 +++ lib/crypto/gpg/reader.go | 4 ++++ lib/crypto/gpg/writer.go | 7 +++++++ 3 files changed, 14 insertions(+) diff --git a/lib/crypto/gpg/gpgbin/gpgbin.go b/lib/crypto/gpg/gpgbin/gpgbin.go index 3db28d34..a63dd886 100644 --- a/lib/crypto/gpg/gpgbin/gpgbin.go +++ b/lib/crypto/gpg/gpgbin/gpgbin.go @@ -11,6 +11,7 @@ import ( "strings" "git.sr.ht/~rjarry/aerc/lib/log" + "git.sr.ht/~rjarry/aerc/lib/pinentry" "git.sr.ht/~rjarry/aerc/models" ) @@ -30,6 +31,8 @@ func newGpg(stdin io.Reader, args []string) *gpg { g.cmd.Stdout = &g.stdout g.cmd.Stderr = &g.stderr + pinentry.SetCmdEnv(g.cmd) + return g } diff --git a/lib/crypto/gpg/reader.go b/lib/crypto/gpg/reader.go index 07553c97..77022962 100644 --- a/lib/crypto/gpg/reader.go +++ b/lib/crypto/gpg/reader.go @@ -12,6 +12,7 @@ import ( "strings" "git.sr.ht/~rjarry/aerc/lib/crypto/gpg/gpgbin" + "git.sr.ht/~rjarry/aerc/lib/pinentry" "git.sr.ht/~rjarry/aerc/models" "github.com/emersion/go-message/textproto" ) @@ -92,6 +93,9 @@ func newEncryptedReader(h textproto.Header, mr *textproto.MultipartReader) (*Rea return nil, fmt.Errorf("gpgmail: second part in multipart/encrypted message has type %q, not application/octet-stream", t) } + pinentry.Enable() + defer pinentry.Disable() + md, err := gpgbin.Decrypt(p) if err != nil { return nil, fmt.Errorf("gpgmail: failed to read PGP message: %w", err) diff --git a/lib/crypto/gpg/writer.go b/lib/crypto/gpg/writer.go index c879bc7f..9c12c6bb 100644 --- a/lib/crypto/gpg/writer.go +++ b/lib/crypto/gpg/writer.go @@ -11,6 +11,7 @@ import ( "net/mail" "git.sr.ht/~rjarry/aerc/lib/crypto/gpg/gpgbin" + "git.sr.ht/~rjarry/aerc/lib/pinentry" "github.com/emersion/go-message" "github.com/emersion/go-message/textproto" ) @@ -27,6 +28,9 @@ func (es *EncrypterSigner) Write(p []byte) (int, error) { } func (es *EncrypterSigner) Close() (err error) { + pinentry.Enable() + defer pinentry.Disable() + r := bytes.NewReader(es.msgBuf.Bytes()) enc, err := gpgbin.Encrypt(r, es.to, es.from) if err != nil { @@ -72,6 +76,9 @@ func (s *Signer) Close() (err error) { _ = textproto.WriteHeader(&buf, header.Header) _, _ = io.Copy(&buf, msg.Body) + pinentry.Enable() + defer pinentry.Disable() + sig, micalg, err := gpgbin.Sign(bytes.NewReader(buf.Bytes()), s.from) if err != nil { return err -- cgit