crypt.go 721 B

12345678910111213141516171819202122232425262728293031323334353637
  1. package main
  2. import (
  3. "crypto/hmac"
  4. "crypto/sha256"
  5. "encoding/base64"
  6. "errors"
  7. )
  8. var (
  9. errInvalidToken = errors.New("Invalid token")
  10. errInvalidTokenEncoding = errors.New("Invalid token encoding")
  11. )
  12. func validatePath(token, path string) error {
  13. messageMAC, err := base64.RawURLEncoding.DecodeString(token)
  14. if err != nil {
  15. return errInvalidTokenEncoding
  16. }
  17. if !hmac.Equal(messageMAC, signatureFor(path)) {
  18. return errInvalidToken
  19. }
  20. return nil
  21. }
  22. func signatureFor(str string) []byte {
  23. mac := hmac.New(sha256.New, conf.Key)
  24. mac.Write(conf.Salt)
  25. mac.Write([]byte(str))
  26. expectedMAC := mac.Sum(nil)
  27. if conf.SignatureSize < 32 {
  28. return expectedMAC[:conf.SignatureSize]
  29. }
  30. return expectedMAC
  31. }