/*
GoCheese -- Python private package repository and caching proxy
-Copyright (C) 2019-2021 Sergey Matveev <stargrave@stargrave.org>
+Copyright (C) 2019-2022 Sergey Matveev <stargrave@stargrave.org>
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
package main
import (
+ "bufio"
"bytes"
"crypto/sha256"
"fmt"
- "io/ioutil"
+ "hash"
+ "io"
"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 := os.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 := os.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 := os.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