From 0dde4c607250fa745c7bd84298a1ebeb7ad63430 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Wed, 26 Jul 2017 02:48:44 +0200 Subject: .. --- zsig/header.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'zsig/header.go') diff --git a/zsig/header.go b/zsig/header.go index 46f29ae..20d4db7 100644 --- a/zsig/header.go +++ b/zsig/header.go @@ -3,7 +3,9 @@ package zsig import ( "bufio" "bytes" + "crypto/sha512" "encoding/hex" + "errors" "fmt" "io" "strconv" @@ -11,6 +13,11 @@ import ( "time" ) +const ( + Alg = "SHA512/256" + BlockSize = 65536 +) + type ZHeader struct { Date time.Time KeyFile string @@ -70,3 +77,29 @@ func Parse(r io.Reader) (ZHeader, error) { } return h, s.Err() } + +func (z ZHeader) Verify(r io.Reader) error { + if z.Alg != Alg { + return errors.New("invalid hash algorithm") + } + h := sha512.New512_256() // from z.Alg + blockCount := len(z.Sums) + for _, sum := range z.Sums { + h.Reset() + n, err := io.CopyN(h, r, z.BlockSize) + if n == 0 && err == io.EOF { + break + } + if err != nil && err != io.EOF { + return err + } + if !bytes.Equal(sum, h.Sum(nil)) { + return errors.New("sum mismatch") + } + blockCount-- + } + if blockCount != 0 { + return errors.New("count mismatch") + } + return nil +} -- cgit v1.2.3