OpenSSL - traitements bas niveau (pro only)

OpenSSL - traitements bas niveau (pro only) - C++ - Programmation

Marsh Posté le 31-07-2007 à 10:31:42    

Bonjour,
 
Je souhaiterais utiliser OpenSSL pour implémenter le protocole SSL (ou TLS) pour crypter la communication entre un client et un serveur par exemple. Jusque là tout va bien. J'ai recopié depuis ce lien les infos suivantes sur la manière de réaliser ce que je veux avec les API SSPI Windows.
 

Citation :

SSPI Overview and Steps
 
SSPI stands for Security Support Provider Interface. It is an abstraction layer over the security services provided by windows. SSL/TLS itself is implemented in Secure Channel security provider and SSPI abstracts it for us. SSPI works by taking and returning data blobs to be sent to remote party. This way it allows us most flexibility in choosing what protocol (for ex., tcp/ip) to use and what to do with encrypted/decrypted data. One thing to be aware of is making sure the data is a stream and nothing is out of sequence. SSPI provides a number of built-in protocols Kerberos, NTLM, SSL/TLS. There is almost exactly the same sequence of function calls for either of them. In SSL/TLS case there is a little more to be done.
 
Client Side:
1) Open Certificate store. Choose what certificate to use. Call AcquireCredentialsHandle.
2) When you need to connect. Call InitializeSecurityContext. Send out data blob that is returned.
3) Go into handshake loop with remote party by calling InitializeSecurityContext passing in received data blobs and sending out returned data blobs until success is returned.
4) When need to send data out, call EncryptMessage and send returned encrypted data blob to remote party.
5) When need to decrypt received data, call DecryptMessage and process decrypted data blob

6) When done, call ApplyControlToken with SCHANNEL_SHUTDOWN. Call InitializeSecurityContext and send out returned data blob.
 
Server Side:
1) Open Certificate store. Choose what certificate to use. Call AcquireCredentialsHandle.
2) When you receive new connection from client, call AcceptSecurityContext. Send out data blob that is returned.
3) Go into handshake loop with remote party by calling AcceptSecurityContext passing in received data blobs and sending out returned data blobs until success is returned.
4) When need to send data out, call EncryptMessage and send returned encrypted data blob to remote party.
5) When need to decrypt received data, call DecryptMessage and process decrypted data blob

6) When done, call ApplyControlToken with SCHANNEL_SHUTDOWN. Call AcceptSecurityContext and send out returned data blob.


 
En gros, je souhaite avoir le contrôle sur la manière d'envoyer les données. Dans l'exemple avec les API SSPI Windows, on encrypte les données avec ces API, puis on envoye les "data blob" de la "manière qu'on veut". En pratique on utilisera par exemple les sockets windows (TCP/IP), mais on peut imaginer envoyer les données en série, etc.
 
Ce que je reproche à OpenSSL dans ce que j'ai vu, c'est que lorsqu'on veut utiliser cette API, elle gère tout automatiquement. Par exemple, sous OpenSSL, on peut faire :

Citation :


initialisation des sockets, BIO, contexte ssl, etc
...
char* request = "voici ma requete a envoyer";
request_len = strlen(request);
SSL_write(ssl, request, request_len);


La fonction SSL_write() s'occupe donc d'encrypter,et d'envoyer, on ne peut pas préciser la manière d'envoyer les données.
 
Sous SSPI Windows, on peut faire :

Citation :


initialisation des sockets, contexte ssl, etc
SecBufferDesc   Message; // initialisation des buffers à envoyer
...
scRet = g_pSSPI->EncryptMessage(phContext, 0, &Message, 0); // encryption du message
send(Socket, ...); // envoi du message crypté de la manière qu'on veut


 
Est-ce que quelqu'un sait si on peut faire le même genre de chose sous OpenSSL ?
Ai-je été clair ? Je l'espère mais n'hésitez pas à me demander plus d'information si ce n'est pas le cas.

Reply

Marsh Posté le 31-07-2007 à 10:31:42   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed