X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=integrity.go;h=ac7500e7c656bdd27da062aea16bb1c96d3fe5d1;hb=f077359218864862f94290b582cb09a4a8fa1b9c;hp=f6f39e6d5749baff977e93cfa5460cb7c4be7ec3;hpb=d9767ae738045ebf1bd483ae708af80fa384ca9f;p=gocheese.git diff --git a/integrity.go b/integrity.go index f6f39e6..ac7500e 100644 --- a/integrity.go +++ b/integrity.go @@ -1,6 +1,6 @@ /* GoCheese -- Python private package repository and caching proxy -Copyright (C) 2019-2020 Sergey Matveev +Copyright (C) 2019-2021 Sergey Matveev This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -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