aboutsummaryrefslogtreecommitdiff
path: root/zsig
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-07-26 00:05:21 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-07-26 00:05:21 +0200
commitfaa7739dcde1a1a57df8991a193975eb52aa4df2 (patch)
treeab28199c455442c16c20adae01c183d3f2baad95 /zsig
parent15fe28c9af4a69d5fb5188c3cbeadae31a9c891f (diff)
...
Diffstat (limited to 'zsig')
-rw-r--r--zsig/header.go4
-rw-r--r--zsig/sum.go42
-rw-r--r--zsig/zsig_test.go35
3 files changed, 24 insertions, 57 deletions
diff --git a/zsig/header.go b/zsig/header.go
index c63a03b..46f29ae 100644
--- a/zsig/header.go
+++ b/zsig/header.go
@@ -15,7 +15,7 @@ type ZHeader struct {
Date time.Time
KeyFile string
Alg string
- BlockSize int
+ BlockSize int64
Sums [][]byte
}
@@ -52,7 +52,7 @@ func Parse(r io.Reader) (ZHeader, error) {
case strings.HasPrefix(line, "algorithm="):
h.Alg = line[10:]
case strings.HasPrefix(line, "blocksize="):
- i, err := strconv.Atoi(line[10:])
+ i, err := strconv.ParseInt(line[10:], 10, 64)
if err != nil {
return ZHeader{}, err
}
diff --git a/zsig/sum.go b/zsig/sum.go
index 778d1f2..5768b95 100644
--- a/zsig/sum.go
+++ b/zsig/sum.go
@@ -1,8 +1,11 @@
package zsig
import (
- "hash"
+ "bytes"
+ "crypto/sha512"
+ "errors"
"io"
+ "log"
)
const (
@@ -10,24 +13,23 @@ const (
BlockSize = 65536
)
-// Sum calculates SHA512/256
-func Sum(r io.Reader, blockSize int, h hash.Hash) chan []byte {
- c := make(chan []byte, 1)
- if blockSize == 0 {
- blockSize = BlockSize
- }
- go func() {
- defer close(c)
- buf := make([]byte, blockSize)
- for {
- n, err := io.ReadFull(r, buf)
- if err == io.EOF {
- return
- }
- h.Reset()
- h.Write(buf[:n])
- c <- h.Sum(nil)
+func (z ZHeader) Verify(r io.Reader) error {
+ h := sha512.New512_256() // from z.Alg
+ blockCount := len(z.Sums)
+ for _, sum := range z.Sums {
+ h.Reset()
+ _, err := io.CopyN(h, r, z.BlockSize)
+ if err != nil && err != io.EOF {
+ return err
+ }
+ if !bytes.Equal(sum, h.Sum(nil)) {
+ return errors.New("sum mismatch")
}
- }()
- return c
+ blockCount--
+ }
+ if blockCount != 0 {
+ log.Println(blockCount)
+ return errors.New("len mismatch")
+ }
+ return nil
}
diff --git a/zsig/zsig_test.go b/zsig/zsig_test.go
deleted file mode 100644
index b226c15..0000000
--- a/zsig/zsig_test.go
+++ /dev/null
@@ -1,35 +0,0 @@
-package zsig
-
-import (
- "crypto/sha512"
- "os"
- "path"
- "testing"
-)
-
-func TestZsig(t *testing.T) {
- testCases := []string{
- "rand.gz.sig",
- }
- for _, tc := range testCases {
- t.Run(tc, func(t *testing.T) {
- fname := path.Join("testdata", tc)
- fd, err := os.Open(fname)
- if err != nil {
- t.Fatal(err)
- }
- defer fd.Close()
-
- z, err := NewReader(fd)
- if err != nil {
- t.Error(err)
- }
- t.Log(z.header)
-
- h := sha512.New512_256()
- for block := range Sum(z, BlockSize, h) {
- t.Logf("%x", block)
- }
- })
- }
-}