embeddedhash.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package securedload
  2. import (
  3. "bytes"
  4. "crypto/sha256"
  5. "encoding/hex"
  6. "strings"
  7. "github.com/v2fly/VSign/insmgr"
  8. "github.com/v2fly/VSign/signerVerify"
  9. "github.com/v2fly/v2ray-core/v4/common/platform"
  10. "github.com/v2fly/v2ray-core/v4/common/platform/filesystem"
  11. )
  12. type EmbeddedHashProtectedLoader struct {
  13. checkedFile map[string]string
  14. }
  15. func (e EmbeddedHashProtectedLoader) VerifyAndLoad(filename string) ([]byte, error) {
  16. filecontent, err := filesystem.ReadFile(platform.GetAssetLocation(filename))
  17. if err != nil {
  18. return nil, newError("Cannot find file", filename).Base(err)
  19. }
  20. fileHash := sha256.Sum256(filecontent)
  21. fileHashAsString := hex.EncodeToString(fileHash[:])
  22. if filenameverified, ok := e.checkedFile[fileHashAsString]; ok {
  23. for _, filenameVerifiedIndividual := range strings.Split(filenameverified, ";") {
  24. if strings.HasSuffix(filenameVerifiedIndividual, filename) {
  25. return filecontent, nil
  26. }
  27. }
  28. }
  29. return nil, newError("Unrecognized file at ", filename, " can not be loaded for execution")
  30. }
  31. func NewEmbeddedHashProtectedLoader() *EmbeddedHashProtectedLoader {
  32. instructions := insmgr.ReadAllIns(bytes.NewReader([]byte(allowedHashes)))
  33. checkedFile, _, ok := signerVerify.CheckAsClient(instructions, "v2fly", true)
  34. if !ok {
  35. panic("Embedded Hash data is invalid")
  36. }
  37. return &EmbeddedHashProtectedLoader{checkedFile: checkedFile}
  38. }
  39. func init() {
  40. RegisterProtectedLoader("embedded", NewEmbeddedHashProtectedLoader())
  41. }