http-signature_test.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package test
  2. import (
  3. "crypto"
  4. "crypto/rand"
  5. "crypto/rsa"
  6. "net/http"
  7. "testing"
  8. "time"
  9. "github.com/go-fed/httpsig"
  10. "github.com/ncarlier/webhookd/pkg/assert"
  11. "github.com/ncarlier/webhookd/pkg/middleware/signature"
  12. "github.com/ncarlier/webhookd/pkg/truststore"
  13. )
  14. func assertSigner(t *testing.T) httpsig.Signer {
  15. prefs := []httpsig.Algorithm{httpsig.RSA_SHA256}
  16. digestAlgorithm := httpsig.DigestSha256
  17. headers := []string{httpsig.RequestTarget, "date"}
  18. signer, _, err := httpsig.NewSigner(prefs, digestAlgorithm, headers, httpsig.Signature, 0)
  19. assert.Nil(t, err, "")
  20. return signer
  21. }
  22. func TestHTTPSignature(t *testing.T) {
  23. privkey, err := rsa.GenerateKey(rand.Reader, 2048)
  24. assert.Nil(t, err, "")
  25. pubkey := &privkey.PublicKey
  26. ts := &truststore.InMemoryTrustStore{
  27. Keys: map[string]crypto.PublicKey{
  28. "default": pubkey,
  29. },
  30. }
  31. signer := assertSigner(t)
  32. var body []byte
  33. req, err := http.NewRequest("GET", "/", http.NoBody)
  34. assert.Nil(t, err, "")
  35. req.Header.Add("date", time.Now().UTC().Format(http.TimeFormat))
  36. err = signer.SignRequest(privkey, "default", req, body)
  37. assert.Nil(t, err, "")
  38. err = signature.HTTPSignatureHandler(req, ts)
  39. assert.Nil(t, err, "")
  40. }