Что: 48584050c661df42c76a1026b3aebe16da078b52
Когда: 2024-04-11 22:17:05+03:00
Темы: crypto go multimedia
Доработки VoRS В прошлой записи упоминал об относительно простом VoIP клиент/сервере. До четырёх утра не спал, но решил ещё красивее сделать: заменить TLS на Noise. Кода конечно потребовало больше, ведь не готовый же протокол используется, но зато в целом куда более простая система. Выбрал Noise-NK шаблон, где всего ровно за один round-trip производится рукопожатие. При этом, уже в первое сообщение от клиента и сервера можно вложить полезную нагрузку (которая тоже будет зашифрована). В итоге, уже с первым сообщением от клиента он предоставляет свой username. А сервер в своём сообщении может сразу объяснить причину отказа например. Кроме того, вместо того, чтобы заставлять клиента использовать такой же номер UDP порта с которого он пришёл на TCP сервера (что не всегда может быть доступно), клиент отправляет пакеты с произвольного порта. Во время рукопожатия, сервер выдаёт ему 128-бит cookie, которую клиент должен в UDP пакете послать ему. Ведь проходя через NAT-ы, он в общем случае может и не знать какой порт увидит сервер. Только приняв cookie, сервер выдаёт клиенту SID и оповещает остальных о его подключении. И проверка связи по UDP, и дружелюбность к NAT-ам и stateful firewall-ам. От пароля избавился. Так как публичный ключ сервера во время рукопожатия не передаётся, то его нужно знать клиенту заранее. А чем заранее выданный публичный ключ не идентичен паролю? Shared секрет для аутентификации. Включил в Opus-е DTX (discontinuous transmission), где кодек может вообще не отправлять пакеты если в них тишина. Действительно, при ней ничего не отправляет. А также всё же снизил bitrate до 24Kbps, ибо это вполне себе потолок достаточности для VoIP. Урезал Poly1305 до 64-бит. Overhead от VoRS выходит 12-байтным (и это с шифрованием и аутентификацией). Ну и сервер начали проверять Poly1305, ибо это штука очень быстрая. Плюс попробовал использовать ML/нейросети из Opus 1.5 (78018e649ab66c7a1f45b793ba7c3c8c7f0a24e4). Для этого нужно повысить настройку сложности декодера. Go обёртка не позволяет это сделать, ибо раньше в декодере этого просто нельзя было указывать. Сделал fork в git://git.stargrave.org/go-opus.git, где оно появилось. Действительно, особенно при потерях пакетов, разница на слух есть заметная, если libopus собран с --enable-deep-plc --enable-osce и complexity=10. Но это всё опционально.
Сгенерирован: SGBlog 0.34.0