verify.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package signature
  2. import (
  3. "crypto/rsa"
  4. "os"
  5. "github.com/langgenius/dify-plugin-daemon/internal/utils/encryption"
  6. "github.com/langgenius/dify-plugin-daemon/internal/utils/log"
  7. "github.com/langgenius/dify-plugin-daemon/pkg/plugin_packager/decoder"
  8. )
  9. func Verify(difypkgPath string, publicKeyPath string) error {
  10. // read the plugin
  11. plugin, err := os.ReadFile(difypkgPath)
  12. if err != nil {
  13. log.Error("Failed to read plugin file: %v", err)
  14. return err
  15. }
  16. decoderInstance, err := decoder.NewZipPluginDecoder(plugin)
  17. if err != nil {
  18. log.Error("Failed to create plugin decoder, plugin path: %s, error: %v", difypkgPath, err)
  19. return err
  20. }
  21. if publicKeyPath == "" {
  22. // verify the plugin with the official (bundled) public key
  23. err = decoder.VerifyPlugin(decoderInstance)
  24. if err != nil {
  25. log.Error("Failed to verify plugin with official public key: %v", err)
  26. return err
  27. }
  28. } else {
  29. // read the public key
  30. publicKeyBytes, err := os.ReadFile(publicKeyPath)
  31. if err != nil {
  32. log.Error("Failed to read public key file: %v", err)
  33. return err
  34. }
  35. publicKey, err := encryption.LoadPublicKey(publicKeyBytes)
  36. if err != nil {
  37. log.Error("Failed to load public key: %v", err)
  38. return err
  39. }
  40. // verify the plugin
  41. err = decoder.VerifyPluginWithPublicKeys(decoderInstance, []*rsa.PublicKey{publicKey})
  42. if err != nil {
  43. log.Error("Failed to verify plugin with provided public key: %v", err)
  44. return err
  45. }
  46. }
  47. log.Info("Plugin verified successfully")
  48. return nil
  49. }