aboutsummaryrefslogtreecommitdiff
path: root/sig.go
diff options
context:
space:
mode:
Diffstat (limited to 'sig.go')
-rw-r--r--sig.go55
1 files changed, 55 insertions, 0 deletions
diff --git a/sig.go b/sig.go
new file mode 100644
index 0000000..ac7bc73
--- /dev/null
+++ b/sig.go
@@ -0,0 +1,55 @@
+package main
+
+import (
+ "fmt"
+ "io/ioutil"
+
+ "dim13.org/signify/ask"
+ "dim13.org/signify/file"
+ "dim13.org/signify/key"
+)
+
+func Sign(msgFile, encFile string, embed bool) error {
+ encKey, err := OpenEnc(encFile)
+ if err != nil {
+ return err
+ }
+ body, err := ioutil.ReadFile(msgFile)
+ if err != nil {
+ return err
+ }
+ sig := encKey.Sign(body)
+ sigRaw, err := key.Marshal(sig)
+ if err != nil {
+ return err
+ }
+ block := &file.Block{
+ Comment: fmt.Sprintf("verify with %s", file.PubName(encFile)),
+ Bytes: sigRaw,
+ }
+ if embed {
+ block.Message = body
+ }
+ if err := file.EncodeFile(msgFile+".sig", file.SigMode, block); err != nil {
+ return err
+ }
+ return nil
+}
+
+func OpenEnc(fname string) (*key.Enc, error) {
+ block, err := file.DecodeFile(fname)
+ if err != nil {
+ return nil, err
+ }
+ encKey := new(key.Enc)
+ if err := key.Unmarshal(block.Bytes, encKey); err != nil {
+ return nil, err
+ }
+ if err := Kdf(encKey, ask.Password); err != nil {
+ return nil, err
+ }
+ if err := encKey.Check(); err != nil {
+ return nil, err
+ }
+ return encKey, nil
+}