Jason A. Donenfeld, autor WireGuard VPN, wydał pierwszą główną wersję oprogramowania klienckiego WireGuard dla systemu Windows 1.0, a także sterowniki WireGuardNT 1.0 z portem VPN WireGuard dla jądra Windows 10 i 11, obsługujący architektury AMD64, x86 i ARM64. Kod komponentów jądra Windows jest licencjonowany na licencji GPLv2, a oprogramowanie klienckie na licencji MIT.
Port bazuje na kodzie źródłowym głównej implementacji WireGuard dla jądra Linux, która została przekonwertowana w celu wykorzystania encji jądra Windows oraz stosu sieciowego NDIS. W porównaniu z implementacją wireguard-go, która działa w przestrzeni użytkownika i wykorzystuje interfejs sieciowy Wintun, WireGuardNT oferuje znaczną poprawę wydajności poprzez eliminację przełączania kontekstu i kopiowanie zawartości pakietów z jądra do przestrzeni użytkownika. Podobnie jak w implementacjach dla Linuksa, OpenBSD i FreeBSD, cała logika przetwarzania protokołów w WireGuardNT działa bezpośrednio na poziomie stosu sieciowego.
Wersję 1.0 uznano za kamień milowy, ponieważ rozwiązano szereg problemów i zrealizowano zamierzone zadania, takie jak: użycie funkcji NdisWdfGetAdapterContextFromAdapterHandle() zamiast mniej bezpiecznego przechowywania stanu sterownika w polu Reserved i użycia nieudokumentowanych przesunięć; prawidłowe i szybkie śledzenie rozmiaru MTU (Maximum Transmission Unit) poprzez przechwytywanie wywołań systemowych; użycie standardu C23 w kodzie.
Przypomnijmy, że VPN WireGuard został wdrożony w oparciu o nowoczesne metody szyfrowania, charakteryzuje się bardzo wysoką wydajnością, jest łatwy w użyciu, pozbawiony komplikacji i sprawdził się w wielu dużych wdrożeniach przetwarzających duże wolumeny ruchu. Projekt rozwijany jest od 2015 roku i przeszedł audyt oraz formalną weryfikację stosowanych metod szyfrowania. WireGuard wykorzystuje koncepcję routingu szyfrowanego przy użyciu klucza, która polega na przypisaniu każdemu interfejsowi sieciowemu klucza prywatnego i wykorzystaniu kluczy publicznych do powiązania.
Wymiana kluczy publicznych w celu nawiązania połączenia przebiega podobnie jak w przypadku protokołu SSH. Do negocjacji kluczy i nawiązania połączenia bez konieczności uruchamiania oddzielnego demona w przestrzeni użytkownika wykorzystywany jest mechanizm Noise_IK z Noise Protocol Framework, podobny do obsługi kluczy authorized_keys w protokole SSH. Transfer danych odbywa się poprzez enkapsulację w pakietach UDP. Obsługiwana jest zmiana kluczy. Adresy IP Serwery VPN (roaming) bez przerywania połączenia z automatyczną rekonfiguracją klienta.
Do szyfrowania wykorzystano szyfr strumieniowy ChaCha20 i algorytm uwierzytelniania wiadomości Poly1305 (MAC) opracowane przez Daniela J. Bernsteina, Tanję Lange i Petera Schwabe. Algorytmy ChaCha20 i Poly1305 są pozycjonowane jako szybsze i bezpieczniejsze odpowiedniki algorytmów AES-256-CTR i HMAC, których implementacja programowa pozwala na osiągnięcie stałego czasu wykonania bez konieczności stosowania specjalnego wsparcia sprzętowego. Do wygenerowania współdzielonego klucza tajnego wykorzystano protokół Elliptic Curve Diffie-Hellmana w implementacji Curve25519, również zaproponowanej przez Daniela Bernsteina. Do hashowania używany jest algorytm BLAKE2s (RFC7693).
Źródło: opennet.ru
