signature.go 967 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package security
  2. import (
  3. "crypto/hmac"
  4. "crypto/sha256"
  5. "encoding/base64"
  6. "github.com/imgproxy/imgproxy/v3/config"
  7. )
  8. func VerifySignature(signature, path string) error {
  9. if len(config.Keys) == 0 || len(config.Salts) == 0 {
  10. return nil
  11. }
  12. for _, s := range config.TrustedSignatures {
  13. if s == signature {
  14. return nil
  15. }
  16. }
  17. messageMAC, err := base64.RawURLEncoding.DecodeString(signature)
  18. if err != nil {
  19. return newSignatureError("Invalid signature encoding")
  20. }
  21. for i := 0; i < len(config.Keys); i++ {
  22. if hmac.Equal(messageMAC, signatureFor(path, config.Keys[i], config.Salts[i], config.SignatureSize)) {
  23. return nil
  24. }
  25. }
  26. return newSignatureError("Invalid signature")
  27. }
  28. func signatureFor(str string, key, salt []byte, signatureSize int) []byte {
  29. mac := hmac.New(sha256.New, key)
  30. mac.Write(salt)
  31. mac.Write([]byte(str))
  32. expectedMAC := mac.Sum(nil)
  33. if signatureSize < 32 {
  34. return expectedMAC[:signatureSize]
  35. }
  36. return expectedMAC
  37. }