summaryrefslogtreecommitdiff
path: root/lib/crypto/pgp/pgp.go
diff options
context:
space:
mode:
Diffstat (limited to 'lib/crypto/pgp/pgp.go')
-rw-r--r--lib/crypto/pgp/pgp.go34
1 files changed, 34 insertions, 0 deletions
diff --git a/lib/crypto/pgp/pgp.go b/lib/crypto/pgp/pgp.go
index f0f3f65..4dbe37c 100644
--- a/lib/crypto/pgp/pgp.go
+++ b/lib/crypto/pgp/pgp.go
@@ -13,6 +13,7 @@ import (
"git.sr.ht/~rjarry/aerc/models"
"github.com/ProtonMail/go-crypto/openpgp"
+ "github.com/ProtonMail/go-crypto/openpgp/armor"
"github.com/ProtonMail/go-crypto/openpgp/packet"
"github.com/emersion/go-message/mail"
"github.com/emersion/go-pgpmail"
@@ -271,6 +272,39 @@ func (m *Mail) GetKeyId(s string) (string, error) {
return entity.PrimaryKey.KeyIdString(), nil
}
+func (m *Mail) ExportKey(k string) (io.Reader, error) {
+ var err error
+ var entity *openpgp.Entity
+ switch strings.Contains(k, "@") {
+ case true:
+ entity, err = m.getSignerEntityByEmail(k)
+ if err != nil {
+ return nil, err
+ }
+ case false:
+ entity, err = m.getSignerEntityByKeyId(k)
+ if err != nil {
+ return nil, err
+ }
+ }
+ pks := bytes.NewBuffer(nil)
+ err = entity.Serialize(pks)
+ if err != nil {
+ return nil, fmt.Errorf("pgp: error exporting key: %v", err)
+ }
+ pka := bytes.NewBuffer(nil)
+ w, err := armor.Encode(pka, "PGP PUBLIC KEY BLOCK", map[string]string{})
+ if err != nil {
+ return nil, fmt.Errorf("pgp: error exporting key: %v", err)
+ }
+ w.Write(pks.Bytes())
+ if err != nil {
+ return nil, fmt.Errorf("pgp: error exporting key: %v", err)
+ }
+ w.Close()
+ return pka, nil
+}
+
func handleSignatureError(e string) models.SignatureValidity {
if e == "openpgp: signature made by unknown entity" {
return models.UnknownEntity