aboutsummaryrefslogtreecommitdiff
path: root/files.go
diff options
context:
space:
mode:
Diffstat (limited to 'files.go')
-rw-r--r--files.go76
1 files changed, 76 insertions, 0 deletions
diff --git a/files.go b/files.go
new file mode 100644
index 0000000..f1a432d
--- /dev/null
+++ b/files.go
@@ -0,0 +1,76 @@
+package main
+
+import (
+ "os"
+
+ "dim13.org/signify/ask"
+ "dim13.org/signify/b64file"
+ "dim13.org/signify/key"
+)
+
+const (
+ ModeSec os.FileMode = 0600
+ ModePub os.FileMode = 0644
+ ModeSig os.FileMode = 0644
+)
+
+func Open(fname string) (*os.File, error) {
+ return os.OpenFile(fname, os.O_RDONLY, 0)
+}
+
+func Create(fname string, perm os.FileMode) (*os.File, error) {
+ return os.OpenFile(fname, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
+}
+
+func openSec(fname string) (*key.Sec, error) {
+ sec := new(key.Sec)
+ fd, err := Open(fname)
+ if err != nil {
+ return nil, err
+ }
+ defer fd.Close()
+ if _, _, err := b64file.Decode(fd, sec); err != nil {
+ return nil, err
+ }
+ if err := sec.Crypt(ask.Passphrase{}); err != nil {
+ return nil, err
+ }
+ if err := sec.Validate(); err != nil {
+ return nil, err
+ }
+ return sec, nil
+}
+
+func openPub(fname string) (*key.Pub, error) {
+ pub := new(key.Pub)
+ fd, err := Open(fname)
+ if err != nil {
+ return nil, err
+ }
+ defer fd.Close()
+ if _, _, err := b64file.Decode(fd, pub); err != nil {
+ return nil, err
+ }
+ if err := pub.Validate(); err != nil {
+ return nil, err
+ }
+ return pub, nil
+}
+
+func openSig(fname string) (*key.Sig, []byte, string, error) {
+ sig := new(key.Sig)
+ fd, err := Open(fname)
+ if err != nil {
+ return nil, nil, "", err
+ }
+ defer fd.Close()
+ comment, msg, err := b64file.Decode(fd, sig)
+ if err != nil {
+ return nil, nil, "", err
+ }
+ if err := sig.Validate(); err != nil {
+ return nil, nil, "", err
+ }
+ pubKey := CommentPubFile(comment)
+ return sig, msg, pubKey, nil
+}