X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=integrity.go;h=84011fe23acafec4310d0d0892c281cdd1bd9967;hb=db1754452806598545038fb78deae6788cae2af8;hp=7ca0a0c07ce22de4649afbb12d08fcf0d3e10e83;hpb=cb0449b3d3da2498e360098694a556c882d454bd;p=gocheese.git diff --git a/integrity.go b/integrity.go index 7ca0a0c..84011fe 100644 --- a/integrity.go +++ b/integrity.go @@ -18,55 +18,91 @@ 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) + 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())) + files, err := ioutil.ReadDir(filepath.Join(*Root, dir.Name())) if err != nil { 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