TLS (клиент)

...
  • Очень полезное и серьезное начинание.
    Из хаоса в космос
  • Good work! Glad to see that someone tackles it!
  • Когда-то я делал алгоритм шифрования des посмотреть можно здесь:
    http://websvn.kolibrios.org/listing.php ... 162e2aad94
    А алгоритм aes делал diamond для программы kfar:
    http://websvn.kolibrios.org/filedetails ... %2Faes.inc
  • "Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction." Albert Einstein
  • hidnplayr,
    Yes, I know about that work, but I don't code in asm.
  • What language did you write this in?
    Do you care to share the source code? Maybe it can be used to improve ASM version :)
    "Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction." Albert Einstein
  • Oberon-07/11. This compiler is another my work. Later the cryptographic algorithms will be replaced by those written in C (or asm). But it's not yet soon.
    Yes, I'll share the source code. But it's still early.
  • Cool, keep up the good work!
    "Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction." Albert Einstein
  • Hello akron1

    This looks pretty useful for Netsurf as well to support HTTPS.

    Maybe I'll be able to incorporate it into Netsurf once this is matured enough.
    ---
    Check out the Netsurf Web Browser for KolibriOS.
    Read the wiki and happy hacking with KolibriOS!
  • ashmew2

    I hope it will be possible. I continue to develop...
  • Программа преобразована в библиотеку. Пока еще есть недоработки, но уже можно пробовать ее использовать.

    Вероятно, есть проблемы с сетевой подсистемой KolibriOS: иногда библиотека не может открыть сокет и возвращает код ошибки -23. Библиотека сделана с возможностью компиляции как для KolibriOS, так и для Windows (я вынес все системные зависимости в один модуль). Компиляция для Windows мне нужна для упрощения разработки и тестирования. Поэтому библиотека содержит небольшую избыточность. В Windows всё работает безотказно. В KolibriOS -- то не открывается сокет, то теряется соединение.

    Пока я возьму паузу и продолжу после нового года. Планирую сделать:

    - поддержку TLS 1.1 и 1.2
    - заменить криптоалгоритмы на высокоэффективные, написанные на асме или C (прежде всего RSA)
    - улучшить надежность работы
    - возможно переписать отдельные части или даже всё. Я впервые писал сетевое приложение и многие особенности работы с сетью мне были неизвестны. И поэтому, то, что я написал мне не нравится. Теперь, когда есть работающая реализация и получен опыт, написать новую будет несложно.

    Описание функций
    Spoiler:void lib_init (void)

    инициализировать библиотеку.

    Приложение обязательно должно вызвать эту функцию после загрузки библиотеки.

    ______________
    void *open (void *session, int b1, int b2, int b3, int b4, int port, int buf_size, int &error)

    открыть сессию

    - session -- указатель на session_id и master_secret ранее открытой сессии или 0, если эта сессия первая
    - b1, b2, b3, b4 -- IP сервера
    - port -- порт (для https port = 443)
    - buf_size -- размер буфера для временного хранения данных до передачи в приложение. Приложение должно
    читать данные как можно быстрее, иначе буфер будет заполнен, приём данных от сервера остановится и
    соединение может быть потеряно. Это не проблема библиотеки -- при работе под Windows, даже если приложение
    читает данные медленно, соединение не теряется. В настоящее время, допустимый размер буфера 256 Кб - 256 Мб.
    На самом деле, библиотека создает два буфера заданного размера. Буферы кольцевые: если достигнут конец
    буфера, то данные будут записаны в начало, если начало уже прочитано приложением. При быстрой работе
    приложения и медленной работе сети, переполнение буферов не происходит.
    - error -- возвращаемый код ошибки (отрицательное число), 0 -- успех.

    результат: указатель на параметры соединения, 0 -- ошибка

    ______________
    void session (void *params, void *buffer)

    получить session_id и master_secret ранее открытой (и еще не закрытой!) сессии

    - params -- указатель на параметры соединения ранее открытой сессии
    - buffer -- адрес памяти, куда будет записан результат (81 байт минимум). Это можно использовать для открытия
    следующей сессии с тем же сервером (функция open, параметр session), чтобы повторно не вычислять RSA
    (алгоритм RSA работает медленно).

    ______________
    void close (void **params)

    закрыть сессию, освободить память

    - params -- указатель на параметры соединения. Будет присвоено значение 0.

    ______________
    int send (void *params, void *buffer, int size)

    отправить данные

    - params -- указатель на параметры соединения
    - buffer -- указатель на данные
    - size -- размер данных

    результат: 0 -- успех, иначе код ошибки

    ______________
    int recv (void *params, void *buffer, int size)

    получить данные

    - params -- указатель на параметры соединения
    - buffer -- указатель на буфер для данных
    - size -- размер буфера

    результат:

    >= 0 -- количество записанных в буфер байтов.
    -17 -- сервер завершил передачу данных и закрыл сессию. После этого необходимо вызвать close,
    чтобы освободить память.
    < 0 (!= -17) -- код ошибки.

    ______________
    Общий порядок вызовов:

    open
    session (необязательно)
    send
    recv
    close


    Cоглашение вызовов stdcall.
    Рекомендуемый минимальный размер стэка приложения 256 Кб.
    ----
    03-nov-2017

    До перерыва, я всё же сделал одно небольшое, но важное улучшение. Я переделал алгоритм RSA (изменил форму представления длинных чисел и сделал предварительные вычисления). Теперь RSA работает в 7 раз быстрее. На Core i7 время работы алгоритма сократилось с 2250 мс до 320 мс. Приложению требуется дополнительно 64 Кб стэка для хранения результатов предварительных вычислений.
    Attachments
    TLSv0.21.zip (62.76 KiB)
    Downloaded 301 times
    Last edited by akron1 on Fri Nov 03, 2017 5:49 pm, edited 1 time in total.
  • Very nice work, I will try to connect it to HTTP library in the future and see how usable it can be.
    "Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction." Albert Einstein
  • Всё же, учитывая сравнительно малый объем оставшейся работы по этой библиотеке, я решил не откладывая довести программу до предварительного завершения.

    - Изменен интерфейс
    - Исправлены баги
    - Добавлена поддержка TLS 1.1

    Тщательного тестирования я не проводил, но простые тесты программа проходит.

    Я раньше писал о нестабильной работе билиотеки в KolibriOS по сравнению с Windows. Теперь можно описать проблемы более точно:

    - "не открывается сокет". На самом деле сокет открывается, просто в некоторых случаях функция 75.4 не может установить соединение с сервером. После неудачного вызова f75.4, регистр ebx содержит значение 60. Если это код ошибки, то "Connection timeout". Решение: в случае неудачи, библиотека пробует подключиться еще 4 раза, то есть, делается до пяти попыток соединения, обычно удается подключиться со второй попытки, если не удалось с первой.

    - "теряется соединение". Теряется не соединение, а данные, если буфер сокета был переполнен. Это может произойти, когда приложение обрабатывает данные медленнее, чем они поступают из сети. Не знаю, баг ли это в реализации протокола TCP, или просто Windows использует буфер сокета большего размера.

    Новый интерфейс библиотеки. Вместо указателей на параметры соединения, используются целочисленные идентификаторы для защиты памяти.
    Spoiler:void lib_init (void)

    инициализировать библиотеку.

    Приложение обязательно должно вызвать эту функцию после загрузки библиотеки.

    -------------------------------------------
    int open (void *session, int b1, int b2, int b3, int b4, int port, int buf_size, int &error)

    открыть сессию

    - session -- указатель на session_id и master_secret ранее открытой сессии или 0, если эта сессия первая
    - b1, b2, b3, b4 -- IP сервера
    - port -- порт (для https port = 443)
    - buf_size -- размер буфера для временного хранения данных до передачи в приложение. Приложение должно
    читать данные как можно быстрее, иначе буфер будет заполнен, и данные будут потеряны.
    Это не проблема библиотеки -- при работе в Windows, даже если приложение читает данные медленно,
    потеря данных не происходит. В настоящее время, допустимый размер буфера 256 Кб - 256 Мб.
    На самом деле, библиотека создает два буфера заданного размера. Буферы кольцевые: если достигнут конец
    буфера, то данные будут записаны в начало, если начало уже прочитано приложением. При быстрой работе
    приложения и медленной работе сети, переполнение буферов не происходит.
    - error -- возвращаемый код ошибки (отрицательное число), 0 -- успех.

    результат: идентификатор соединения, 0 -- ошибка

    -------------------------------------------
    bool session (int connection, void *buffer)

    получить session_id и master_secret ранее открытой (и еще не закрытой!) сессии

    - connection -- идентификатор соединения ранее открытой сессии
    - buffer -- адрес памяти, куда будет записан результат (81 байт). Это можно использовать для открытия
    следующей сессии с тем же сервером (функция open, параметр session), чтобы повторно не вычислять RSA
    (алгоритм RSA работает медленно).

    результат: true -- успех, false -- ошибка

    -------------------------------------------
    bool close (int connection)

    закрыть сессию, освободить память

    - connection -- идентификатор соединения.

    результат: true -- успех, false -- ошибка (неправильный идентификатор или соединение уже закрыто)

    -------------------------------------------
    int send (int connection, void *buffer, int size)

    отправить данные

    - connection -- идентификатор соединения
    - buffer -- указатель на данные
    - size -- размер данных

    результат: 0 -- успех, иначе код ошибки

    -------------------------------------------
    int recv (int connection, void *buffer, int size)

    получить данные

    - connection -- идентификатор соединения
    - buffer -- указатель на буфер для данных
    - size -- размер буфера

    результат:

    >= 0 -- количество записанных в буфер байтов.
    == -17 -- сервер завершил передачу данных и закрыл сессию.
    < 0 (!= -17) -- код ошибки.

    -------------------------------------------
    Общий порядок вызовов:

    open
    session (необязательно)
    send
    recv
    close


    Cоглашение вызовов stdcall.
    Рекомендуемый размер стэка приложения 256 Кб.
    Список кодов ошибок. На практике, многие ошибки никогда не возникают, если сервер работает правильно. Если ошибку возвращает функция open, то ничего делать не надо. Если код ошибки (в том числе и код -17) возвращают функции send или recv, то после этого надо вызвать функцию close чтобы освободить память.
    Spoiler:-1 не удалось отправить данные
    -2 ошибка дешифрования записи
    -3 неправильный MAC записи
    -4 время истекло, сервер не ответил
    -5 ошибка версии протокола TLS
    -6 запись переполнена
    -7 отказ согласования
    -8 не удалось открыть сокет
    -9 получено сообщение alert
    -10 неожиданный тип записи
    -11 отказ возобновления сессии
    -12 недопустимый шифронабор
    -13 заполнен буфер для handshake-сообщений
    -14 тип ключа не соответствует шифронабору
    -15 ошибка парсера сертификатов
    -16 слишком много соединений
    -17 сервер завершил передачу данных и закрыл сессию
    -18 слишком длинный ключ RSA
    -19 слишком короткий ключ RSA
    -20 параметр size функции send меньше нуля
    -21 неправильный идентификатор соединения
    -22 соединение разорвано
    -23 не удалось создать процесс (для сокета)
    -24 не удалось создать процесс (для дешифрования)
    -25 недостаточно памяти
    -26 не удалось соединиться с сервером
    Поддержку TLS 1.2 и оптимизацию криптографических алгоритмов пока можно отложить.
    Если будут какие-либо рациональные предложения по улучшению, изменению интерфейса и т. п., то я, по-возможности, сделаю. А пока на этом всё.
    Attachments
    TLSv0.23.zip (59.96 KiB)
    перенес на новый компилятор
    Downloaded 296 times
    Last edited by akron1 on Wed May 23, 2018 9:25 am, edited 1 time in total.
  • very nice

    отличная заделка на будущее. грац
  • Who is online

    Users browsing this forum: No registered users and 1 guest