embeddedhash.go 1.5 KB

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