aboutsummaryrefslogtreecommitdiff
path: root/zsig/header.go
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-07-17 14:42:08 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-07-17 14:42:08 +0200
commita6ed0b51c8a04fbbc0bbf0aec4b0fdb20e52760d (patch)
tree7f02340f6629b575273fd4f02690792fe61810c2 /zsig/header.go
parent631d34ea85961e1b7a6eaa864ee2d91476cbe922 (diff)
Move
Diffstat (limited to 'zsig/header.go')
-rw-r--r--zsig/header.go71
1 files changed, 71 insertions, 0 deletions
diff --git a/zsig/header.go b/zsig/header.go
new file mode 100644
index 0000000..aa1c13b
--- /dev/null
+++ b/zsig/header.go
@@ -0,0 +1,71 @@
+package zsig
+
+import (
+ "bufio"
+ "encoding/hex"
+ "fmt"
+ "io"
+ "strconv"
+ "strings"
+ "time"
+)
+
+type ZHeader struct {
+ Date time.Time
+ KeyFile string
+ Alg string
+ BlockSize int
+ Sums [][]byte
+}
+
+const (
+ DefaultAlg = "SHA512/256"
+ DefaultBlockSize = 65536
+)
+
+func (h ZHeader) Print(w io.Writer) error {
+ fmt.Fprintf(w, "date=%v\n", h.Date.Format(time.RFC3339))
+ fmt.Fprintf(w, "key=%v\n", h.KeyFile)
+ fmt.Fprintf(w, "algorithm=%v\n", h.Alg)
+ fmt.Fprintf(w, "blocksize=%v\n\n", h.BlockSize)
+ for _, sum := range h.Sums {
+ fmt.Fprintf(w, "%x\n", sum)
+ }
+ return nil
+}
+
+func Parse(r io.Reader) (ZHeader, error) {
+ var h ZHeader
+ s := bufio.NewScanner(r)
+ for s.Scan() {
+ line := s.Text()
+ switch {
+ case strings.HasPrefix(line, "date="):
+ t, err := time.Parse(time.RFC3339, line[5:])
+ if err != nil {
+ return ZHeader{}, err
+ }
+ h.Date = t
+ case strings.HasPrefix(line, "key="):
+ h.KeyFile = line[4:]
+ case strings.HasPrefix(line, "algorithm="):
+ h.Alg = line[10:]
+ case strings.HasPrefix(line, "blocksize="):
+ i, err := strconv.Atoi(line[10:])
+ if err != nil {
+ return ZHeader{}, err
+ }
+ h.BlockSize = i
+ case line == "":
+ for s.Scan() {
+ line = s.Text()
+ sum, err := hex.DecodeString(line)
+ if err != nil {
+ return ZHeader{}, err
+ }
+ h.Sums = append(h.Sums, sum)
+ }
+ }
+ }
+ return h, s.Err()
+}