Как правильно сделать авторизацию и шифрование для TCP соединения?
TLS поддерживает механизм, когда обе стороны предоставляют сертификаты. Вы можете создать свой CA (корневой сертификат) и подписать им сертификаты каждой из сторон, наличие этой подписи защитит от подделки и каждая из сторон сможет проверить другую. Естественно соединения без клиентского сертификата или подписанные не нашим CA обрываем на этапе рукопожатия.
При успешном рукопожатии у нас есть сессионный ключ, которым шифруется трафик.
Так же в целях безопасности я бы ограничил поддержку только протокола TLS1.3, учитывая, что и клиент и сервер - наши приложения, проблем точно не возникнет
Для TCP соединения - авторизация и шифрование не делаются. Они работают поверх TCP - например, SSL.

Я советую смотреть в сторону SSh - как там это сделано. Уверен, что в SSh уже сделано всё, что Вам хочется; а также то, что Вам пока что не хочется, но потребуется/будет полезно.
Поищите на Хабре статьи про SSh. Сначала смотрите на функциональность - что он может. Потом - копайте, как это делается.
Ещё одно направление поиска - PuTTY. Это тот же SSh, просто под Windows. Возможно, там доки лучше зайдут.

SSh - продукт открытый, код можно тянуть свободно.

Хорошее решение - запихнуть Вашу TCP-сессию в SSh-туннель, который сделает и шифрование, и авторизацию.