Sophie

Sophie

distrib > Mageia > 5 > x86_64 > media > core-updates > by-pkgid > e676599e1b67b3b32c0c27009eb121bc > files > 83

botan-doc-1.10.17-1.mga5.noarch.rpm

<!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 &mdash; 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&lt;size_t, byte*, size_t&gt; <em>input_fn</em>, std::tr1::function&lt;void, const byte*, size_t&gt; <em>output_fn</em>, const TLS_Policy&amp; <em>policy</em>, RandomNumberGenerator&amp; <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&lt;X509_Certificate&gt; <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 &lt;botan/botan.h&gt;</span>
<span class="cp">#include &lt;botan/tls_client.h&gt;</span>
<span class="cp">#include &quot;socket.h&quot;</span>

<span class="k">using</span> <span class="k">namespace</span> <span class="n">Botan</span><span class="p">;</span>

<span class="cp">#include &lt;stdio.h&gt;</span>
<span class="cp">#include &lt;string&gt;</span>
<span class="cp">#include &lt;iostream&gt;</span>
<span class="cp">#include &lt;memory&gt;</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">&lt;</span><span class="n">X509_Certificate</span><span class="o">&gt;&amp;</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">&lt;&lt;</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">&lt;&lt;</span> <span class="s">&quot;Warning: not checking cert signatures</span><span class="se">\n</span><span class="s">&quot;</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">&amp;&amp;</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">&quot;Usage: %s host [port]</span><span class="se">\n</span><span class="s">&quot;</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">&quot;Connecting to %s:%d...</span><span class="se">\n</span><span class="s">&quot;</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">&amp;</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">&amp;</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">&quot;Handshake extablished...</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span>

<span class="cp">#if 0</span><span class="c"></span>
<span class="c">      std::string http_command = &quot;GET / HTTP/1.1\r\n&quot;</span>
<span class="c">                                 &quot;Server: &quot; + host + &#39;:&#39; + to_string(port) + &quot;\r\n\r\n&quot;;</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">&quot;GET / HTTP/1.0</span><span class="se">\r\n\r\n</span><span class="s">&quot;</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">&quot;%s&quot;</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">&quot;</span><span class="se">\n</span><span class="s">Retrieved %d bytes total</span><span class="se">\n</span><span class="s">&quot;</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">&amp;</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">&quot;%s</span><span class="se">\n</span><span class="s">&quot;</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 &lt;botan/botan.h&gt;</span>
<span class="cp">#include &lt;botan/tls_server.h&gt;</span>

<span class="cp">#include &lt;botan/rsa.h&gt;</span>
<span class="cp">#include &lt;botan/dsa.h&gt;</span>
<span class="cp">#include &lt;botan/x509self.h&gt;</span>

<span class="cp">#include &quot;socket.h&quot;</span>

<span class="k">using</span> <span class="k">namespace</span> <span class="n">Botan</span><span class="p">;</span>

<span class="cp">#include &lt;stdio.h&gt;</span>
<span class="cp">#include &lt;string&gt;</span>
<span class="cp">#include &lt;iostream&gt;</span>
<span class="cp">#include &lt;memory&gt;</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">&lt;</span><span class="n">X509_Certificate</span><span class="o">&gt;&amp;</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">&lt;&lt;</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">&lt;&lt;</span> <span class="s">&quot;Warning: not checking cert signatures</span><span class="se">\n</span><span class="s">&quot;</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">&quot;dsa/jce/1024&quot;</span><span class="p">));</span>

      <span class="n">X509_Cert_Options</span> <span class="n">options</span><span class="p">(</span>
         <span class="s">&quot;localhost/US/Syn Ack Labs/Mathematical Munitions Dept&quot;</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">&quot;SHA-1&quot;</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">&quot;Listening for new connection on port %d</span><span class="se">\n</span><span class="s">&quot;</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">&quot;Got new connection</span><span class="se">\n</span><span class="s">&quot;</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">&amp;</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">&amp;</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">&quot;&quot;</span><span class="p">)</span>
               <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Client requested host &#39;%s&#39;</span><span class="se">\n</span><span class="s">&quot;</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">&quot;Writing some text</span><span class="se">\n</span><span class="s">&quot;</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">&quot;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">&quot;</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">&quot;Now trying a read...</span><span class="se">\n</span><span class="s">&quot;</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">&quot;%d: &#39;%s&#39;</span><span class="se">\n</span><span class="s">&quot;</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">&amp;</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">&quot;%s</span><span class="se">\n</span><span class="s">&quot;</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">&amp;</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">&quot;%s</span><span class="se">\n</span><span class="s">&quot;</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">
        &copy; 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>