serverlist_signature_test.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package pia
  2. import (
  3. "crypto"
  4. "crypto/rand"
  5. "crypto/rsa"
  6. "crypto/sha256"
  7. "crypto/x509"
  8. "encoding/base64"
  9. "encoding/pem"
  10. "os"
  11. "path/filepath"
  12. "testing"
  13. )
  14. func TestVerifySignedServerList(t *testing.T) {
  15. payload := []byte(`{"version":6,"groups":{},"regions":[]}`)
  16. privateKey, err := rsa.GenerateKey(rand.Reader, 2048)
  17. if err != nil {
  18. t.Fatal(err)
  19. }
  20. digest := sha256.Sum256(payload)
  21. signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, digest[:])
  22. if err != nil {
  23. t.Fatal(err)
  24. }
  25. publicDER, err := x509.MarshalPKIXPublicKey(&privateKey.PublicKey)
  26. if err != nil {
  27. t.Fatal(err)
  28. }
  29. publicPEM := pem.EncodeToMemory(&pem.Block{Type: "PUBLIC KEY", Bytes: publicDER})
  30. signed := append(append(append([]byte{}, payload...), '\n', '\n'), []byte(base64.StdEncoding.EncodeToString(signature))...)
  31. validSigned := append([]byte(nil), signed...)
  32. verified, err := VerifySignedServerList(signed, publicPEM)
  33. if err != nil {
  34. t.Fatal(err)
  35. }
  36. if string(verified) != string(payload) {
  37. t.Fatalf("verified payload changed: %s", verified)
  38. }
  39. signed[10] ^= 1
  40. if _, err := VerifySignedServerList(signed, publicPEM); err == nil {
  41. t.Fatal("expected tampered payload to fail signature verification")
  42. }
  43. for name, input := range map[string][]byte{
  44. "missing signature": payload,
  45. "invalid base64": append(append([]byte{}, payload...), []byte("\nnot-base64!")...),
  46. "trailing garbage": append(append([]byte{}, validSigned...), []byte("\nextra")...),
  47. } {
  48. t.Run(name, func(t *testing.T) {
  49. if _, err := VerifySignedServerList(input, publicPEM); err == nil {
  50. t.Fatal("expected malformed signed response to be rejected")
  51. }
  52. })
  53. }
  54. fixture, err := os.ReadFile(filepath.Join("testdata", "serverlist", "invalid_signature.txt"))
  55. if err != nil {
  56. t.Fatal(err)
  57. }
  58. if _, err := VerifySignedServerList(fixture, publicPEM); err == nil {
  59. t.Fatal("expected invalid-signature fixture to be rejected")
  60. }
  61. }