From db1754452806598545038fb78deae6788cae2af8 Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Sat, 25 Sep 2021 23:49:40 +0300 Subject: [PATCH] BLAKE2b-256-aware -fsck --- integrity.go | 80 +++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 58 insertions(+), 22 deletions(-) diff --git a/integrity.go b/integrity.go index 1e0dddd..84011fe 100644 --- a/integrity.go +++ b/integrity.go @@ -18,25 +18,61 @@ along with this program. If not, see . package main import ( + "bufio" "bytes" "crypto/sha256" "fmt" + "hash" + "io" "io/ioutil" "log" "os" "path/filepath" "strings" + + "golang.org/x/crypto/blake2b" ) +func checkFile( + pkgName, fn, fnHash, hasherName string, + hasher hash.Hash, digest []byte, +) bool { + expected, err := ioutil.ReadFile(fnHash) + if err != nil { + log.Fatal(err) + } + fd, err := os.Open(fn) + if err != nil { + if os.IsNotExist(err) { + return true + } + log.Fatal(err) + } + _, err = io.Copy(hasher, bufio.NewReader(fd)) + fd.Close() + if err != nil { + log.Fatal(err) + } + isEqual := bytes.Compare(hasher.Sum(digest[:0]), expected) == 0 + hasher.Reset() + if isEqual { + fmt.Println("GOOD", hasherName, pkgName) + return true + } + fmt.Println("BAD", hasherName, pkgName) + return false +} + func goodIntegrity() bool { dirs, err := ioutil.ReadDir(*Root) if err != nil { log.Fatal(err) } - hasher := sha256.New() - digest := make([]byte, sha256.Size) + hasherSHA256 := sha256.New() + hasherBLAKE2b256 := blake2b256New() + digestSHA256 := make([]byte, sha256.Size) + digestBLAKE2b256 := make([]byte, blake2b.Size256) isGood := true - var data []byte var pkgName string for _, dir := range dirs { files, err := ioutil.ReadDir(filepath.Join(*Root, dir.Name())) @@ -44,29 +80,29 @@ func goodIntegrity() bool { log.Fatal(err) } for _, file := range files { - if !strings.HasSuffix(file.Name(), "."+HashAlgoSHA256) { + if strings.HasSuffix(file.Name(), "."+HashAlgoSHA256) { + pkgName = strings.TrimSuffix(file.Name(), "."+HashAlgoSHA256) + if !checkFile( + pkgName, + filepath.Join(*Root, dir.Name(), pkgName), + filepath.Join(*Root, dir.Name(), file.Name()), + "SHA256", hasherSHA256, digestSHA256, + ) { + isGood = false + } continue } - pkgName = strings.TrimSuffix(file.Name(), "."+HashAlgoSHA256) - data, err = ioutil.ReadFile(filepath.Join(*Root, dir.Name(), pkgName)) - if err != nil { - if os.IsNotExist(err) { - continue + if strings.HasSuffix(file.Name(), "."+HashAlgoBLAKE2b256) { + pkgName = strings.TrimSuffix(file.Name(), "."+HashAlgoBLAKE2b256) + if !checkFile( + pkgName, + filepath.Join(*Root, dir.Name(), pkgName), + filepath.Join(*Root, dir.Name(), file.Name()), + "BLAKE2b-256", hasherBLAKE2b256, digestBLAKE2b256, + ) { + isGood = false } - log.Fatal(err) - } - hasher.Write(data) - data, err = ioutil.ReadFile(filepath.Join(*Root, dir.Name(), file.Name())) - if err != nil { - log.Fatal(err) - } - if bytes.Compare(hasher.Sum(digest[:0]), data) == 0 { - fmt.Println("GOOD", pkgName) - } else { - isGood = false - fmt.Println("BAD", pkgName) } - hasher.Reset() } } return isGood -- 2.44.0