From f3158b36f1f210ff54febbe82b571c1379b30c98 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Tue, 3 Mar 2020 16:20:07 -0500 Subject: Initial support for PGP decryption & signatures --- lib/keystore.go | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 lib/keystore.go (limited to 'lib/keystore.go') diff --git a/lib/keystore.go b/lib/keystore.go new file mode 100644 index 0000000..dcdbd74 --- /dev/null +++ b/lib/keystore.go @@ -0,0 +1,81 @@ +package lib + +import ( + "io" + "os" + "path" + + "github.com/kyoh86/xdg" + "golang.org/x/crypto/openpgp" + "golang.org/x/crypto/openpgp/packet" +) + +var ( + Keyring openpgp.EntityList + + locked bool +) + +func InitKeyring() { + os.MkdirAll(path.Join(xdg.DataHome(), "aerc"), 0700) + + lockpath := path.Join(xdg.DataHome(), "aerc", "keyring.lock") + lockfile, err := os.OpenFile(lockpath, os.O_CREATE|os.O_EXCL, 0600) + if err != nil { + // TODO: Consider connecting to main process over IPC socket + locked = false + } else { + locked = true + lockfile.Close() + } + + keypath := path.Join(xdg.DataHome(), "aerc", "keyring.asc") + keyfile, err := os.Open(keypath) + if os.IsNotExist(err) { + return + } else if err != nil { + panic(err) + } + defer keyfile.Close() + + Keyring, err = openpgp.ReadKeyRing(keyfile) + if err != nil { + panic(err) + } +} + +func UnlockKeyring() { + if !locked { + return + } + lockpath := path.Join(xdg.DataHome(), "aerc", "keyring.lock") + os.Remove(lockpath) +} + +func ImportKeys(r io.Reader) error { + keys, err := openpgp.ReadKeyRing(r) + if err != nil { + return err + } + Keyring = append(Keyring, keys...) + if locked { + keypath := path.Join(xdg.DataHome(), "aerc", "keyring.asc") + keyfile, err := os.OpenFile(keypath, os.O_CREATE|os.O_APPEND, 0600) + if err != nil { + return err + } + defer keyfile.Close() + + for _, key := range keys { + if key.PrivateKey != nil { + err = key.SerializePrivate(keyfile, &packet.Config{}) + } else { + err = key.Serialize(keyfile) + } + if err != nil { + return err + } + } + } + return nil +} -- cgit 1.4.1-2-gfad0