Недавно, 4 сентября, я начал разработку библиотеки TLS. Первую неделю я читал документацию и прикидывал, насколько реально это сделать. Затем начал кодировать. За основу я взял старую версию TLS (1.0), потом можно будет модернизировать до 1.2. До завершения еще далеко, но кое-что уже есть. Программа может подключиться к https-серверу, обменяться ключами, отправить прикладной запрос и прочитать ответ. Парсер сертификатов я пока не сделал, а просто захардкодил открытый ключ Википедии.
Надо запустить программу и ввести в консоли "en.wikipedia.org/wiki/Main_Page" или "en.wikipedia.org/wiki/KolibriOS" (регистр имеет значение). Программа обменяется ключами и отправит запрос
GET /wiki/??? HTTP/1.1
Host: en.wikipedia.org
Полученный ответ будет показан в консоли и сохранен в файле /tmp0/1/1.txt.
Пока программа работает довольно медленно: криптографические алгоритмы очень тяжелые, O7/11 тут не справляется. Вроде бы, где-то здесь были готовые алгоритмы на асме, я пока их не рассматривал, но в будущем, конечно, надо применить ассемблерные решения. Даже на Core i7 требуется ~3 сек для вычисления RSA. 3DES работает со скоростью 60-70 кбайт/c. Небыстро...
Кстати, сервер Википедии иногда, вместо нормального ответа возвращает предупреждение, что, дескать, ваш "браузер" (IE 8.0, Windows XP) устарел и поддержка 3DES прекращается. Я знал, что 3DES устарел, но думал, что он еще вполне поддерживается. Просто мне показалось, что 3DES проще сделать, чем AES. Но всё равно надо перейти на AES.
При первом запуске программы, соединение с сервером устанавливается не сразу, а примерно через минуту. Программа пишет "connecting..." а дальше надо ждать. Есть какая-то проблема с сокетами. При последующих запусках, когда сокеты "прогрелись", соединение устанавливается незамедлительно.
Максимальный размер ответа ограничен 4 Мб -- если больше, будет аварийная ситуация. Оперативной памяти программа тратит тоже немало (40-50 Мб), но это вроде несложно уменьшить.
Пока всё очень ненадежно и медленно. Но начало положено...
Так выглядит в NetSurf главная страница Википедии, которая была загружена этой программой.
Attachment:
1.PNG [ 154.55 KiB | Viewed 2675 times ]
----
05-oct-2017
Увеличена скорость получения данных из сети.
Добавлены функции AES и SHA256.
список поддерживаемых шифронаборов:
TLS_RSA_WITH_3DES_EDE_CBC_SHA (устарел)
TLS_RSA_WITH_AES_128_CBC_SHA
TLS_RSA_WITH_AES_256_CBC_SHA
TLS_RSA_WITH_AES_128_CBC_SHA256 (TLS 1.2)
TLS_RSA_WITH_AES_256_CBC_SHA256 (TLS 1.2)
последние два используются только с TLS 1.2, пока не нужно, но потом пригодятся.
Сервер перестал присылать сообщения об устаревшем 3DES. К тому же, AES работает намного быстрее.
----
15-oct-2017
Сделана обработка ошибок, оптимизация по памяти, улучшена внутренняя структура, готовится преобразование программы в библиотеку: убраны почти все глобальные переменные, сформирован интерфейс будущей библиотеки. Остается еще много мелких недоработок + парсер сертификатов.
----
22-oct-2017
Большой прогресс. Сделан простой парсер сертификатов (программа подключается только к Wikipedia, но теперь открытый ключ не встроен в программу, а извлекается из сертификата сервера). Предусмотрена возможность возобновления сессии. Сделана обработка сетевых событий. Снято ограничение на размер ответа. Повышена надежность работы программы. Оптимизирован алгоритм AES -- теперь на мощных машинах он работает в несколько раз быстрее, чем сетевая подсистема в KolibriOS.
Остается сделать кое-какую мелочь, преобразовать программу в библиотеку, написать примеры использования и описание функций.