Большая часть сложности SSL обусловлена высокой модульностью.Клиент может поддерживать несколько «наборов шифров», и сервер выбирает один.Данные могут быть сжаты.Клиент может аутентифицировать себя, представив свой собственный сертификат и используя соответствующий закрытый ключ.Открытый ключ сервера отправляется в виде сертификата X.509, а проверка сертификата X.509 является сложной.
Вы можете существенно упростить SSL путем жесткого кодирования вариантов на стороне клиента.Например, вы решаете, что будете поддерживать только один набор шифров, например, TLS_RSA_WITH_AES_128_CBC_SHA256.Без сжатия.Вы можете жестко закодировать в клиенте открытый ключ сервера и просто проигнорировать сертификат, который отправляет сервер.Если возможно, используйте TLS 1.2 , что требует использования одной хэш-функции (SHA-256) вместо двух (MD5 и SHA-1) для предыдущих версий протокола (TLS - стандартное имя для SSL; TLS 1.0 - это SSL 3.1).
Я (профессионально) реализовал клиент TLS, который поддерживает как AES, так и 3DES, и выполняет элементарную проверку X.509 (только подписи RSA).Полный код умещается в 21 Кбайт ПЗУ (для процессора ARM, код C скомпилирован с помощью инструкций большого пальца) и требует только 19 Кбайт ОЗУ, из которых 16 Кбайт предназначены для входного буфера (максимальный размер для входной записи вSSL, при условии отсутствия сжатия, составляет около 16 Кбайт).Таким образом, SSL может быть достаточно маленьким для микроконтроллера.
Как только вы упростили SSL посредством априорного выбора параметров, выбранных клиентом, вы получите протокол, который примерно такой же легкий, как и он.можно получить: оставшаяся сложность является внутренней.Если вы попытаетесь получить что-то более простое, то в итоге вы получите что-то более слабое.
Что касается существующих реализаций, по крайней мере PolarSSL предназначен для встроенных устройств и доступен по лицензии с открытым исходным кодом (GPLv2).Я не знаю, как маленький он может сжаться.Существует также CyaSSL , который также можно получить в соответствии с условиями GPLv2 и заявляет, что его можно скомпилировать в код размером 30 Кбайт (с минимальными параметрами).