aboutsummaryrefslogtreecommitdiff
path: root/chksum
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-05-03 12:18:48 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-05-03 12:18:48 +0200
commit6dc80a803e91122a7b56b37276a257d51890be4f (patch)
treeeb9d32dd603dcbe4f2d95ebc3a2ebd1aa0cdd699 /chksum
parent5d57799242d4b6f280a92c3a523a08faf42e26e7 (diff)
checksum
Diffstat (limited to 'chksum')
-rw-r--r--chksum/chksum.go27
-rw-r--r--chksum/chksum_test.go10
-rw-r--r--chksum/testdata/SUM2
3 files changed, 31 insertions, 8 deletions
diff --git a/chksum/chksum.go b/chksum/chksum.go
index 6580edd..0931567 100644
--- a/chksum/chksum.go
+++ b/chksum/chksum.go
@@ -2,6 +2,7 @@ package chksum
import (
"bufio"
+ "bytes"
"crypto/md5"
"crypto/sha1"
"crypto/sha256"
@@ -9,6 +10,7 @@ import (
"encoding/hex"
"errors"
"hash"
+ "io"
"os"
"regexp"
)
@@ -41,7 +43,7 @@ func ParseFile(fname string) ([]Checksum, error) {
defer fd.Close()
var checklist []Checksum
- re := regexp.MustCompile(`(\w+) \(([^\)]+)\) = (\w+)`)
+ re := regexp.MustCompile(`(\w+) \(([^)]+)\) = (\w+)`)
scanner := bufio.NewScanner(fd)
for scanner.Scan() {
//var cs Checksum
@@ -49,21 +51,34 @@ func ParseFile(fname string) ([]Checksum, error) {
if len(r) != 4 {
return nil, errors.New("invalid content")
}
- h, err := hex.DecodeString(r[3])
+ h, ok := hashes[r[1]]
+ if !ok {
+ return nil, errors.New("unknown hash alg")
+ }
+ bytes, err := hex.DecodeString(r[3])
if err != nil {
return nil, err
}
cs := Checksum{
FileName: r[2],
Alg: r[1],
- Bytes: h,
- Hash: hashes[r[1]](),
+ Bytes: bytes,
+ Hash: h(),
}
checklist = append(checklist, cs)
}
return checklist, scanner.Err()
}
-func (c Checksum) Check() bool {
- return false
+func (c Checksum) Check() error {
+ fd, err := os.Open(c.FileName)
+ if err != nil {
+ return err
+ }
+ defer fd.Close()
+ io.Copy(c.Hash, fd)
+ if !bytes.Equal(c.Hash.Sum(nil), c.Bytes) {
+ return errors.New("hash mismatch")
+ }
+ return nil
}
diff --git a/chksum/chksum_test.go b/chksum/chksum_test.go
index 0364686..ebff6c1 100644
--- a/chksum/chksum_test.go
+++ b/chksum/chksum_test.go
@@ -10,7 +10,15 @@ func TestParseFile(t *testing.T) {
}
for _, tc := range testCases {
t.Run(tc.file, func(t *testing.T) {
- ParseFile(tc.file)
+ checkList, err := ParseFile(tc.file)
+ if err != nil {
+ t.Error(err)
+ }
+ for _, cs := range checkList {
+ if err := cs.Check(); err != nil {
+ t.Log(err)
+ }
+ }
})
}
}
diff --git a/chksum/testdata/SUM b/chksum/testdata/SUM
index fb4079a..b5ddca0 100644
--- a/chksum/testdata/SUM
+++ b/chksum/testdata/SUM
@@ -1 +1 @@
-MD5 (chksum.go) = 8027f44051361e49f45af17ea723c855
+MD5 (chksum.go) = 509551696ec317f7be76a03b13586218