2009-12-03 4 views
1

J'ai un simple stream_t tapez en C avec vos opérations de base de lecture/écriture, et la prise en charge de plusieurs implémentations sous-jacentes en utilisant des pointeurs de fonction. Un flux peut donc être sauvegardé par un fichier, un tampon char, etc.Flux de wrapper SSL en C

Un type de flux est un socket POSIX standard, et je voudrais coder un flux wrapper qui va ajouter le support SSL à un flux existant, similaire à SslStream de .NET. Donc, je pourrais écrire quelque chose comme ceci:

 
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 

J'ai écrit un code de socket SSL avant d'utiliser BIO_new_connect(...) etc. OpenSSL mais ceci est une API de niveau plus élevé que ce que je dois. Est-ce que OpenSSL expose les fonctions dont j'aurais besoin pour effectuer manuellement le handshake et le cryptage? Ou y at-il une autre bibliothèque que je peux utiliser?

Répondre

1

Je ne connais aucune bibliothèque que vous pouvez utiliser, mais vous pouvez trouver beaucoup d'échantillons. La plupart des applications en C devraient faire de même pour leur code TCP, de sorte que les versions SSL et socket ne diffèrent pas trop.

Par exemple, consultez ssl_unix.c de IMAP Pine,

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

Il fait exactement ce que vous décrivez avec OpenSSL.

1

J'ai utilisé un BIO_s_mem comme couverture pour les opérations de socket SSL. Je voudrais lire et écrire dans le socket moi-même (plutôt que de donner le handle à OpenSSL et de le faire lire/écrire). La poignée de main est faite lorsque vous appelez SSL_accept (côté serveur) ou SSL_connect (côté client). Autre que cela, appelez simplement SSL_read et SSL_write pour faire la lecture et l'écriture.