crypery
Описание
crypery - сетевой стек на чистом C/CPP, состоящий из четырёх модулей: криптографическая библиотека TLS 1.2/1.3, OpenSSL-совместимый SSL-обёрточный слой, HTTPS-сервер и HTTPS-клиент.
- Все криптоалгоритмы реализованы с нуля - без внешних криптографических библиотек. Единственная опциональная зависимость - zlib для gzip-сжатия (отключается флагом HTTP_NO_GZIP).
- Портативность - работает на Windows (MinGW, Winsock) и Unix-подобных системах (BSD-сокеты, pthreads).
- Полный цикл: от низкоуровневой криптографии (AES-GCM, RSA, ECDH) до готовых HTTP-сервера и HTTP-клиента.
Используемые модули
tls
Базовый криптографический слой. Чистая C/CPP-реализация протоколов TLS 1.2 и TLS 1.3 со встроенным набором примитивов:
- симметричное шифрование AES-128-GCM;
- хеширование SHA-256, MAC HMAC-SHA256, вывод ключей HKDF-SHA256;
- асимметричная криптография: RSA-2048 (подпись PKCS#1 v1.5 и RSASSA-PSS), ECDH на кривых P-256 (secp256r1) и X25519;
- генерация и разбор самоподписанных X.509-сертификатов (DER/PEM), включая загрузку PEM-файлов;
- контекст TLS-соединения: рукопожатие (клиент/сервер, автовыбор версии), шифрование и расшифровка данных приложения, SNI, проверка сертификата стороны, close_notify;
- потокобезопасность: генерация случайных чисел (xorshift128) защищена блокировкой, что позволяет вести параллельные рукопожатия в пуле потоков.
ssl
OpenSSL-совместимый API-слой над встроенной реализацией TLS. Предназначен для того, чтобы код, написанный под OpenSSL, работал без изменений:
- типы контекста и соединения, совместимые с OpenSSL;
- загрузка сертификата и закрытого ключа из PEM-файлов, проверка соответствия ключа сертификату;
- серверное и клиентское рукопожатие (TLS 1.2/1.3);
- шифрованный ввод-вывод поверх сокета;
- настраиваемые таймауты: I/O-операция, всё рукопожатие, ожидание записи TLS-записи, сборка фрагментированных пакетов;
- режимы проверки сертификата стороны;
- платформенный шим: Winsock на Windows, BSD-сокеты на POSIX.
http
Самодостаточная HTTP/1.1-библиотека сервера, построенная на встроенном TLS-стеке:
- маршрутизация запросов по методу и пути с пользовательскими обработчиками;
- раздача статических файлов из корневой директории с определением MIME-типов;
- gzip-сжатие: раздача предсжатых.gz-файлов и сжатие на лету через zlib (отключается HTTP_NO_GZIP);
- WebSocket (RFC 6455): апгрейд соединения, чтение и отправка кадров (текст, бинарные данные, close, ping/pong);
- Server-Sent Events (SSE);
- разбор query-строки (URL-декодирование) и multipart/form-data (включая загрузку файлов);
- безопасность: защита от path traversal, блокировка чувствительных путей (.git,.env, config* и др.), валидация заголовка Host по списку доменов, лимиты размера тела и заголовков;
- пул рабочих потоков с кольцевой очередью соединений, блокирующий accept-цикл;
- автоматическое определение TLS/HTTP по первому байту (0x16 → TLS, иначе HTTP с ответом 426);
- статистика: счётчики запросов по категориям кодов состояния, uptime, req/s;
- собственный платформенный шим (сокеты, строки, потоки, мьютексы, события) - модуль не зависит от внешних compat-заголовков.
url
Самодостаточная HTTP/HTTPS-библиотека клиента, построенная на встроенном TLS-стеке:
- разбор абсолютных URL: http/https, явный порт, userinfo, фрагменты, IPv6-литералы;
- выполнение HTTP/1.1-запросов (GET, POST, HEAD и др.) с кастомными заголовками, телом, Content-Type, Range;
- чтение ответа: статус-строка, заголовки, тело по Content-Length, chunked transfer encoding или до EOF;
- обработка редиректов (301/302/303/307/308) с семантикой методов по RFC 7231 и ограничением числа переходов;
- сборка multipart/form-data тел (поля и файлы, генерация boundary, определение MIME по расширению);
- транспортный слой: DNS-резолвинг, подключение с таймаутом, TLS-рукопожатие (SNI, опция пропуска проверки сертификата), буферизованный ввод-вывод;
- коды ошибок, совместимые с конвенциями curl;
- опциональное подробное логирование через колбэк (отключается URL_NO_LOG).
Технологии
- Язык: чистый C/CPP, без внешних зависимостей (zlib - опционально)
- Протоколы: TLS 1.2, TLS 1.3, HTTP/1.1, HTTPS, WebSocket (RFC 6455), SSE, chunked transfer encoding
- Криптография: AES-128-GCM, SHA-256, HMAC-SHA256, HKDF-SHA256, RSA-2048 (PKCS#1 v1.5, RSASSA-PSS), ECDH P-256 (secp256r1), X25519, X.509 (DER/PEM), SHA-1 (только для WebSocket-рукопожатия)
- Сетевой уровень: Winsock2 (Windows) / BSD-сокеты (POSIX), select() для таймаутов, SO_RCVTIMEO, getaddrinfo для DNS
- Потоки: WinAPI-потоки (Windows) / pthreads (POSIX), пул рабочих потоков, критические секции / мьютексы, автосбрасываемые события
- Сжатие: gzip через zlib (опционально)
- Совместимость API: OpenSSL (SSL_CTX/SSL) и curl (url_*)
- Лицензия: GNU AGPL v3 (Affero GPL)