+### gpg + ssh + forwarding
+# NOTE: while ssh manages its auth sock in its protocol when ForwardSsh is
+# enabled, GPG must be forwarded manually over Unix socket. to support
+# this, we forward the restricted gpg-agent extra socket to the remote
+# host with a RemoteForward rule in ~/.ssh/config that uses the
+# _GNUPG_SOCK_* env vars. to avoid conflicts with other ssh sessions
+# where the same user is connecting to the same host from different
+# machines, gpg in each environment should utilize its own forwarded
+# socket, rather than replace the sockets in GNUPGHOME which will be
+# overridden on the next connection. previously, you could provide a path
+# to the agent socket in GPG_AGENT_INFO, but that was deprecated in GPG
+# v2.1. instead, we must clone GNUPGHOME with links and replace the agent
+# sockets there with the forwarded one.
+# NOTE: since Unix sockets are not supported under Windows, this will not work
+# under msys, cygwin, mingw, etc., but may work under wsl2.
+# HACK: without SendEnv, which is disabled by default in most sshd configs,
+# there is no foolproof way to prevent race conditions via filename
+# collisions or to pass the desired forward path to the remote host
+# environment. we just have to guess the path we choose is good on the
+# desination, and assume the newest matching socket is the correct one
+# after connecting. in theory, we could occlude the ssh binary on PATH
+# with an alias or script that would allow us to communicate with the
+# remote host before opening a shell, so that we can have the host
+# communicate back to the client where it wants a socket created or ask
+# the host if the path the client wants to use is writable. however, this
+# would open up too many edge cases where it wouldn't work or be clunky
+# (e.g. asking for password twice) to make it worth it.
+if [[ ! -v _sev_setup_agents ]] {
+ export GNUPGHOME=~/etc/gnupg
+
+ function _socketpath {
+ # dirs are percent-encoded: https://stackoverflow.com/a/64312099
+ echo ${1//(#b)%([[:xdigit:]](#c2))/${(#):-0x$match[1]}}