X-Git-Url: http://www.git.cypherpunks.ru/?p=gocheese.git;a=blobdiff_plain;f=integrity.go;h=84011fe23acafec4310d0d0892c281cdd1bd9967;hp=1e0dddde15c86657d48e26d5f3e9aa928765b851;hb=db1754452806598545038fb78deae6788cae2af8;hpb=5ea9543f13b71465be7677c5b227583a821195d9 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