<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>SSL and TLS — Botan</title> <link rel="stylesheet" href="_static/agogo.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <script type="text/javascript"> var DOCUMENTATION_OPTIONS = { URL_ROOT: './', VERSION: '1.10.17', COLLAPSE_INDEX: false, FILE_SUFFIX: '.html', HAS_SOURCE: true }; </script> <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> <link rel="top" title="Botan" href="index.html" /> <link rel="next" title="BigInt" href="bigint.html" /> <link rel="prev" title="Certificate Handling" href="x509.html" /> </head> <body> <div class="header-wrapper"> <div class="header"> <h1>Botan</h1> </div> </div> <div class="content-wrapper"> <div class="content"> <div class="document"> <div class="documentwrapper"> <div class="bodywrapper"> <div class="body"> <div class="section" id="ssl-and-tls"> <span id="ssl-api"></span><h1>SSL and TLS<a class="headerlink" href="#ssl-and-tls" title="Permalink to this headline">¶</a></h1> <div class="versionadded"> <p><span class="versionmodified">New in version 1.9.4.</span></p> </div> <p>Botan supports both client and server implementations of the SSL/TLS protocols, including SSL v3, TLS v1.0, and TLS v1.1. The insecure and obsolete SSL v2 is not supported.</p> <p>The implementation uses <tt class="docutils literal"><span class="pre">std::tr1::function</span></tt>, so it may not have been compiled into the version you are using; you can test for the feature macro <tt class="docutils literal"><span class="pre">BOTAN_HAS_SSL_TLS</span></tt> to check.</p> <div class="section" id="tls-clients"> <h2>TLS Clients<a class="headerlink" href="#tls-clients" title="Permalink to this headline">¶</a></h2> <dl class="class"> <dt id="TLS_Client"> <em class="property">class </em><tt class="descname">TLS_Client</tt><a class="headerlink" href="#TLS_Client" title="Permalink to this definition">¶</a></dt> <dd><dl class="function"> <dt id="TLS_Client::TLS_Client__std::tr1::function:s.byteP.s:.std::tr1::function:void.byteCP.s:.TLS_PolicyCR.RandomNumberGeneratorR"> <tt class="descname">TLS_Client</tt><big>(</big>std::tr1::function<size_t, byte*, size_t> <em>input_fn</em>, std::tr1::function<void, const byte*, size_t> <em>output_fn</em>, const TLS_Policy& <em>policy</em>, RandomNumberGenerator& <em>rng</em><big>)</big><a class="headerlink" href="#TLS_Client::TLS_Client__std::tr1::function:s.byteP.s:.std::tr1::function:void.byteCP.s:.TLS_PolicyCR.RandomNumberGeneratorR" title="Permalink to this definition">¶</a></dt> <dd></dd></dl> <p>Creates a TLS client. It will call <em>input_fn</em> to read bytes from the network and call <em>output_fn</em> when bytes need to be written to the network.</p> <dl class="function"> <dt id="TLS_Client::read__byteP.s"> size_t <tt class="descname">read</tt><big>(</big>byte* <em>buf</em>, size_t <em>buf_len</em><big>)</big><a class="headerlink" href="#TLS_Client::read__byteP.s" title="Permalink to this definition">¶</a></dt> <dd></dd></dl> <p>Reads up to <em>buf_len</em> bytes from the open connection into <em>buf</em>, returning the number of bytes actually written.</p> <dl class="function"> <dt id="TLS_Client::write__byteCP.s"> void <tt class="descname">write</tt><big>(</big>const byte* <em>buf</em>, size_t <em>buf_len</em><big>)</big><a class="headerlink" href="#TLS_Client::write__byteCP.s" title="Permalink to this definition">¶</a></dt> <dd></dd></dl> <p>Writes <em>buf_len</em> bytes in <em>buf</em> to the remote side</p> <dl class="function"> <dt id="TLS_Client::close"> void <tt class="descname">close</tt><big>(</big><big>)</big><a class="headerlink" href="#TLS_Client::close" title="Permalink to this definition">¶</a></dt> <dd></dd></dl> <p>Closes the connection</p> <dl class="function"> <dt id="TLS_Client::peer_cert_chain"> std::vector<X509_Certificate> <tt class="descname">peer_cert_chain</tt><big>(</big><big>)</big><a class="headerlink" href="#TLS_Client::peer_cert_chain" title="Permalink to this definition">¶</a></dt> <dd></dd></dl> <p>Returns the certificate chain of the server</p> </dd></dl> <p>A simple TLS client example:</p> <div class="highlight-cpp"><div class="highlight"><pre><span class="cp">#include <botan/botan.h></span> <span class="cp">#include <botan/tls_client.h></span> <span class="cp">#include "socket.h"</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">Botan</span><span class="p">;</span> <span class="cp">#include <stdio.h></span> <span class="cp">#include <string></span> <span class="cp">#include <iostream></span> <span class="cp">#include <memory></span> <span class="k">class</span> <span class="nc">Client_TLS_Policy</span> <span class="o">:</span> <span class="k">public</span> <span class="n">TLS_Policy</span> <span class="p">{</span> <span class="nl">public:</span> <span class="kt">bool</span> <span class="n">check_cert</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">X509_Certificate</span><span class="o">>&</span> <span class="n">certs</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span> <span class="k">for</span><span class="p">(</span><span class="kt">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">!=</span> <span class="n">certs</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span> <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="n">certs</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">to_string</span><span class="p">();</span> <span class="p">}</span> <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"Warning: not checking cert signatures</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span> <span class="k">return</span> <span class="nb">true</span><span class="p">;</span> <span class="p">}</span> <span class="p">};</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span> <span class="k">if</span><span class="p">(</span><span class="n">argc</span> <span class="o">!=</span> <span class="mi">2</span> <span class="o">&&</span> <span class="n">argc</span> <span class="o">!=</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span> <span class="n">printf</span><span class="p">(</span><span class="s">"Usage: %s host [port]</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span> <span class="k">return</span> <span class="mi">1</span><span class="p">;</span> <span class="p">}</span> <span class="n">try</span> <span class="p">{</span> <span class="n">LibraryInitializer</span> <span class="n">botan_init</span><span class="p">;</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">host</span> <span class="o">=</span> <span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span> <span class="n">u32bit</span> <span class="n">port</span> <span class="o">=</span> <span class="n">argc</span> <span class="o">==</span> <span class="mi">3</span> <span class="o">?</span> <span class="n">Botan</span><span class="o">::</span><span class="n">to_u32bit</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span> <span class="o">:</span> <span class="mi">443</span><span class="p">;</span> <span class="n">printf</span><span class="p">(</span><span class="s">"Connecting to %s:%d...</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">host</span><span class="p">.</span><span class="n">c_str</span><span class="p">(),</span> <span class="n">port</span><span class="p">);</span> <span class="n">SocketInitializer</span> <span class="n">socket_init</span><span class="p">;</span> <span class="n">Socket</span> <span class="n">sock</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">port</span><span class="p">);</span> <span class="n">AutoSeeded_RNG</span> <span class="n">rng</span><span class="p">;</span> <span class="n">Client_TLS_Policy</span> <span class="n">policy</span><span class="p">;</span> <span class="n">TLS_Client</span> <span class="n">tls</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">tr1</span><span class="o">::</span><span class="n">bind</span><span class="p">(</span><span class="o">&</span><span class="n">Socket</span><span class="o">::</span><span class="n">read</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">tr1</span><span class="o">::</span><span class="n">ref</span><span class="p">(</span><span class="n">sock</span><span class="p">),</span> <span class="n">_1</span><span class="p">,</span> <span class="n">_2</span><span class="p">),</span> <span class="n">std</span><span class="o">::</span><span class="n">tr1</span><span class="o">::</span><span class="n">bind</span><span class="p">(</span><span class="o">&</span><span class="n">Socket</span><span class="o">::</span><span class="n">write</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">tr1</span><span class="o">::</span><span class="n">ref</span><span class="p">(</span><span class="n">sock</span><span class="p">),</span> <span class="n">_1</span><span class="p">,</span> <span class="n">_2</span><span class="p">),</span> <span class="n">policy</span><span class="p">,</span> <span class="n">rng</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">"Handshake extablished...</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span> <span class="cp">#if 0</span><span class="c"></span> <span class="c"> std::string http_command = "GET / HTTP/1.1\r\n"</span> <span class="c"> "Server: " + host + ':' + to_string(port) + "\r\n\r\n";</span> <span class="cp">#else</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">http_command</span> <span class="o">=</span> <span class="s">"GET / HTTP/1.0</span><span class="se">\r\n\r\n</span><span class="s">"</span><span class="p">;</span> <span class="cp">#endif</span> <span class="n">tls</span><span class="p">.</span><span class="n">write</span><span class="p">((</span><span class="k">const</span> <span class="n">Botan</span><span class="o">::</span><span class="n">byte</span><span class="o">*</span><span class="p">)</span><span class="n">http_command</span><span class="p">.</span><span class="n">c_str</span><span class="p">(),</span> <span class="n">http_command</span><span class="p">.</span><span class="n">length</span><span class="p">());</span> <span class="kt">size_t</span> <span class="n">total_got</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="k">while</span><span class="p">(</span><span class="nb">true</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span><span class="p">(</span><span class="n">tls</span><span class="p">.</span><span class="n">is_closed</span><span class="p">())</span> <span class="k">break</span><span class="p">;</span> <span class="n">Botan</span><span class="o">::</span><span class="n">byte</span> <span class="n">buf</span><span class="p">[</span><span class="mi">128</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">0</span> <span class="p">};</span> <span class="kt">size_t</span> <span class="n">got</span> <span class="o">=</span> <span class="n">tls</span><span class="p">.</span><span class="n">read</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">"%s"</span><span class="p">,</span> <span class="n">buf</span><span class="p">);</span> <span class="n">fflush</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span> <span class="n">total_got</span> <span class="o">+=</span> <span class="n">got</span><span class="p">;</span> <span class="p">}</span> <span class="n">printf</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">Retrieved %d bytes total</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">total_got</span><span class="p">);</span> <span class="p">}</span> <span class="k">catch</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">exception</span><span class="o">&</span> <span class="n">e</span><span class="p">)</span> <span class="p">{</span> <span class="n">printf</span><span class="p">(</span><span class="s">"%s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">e</span><span class="p">.</span><span class="n">what</span><span class="p">());</span> <span class="k">return</span> <span class="mi">1</span><span class="p">;</span> <span class="p">}</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </pre></div> </div> </div> <div class="section" id="tls-servers"> <h2>TLS Servers<a class="headerlink" href="#tls-servers" title="Permalink to this headline">¶</a></h2> <p>A simple TLS server</p> <div class="highlight-cpp"><div class="highlight"><pre><span class="cp">#include <botan/botan.h></span> <span class="cp">#include <botan/tls_server.h></span> <span class="cp">#include <botan/rsa.h></span> <span class="cp">#include <botan/dsa.h></span> <span class="cp">#include <botan/x509self.h></span> <span class="cp">#include "socket.h"</span> <span class="k">using</span> <span class="k">namespace</span> <span class="n">Botan</span><span class="p">;</span> <span class="cp">#include <stdio.h></span> <span class="cp">#include <string></span> <span class="cp">#include <iostream></span> <span class="cp">#include <memory></span> <span class="k">class</span> <span class="nc">Server_TLS_Policy</span> <span class="o">:</span> <span class="k">public</span> <span class="n">TLS_Policy</span> <span class="p">{</span> <span class="nl">public:</span> <span class="kt">bool</span> <span class="n">check_cert</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">X509_Certificate</span><span class="o">>&</span> <span class="n">certs</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span> <span class="k">for</span><span class="p">(</span><span class="kt">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">!=</span> <span class="n">certs</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span> <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="n">certs</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">to_string</span><span class="p">();</span> <span class="p">}</span> <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"Warning: not checking cert signatures</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span> <span class="k">return</span> <span class="nb">true</span><span class="p">;</span> <span class="p">}</span> <span class="p">};</span> <span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span> <span class="kt">int</span> <span class="n">port</span> <span class="o">=</span> <span class="mi">4433</span><span class="p">;</span> <span class="k">if</span><span class="p">(</span><span class="n">argc</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span> <span class="n">port</span> <span class="o">=</span> <span class="n">to_u32bit</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span> <span class="n">try</span> <span class="p">{</span> <span class="n">LibraryInitializer</span> <span class="n">botan_init</span><span class="p">;</span> <span class="n">SocketInitializer</span> <span class="n">socket_init</span><span class="p">;</span> <span class="n">AutoSeeded_RNG</span> <span class="n">rng</span><span class="p">;</span> <span class="c1">//RSA_PrivateKey key(rng, 1024);</span> <span class="n">DSA_PrivateKey</span> <span class="n">key</span><span class="p">(</span><span class="n">rng</span><span class="p">,</span> <span class="n">DL_Group</span><span class="p">(</span><span class="s">"dsa/jce/1024"</span><span class="p">));</span> <span class="n">X509_Cert_Options</span> <span class="n">options</span><span class="p">(</span> <span class="s">"localhost/US/Syn Ack Labs/Mathematical Munitions Dept"</span><span class="p">);</span> <span class="n">X509_Certificate</span> <span class="n">cert</span> <span class="o">=</span> <span class="n">X509</span><span class="o">::</span><span class="n">create_self_signed_cert</span><span class="p">(</span><span class="n">options</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="s">"SHA-1"</span><span class="p">,</span> <span class="n">rng</span><span class="p">);</span> <span class="n">Server_Socket</span> <span class="n">listener</span><span class="p">(</span><span class="n">port</span><span class="p">);</span> <span class="n">Server_TLS_Policy</span> <span class="n">policy</span><span class="p">;</span> <span class="k">while</span><span class="p">(</span><span class="nb">true</span><span class="p">)</span> <span class="p">{</span> <span class="n">try</span> <span class="p">{</span> <span class="n">printf</span><span class="p">(</span><span class="s">"Listening for new connection on port %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">port</span><span class="p">);</span> <span class="n">Socket</span><span class="o">*</span> <span class="n">sock</span> <span class="o">=</span> <span class="n">listener</span><span class="p">.</span><span class="n">accept</span><span class="p">();</span> <span class="n">printf</span><span class="p">(</span><span class="s">"Got new connection</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span> <span class="n">TLS_Server</span> <span class="n">tls</span><span class="p">(</span> <span class="n">std</span><span class="o">::</span><span class="n">tr1</span><span class="o">::</span><span class="n">bind</span><span class="p">(</span><span class="o">&</span><span class="n">Socket</span><span class="o">::</span><span class="n">read</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">tr1</span><span class="o">::</span><span class="n">ref</span><span class="p">(</span><span class="n">sock</span><span class="p">),</span> <span class="n">_1</span><span class="p">,</span> <span class="n">_2</span><span class="p">),</span> <span class="n">std</span><span class="o">::</span><span class="n">tr1</span><span class="o">::</span><span class="n">bind</span><span class="p">(</span><span class="o">&</span><span class="n">Socket</span><span class="o">::</span><span class="n">write</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">tr1</span><span class="o">::</span><span class="n">ref</span><span class="p">(</span><span class="n">sock</span><span class="p">),</span> <span class="n">_1</span><span class="p">,</span> <span class="n">_2</span><span class="p">),</span> <span class="n">policy</span><span class="p">,</span> <span class="n">rng</span><span class="p">,</span> <span class="n">cert</span><span class="p">,</span> <span class="n">key</span><span class="p">);</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">hostname</span> <span class="o">=</span> <span class="n">tls</span><span class="p">.</span><span class="n">requested_hostname</span><span class="p">();</span> <span class="k">if</span><span class="p">(</span><span class="n">hostname</span> <span class="o">!=</span> <span class="s">""</span><span class="p">)</span> <span class="n">printf</span><span class="p">(</span><span class="s">"Client requested host '%s'</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">hostname</span><span class="p">.</span><span class="n">c_str</span><span class="p">());</span> <span class="n">printf</span><span class="p">(</span><span class="s">"Writing some text</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span> <span class="kt">char</span> <span class="n">msg</span><span class="p">[]</span> <span class="o">=</span> <span class="s">"Foo</span><span class="se">\n</span><span class="s">Bar</span><span class="se">\n</span><span class="s">Baz</span><span class="se">\n</span><span class="s">Quux</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span> <span class="n">tls</span><span class="p">.</span><span class="n">write</span><span class="p">((</span><span class="k">const</span> <span class="n">Botan</span><span class="o">::</span><span class="n">byte</span><span class="o">*</span><span class="p">)</span><span class="n">msg</span><span class="p">,</span> <span class="n">strlen</span><span class="p">(</span><span class="n">msg</span><span class="p">));</span> <span class="n">printf</span><span class="p">(</span><span class="s">"Now trying a read...</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span> <span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">1024</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">0</span> <span class="p">};</span> <span class="n">u32bit</span> <span class="n">got</span> <span class="o">=</span> <span class="n">tls</span><span class="p">.</span><span class="n">read</span><span class="p">((</span><span class="n">Botan</span><span class="o">::</span><span class="n">byte</span><span class="o">*</span><span class="p">)</span><span class="n">buf</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span> <span class="n">printf</span><span class="p">(</span><span class="s">"%d: '%s'</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">got</span><span class="p">,</span> <span class="n">buf</span><span class="p">);</span> <span class="n">tls</span><span class="p">.</span><span class="n">close</span><span class="p">();</span> <span class="p">}</span> <span class="k">catch</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">exception</span><span class="o">&</span> <span class="n">e</span><span class="p">)</span> <span class="p">{</span> <span class="n">printf</span><span class="p">(</span><span class="s">"%s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">e</span><span class="p">.</span><span class="n">what</span><span class="p">());</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="k">catch</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">exception</span><span class="o">&</span> <span class="n">e</span><span class="p">)</span> <span class="p">{</span> <span class="n">printf</span><span class="p">(</span><span class="s">"%s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">e</span><span class="p">.</span><span class="n">what</span><span class="p">());</span> <span class="k">return</span> <span class="mi">1</span><span class="p">;</span> <span class="p">}</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> <span class="p">}</span> </pre></div> </div> </div> </div> </div> </div> </div> </div> <div class="sidebar"> <h3>Table Of Contents</h3> <ul class="current"> <li class="toctree-l1"><a class="reference internal" href="index.html">Welcome</a></li> <li class="toctree-l1"><a class="reference internal" href="reading.html">Recommended Reading</a></li> <li class="toctree-l1"><a class="reference internal" href="building.html">Building The Library</a></li> <li class="toctree-l1"><a class="reference internal" href="firststep.html">Getting Started</a></li> <li class="toctree-l1"><a class="reference internal" href="filters.html">Information Flow: Pipes and Filters</a></li> <li class="toctree-l1"><a class="reference internal" href="pubkey.html">Public Key Cryptography</a></li> <li class="toctree-l1"><a class="reference internal" href="x509.html">Certificate Handling</a></li> <li class="toctree-l1 current"><a class="current reference internal" href="">SSL and TLS</a><ul> <li class="toctree-l2"><a class="reference internal" href="#tls-clients">TLS Clients</a></li> <li class="toctree-l2"><a class="reference internal" href="#tls-servers">TLS Servers</a></li> </ul> </li> <li class="toctree-l1"><a class="reference internal" href="bigint.html">BigInt</a></li> <li class="toctree-l1"><a class="reference internal" href="lowlevel.html">The Low-Level Interface</a></li> <li class="toctree-l1"><a class="reference internal" href="secmem.html">Secure Memory Containers</a></li> <li class="toctree-l1"><a class="reference internal" href="kdf.html">Key Derivation Functions</a></li> <li class="toctree-l1"><a class="reference internal" href="pbkdf.html">PBKDF Algorithms</a></li> <li class="toctree-l1"><a class="reference internal" href="passhash.html">Password Hashing</a></li> <li class="toctree-l1"><a class="reference internal" href="rng.html">Random Number Generators</a></li> <li class="toctree-l1"><a class="reference internal" href="fpe.html">Format Preserving Encryption</a></li> <li class="toctree-l1"><a class="reference internal" href="python.html">Python Binding</a></li> </ul> <h3 style="margin-top: 1.5em;">Search</h3> <form class="search" action="search.html" method="get"> <input type="text" name="q" /> <input type="submit" value="Go" /> <input type="hidden" name="check_keywords" value="yes" /> <input type="hidden" name="area" value="default" /> </form> <p class="searchtip" style="font-size: 90%"> Enter search terms or a module, class or function name. </p> </div> <div class="clearer"></div> </div> </div> <div class="footer-wrapper"> <div class="footer"> <div class="left"> <a href="x509.html" title="Certificate Handling" accesskey="P">previous</a> | <a href="bigint.html" title="BigInt" accesskey="N">next</a> | <a href="genindex.html" title="General Index" accesskey="I">index</a> <br/> <a href="_sources/ssl.txt" rel="nofollow">Show Source</a> </div> <div class="right"> <div class="footer"> © Copyright 2000-2011, Jack Lloyd. Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3. </div> </div> <div class="clearer"></div> </div> </div> </body> </html>