From 6dc80a803e91122a7b56b37276a257d51890be4f Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Wed, 3 May 2017 12:18:48 +0200 Subject: checksum --- chksum/chksum.go | 27 +++++++++++++++++++++------ chksum/chksum_test.go | 10 +++++++++- chksum/testdata/SUM | 2 +- 3 files changed, 31 insertions(+), 8 deletions(-) (limited to 'chksum') 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 -- cgit v1.2.3