Will the kernel portion depend on lkm?
There is also BoringTun: https://github.com/cloudflare/boringtun which is faster
Disclaimer: I wrote BoringTun
There's also official documentation for how a userspace implementation should behave. [1]
The android version of WireGuard has a userspace implementation for devices without WireGuard in the kernel, which at the moment is pretty much all.