aboutsummaryrefslogtreecommitdiff
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
parent15fe28c9af4a69d5fb5188c3cbeadae31a9c891f (diff)
...
-rw-r--r--verify.go17
-rw-r--r--zsig/header.go4
-rw-r--r--zsig/sum.go42
-rw-r--r--zsig/zsig_test.go35
4 files changed, 25 insertions, 73 deletions
diff --git a/verify.go b/verify.go
index 2c62241..3d445d3 100644
--- a/verify.go
+++ b/verify.go
@@ -1,9 +1,6 @@
package main
import (
- "bytes"
- "crypto/sha512"
- "errors"
"flag"
"fmt"
"io/ioutil"
@@ -128,19 +125,7 @@ func verifyGzip(pubFile, msgFile string) error {
return err
}
- if zhead.Alg != "SHA512/256" {
- return errors.New("whatever alg")
- }
-
- sumch := zsig.Sum(z, zhead.BlockSize, sha512.New512_256())
- for _, sum := range zhead.Sums {
- s := <-sumch
- if !bytes.Equal(sum, s) {
- return errors.New("don't match")
- }
- }
-
- return nil
+ return zhead.Verify(z)
}
func openPub(fname string) (*key.Pub, error) {
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)
- }
- })
- }
-}