package zsig import ( "bufio" "bytes" "encoding/hex" "fmt" "io" "strconv" "strings" "time" ) type ZHeader struct { Date time.Time KeyFile string Alg string BlockSize int Sums [][]byte } 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 ParseBytes(data []byte) (ZHeader, error) { r := bytes.NewReader(data) return Parse(r) } 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() }