aboutsummaryrefslogtreecommitdiff
path: root/ver.go
diff options
context:
space:
mode:
Diffstat (limited to 'ver.go')
-rw-r--r--ver.go64
1 files changed, 64 insertions, 0 deletions
diff --git a/ver.go b/ver.go
new file mode 100644
index 0000000..3de37b2
--- /dev/null
+++ b/ver.go
@@ -0,0 +1,64 @@
+package main
+
+import (
+ "fmt"
+ "io/ioutil"
+
+ "dim13.org/signify/file"
+ "dim13.org/signify/key"
+)
+
+func Verify(msgFile, pubFile string, quiet bool) error {
+ pubKey, err := OpenPub(pubFile)
+ if err != nil {
+ return err
+ }
+ sig, body, err := OpenSig(msgFile)
+ if err != nil {
+ return err
+ }
+ if err := pubKey.Verify(body, sig); err != nil {
+ return err
+ }
+ if !quiet {
+ fmt.Println("Signature Verfied")
+ }
+ return nil
+}
+
+func OpenPub(fname string) (*key.Pub, error) {
+ block, err := file.DecodeFile(fname)
+ if err != nil {
+ return nil, err
+ }
+ pubKey := new(key.Pub)
+ if err := key.Unmarshal(block.Bytes, pubKey); err != nil {
+ return nil, err
+ }
+ if err := pubKey.Check(); err != nil {
+ return nil, err
+ }
+ return pubKey, nil
+}
+
+func OpenSig(fname string) (*key.Sig, []byte, error) {
+ block, err := file.DecodeFile(fname + ".sig")
+ if err != nil {
+ return nil, nil, err
+ }
+ sig := new(key.Sig)
+ if err := key.Unmarshal(block.Bytes, sig); err != nil {
+ return nil, nil, err
+ }
+ if err := sig.Check(); err != nil {
+ return nil, nil, err
+ }
+ if len(block.Message) > 0 {
+ return sig, block.Message, nil
+ }
+ msg, err := ioutil.ReadFile(fname)
+ if err != nil {
+ return nil, nil, err
+ }
+ return sig, msg, nil
+}