wireguard_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package wireguard
  2. import (
  3. "encoding/base64"
  4. "encoding/hex"
  5. "strings"
  6. "testing"
  7. )
  8. func TestGenerateWireguardKeypairRoundTrip(t *testing.T) {
  9. priv, pub, err := GenerateWireguardKeypair()
  10. if err != nil {
  11. t.Fatalf("GenerateWireguardKeypair: %v", err)
  12. }
  13. for name, key := range map[string]string{"private": priv, "public": pub} {
  14. raw, err := base64.StdEncoding.DecodeString(key)
  15. if err != nil {
  16. t.Fatalf("%s key not base64: %v", name, err)
  17. }
  18. if len(raw) != 32 {
  19. t.Fatalf("%s key decodes to %d bytes, want 32", name, len(raw))
  20. }
  21. }
  22. derived, err := PublicKeyFromPrivate(priv)
  23. if err != nil {
  24. t.Fatalf("PublicKeyFromPrivate: %v", err)
  25. }
  26. if derived != pub {
  27. t.Fatalf("PublicKeyFromPrivate(priv) = %q, want %q", derived, pub)
  28. }
  29. }
  30. func TestPublicKeyFromPrivateKnownVector(t *testing.T) {
  31. privHex := "77076d0a7318a57d3c16c17251b26645df4c2f87ebc0992ab177fba51db92c2a"
  32. wantPubHex := "8520f0098930a754748b7ddcb43ef75a0dbf3a0d26381af4eba4a98eaa9b4e6a"
  33. privBytes, err := hex.DecodeString(privHex)
  34. if err != nil {
  35. t.Fatalf("decode priv vector: %v", err)
  36. }
  37. pubB64, err := PublicKeyFromPrivate(base64.StdEncoding.EncodeToString(privBytes))
  38. if err != nil {
  39. t.Fatalf("PublicKeyFromPrivate: %v", err)
  40. }
  41. gotPubHex, err := KeyToHex(pubB64)
  42. if err != nil {
  43. t.Fatalf("KeyToHex: %v", err)
  44. }
  45. if gotPubHex != wantPubHex {
  46. t.Fatalf("derived public key hex = %q, want %q", gotPubHex, wantPubHex)
  47. }
  48. }
  49. func TestKeyToHex(t *testing.T) {
  50. low := make([]byte, 32)
  51. for i := range low {
  52. low[i] = byte(i)
  53. }
  54. high := make([]byte, 32)
  55. for i := range high {
  56. high[i] = 0xff
  57. }
  58. for _, raw := range [][]byte{low, high} {
  59. wantHex := hex.EncodeToString(raw)
  60. std := base64.StdEncoding.EncodeToString(raw)
  61. url := base64.URLEncoding.EncodeToString(raw)
  62. padless := strings.TrimRight(std, "=")
  63. for label, in := range map[string]string{"std": std, "url": url, "padless": padless, "hex": wantHex} {
  64. got, err := KeyToHex(in)
  65. if err != nil {
  66. t.Fatalf("KeyToHex(%s=%q): %v", label, in, err)
  67. }
  68. if got != wantHex {
  69. t.Fatalf("KeyToHex(%s) = %q, want %q", label, got, wantHex)
  70. }
  71. if back, err := hex.DecodeString(got); err != nil || len(back) != 32 {
  72. t.Fatalf("KeyToHex output not a 32-byte hex key: err=%v len=%d", err, len(back))
  73. }
  74. }
  75. }
  76. }
  77. func TestKeyToHexEmpty(t *testing.T) {
  78. got, err := KeyToHex("")
  79. if err != nil {
  80. t.Fatalf("KeyToHex(\"\"): %v", err)
  81. }
  82. if got != "" {
  83. t.Fatalf("KeyToHex(\"\") = %q, want empty", got)
  84. }
  85. }
  86. func TestKeyToHexRejectsBadInput(t *testing.T) {
  87. cases := map[string]string{
  88. "not base64": "this is not base64 @@@@",
  89. "wrong length": base64.StdEncoding.EncodeToString(make([]byte, 16)),
  90. }
  91. for name, in := range cases {
  92. if _, err := KeyToHex(in); err == nil {
  93. t.Fatalf("KeyToHex(%s=%q) expected error, got nil", name, in)
  94. }
  95. }
  96. }
  97. func TestGenerateWireguardPSK(t *testing.T) {
  98. a, err := GenerateWireguardPSK()
  99. if err != nil {
  100. t.Fatalf("GenerateWireguardPSK: %v", err)
  101. }
  102. b, err := GenerateWireguardPSK()
  103. if err != nil {
  104. t.Fatalf("GenerateWireguardPSK: %v", err)
  105. }
  106. if a == b {
  107. t.Fatalf("two PSKs are identical: %q", a)
  108. }
  109. raw, err := base64.StdEncoding.DecodeString(a)
  110. if err != nil || len(raw) != 32 {
  111. t.Fatalf("PSK not a 32-byte base64 key: err=%v len=%d", err, len(raw))
  112. }
  113. }