Commit Diff


commit - 68860e7a100628b0ffb9d80c5ef48e1c320c06c8
commit + 19d3d0922b972a61ba5b23ee6cd98a2ab151c7b1
blob - 325fe2f319fbbc9fd030c6183648da2b154a6bf5
blob + 8810d2eebbe8cae51b5445ba2263c4ba862395db
--- bin/wg_config
+++ bin/wg_config
@@ -1,84 +1,112 @@
 #!/bin/sh -e
-# This script creates wireguard Client and Server config files
 #
+# Create WireGuard client and server peer configs for a single host
+# against a running wg0 server interface.
+#
+# Usage: wg_config name client_ip port
+#
+
 #### Functions
-create_client_pubkey() {
-	ifconfig wg9 create wgkey $CLIENT_PRIVKEY
-	ifconfig wg9 | awk '/wgpubkey/ { print $2 }'
-	ifconfig wg9 destroy
+
+# Show usage and exit.
+usage() {
+	echo "usage: ${0##*/} name client_ip port" >&2
+	exit 1
 }
 
+# Derive X25519 public key from a base64-encoded private key using only
+# openssl(1).  Constructs a PKCS#8 DER-encoded X25519 private key per
+# RFC 8410 (OID 1.3.101.110) and extracts the raw 32-byte public key
+# from the SubjectPublicKeyInfo DER output.
+#
+# Reference: RFC 8410, Section 7 — "Algorithm Identifiers for Ed25519,
+#   Ed448, X25519, and X448 for Use in the Internet X.509 Public Key
+#   Infrastructure" (https://www.rfc-editor.org/rfc/rfc8410)
+# Prior art:
+#   https://gist.github.com/Aleksanaa/9886c9d7d50f1c815400657578ee9a76
+#   https://gist.github.com/yrpeng/0b51f6f91931b70f6523db9c2d3ba835
+get_pubkey() {
+	{
+		printf '\x30\x2e\x02\x01\x00\x30\x05\x06\x03\x2b\x65\x6e\x04\x22\x04\x20'
+		echo "$1" | openssl enc -base64 -d
+	} | openssl pkey -inform DER -pubout -outform DER 2>/dev/null \
+	  | tail -c 32 \
+	  | openssl enc -base64
+}
+
 get_server_pubkey() {
 	ifconfig wg0 | awk '/wgpubkey/ { print $2 }'
 }
 
-get_server_ip() {
-	ifconfig wg0 | awk '/inet/ { print $2 }'
-}
 
+#### Argument parsing
 
-#### Script
-
-if [[ $# -eq 0 ]]; then
-	echo "Usage: $0 ClientName ClientTunnelIP ServerPort"
-	exit 0
+if [ $# -ne 3 ]; then
+	usage
 fi
 
-#### Variables
 CLIENT_NAME="$1"
 CLIENT_IP="$2"
 SERVER_PORT="$3"
+
+
+#### Setup
+
 DNS_SERVER="9.9.9.9"
-CLIENT_PRIVKEY="$(openssl rand -base64 32)"
-CLIENT_PUBKEY="$(create_client_pubkey)"
-SERVER_PUBKEY="$(get_server_pubkey)"
-SHARED_KEY="$(openssl rand -base64 32)"
+CLIENT_PRIVKEY=$(openssl rand -base64 32)
+CLIENT_PUBKEY=$(get_pubkey "$CLIENT_PRIVKEY")
+SERVER_PUBKEY=$(get_server_pubkey)
+SHARED_KEY=$(openssl rand -base64 32)
 
-# Everything else config ($CLIENT_NAME.conf
-cat << EOF > $CLIENT_NAME.conf
+
+#### Generate configs
+
+# Standard WireGuard client config.
+cat <<EOF > "${CLIENT_NAME}.conf"
 [Interface]
-# $CLIENT_NAME private key
-PrivateKey = $CLIENT_PRIVKEY
-Address = $CLIENT_IP/32
-DNS = $DNS_SERVER
+# ${CLIENT_NAME} private key
+PrivateKey = ${CLIENT_PRIVKEY}
+Address = ${CLIENT_IP}/32
+DNS = ${DNS_SERVER}
 
 [Peer]
 # Wireguard server public key
-PublicKey = $SERVER_PUBKEY
-PresharedKey = $SHARED_KEY
+PublicKey = ${SERVER_PUBKEY}
+PresharedKey = ${SHARED_KEY}
 AllowedIPs = 0.0.0.0/0
 Endpoint = fugu.farm:${SERVER_PORT}
 PersistentKeepalive = 25
 EOF
 
-
-# OpenBSD Client config ($CLIENT_NAME.hostname.wg)
-cat << EOF > $CLIENT_NAME.hostname.wg
-# Interface
-wgkey $CLIENT_PRIVKEY
-$CLIENT_IP 255.255.255.0
+# OpenBSD client config.
+cat <<EOF > "${CLIENT_NAME}.hostname.wg"
+# ${CLIENT_NAME}
+description "${CLIENT_NAME}"
+wgkey ${CLIENT_PRIVKEY}
+inet ${CLIENT_IP} 255.255.255.0
 up
 
 # Peer fugu.farm
-wgpeer $SERVER_PUBKEY \\
-	wgpsk $SHARED_KEY \\
-	wgendpoint fugu.farm $SERVER_PORT \\
-	wgaip 0.0.0.0/0 wgpka 20
+wgpeer ${SERVER_PUBKEY} \\
+	wgdescr "fugu.farm" \\
+	wgpsk ${SHARED_KEY} \\
+	wgendpoint fugu.farm ${SERVER_PORT} \\
+	wgaip 0.0.0.0/0 wgpka 25
 EOF
 
-
-# Peer config for server ($CLIENT_NAME.hostname.wgserver)
-cat << EOF > $CLIENT_NAME.hostname.wgserver
-
-# Peer $CLIENT_NAME
-wgpeer $CLIENT_PUBKEY \\
-	wgpsk $SHARED_KEY \\
-	wgaip $CLIENT_IP/32 
+# Server peer snippet.
+cat <<EOF > "${CLIENT_NAME}.hostname.wgserver"
+# Peer ${CLIENT_NAME}
+wgpeer ${CLIENT_PUBKEY} \\
+	wgdescr "${CLIENT_NAME}" \\
+	wgpsk ${SHARED_KEY} \\
+	wgaip ${CLIENT_IP}/32
 EOF
 
-chown isaac:isaac	\
-	${CLIENT_NAME}.hostname.wgserver	\
-	${CLIENT_NAME}.hostname.wg		\
-	${CLIENT_NAME}.conf		\
 
-exit 0
+#### Permissions — configs contain private keys.
+
+chmod 600 \
+	"${CLIENT_NAME}.conf" \
+	"${CLIENT_NAME}.hostname.wg" \
+	"${CLIENT_NAME}.hostname.wgserver"