checksum.go 898 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package decoder
  2. import (
  3. "crypto/sha256"
  4. "encoding/hex"
  5. "path"
  6. "slices"
  7. )
  8. func CalculateChecksum(plugin PluginDecoder) (string, error) {
  9. m := map[string][]byte{}
  10. sha256 := func(data []byte) []byte {
  11. sha := sha256.New()
  12. sha.Write(data)
  13. return sha.Sum(nil)
  14. }
  15. if err := plugin.Walk(func(filename string, dir string) error {
  16. var err error
  17. content, err := plugin.ReadFile(path.Join(dir, filename))
  18. if err != nil {
  19. return err
  20. }
  21. m[path.Join(dir, filename)] = sha256(content)
  22. return nil
  23. }); err != nil {
  24. return "", err
  25. }
  26. // sort the keys, ensure the order is consistent
  27. keys := make([]string, 0, len(m))
  28. for k := range m {
  29. keys = append(keys, k)
  30. }
  31. slices.Sort(keys)
  32. data := make([]byte, 0, len(m)*(32+32))
  33. for _, k := range keys {
  34. data = append(data, sha256([]byte(k))...)
  35. data = append(data, m[k]...)
  36. }
  37. return hex.EncodeToString(sha256(data)), nil
  38. }