mirror of
https://github.com/henrygd/beszel.git
synced 2026-08-17 12:46:22 +00:00
44 lines
1.1 KiB
Go
44 lines
1.1 KiB
Go
package ghupdate
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/sha256"
|
|
"encoding/hex"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
func verifyAssetChecksum(path, digest string) error {
|
|
algorithm, expectedHex, ok := strings.Cut(digest, ":")
|
|
if !ok || algorithm == "" || expectedHex == "" {
|
|
return fmt.Errorf("invalid release digest %q", digest)
|
|
}
|
|
if !strings.EqualFold(algorithm, "sha256") {
|
|
return fmt.Errorf("unsupported release digest algorithm %q", algorithm)
|
|
}
|
|
|
|
expected, err := hex.DecodeString(expectedHex)
|
|
if err != nil || len(expected) != sha256.Size {
|
|
return fmt.Errorf("invalid SHA-256 release digest %q", digest)
|
|
}
|
|
|
|
file, err := os.Open(path)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to open release for checksum verification: %w", err)
|
|
}
|
|
defer file.Close()
|
|
|
|
hash := sha256.New()
|
|
if _, err := io.Copy(hash, file); err != nil {
|
|
return fmt.Errorf("failed to calculate release checksum: %w", err)
|
|
}
|
|
actual := hash.Sum(nil)
|
|
if !bytes.Equal(actual, expected) {
|
|
return fmt.Errorf("release checksum mismatch: expected %s, got %s", expectedHex, hex.EncodeToString(actual))
|
|
}
|
|
|
|
return nil
|
|
}
|