]> Cypherpunks.ru repositories - gocheese.git/commitdiff
BLAKE2b-256-aware -fsck
authorSergey Matveev <stargrave@stargrave.org>
Sat, 25 Sep 2021 20:49:40 +0000 (23:49 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Sun, 26 Sep 2021 17:15:43 +0000 (20:15 +0300)
integrity.go

index 1e0dddde15c86657d48e26d5f3e9aa928765b851..84011fe23acafec4310d0d0892c281cdd1bd9967 100644 (file)
@@ -18,25 +18,61 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 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