ed5519-signature_test.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package test
  2. import (
  3. "bytes"
  4. "crypto"
  5. "crypto/ed25519"
  6. "crypto/rand"
  7. "encoding/hex"
  8. "net/http"
  9. "strconv"
  10. "testing"
  11. "time"
  12. "github.com/ncarlier/webhookd/pkg/assert"
  13. "github.com/ncarlier/webhookd/pkg/middleware/signature"
  14. "github.com/ncarlier/webhookd/pkg/truststore"
  15. )
  16. func TestEd5519Signature(t *testing.T) {
  17. pubkey, privkey, err := ed25519.GenerateKey(rand.Reader)
  18. assert.Nil(t, err, "")
  19. ts := &truststore.InMemoryTrustStore{
  20. Keys: map[string]crypto.PublicKey{
  21. "default": pubkey,
  22. },
  23. }
  24. body := "this is a test"
  25. req, err := http.NewRequest("POST", "/", bytes.NewBufferString(body))
  26. assert.Nil(t, err, "")
  27. now := time.Now()
  28. timestamp := strconv.FormatInt(now.Unix(), 10)
  29. var msg bytes.Buffer
  30. msg.WriteString(timestamp)
  31. msg.WriteString(body)
  32. s := ed25519.Sign(privkey, msg.Bytes())
  33. req.Header.Set("X-Signature-Ed25519", hex.EncodeToString(s[:ed25519.SignatureSize]))
  34. req.Header.Set("X-Signature-Timestamp", timestamp)
  35. req.Header.Add("date", now.UTC().Format(http.TimeFormat))
  36. req.Header.Set("Content-Type", "text/plain")
  37. err = signature.Ed25519SignatureHandler(req, ts)
  38. assert.Nil(t, err, "")
  39. }