aboutsummaryrefslogtreecommitdiff
path: root/wgcfg/config.go
diff options
context:
space:
mode:
Diffstat (limited to 'wgcfg/config.go')
-rw-r--r--wgcfg/config.go78
1 files changed, 78 insertions, 0 deletions
diff --git a/wgcfg/config.go b/wgcfg/config.go
new file mode 100644
index 0000000..2b5e714
--- /dev/null
+++ b/wgcfg/config.go
@@ -0,0 +1,78 @@
+/* SPDX-License-Identifier: MIT
+ *
+ * Copyright (C) 2019 WireGuard LLC. All Rights Reserved.
+ */
+
+// Package wgcfg has types and a parser for representing WireGuard config.
+package wgcfg
+
+import (
+ "fmt"
+ "strings"
+)
+
+// Config is a wireguard configuration.
+type Config struct {
+ Name string
+ PrivateKey PrivateKey
+ Addresses []CIDR
+ ListenPort uint16
+ MTU uint16
+ DNS []IP
+ Peers []Peer
+}
+
+type Peer struct {
+ PublicKey Key
+ PresharedKey SymmetricKey
+ AllowedIPs []CIDR
+ Endpoints []Endpoint
+ PersistentKeepalive uint16
+}
+
+type Endpoint struct {
+ Host string
+ Port uint16
+}
+
+func (e *Endpoint) String() string {
+ if strings.IndexByte(e.Host, ':') > 0 {
+ return fmt.Sprintf("[%s]:%d", e.Host, e.Port)
+ }
+ return fmt.Sprintf("%s:%d", e.Host, e.Port)
+}
+
+func (e *Endpoint) IsEmpty() bool {
+ return len(e.Host) == 0
+}
+
+// Copy makes a deep copy of Config.
+// The result aliases no memory with the original.
+func (cfg Config) Copy() Config {
+ res := cfg
+ if res.Addresses != nil {
+ res.Addresses = append([]CIDR{}, res.Addresses...)
+ }
+ if res.DNS != nil {
+ res.DNS = append([]IP{}, res.DNS...)
+ }
+ peers := make([]Peer, 0, len(res.Peers))
+ for _, peer := range res.Peers {
+ peers = append(peers, peer.Copy())
+ }
+ res.Peers = peers
+ return res
+}
+
+// Copy makes a deep copy of Peer.
+// The result aliases no memory with the original.
+func (peer Peer) Copy() Peer {
+ res := peer
+ if res.AllowedIPs != nil {
+ res.AllowedIPs = append([]CIDR{}, res.AllowedIPs...)
+ }
+ if res.Endpoints != nil {
+ res.Endpoints = append([]Endpoint{}, res.Endpoints...)
+ }
+ return res
+}