{"id":185,"date":"2012-07-03T10:00:59","date_gmt":"2012-07-03T08:00:59","guid":{"rendered":"http:\/\/blog.asafety.fr\/?p=185"},"modified":"2015-11-11T01:17:38","modified_gmt":"2015-11-10T23:17:38","slug":"c-client-serveur-ssl-tls-multiplateformes-avec-openssl","status":"publish","type":"post","link":"https:\/\/www.asafety.fr\/en\/projects-and-tools\/c-client-serveur-ssl-tls-multiplateformes-avec-openssl\/","title":{"rendered":"[C] Client\/Serveur SSL\/TLS multiplateformes avec OpenSSL"},"content":{"rendered":"<p><\/p>\n<p><p>Au cours de la plupart des d\u00e9veloppements actuels de logiciels exploitant les r\u00e9seaux, la s\u00e9curit\u00e9 de ces \u00e9changes est primordiale. Une des solutions les plus employ\u00e9e de part sa facilit\u00e9 d&#8217;int\u00e9gration, sa standardisation et qui a fait ses preuves est une encapsulation via le protocole SSL\/TLS.<\/p>\n<p>SSL (<em>Secure Socket Layer<\/em>) \/ TLS (<em>Transport Layer Security<\/em>) est un protocole permettant de relier des syst\u00e8mes informatiques entre eux d\u2019une mani\u00e8re s\u00e9curis\u00e9e. Garantissant l\u2019int\u00e9grit\u00e9 des \u00e9changes, la confidentialit\u00e9 et l\u2019authentification des donn\u00e9es, ce protocole est un standard en termes de protocole s\u00e9curis\u00e9. Datant de de 1994, SSL se d\u00e9coupe en 3 versions (1.0 non-utilis\u00e9e, 2.0 jug\u00e9e \u00e0 pr\u00e9sent obsol\u00e8te et ins\u00e9curis\u00e9e et 3.0 extr\u00eamement d\u00e9ploy\u00e9e). Apr\u00e8s une standardisation du protocole par l&#8217;<a title=\"Internet Engineering task Force\" href=\"http:\/\/www.ietf.org\/\" target=\"_blank\">IETF<\/a> en 2001, SSL \u00e0 chang\u00e9 de nom pour TLS qui lui aussi se d\u00e9coupe en 3 version (1.0 tr\u00e8s d\u00e9ploy\u00e9e, 1.1 et 1.2 qui \u00e9tendent ses fonctionnalit\u00e9s).<\/p>\n<p>SSL\/TLS se d\u00e9coupe en 4 sous-protocoles:<\/p>\n<ul>\n<li><em>Handshake<\/em> : la n\u00e9gociation des param\u00e8tres de s\u00e9curit\u00e9 en tant que tel.<\/li>\n<li><em>Change Cipher Spec<\/em> : la validation de la n\u00e9gociation pr\u00e9alable, pour v\u00e9rifier que les deux partis se sont bien accord\u00e9s quant \u00e0 la cl\u00e9 ma\u00eetresse g\u00e9n\u00e9r\u00e9e, aux algorithmes \u00e0 employer etc.<\/li>\n<li><em>Alert<\/em> : protocole informatif de l&#8217;\u00e9tat de la liaison.<\/li>\n<li><em>Record<\/em> : protocole d&#8217;acheminement des donn\u00e9es de la communication. Ce protocole peut encapsuler tout autre protocole et le rend ainsi s\u00e9curis\u00e9.<\/li>\n<\/ul>\n<p>SSL\/TLS \u00e9volue \u00e0 l&#8217;inter-couche transport\/application de la pile OSI. Il est utilis\u00e9 avec d&#8217;autres protocoles standardis\u00e9s tels que HTTP, FTP ou encore SMPT en leur ajoutant un &#8220;S&#8221; final. Pour les puristes, &#8220;HTTPS&#8221;, &#8220;FTPS&#8221; ou &#8220;STMPS&#8221; ne sont pas des protocoles en tant que tel. Ce sont des encapsulations de protocoles\u00a0ins\u00e9curis\u00e9s\u00a0(HTTP) dans une couche SSL\/TLS ; d&#8217;o\u00f9 leur mise en italique dans la figure suivante.<\/p>\n<div id=\"attachment_186\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/pile_OSI_SSL-TLS.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-186\" class=\"size-medium wp-image-186\" title=\"Pile OSI et placement du protocole SSL\/TLS\" src=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/pile_OSI_SSL-TLS-300x230.png\" alt=\"Pile OSI et placement du protocole SSL\/TLS\" width=\"300\" height=\"230\" srcset=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/pile_OSI_SSL-TLS-300x230.png 300w, https:\/\/www.asafety.fr\/wp-content\/uploads\/pile_OSI_SSL-TLS.png 773w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-186\" class=\"wp-caption-text\">Pile OSI et placement du protocole SSL\/TLS<\/p><\/div>\n<p>Ce protocole se fonde initialement sur un mode de transport TCP (pouvant \u00eatre UDP pour le <a title=\"Datagram Transport Layer Security\" href=\"http:\/\/fr.wikipedia.org\/wiki\/Datagram_Transport_Layer_Security\" target=\"_blank\">DTLS<\/a>, <a title=\"Wireless Transport Layer Security\" href=\"http:\/\/fr.wikipedia.org\/wiki\/WTLS\" target=\"_blank\">WTLS<\/a>&#8230;) et s&#8217;impl\u00e9mente dans des d\u00e9veloppements logiciels par le biais d&#8217;API dont certaines des plus connues sont:<\/p>\n<ul>\n<li><a title=\"OpenSSL\" href=\"http:\/\/www.openssl.org\/\" target=\"_blank\">OpenSSL<\/a> : l&#8217;API de r\u00e9f\u00e9rence.<\/li>\n<li><a title=\"GnuTLS\" href=\"http:\/\/gnutls.org\/\" target=\"_blank\">GnuTLS<\/a> : alternative \u00e0 OpenSSL<\/li>\n<li><a title=\"yaSSL\" href=\"http:\/\/www.yassl.com\" target=\"_blank\">yaSSL<\/a> : version destin\u00e9e au monde de l&#8217;embarqu\u00e9<\/li>\n<li><a title=\"MatrixSSL\" href=\"http:\/\/www.matrixssl.org\/\" target=\"_blank\">MatrixSSL<\/a> : cible \u00e9galement le monde de l&#8217;embarqu\u00e9<\/li>\n<\/ul>\n<p>Au sein de cet article, il vous est pr\u00e9sent\u00e9 une impl\u00e9mentation simple d&#8217;un client et d&#8217;un serveur exploitant le protocole SSL\/TLS pour communiquer via l&#8217;API OpenSSL. Ce client\/serveur est multi-plateformes Windows\/Linux.<\/p>\n<p><strong>Fonctionnalit\u00e9 du serveur :<\/strong><\/p>\n<ul>\n<li>Se met en \u00e9coute sur un port d\u00e9fini<\/li>\n<li>Permet d&#8217;utiliser les versions SSL2.0, SSL3.0n SSL2.0 &#038; 3.0, TLS1.0<\/li>\n<li>Permet de charger un certificat contenant une cl\u00e9 publique \u00e0 partir d&#8217;un fichier, idem concernant la cl\u00e9 priv\u00e9e.<\/li>\n<li>Permet d&#8217;utiliser un certificat contenant une cl\u00e9 publique et une cl\u00e9 priv\u00e9e cod\u00e9s en dur dans l&#8217;application, au format PEM (encodage base64 du format DER).<\/li>\n<li>Permet de g\u00e9n\u00e9rer un nouveau certificat et une nouvelle cl\u00e9 publique dynamiquement \u00e0 chaque lancement du serveur.<\/li>\n<li>Le serveur v\u00e9rifie la correspondance entre le certificat et la cl\u00e9 priv\u00e9e avant de se mettre en \u00e9coute.<\/li>\n<li>Le serveur patiente jusqu&#8217;\u00e0 la connexion d&#8217;un client. Il affiche les d\u00e9tails du potentiel certificat envoy\u00e9 par le client (facultatif) et attend la r\u00e9ception d&#8217;un message via le protocole &#8220;<em>record<\/em>&#8220;.<\/li>\n<li>Lorsqu&#8217;un message arrive, celui-ci est directement retourn\u00e9 au client (<em>ping-pong<\/em>) puis le serveur attend une nouvelle connexion.<\/li>\n<\/ul>\n<div><strong>Code source du serveur :<\/strong><\/div>\n<div>[c]\/** SSL\/TLS Server&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * SSL\/TLS server demonstration. This source code is cross-plateforme Windows and Linux.&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * Compile under Linux with : g++ main.cpp -Wall -lssl -lcrypto -o main&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * Certificat and private key to protect transaction can be used from :&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * &#8211; External(s) file(s), created with command : openssl req -x509 -nodes -newkey rsa:2048 -keyout server.pem -out server.pem&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * &#8211; Internal uniq hardcoded certificat and private key, equal into each server instance&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * &#8211; Randomly generated certificat and private key, best solution to used dynamic keying material at each server lauching.&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * Usage :&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * # run the server on port 1337 for SSLv2&amp;amp;amp;amp;amp;amp;3 protocol with internals key and certificat&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * $ [.\/]server[.exe] 1337&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * # run the server on port 1337 for TLSv1 protocol with key and certificat in server.pem file&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * $ [.\/]server[.exe] 1337 1 server.pem server.pem&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @author x@s&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n *\/&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;#define DEFAULT_PORT 443&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;#ifdef __unix__ \/\/ __unix__ is usually defined by compilers targeting Unix systems&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n# include &amp;amp;amp;amp;amp;lt;unistd.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n# include &amp;amp;amp;amp;amp;lt;sys\/socket.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n# include &amp;amp;amp;amp;amp;lt;arpa\/inet.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n# include &amp;amp;amp;amp;amp;lt;resolv.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n# define SOCKLEN_T socklen_t&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n# define CLOSESOCKET close&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n#elif defined _WIN32 \/\/ _Win32 is usually defined by compilers targeting 32 or 64 bit Windows systems&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n# include &amp;amp;amp;amp;amp;lt;windows.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n# include &amp;amp;amp;amp;amp;lt;winsock2.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n# define SOCKLEN_T int&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n# define CLOSESOCKET closesocket&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n#endif&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;#include &amp;amp;amp;amp;amp;lt;stdio.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n#include &amp;amp;amp;amp;amp;lt;errno.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n#include &amp;amp;amp;amp;amp;lt;unistd.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n#include &amp;amp;amp;amp;amp;lt;malloc.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n#include &amp;amp;amp;amp;amp;lt;string.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;#include &amp;amp;amp;amp;amp;lt;openssl\/crypto.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n#include &amp;amp;amp;amp;amp;lt;openssl\/x509v3.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n#include &amp;amp;amp;amp;amp;lt;openssl\/pem.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n#include &amp;amp;amp;amp;amp;lt;openssl\/ssl.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n#include &amp;amp;amp;amp;amp;lt;openssl\/err.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n#include &amp;amp;amp;amp;amp;lt;openssl\/bio.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;#ifdef _WIN32&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\nWSADATA wsa; \/\/ Winsock data&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n#endif&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;\/**&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * printUsage function who describe the utilisation of this script.&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @param char* bin : the name of the current binary.&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n *\/&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\nvoid printHeader(char* bin){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[?] Usage : %s &amp;amp;amp;amp;amp;lt;port&amp;amp;amp;amp;amp;gt; [&amp;amp;amp;amp;amp;lt;method&amp;amp;amp;amp;amp;gt; &amp;amp;amp;amp;amp;lt;server_cert&amp;amp;amp;amp;amp;gt; &amp;amp;amp;amp;amp;lt;server_private_key&amp;amp;amp;amp;amp;gt;]\\n&amp;amp;amp;amp;amp;quot;, bin);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[?] With &amp;amp;amp;amp;amp;lt;method&amp;amp;amp;amp;amp;gt; :\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;\\t1 :\\tTLS v1\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;\\t2 :\\tSSL v2 (deprecated so disabled)\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;\\t3 :\\tSSL v3\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;\\t4 :\\tSSL v2 &amp;amp;amp;amp;amp;amp; v3 (default)\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n return;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n}&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;\/**&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * makeServerSocket function who create a traditionnal server socket, bind it and listen to it.&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @param int port : the port to listen&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @return int socket : the socket number created&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n *\/&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\nint makeServerSocket(int port){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n int sock;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n struct sockaddr_in addr;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n #ifdef _WIN32&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n WSAStartup(MAKEWORD(2,0),&amp;amp;amp;amp;amp;amp;wsa);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n #endif&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n sock = socket(PF_INET, SOCK_STREAM, 0);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n memset(&amp;amp;amp;amp;amp;amp;addr, 0, sizeof(addr));&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n addr.sin_family = AF_INET;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n addr.sin_port = htons(port);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n addr.sin_addr.s_addr = INADDR_ANY;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n if(bind(sock, (struct sockaddr*)&amp;amp;amp;amp;amp;amp;addr, sizeof(addr)) != 0){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n perror(&amp;amp;amp;amp;amp;quot;[-] Can&#8217;t bind port on indicated port&#8230;&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n abort();&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n }&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n if(listen(sock, 10) != 0){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n perror(&amp;amp;amp;amp;amp;quot;[-] Can&#8217;t listening on indicated port&#8230;&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n abort();&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n }&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[+] Server listening on the %d port&#8230;\\n&amp;amp;amp;amp;amp;quot;, port);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n return sock;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n}&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;\/**&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * callbackGeneratingKey called during internal dynamic key generation.&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * A callback function may be used to provide feedback about the&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * progress of the key generation. If callback is not NULL, it will&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * be called as follows:&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * &#8211; While a random prime number is generated, it is called as&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * described in BN_generate_prime(3).&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * &#8211; When the n-th randomly generated prime is rejected as not&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * suitable for the key, callback(2, n, cb_arg) is called.&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * &#8211; When a random p has been found with p-1 relatively prime to e,&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * it is called as callback(3, 0, cb_arg).&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * The process is then repeated for prime q with callback(3, 1, cb_arg).&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @param int p : callback random prime flag&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @param int n : n-th randomly generation&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @param void *arg : argument for the callback passed from initial call&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n *\/&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\nstatic void callbackGeneratingKey(int p, int n, void *arg){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n char c=&#8217;B&#8217;;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n if (p == 0) c = &#8216;.&#8217;; \/\/ generating key&#8230;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n if (p == 1) c = &#8216;+&#8217;; \/\/ near the end of generation&#8230;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n if (p == 2) c = &#8216;*&#8217;; \/\/ rejecting current random generation&#8230;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n if (p == 3) c = &#8216;\\n&#8217;; \/\/ key generated&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n fputc(c, stderr); \/\/ print generation state&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n}&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;\/**&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * makekCert function who create the server certificat containing public key and&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * the server private key signed (dynamic method).&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @param X509 **x509p : potential previous instance of X509 certificat&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @param EVP_PKEY **pkeyp : potential previous instance of private key&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @param int bits : length of the RSA key to generate (precaunized greater than or equal 2048b)&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @param int serial : long integer representing a serial number&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @param int days : number of valid days of the certificat&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @see Inpired from \/demos\/x509\/mkcert.c file of OpenSSL library.&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n *\/&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\nvoid makekCert(X509 **x509p, EVP_PKEY **pkeyp, int bits, int serial, int days){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n X509 *x;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n EVP_PKEY *pk;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n RSA *rsa;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n X509_NAME *name = NULL;&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;if((pkeyp == NULL) || (*pkeyp == NULL)){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n if((pk = EVP_PKEY_new()) == NULL)&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n abort();&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n } else&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n pk= *pkeyp;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n if((x509p == NULL) || (*x509p == NULL)){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n if ((x = X509_new()) == NULL)&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n abort();&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n } else&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n x= *x509p;&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;\/\/ create RSA key&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n rsa = RSA_generate_key(bits, RSA_F4, callbackGeneratingKey, NULL);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n if(!EVP_PKEY_assign_RSA(pk, rsa))&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n abort();&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n rsa = NULL;&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;X509_set_version(x, 2); \/\/ why not 3 ?&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n ASN1_INTEGER_set(X509_get_serialNumber(x), serial);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n X509_gmtime_adj(X509_get_notBefore(x), 0); \/\/ define validation begin cert&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n X509_gmtime_adj(X509_get_notAfter(x), (long)60*60*24*days); \/\/ define validation end cert&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n X509_set_pubkey(x, pk); \/\/ define public key in cert&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n name = X509_get_subject_name(x);&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;\/\/ This function creates and adds the entry, working out the&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n \/\/ correct string type and performing checks on its length.&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n \/\/ Normally we&#8217;d check the return value for errors&#8230;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n X509_NAME_add_entry_by_txt(name, &amp;amp;amp;amp;amp;quot;C&amp;amp;amp;amp;amp;quot;, MBSTRING_ASC, (const unsigned char*)&amp;amp;amp;amp;amp;quot;XX&amp;amp;amp;amp;amp;quot;, -1, -1, 0); \/\/ useless if more anonymity needed&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n X509_NAME_add_entry_by_txt(name,&amp;amp;amp;amp;amp;quot;CN&amp;amp;amp;amp;amp;quot;, MBSTRING_ASC, (const unsigned char*)&amp;amp;amp;amp;amp;quot;ASRAT&amp;amp;amp;amp;amp;quot;, -1, -1, 0); \/\/ useless if more anonymity needed&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;\/\/ Its self signed so set the issuer name to be the same as the subject.&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n X509_set_issuer_name(x, name);&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;if(!X509_sign(x, pk, EVP_md5())) \/\/ secured more with sha1? md5\/sha1? sha256?&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n abort();&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;*x509p = x;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n *pkeyp = pk;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n return;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n}&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;\/**&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * initSSLContext function who initialize the SSL\/TLS engine with right method\/protocol&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @param int ctxMethod : the number coresponding to the method\/protocol to use&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @return SSL_CTX *ctx : a pointer to the SSL context created&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n *\/&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\nSSL_CTX* initSSLContext(int ctxMethod){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n const SSL_METHOD *method;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n SSL_CTX *ctx;&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;SSL_library_init(); \/\/ initialize the SSL library&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n SSL_load_error_strings(); \/\/ bring in and register error messages&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n OpenSSL_add_all_algorithms(); \/\/ load usable algorithms&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;switch(ctxMethod){ \/\/ create new client-method instance&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n case 1 :&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n method = TLSv1_server_method();&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[+] Use TLSv1 method.\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n break;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n \/\/ SSLv2 isn&#8217;t sure and is deprecated, so the latest OpenSSL version on Linux delete his implementation.&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n \/*case 2 :&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n method = SSLv2_server_method();&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[+] Use SSLv2 method.\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n break;*\/&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n case 3 :&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n method = SSLv3_server_method();&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[+] Use SSLv3 method.\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n break;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n case 4 :&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n method = SSLv23_server_method();&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[+] Use SSLv2&amp;amp;amp;amp;amp;amp;3 method.\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n break;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n default :&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n method = SSLv23_server_method();&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[+] Use SSLv2&amp;amp;amp;amp;amp;amp;3 method.\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n }&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;ctx = SSL_CTX_new(method); \/\/ create new context from selected method&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n if(ctx == NULL){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n ERR_print_errors_fp(stderr);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n abort();&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n }&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n return ctx;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n}&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;\/**&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * loadCertificates function who load private key and certificat from files.&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * 3 mecanisms available :&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * &#8211; loading certificate and private key from file(s)&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * &#8211; use embed hardcoded certificate and private key in the PEM format&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * &#8211; generate random and dynamic certificate and private key at each server&#8217;s launch instance.&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @param SSL_CTX* ctx : the SSL\/TLS context&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @param char *certFile : filename of the PEM certificat&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @param char *keyFile : filename of the PEM private key&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n *\/&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\nvoid loadCertificates(SSL_CTX* ctx, const char* certFile, const char* keyFile){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n \/\/ The server private key in PEM format, if internals required&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n \/*const char *keyBuffer = &amp;amp;amp;amp;amp;quot;&#8212;&#8211;BEGIN PRIVATE KEY&#8212;&#8211;\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDP1SC2T\/+NW59H\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;CYF0mzkoFcObGUAkoK7mvemFk2P99FLcKbqYKZZDMLVBg+tLU12kuIefYrC4G8F7\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;K8WReTZ+ZBWI1h+gEBhilZ0O4+XXoww2tjVyuHNe5twSxOhRYvoPNSKMLPR70Oij\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;b4nHSyu0a7JHAWvEdpk7HIeWugKYbY8ss58iCmkWGcrop\/od6SPW12W+ugAyDGD9\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;F1Otrmb+T3KQPadlPgGdNprvVXHjk+eS1RcwOsT630usogl1JqhoAT4ViQvxDP0J\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;LEffPvG2Iow2WoRtjLGfKqGinhtrLyuht5s3XBzm05kHYNVDc1vkWPvk4PuoIfTp\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;ezrxuMR5AgMBAAECggEADV6wlAnhbr6OKIu8ADxcGPANfVTKg5Cyr7VX6Hfq3tNw\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;4SjuEAvc1sWzY1uRL29VfttAHkjDBZUDhWDzfMBHeSoHGJ5tumZOq0jkqaiPiKe8\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;iWh\/V7n18gz3610vdMzhOUk5x7q8n5p43Mq4GlIDpb+n4Fl\/DUxz3xGex1t\/\/z4v\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;W7U1j+dKxiZGaNz2dyVVM7eHaynvEE4QL8i4msjhmrFSItqjF\/0M\/CJ0oEPPb2VL\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;6GLSfqCcjBzt0Sy93gVNhxO+KjMpumB1a9omDxBkTO4HF4xoDojrtkgYXaUx3uKk\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;Gc35xLoOdkn\/pNDDzGzQT+xWYOO6IBxJGj\/INvnIAQKBgQDwdVsC02z0Pb4JrlcM\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;KRBGyJetxxQguiZ3TYMIGMMP\/fQZn3uofmWxNGPbk20VmDXXtZFsCJG7zrFVOUe3\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;eXIPjE2ho80aPAMWeiPAMkivhj0OnPHTg5sof75uH5F9zPerw7kgcwZMFPZk\/Za0\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;53gxjakIZo2mlrtaomZLD\/U+2QKBgQDdQ\/EQlMG5+sjGn6MQrqpzlIT+PYQ4OmFE\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;p8B6AKtwC1oVKkY\/1dWVUQ33DqTbXv8i8zN2mplMaFM\/6rJNcY4BhKwBm+pW5XuV\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;LHLMGGkubues3bCb2OHax8DOm\/i6hDJ14cEORsZSA2Jt6qzxaQ9HrtCZy29S5FIg\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;cFGCLHNuoQKBgAIe5tiViMZ2rPBk6zueORiGuF+9+712JtSyiE9P+Jhxgu+e6nZH\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;9xmi\/qZ3HGUuXHs0jL3JLY\/ceM\/pm2pQ1eKxOBYO3cY3dUeDeEE\/sEhsBKnWVIOr\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;C3lF9yX9fUkAv8ZyCXXxzcJqBOpLGkMqL3Mwbqc2UFWBytE30XMkBuOxAoGBAI8l\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;qGzAwIBwpboShy2AwteZq1zMMaEq68i9+oEzs7X+Mh5lRiOAVPiQAsfmGnOuBsP2\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;sUG3DRxolgtQ7F+76lJDIgC8fSQQvR4qLm6qEEoxCANHPT3mV1\/yQWOpdoY8hmTL\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;U9nHogBnHiPcYlygSnlmuJ\/3BCONgTBpWeIsndVhAoGAOFpnITiCmUFc5AUaxglZ\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;fz4fC+Mt4SF4XGFUtL8feGN4XGXHU6lQVQqu1yaRpYjSTabq6V6LLvVOh1sb+qZw\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;sSB4hC5C+VjjIBScsaN0pytFdL0+FeRaGPVBUs\/yBWzfhi6Lm9vE8ebE0fMxr7b5\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;gw4qJCTvXYDZ8ZOIwG4YRRs=\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;&#8212;&#8211;END PRIVATE KEY&#8212;&#8211;\\n&amp;amp;amp;amp;amp;quot;;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n \/\/ The server certificat containing public key in PEM format&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n const char *certBuffer = &amp;amp;amp;amp;amp;quot;&#8212;&#8211;BEGIN CERTIFICATE&#8212;&#8211;\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;MIIDiTCCAnGgAwIBAgIJAK0drhMsLqg2MA0GCSqGSIb3DQEBBQUAMFsxCzAJBgNV\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;BAYTAlhYMQowCAYDVQQIDAFYMQowCAYDVQQHDAFYMQowCAYDVQQKDAFYMQowCAYD\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;VQQLDAFYMQowCAYDVQQDDAFYMRAwDgYJKoZIhvcNAQkBFgFYMB4XDTEyMDMwMTEz\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;NDcwM1oXDTEyMDMzMTEzNDcwM1owWzELMAkGA1UEBhMCWFgxCjAIBgNVBAgMAVgx\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;CjAIBgNVBAcMAVgxCjAIBgNVBAoMAVgxCjAIBgNVBAsMAVgxCjAIBgNVBAMMAVgx\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;EDAOBgkqhkiG9w0BCQEWAVgwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;AQDP1SC2T\/+NW59HCYF0mzkoFcObGUAkoK7mvemFk2P99FLcKbqYKZZDMLVBg+tL\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;U12kuIefYrC4G8F7K8WReTZ+ZBWI1h+gEBhilZ0O4+XXoww2tjVyuHNe5twSxOhR\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;YvoPNSKMLPR70Oijb4nHSyu0a7JHAWvEdpk7HIeWugKYbY8ss58iCmkWGcrop\/od\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;6SPW12W+ugAyDGD9F1Otrmb+T3KQPadlPgGdNprvVXHjk+eS1RcwOsT630usogl1\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;JqhoAT4ViQvxDP0JLEffPvG2Iow2WoRtjLGfKqGinhtrLyuht5s3XBzm05kHYNVD\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;c1vkWPvk4PuoIfTpezrxuMR5AgMBAAGjUDBOMB0GA1UdDgQWBBRG76BYshU93k3q\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;hy6gIpMl\/VUDhTAfBgNVHSMEGDAWgBRG76BYshU93k3qhy6gIpMl\/VUDhTAMBgNV\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;HRMEBTADAQH\/MA0GCSqGSIb3DQEBBQUAA4IBAQBCGmmyVt9gRJ0fuWh9o5MnT70m\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;nwbt0fM3Z6AO\/Gkc0fkc6H4pZ3tnEtubtXBBm24wMFfXutcXFAjZMk0OTCPj5U8I\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;0\/yjk5zuBdgktIFUTjs4Os\/Ct2wvIfIiOm\/WeL3FZOWli\/HOX1PqjbeF\/HXN+069\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;31U++ajDzM0uDFGc7dEPTXTEuE7w81696n9PTF0PSLt3\/xIOwkMx28Wykc9XKgAp\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;MztGxeEtyb32ib+zL7UhEyuDHnW4haC8QsjG1QLpESTMMASbRe6QxrYxuMFjkf+g\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;FMw9jUYsThZropV2gFipcltT63ncyk0\/W8gj1zmF6QsC46r1MFPUfnc\/I6dx\\n&amp;amp;amp;amp;amp;quot;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n &amp;amp;amp;amp;amp;quot;&#8212;&#8211;END CERTIFICATE&#8212;&#8211;\\n&amp;amp;amp;amp;amp;quot;;*\/&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n X509 *cert = NULL;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n EVP_PKEY *pkey = NULL;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n \/\/ RSA *rsa = NULL; \/\/ if internal private key and certificat required&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n \/\/BIO *cbio, *kbio; \/\/ if internal private key and certificat required&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;if(certFile == NULL || keyFile == NULL){&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;\/*&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n \/\/ if internal certificat and private key required&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[*] Loading internal server&#8217;s certificat and private key.\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n cbio = BIO_new_mem_buf((void*)certBuffer, -1);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n PEM_read_bio_X509(cbio, &amp;amp;amp;amp;amp;amp;cert, 0, NULL);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n SSL_CTX_use_certificate(ctx, cert);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n kbio = BIO_new_mem_buf((void*)keyBuffer, -1);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n PEM_read_bio_RSAPrivateKey(kbio, &amp;amp;amp;amp;amp;amp;rsa, 0, NULL);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n SSL_CTX_use_RSAPrivateKey(ctx, rsa);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n *\/&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;printf(&amp;amp;amp;amp;amp;quot;[*] Generate random server&#8217;s certificat and private key.\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n makekCert(&amp;amp;amp;amp;amp;amp;cert, &amp;amp;amp;amp;amp;amp;pkey, 2048, 0, 0);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n SSL_CTX_use_certificate(ctx, cert);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n SSL_CTX_use_PrivateKey(ctx, pkey);&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;\/\/ set the local certificate from certFile if certFile specified&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n \/\/ set the private key from keyFile (may be the same as certFile) if specified&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n } else if(SSL_CTX_use_certificate_file(ctx, certFile, SSL_FILETYPE_PEM) &amp;amp;amp;amp;amp;lt;= 0 ||&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n SSL_CTX_use_RSAPrivateKey_file(ctx, keyFile, SSL_FILETYPE_PEM) &amp;amp;amp;amp;amp;lt;= 0){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n ERR_print_errors_fp(stderr);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n abort();&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n } else&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[*] Server&#8217;s certificat and private key loaded from file.\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;\/\/ verify private key match the public key into the certificate&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n if(!SSL_CTX_check_private_key(ctx)){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n fprintf(stderr, &amp;amp;amp;amp;amp;quot;[-] Private key does not match the public certificate&#8230;\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n abort();&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n } else&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[+] Server&#8217;s private key match public certificat !\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n return;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n}&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;\/**&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * showCerts function who catch and print out certificate&#8217;s data from the client.&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @param SSL* ssl : the SSL\/TLS connection&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n *\/&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\nvoid showCerts(SSL* ssl){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n X509 *cert;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n char *subject, *issuer;&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;cert = SSL_get_peer_certificate(ssl); \/\/ get the client&#8217;s certificate&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n if(cert != NULL){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n subject = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0); \/\/ get certificate&#8217;s subject&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n issuer = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0); \/\/ get certificate&#8217;s issuer&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;printf(&amp;amp;amp;amp;amp;quot;[+] Client certificates :\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;\\tSubject: %s\\n&amp;amp;amp;amp;amp;quot;, subject);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;\\tIssuer: %s\\n&amp;amp;amp;amp;amp;quot;, issuer);&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;free(subject); \/\/ free the malloc&#8217;ed string&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n free(issuer); \/\/ free the malloc&#8217;ed string&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n X509_free(cert); \/\/ free the malloc&#8217;ed certificate copy&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n }&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n else&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[-] No client&#8217;s certificates\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n return;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n}&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;\/**&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * routine function who treat the content of data received and reply to the client.&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * this function is threadable and his context sharedable.&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @param SSL* ssl : the SSL\/TLS connection&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n *\/&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\nvoid routine(SSL* ssl){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n char buf[1024], reply[1024];&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n int sock, bytes;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n const char* echo = &amp;amp;amp;amp;amp;quot;Enchante %s, je suis ServerName.\\n&amp;amp;amp;amp;amp;quot;;&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;if(SSL_accept(ssl) == -1) \/\/ accept SSL\/TLS connection&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n ERR_print_errors_fp(stderr);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n else{&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[+] Cipher used : %s\\n&amp;amp;amp;amp;amp;quot;, SSL_get_cipher(ssl));&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n showCerts(ssl); \/\/ get any client certificates&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n bytes = SSL_read(ssl, buf, sizeof(buf)); \/\/ read data from client request&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n if(bytes &amp;amp;amp;amp;amp;gt; 0){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n buf[bytes] = 0;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[+] Client data received : %s\\n&amp;amp;amp;amp;amp;quot;, buf);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n sprintf(reply, echo, buf); \/\/ construct response&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n SSL_write(ssl, reply, strlen(reply)); \/\/ send response&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n } else {&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n switch(SSL_get_error(ssl, bytes)){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n case SSL_ERROR_ZERO_RETURN :&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;SSL_ERROR_ZERO_RETURN : &amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n break;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n case SSL_ERROR_NONE :&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;SSL_ERROR_NONE : &amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n break;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n case SSL_ERROR_SSL:&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;SSL_ERROR_SSL : &amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n break;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n }&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n ERR_print_errors_fp(stderr);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n }&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;}&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n sock = SSL_get_fd(ssl); \/\/ get traditionnal socket connection from SSL connection&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n SSL_shutdown(ssl);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n SSL_free(ssl); \/\/ release SSL connection state&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n CLOSESOCKET(sock); \/\/ close socket&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n}&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;\/**&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * main function who coordinate the socket and SSL connection creation, then receive and emit data to and from the client.&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n *\/&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\nint main(int argc, char **argv){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n int sock, ctxMethod, port;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n SSL_CTX *ctx;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n const char *certFile, *keyFile;&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;if(argc != 2 &amp;amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp;amp; argc != 5){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printHeader(argv[0]);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n exit(0);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n }&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;port = (atoi(argv[1]) &amp;amp;amp;amp;amp;gt; 0 &amp;amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp;amp; atoi(argv[1]) &amp;amp;amp;amp;amp;lt; 65535) ? atoi(argv[1]) : DEFAULT_PORT;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n ctxMethod = (argc &amp;amp;amp;amp;amp;gt;= 3) ? atoi(argv[2]) : 4; \/\/ SSLv2, SSLv3, SSLv2&amp;amp;amp;amp;amp;amp;3 or TLSv1&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n ctx = initSSLContext(ctxMethod); \/\/ load SSL library and dependances&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n certFile = (argc &amp;amp;amp;amp;amp;gt;= 4) ? argv[3] : NULL;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n keyFile = (argc &amp;amp;amp;amp;amp;gt;= 5) ? argv[4] : NULL;&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;loadCertificates(ctx, certFile, keyFile); \/\/ load certificats and keys&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;sock = makeServerSocket(port); \/\/ make a classic server socket&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;while(42){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n struct sockaddr_in addr;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n SSL *ssl;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n SOCKLEN_T len = sizeof(addr);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n int client = accept(sock, (struct sockaddr*)&amp;amp;amp;amp;amp;amp;addr, &amp;amp;amp;amp;amp;amp;len); \/\/ accept connection of client&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[+] Connection [%s:%d]\\n&amp;amp;amp;amp;amp;quot;, inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n ssl = SSL_new(ctx); \/\/ get new SSL state with context&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n SSL_set_fd(ssl, client); \/\/ set traditionnal socket to SSL&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n routine(ssl); \/\/ apply routine to the socket&#8217;s content&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n }&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;CLOSESOCKET(sock); \/\/ close socket&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n #ifdef _WIN32&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n WSACleanup(); \/\/ Windows&#8217;s Winsock clean&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n #endif&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n SSL_CTX_free(ctx); \/\/ release SSL&#8217;s context&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n return 0;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n}&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;[\/c]<\/p>\n<\/div>\n<p><strong>Fonctionnalit\u00e9s du client :<\/strong><\/p>\n<ul>\n<li>Se connecte \u00e0 un serveur sur un port d\u00e9fini<\/li>\n<li>Utilise la version du protocole au choix entre\u00a0SSL2.0, SSL3.0n SSL2.0 &amp; 3.0, TLS1.0<\/li>\n<li>Envoi un message au serveur et attend le retour de celui-ci.<\/li>\n<\/ul>\n<div>\n<div><strong>Code source du client :<\/strong><\/div>\n<div>[c]\/** SSL\/TLS Client&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * SSL\/TLS client demonstration. This source code is cross-plateforme Windows and Linux.&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * Compile under Linux with : g++ main.cpp -Wall -lssl -lcrypto -o main&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * Usage :&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * # run the client to 127.0.0.1 on port 1337 for SSLv2&amp;amp;amp;amp;amp;amp;3 protocol&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * $ [.\/]client[.exe] 127.0.0.1 1337&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * # run the client to 127.0.0.1 on port 1337 for TLSv1 protocol&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * $ [.\/]client[.exe] 127.0.0.1 1337 1&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @author x@s&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n *\/&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;#define DEFAULT_PORT 443&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;#ifdef __unix__ \/\/ __unix__ is usually defined by compilers targeting Unix systems&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n# include &amp;amp;amp;amp;amp;lt;unistd.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n# include &amp;amp;amp;amp;amp;lt;sys\/socket.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n# include &amp;amp;amp;amp;amp;lt;resolv.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n# include &amp;amp;amp;amp;amp;lt;netdb.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n# define SOCKLEN_T socklen_t&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n# define CLOSESOCKET close&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n#elif defined _WIN32 \/\/ _Win32 is usually defined by compilers targeting 32 or 64 bit Windows systems&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n# include &amp;amp;amp;amp;amp;lt;windows.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n# include &amp;amp;amp;amp;amp;lt;winsock2.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n# define SOCKLEN_T int&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n# define CLOSESOCKET closesocket&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n#endif&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;#include &amp;amp;amp;amp;amp;lt;stdio.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n#include &amp;amp;amp;amp;amp;lt;errno.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n#include &amp;amp;amp;amp;amp;lt;malloc.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n#include &amp;amp;amp;amp;amp;lt;string.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;#include &amp;amp;amp;amp;amp;lt;openssl\/crypto.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n#include &amp;amp;amp;amp;amp;lt;openssl\/x509.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n#include &amp;amp;amp;amp;amp;lt;openssl\/pem.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n#include &amp;amp;amp;amp;amp;lt;openssl\/ssl.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n#include &amp;amp;amp;amp;amp;lt;openssl\/err.h&amp;amp;amp;amp;amp;gt;&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;#ifdef _WIN32&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\nWSADATA wsa; \/\/ Winsock data&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n#endif&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;\/**&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * printUsage function who describe the utilisation of this script.&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @param char* bin : the name of the current binary.&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n *\/&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\nvoid printHeader(char* bin){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[?] Usage : %s &amp;amp;amp;amp;amp;lt;hostname&amp;amp;amp;amp;amp;gt; &amp;amp;amp;amp;amp;lt;port&amp;amp;amp;amp;amp;gt; [&amp;amp;amp;amp;amp;lt;method&amp;amp;amp;amp;amp;gt;]\\n&amp;amp;amp;amp;amp;quot;, bin);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[?] With optional &amp;amp;amp;amp;amp;lt;method&amp;amp;amp;amp;amp;gt; :\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;\\t1 :\\tTLS v1\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;\\t2 :\\tSSL v2 (deprecated so disabled)\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;\\t3 :\\tSSL v3\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;\\t4 :\\tSSL v2 &amp;amp;amp;amp;amp;amp; v3 (default)\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n return;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n}&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;\/**&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * makeClientSocket function who create a traditionnal client socket to the hostname throught the port.&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @param char* hostname : the target to connect to&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @param int port : the port to connect throught&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @return int socket ; the socket number created&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n *\/&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\nint makeClientSocket(const char *hostname, int port){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n int sock;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n struct hostent *host;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n struct sockaddr_in addr;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n #ifdef _WIN32&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n WSAStartup(MAKEWORD(2,0),&amp;amp;amp;amp;amp;amp;wsa);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n #endif&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n if((host = gethostbyname(hostname)) == NULL ){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n perror(hostname);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n abort();&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n }&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n sock = socket(PF_INET, SOCK_STREAM, 0);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n memset(&amp;amp;amp;amp;amp;amp;addr, 0, sizeof(addr));&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n addr.sin_family = AF_INET;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n addr.sin_port = htons(port);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n addr.sin_addr.s_addr = *(long*)(host-&amp;amp;amp;amp;amp;gt;h_addr);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n if(connect(sock, (struct sockaddr*)&amp;amp;amp;amp;amp;amp;addr, sizeof(addr)) != 0){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n CLOSESOCKET(sock);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n perror(hostname);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n abort();&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n }&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n return sock;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n}&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;\/**&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * initSSLContext function who initialize the SSL\/TLS engine with right method\/protocol&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @param int ctxMethod : the number coresponding to the method\/protocol to use&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @return SSL_CTX *ctx ; a pointer to the SSL context created&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n *\/&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\nSSL_CTX* initSSLContext(int ctxMethod){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n const SSL_METHOD *method;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n SSL_CTX *ctx;&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;SSL_library_init(); \/\/ initialize the SSL library&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n SSL_load_error_strings(); \/\/ bring in and register error messages&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n OpenSSL_add_all_algorithms(); \/\/ load usable algorithms&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;switch(ctxMethod){ \/\/ create new client-method instance&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n case 1 :&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n method = TLSv1_client_method();&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[+] Use TLSv1 method.\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n break;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n \/\/ SSLv2 isn&#8217;t sure and is deprecated, so the latest OpenSSL version delete his implementation.&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n \/*case 2 :&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n method = SSLv2_client_method();&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[+] Use SSLv2 method.\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n break;*\/&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n case 3 :&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n method = SSLv3_client_method();&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[+] Use SSLv3 method.\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n break;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n case 4 :&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n method = SSLv23_client_method();&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[+] Use SSLv2&amp;amp;amp;amp;amp;amp;3 method.\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n break;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n default :&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n method = SSLv23_client_method();&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[+] Use SSLv2&amp;amp;amp;amp;amp;amp;3 method.\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n }&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;ctx = SSL_CTX_new(method); \/\/ create new context from selected method&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n if(ctx == NULL){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n ERR_print_errors_fp(stderr);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n abort();&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n }&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n return ctx;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n}&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;\/**&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * showCerts function who catch and print out certificat&#8217;s data from the server&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * @param SSL* ssl : the SSL\/TLS connection&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n *\/&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\nvoid showCerts(SSL* ssl){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n X509 *cert;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n char *subject, *issuer;&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;cert = SSL_get_peer_certificate(ssl); \/\/ get the server&#8217;s certificate&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n if(cert != NULL){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n subject = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0); \/\/ get certificat&#8217;s subject&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n issuer = X509_NAME_oneline(X509_get_issuer_name(cert), 0, 0); \/\/ get certificat&#8217;s issuer&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;printf(&amp;amp;amp;amp;amp;quot;[+] Server certificates :\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;\\tSubject: %s\\n&amp;amp;amp;amp;amp;quot;, subject);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;\\tIssuer: %s\\n&amp;amp;amp;amp;amp;quot;, issuer);&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;free(subject); \/\/ free the malloc&#8217;ed string&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n free(issuer); \/\/ free the malloc&#8217;ed string&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n X509_free(cert); \/\/ free the malloc&#8217;ed certificate copy&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n if(SSL_get_verify_result(ssl) == X509_V_OK) \/\/ check certificat&#8217;s trust&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[+] Server certificates X509 is trust!\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n else&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[-] Server certificates X509 is not trust&#8230;\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n }&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n else&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[-] No server&#8217;s certificates\\n&amp;amp;amp;amp;amp;quot;);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n return;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n}&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;\/**&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n * main function who coordinate the socket and SSL connection creation, then receive and emit data to and from the server.&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n *\/&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\nint main(int argc, char **argv){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n int sock, bytes, ctxMethod, port;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n SSL_CTX *ctx;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n SSL *ssl;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n char buf[1024];&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n char *hostname;&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;if(argc != 3 &amp;amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp;amp; argc != 4){&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printHeader(argv[0]);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n exit(0);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n }&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;hostname = argv[1];&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n port = (atoi(argv[2]) &amp;amp;amp;amp;amp;gt; 0 &amp;amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp;amp; atoi(argv[2]) &amp;amp;amp;amp;amp;lt; 65535) ? atoi(argv[2]) : DEFAULT_PORT;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n ctxMethod = (argc == 4) ? atoi(argv[3]) : 4; \/\/ SSLv2, SSLv3, SSLv2&amp;amp;amp;amp;amp;amp;3 or TLSv1&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n ctx = initSSLContext(ctxMethod); \/\/ load SSL library and dependances&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n sock = makeClientSocket(hostname, port); \/\/ make a classic socket to the hostname throught the port&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n ssl = SSL_new(ctx); \/\/ create new SSL connection state&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;SSL_set_fd(ssl, sock); \/\/ attach the socket descriptor&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;if(SSL_connect(ssl) == -1) \/\/ make the SSL connection&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n ERR_print_errors_fp(stderr);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n else{&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY); \/\/ if the server suddenly wants a new handshake,&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n \/\/ OpenSSL handles it in the background. Without this&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n \/\/ option, any read or write operation will return an&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n \/\/ error if the server wants a new handshake.&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;char msg[] = &amp;amp;amp;amp;amp;quot;ClientName&amp;amp;amp;amp;amp;quot;;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[+] Cipher used : %s\\n&amp;amp;amp;amp;amp;quot;, SSL_get_cipher(ssl));&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n showCerts(ssl); \/\/ get any certificats&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n SSL_write(ssl, msg, strlen(msg)); \/\/ encrypt and send message&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n bytes = SSL_read(ssl, buf, sizeof(buf)); \/\/ get response and decrypt content&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n buf[bytes] = 0;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n printf(&amp;amp;amp;amp;amp;quot;[+] Server data received : %s\\n&amp;amp;amp;amp;amp;quot;, buf);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n SSL_shutdown(ssl);&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n SSL_free(ssl); \/\/ release SSL connection state&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;}&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n CLOSESOCKET(sock); \/\/ close socket&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n #ifdef _WIN32&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n WSACleanup(); \/\/ Windows&#8217;s Winsock clean&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n #endif&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n SSL_CTX_free(ctx); \/\/ release SSL&#8217;s context&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n return 0;&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n}&amp;amp;amp;lt;\/p&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n&amp;amp;amp;lt;p&amp;amp;amp;gt;[\/c]<\/p>\n<\/div>\n<\/div>\n<p>L&#8217;objectif de ce client\/serveur est de disposer d&#8217;un code source d&#8217;exemple fonctionnel, cross-plateformes, \u00e9pur\u00e9, document\u00e9 et clair quand \u00e0 la mise en place d&#8217;une connexion SSL\/TLS en C pour un quelconque d\u00e9veloppement futur.<\/p>\n<p>La cr\u00e9ation du certificat et de la cl\u00e9 priv\u00e9e du serveur peut se faire avec la ligne de commande suivante (r\u00e9sultat dans un unique fichier) :<\/p>\n<p>[bash]openssl req -x509 -nodes -newkey rsa:2048 -keyout server.pem -out server.pem[\/bash]<\/p>\n<p>Compilation sous environnements Linux:<\/p>\n<p>[bash]g++ main.cpp -Wall -lssl -lcrypto -o main[\/bash]<\/p>\n<p>Sous Windows, OpenSSL doit \u00eatre install\u00e9 avec les fichiers d&#8217;en-t\u00eates disponibles dans les <em>includes<\/em> de l&#8217;IDE. Le <em>linker<\/em>de l&#8217;IDE utilis\u00e9 doit utiliser les biblioth\u00e8ques statiques d&#8217;OpenSSL (libcrypto.a et libssl.a) ou bien les DLL d&#8217;OpenSSL (libeay32.dll et libssl32.dll) doivent \u00eatre pr\u00e9sentes au c\u00f4t\u00e9 du binaire.<br \/>\nUtilisation du serveur:<\/p>\n<p>[bash]&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n# Usage :&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n# run the server on port 1337 for SSLv2&amp;amp;amp;amp;amp;amp;3 protocol with internal randomly generated key and certificate&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n$ [.\/]server[.exe] 1337&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n# run the server on port 1337 for TLSv1 protocol with key and certificate in server.pem file&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n$ [.\/]server[.exe] 1337 1 server.pem server.pem&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n[\/bash]<\/p>\n<p>Utilisation du client:<\/p>\n<p>[bash]&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n# Usage :&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n# run the client to 127.0.0.1 on port 1337 for SSLv2&amp;amp;amp;amp;amp;amp;3 protocol&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n$ [.\/]client[.exe] 127.0.0.1 1337&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n# run the client to 127.0.0.1 on port 1337 for TLSv1 protocol&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n$ [.\/]client[.exe] 127.0.0.1 1337 1&amp;amp;amp;lt;br \/&amp;amp;amp;gt;&amp;amp;lt;br \/&amp;amp;gt;&amp;lt;br \/&amp;gt;<br \/>\n[\/bash]<\/p>\n<p>L&#8217;ensemble des sources et binaires (Gcc et\u00a0<a title=\"Code::Blocks\" href=\"http:\/\/www.codeblocks.org\/\" target=\"_blank\">Code::Blocks<\/a>) sont disponibles dans l&#8217;archive suivante [<a href=\"https:\/\/www.asafety.fr\/wp-content\/uploads\/ASafety_Client-Server_OpenSSL.zip\">Client\/Server OpenSSL<\/a>]. La version utilis\u00e9e d&#8217;OpenSSL au temps de d\u00e9veloppement \u00e9tait la <a title=\"OpenSSL 1.0.0e\" href=\"http:\/\/www.openssl.org\/source\/openssl-1.0.0e.tar.gz\" target=\"_blank\">1.0.0e<\/a>.<\/p>\n<\/p>\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>Au cours de la plupart des d\u00e9veloppements actuels de logiciels exploitant les r\u00e9seaux, la s\u00e9curit\u00e9 de ces \u00e9changes est primordiale. [&hellip;]<\/p>\n","protected":false},"author":1337,"featured_media":1187,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[59,57,56,165,16,15,167],"tags":[105,108,109,101,106,102,103,96,99,95,91,104,93,90,94,107,98,100,97,88,110,111,89,112,92],"class_list":["post-185","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administration-reseaux-et-systemes","category-cryptographie","category-cryptologie","category-os","category-prog-and-dev","category-projects-and-tools","category-windows","tag-alert","tag-c-client-ssl","tag-c-server-ssl","tag-certificat","tag-change-cipher-spec","tag-cle-privee","tag-cle-publique","tag-client","tag-client-openssl","tag-der","tag-gnutls","tag-handshake","tag-matrixssl","tag-openssl","tag-pem","tag-record","tag-server","tag-server-openssl","tag-serveur","tag-ssl","tag-ssl2-0","tag-ssl3-0","tag-tls","tag-tls1-0","tag-yassl"],"_links":{"self":[{"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/posts\/185","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/users\/1337"}],"replies":[{"embeddable":true,"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/comments?post=185"}],"version-history":[{"count":24,"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/posts\/185\/revisions"}],"predecessor-version":[{"id":1645,"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/posts\/185\/revisions\/1645"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/media\/1187"}],"wp:attachment":[{"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/media?parent=185"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/categories?post=185"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.asafety.fr\/en\/wp-json\/wp\/v2\/tags?post=185"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}