aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-07-23 23:35:38 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-07-23 23:35:38 +0200
commitd7395836f1604564e50de54955975f29c87953bf (patch)
treeaa783621786b73380054a2b5121fd78e113ac481
parenteb1ab0c1b5a1b427ab92b42944621ada896790b6 (diff)
Add SIZE hash
-rw-r--r--chksum/chksum.go22
-rw-r--r--chksum/chksum_test.go1
-rw-r--r--chksum/size.go50
-rw-r--r--chksum/testdata/1kbin0 -> 1024 bytes
-rw-r--r--chksum/testdata/SIZE2
5 files changed, 67 insertions, 8 deletions
diff --git a/chksum/chksum.go b/chksum/chksum.go
index c0691e6..1666c56 100644
--- a/chksum/chksum.go
+++ b/chksum/chksum.go
@@ -38,12 +38,18 @@ type Checksum struct {
type Checklist []Checksum
-var hashes = map[string]func() hash.Hash{
- "SHA512/256": sha512.New512_256,
- "SHA512": sha512.New,
- "SHA256": sha256.New,
- "SHA1": sha1.New,
- "MD5": md5.New,
+type hashDef struct {
+ hash func() hash.Hash
+ decode func(string) ([]byte, error)
+}
+
+var hashes = map[string]hashDef{
+ "SHA512/256": {sha512.New512_256, hex.DecodeString},
+ "SHA512": {sha512.New, hex.DecodeString},
+ "SHA256": {sha256.New, hex.DecodeString},
+ "SHA1": {sha1.New, hex.DecodeString},
+ "MD5": {md5.New, hex.DecodeString},
+ "SIZE": {NewSize, ParseSize},
}
func ParseFile(fname string) (Checklist, error) {
@@ -75,14 +81,14 @@ func parse(r io.Reader) (Checklist, error) {
log.Println(match)
return nil, ErrHashAlg
}
- bytes, err := hex.DecodeString(match[3])
+ bytes, err := hash.decode(match[3])
if err != nil {
return nil, err
}
cs := Checksum{
FileName: path.Clean(match[2]),
Bytes: bytes,
- Hash: hash(),
+ Hash: hash.hash(),
}
checklist = append(checklist, cs)
}
diff --git a/chksum/chksum_test.go b/chksum/chksum_test.go
index d51a5ae..e799738 100644
--- a/chksum/chksum_test.go
+++ b/chksum/chksum_test.go
@@ -12,6 +12,7 @@ func TestParseFile(t *testing.T) {
{"testdata/SHA512"},
{"testdata/SHA512256"},
{"testdata/mixed"},
+ {"testdata/SIZE"},
}
for _, tc := range testCases {
t.Run(tc.file, func(t *testing.T) {
diff --git a/chksum/size.go b/chksum/size.go
new file mode 100644
index 0000000..a89fb69
--- /dev/null
+++ b/chksum/size.go
@@ -0,0 +1,50 @@
+package chksum
+
+import (
+ "bytes"
+ "fmt"
+ "hash"
+ "strconv"
+)
+
+type digest struct {
+ size int
+}
+
+func (d *digest) Write(p []byte) (n int, err error) {
+ n = len(p)
+ d.size += n
+ return
+}
+
+func (d *digest) Sum(b []byte) []byte {
+ buf := new(bytes.Buffer)
+ fmt.Fprint(buf, d.size)
+ return append(b, buf.Bytes()...)
+}
+
+func (d *digest) Reset() {
+ d.size = 0
+}
+
+func (d *digest) Size() int {
+ return 1
+}
+
+func (d *digest) BlockSize() int {
+ return 1
+}
+
+func NewSize() hash.Hash {
+ return &digest{}
+}
+
+func ParseSize(s string) ([]byte, error) {
+ n, err := strconv.Atoi(s)
+ if err != nil {
+ return nil, err
+ }
+ buf := new(bytes.Buffer)
+ fmt.Fprint(buf, n)
+ return buf.Bytes(), nil
+}
diff --git a/chksum/testdata/1k b/chksum/testdata/1k
new file mode 100644
index 0000000..06d7405
--- /dev/null
+++ b/chksum/testdata/1k
Binary files differ
diff --git a/chksum/testdata/SIZE b/chksum/testdata/SIZE
new file mode 100644
index 0000000..06c14d0
--- /dev/null
+++ b/chksum/testdata/SIZE
@@ -0,0 +1,2 @@
+SIZE (testdata/empty) = 0
+SIZE (testdata/1k) = 1024