Поток обертки SSL в C

У меня есть простой тип stream_t на C с вашими базовыми операциями чтения / записи и поддержка нескольких базовых реализаций с использованием указателей на функции. Таким образом, поток может поддерживаться файлом, буфером символов и т. Д.

Один тип потока - это стандартный сокет POSIX, и я хотел бы закодировать поток-оболочку, который добавит поддержку SSL в существующий поток, аналогично .NET SslStream. Так что я мог написать что-то вроде этого:

stream_t *socket = something();

// wrap existing stream and perform handshake as client
stream_t *ssl_stream = ssl_stream_create(socket);
ssl_stream_authenticate_as_user(ssl_stream);

// now all read/writes are encrypted and passed through to the wrapped stream

Я написал код сокета SSL перед использованием OpenSSL BIO_new_connect(...) и т. Д., Но это API более высокого уровня, чем то, что мне нужно. Предоставляет ли OpenSSL функции, которые мне понадобятся для ручного подтверждения и шифрования? Или есть еще одна библиотека, которую я могу использовать?


person Mike Weller    schedule 03.12.2009    source источник


Ответы (2)


Я не знаю каких-либо библиотек, которые вы могли бы использовать, но вы можете найти множество примеров. Большинству приложений на C пришлось бы делать то же самое для своего TCP-кода, поэтому версии SSL и необработанных сокетов не слишком сильно отличаются.

Например, посмотрите ssl_unix.c из Pine IMAP,

https://svn.cac.washington.edu/public/alpine/snapshots/imap/src/osdep/unix/

Он делает именно то, что вы описываете, с помощью OpenSSL.

person ZZ Coder    schedule 04.12.2009

Я использовал BIO_s_mem в качестве прикрытия для операций с сокетами SSL. Я бы сам читал и записывал в сокет (вместо того, чтобы отдавать дескриптор OpenSSL и заставлять его выполнять чтение / запись). Рукопожатие выполняется, когда вы вызываете SSL_accept (на стороне сервера) или SSL_connect (на стороне клиента). В остальном просто вызовите SSL_read и SSL_write, чтобы читать и писать.

person Graeme Perrow    schedule 03.12.2009