summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorMatěj Cepl <mcepl@cepl.eu>2017-04-20 23:52:50 +0200
committerMatěj Cepl <mcepl@cepl.eu>2017-09-20 21:13:34 +0200
commitbbf99577b2f9d071728f2e76263b14bf8f1d7580 (patch)
tree50495a03042b4bb8b937230080a4276858453037 /doc
parent3da7124872c6e13bc30ba5da9799bb4abc8a2404 (diff)
downloadm2crypto-bbf99577b2f9d071728f2e76263b14bf8f1d7580.tar.gz
Add generated HTML docs.
Diffstat (limited to 'doc')
-rw-r--r--doc/doctrees/M2Crypto.PGP.doctreebin0 -> 86275 bytes
-rw-r--r--doc/doctrees/M2Crypto.SSL.doctreebin0 -> 349777 bytes
-rw-r--r--doc/doctrees/M2Crypto.doctreebin0 -> 1257651 bytes
-rw-r--r--doc/doctrees/ZServerSSL-HOWTO.doctreebin0 -> 49245 bytes
-rw-r--r--doc/doctrees/environment.picklebin0 -> 459094 bytes
-rw-r--r--doc/doctrees/howto.ca.doctreebin0 -> 51373 bytes
-rw-r--r--doc/doctrees/howto.smime.doctreebin0 -> 94672 bytes
-rw-r--r--doc/doctrees/howto.ssl.doctreebin0 -> 22402 bytes
-rw-r--r--doc/doctrees/index.doctreebin0 -> 7232 bytes
-rw-r--r--doc/html/.buildinfo4
-rw-r--r--doc/html/M2Crypto.PGP.html414
-rw-r--r--doc/html/M2Crypto.SSL.html1606
-rw-r--r--doc/html/M2Crypto.html4720
-rw-r--r--doc/html/ZServerSSL-HOWTO.html359
-rw-r--r--doc/html/_modules/M2Crypto/ASN1.html347
-rw-r--r--doc/html/_modules/M2Crypto/AuthCookie.html263
-rw-r--r--doc/html/_modules/M2Crypto/BIO.html472
-rw-r--r--doc/html/_modules/M2Crypto/BN.html152
-rw-r--r--doc/html/_modules/M2Crypto/DH.html209
-rw-r--r--doc/html/_modules/M2Crypto/DSA.html550
-rw-r--r--doc/html/_modules/M2Crypto/EC.html553
-rw-r--r--doc/html/_modules/M2Crypto/EVP.html569
-rw-r--r--doc/html/_modules/M2Crypto/Engine.html239
-rw-r--r--doc/html/_modules/M2Crypto/Err.html162
-rw-r--r--doc/html/_modules/M2Crypto/PGP/PublicKey.html169
-rw-r--r--doc/html/_modules/M2Crypto/PGP/PublicKeyRing.html192
-rw-r--r--doc/html/_modules/M2Crypto/PGP/RSA.html122
-rw-r--r--doc/html/_modules/M2Crypto/PGP/packet.html514
-rw-r--r--doc/html/_modules/M2Crypto/RC4.html130
-rw-r--r--doc/html/_modules/M2Crypto/RSA.html557
-rw-r--r--doc/html/_modules/M2Crypto/Rand.html127
-rw-r--r--doc/html/_modules/M2Crypto/SMIME.html416
-rw-r--r--doc/html/_modules/M2Crypto/SSL.html134
-rw-r--r--doc/html/_modules/M2Crypto/SSL/Checker.html393
-rw-r--r--doc/html/_modules/M2Crypto/SSL/Cipher.html156
-rw-r--r--doc/html/_modules/M2Crypto/SSL/Connection.html719
-rw-r--r--doc/html/_modules/M2Crypto/SSL/Context.html542
-rw-r--r--doc/html/_modules/M2Crypto/SSL/SSLServer.html157
-rw-r--r--doc/html/_modules/M2Crypto/SSL/Session.html167
-rw-r--r--doc/html/_modules/M2Crypto/SSL/TwistedProtocolWrapper.html518
-rw-r--r--doc/html/_modules/M2Crypto/SSL/cb.html192
-rw-r--r--doc/html/_modules/M2Crypto/SSL/ssl_dispatcher.html139
-rw-r--r--doc/html/_modules/M2Crypto/SSL/timeout.html130
-rw-r--r--doc/html/_modules/M2Crypto/X509.html1504
-rw-r--r--doc/html/_modules/M2Crypto/ftpslib.html185
-rw-r--r--doc/html/_modules/M2Crypto/httpslib.html355
-rw-r--r--doc/html/_modules/M2Crypto/m2crypto.html172
-rw-r--r--doc/html/_modules/M2Crypto/m2urllib.html207
-rw-r--r--doc/html/_modules/M2Crypto/m2urllib2.html274
-rw-r--r--doc/html/_modules/M2Crypto/m2xmlrpclib.html173
-rw-r--r--doc/html/_modules/M2Crypto/threading.html119
-rw-r--r--doc/html/_modules/M2Crypto/util.html223
-rw-r--r--doc/html/_modules/index.html129
-rw-r--r--doc/html/_sources/M2Crypto.PGP.txt51
-rw-r--r--doc/html/_sources/M2Crypto.SSL.txt91
-rw-r--r--doc/html/_sources/M2Crypto.txt219
-rw-r--r--doc/html/_sources/ZServerSSL-HOWTO.txt239
-rw-r--r--doc/html/_sources/howto.ca.txt370
-rw-r--r--doc/html/_sources/howto.smime.txt778
-rw-r--r--doc/html/_sources/howto.ssl.txt131
-rw-r--r--doc/html/_sources/index.txt30
-rw-r--r--doc/html/_static/ajax-loader.gifbin0 -> 673 bytes
-rw-r--r--doc/html/_static/basic.css540
-rw-r--r--doc/html/_static/comment-bright.pngbin0 -> 3500 bytes
-rw-r--r--doc/html/_static/comment-close.pngbin0 -> 3578 bytes
-rw-r--r--doc/html/_static/comment.pngbin0 -> 3445 bytes
-rw-r--r--doc/html/_static/default.css256
-rw-r--r--doc/html/_static/doctools.js247
-rw-r--r--doc/html/_static/down-pressed.pngbin0 -> 368 bytes
-rw-r--r--doc/html/_static/down.pngbin0 -> 363 bytes
-rw-r--r--doc/html/_static/file.pngbin0 -> 392 bytes
-rw-r--r--doc/html/_static/jquery.js154
-rw-r--r--doc/html/_static/minus.pngbin0 -> 199 bytes
-rw-r--r--doc/html/_static/plus.pngbin0 -> 199 bytes
-rw-r--r--doc/html/_static/pygments.css65
-rw-r--r--doc/html/_static/searchtools.js560
-rw-r--r--doc/html/_static/sidebar.js151
-rw-r--r--doc/html/_static/underscore.js23
-rw-r--r--doc/html/_static/up-pressed.pngbin0 -> 372 bytes
-rw-r--r--doc/html/_static/up.pngbin0 -> 363 bytes
-rw-r--r--doc/html/_static/websupport.js808
-rw-r--r--doc/html/genindex.html3258
-rw-r--r--doc/html/howto.ca.html469
-rw-r--r--doc/html/howto.smime.html847
-rw-r--r--doc/html/howto.ssl.html220
-rw-r--r--doc/html/index.html194
-rw-r--r--doc/html/objects.invbin0 -> 5904 bytes
-rw-r--r--doc/html/py-modindex.html326
-rw-r--r--doc/html/search.html105
-rw-r--r--doc/html/searchindex.js1
90 files changed, 29567 insertions, 0 deletions
diff --git a/doc/doctrees/M2Crypto.PGP.doctree b/doc/doctrees/M2Crypto.PGP.doctree
new file mode 100644
index 0000000..85f452c
--- /dev/null
+++ b/doc/doctrees/M2Crypto.PGP.doctree
Binary files differ
diff --git a/doc/doctrees/M2Crypto.SSL.doctree b/doc/doctrees/M2Crypto.SSL.doctree
new file mode 100644
index 0000000..3ccda5f
--- /dev/null
+++ b/doc/doctrees/M2Crypto.SSL.doctree
Binary files differ
diff --git a/doc/doctrees/M2Crypto.doctree b/doc/doctrees/M2Crypto.doctree
new file mode 100644
index 0000000..73f49b8
--- /dev/null
+++ b/doc/doctrees/M2Crypto.doctree
Binary files differ
diff --git a/doc/doctrees/ZServerSSL-HOWTO.doctree b/doc/doctrees/ZServerSSL-HOWTO.doctree
new file mode 100644
index 0000000..3c2a9fc
--- /dev/null
+++ b/doc/doctrees/ZServerSSL-HOWTO.doctree
Binary files differ
diff --git a/doc/doctrees/environment.pickle b/doc/doctrees/environment.pickle
new file mode 100644
index 0000000..d4e74d6
--- /dev/null
+++ b/doc/doctrees/environment.pickle
Binary files differ
diff --git a/doc/doctrees/howto.ca.doctree b/doc/doctrees/howto.ca.doctree
new file mode 100644
index 0000000..124cf99
--- /dev/null
+++ b/doc/doctrees/howto.ca.doctree
Binary files differ
diff --git a/doc/doctrees/howto.smime.doctree b/doc/doctrees/howto.smime.doctree
new file mode 100644
index 0000000..3329844
--- /dev/null
+++ b/doc/doctrees/howto.smime.doctree
Binary files differ
diff --git a/doc/doctrees/howto.ssl.doctree b/doc/doctrees/howto.ssl.doctree
new file mode 100644
index 0000000..438b79b
--- /dev/null
+++ b/doc/doctrees/howto.ssl.doctree
Binary files differ
diff --git a/doc/doctrees/index.doctree b/doc/doctrees/index.doctree
new file mode 100644
index 0000000..281514e
--- /dev/null
+++ b/doc/doctrees/index.doctree
Binary files differ
diff --git a/doc/html/.buildinfo b/doc/html/.buildinfo
new file mode 100644
index 0000000..d49bc3a
--- /dev/null
+++ b/doc/html/.buildinfo
@@ -0,0 +1,4 @@
+# Sphinx build info version 1
+# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
+config: 2ba17edb1c13f7cef17e22ec0437fce4
+tags: fbb0d17656682115ca4d033fb2f83ba1
diff --git a/doc/html/M2Crypto.PGP.html b/doc/html/M2Crypto.PGP.html
new file mode 100644
index 0000000..b64f7a2
--- /dev/null
+++ b/doc/html/M2Crypto.PGP.html
@@ -0,0 +1,414 @@
+
+
+<!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>PGP Package &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '',
+ VERSION: '',
+ 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="M2Crypto documentation" href="index.html" />
+ <link rel="up" title="M2Crypto Package" href="M2Crypto.html" />
+ <link rel="next" title="SSL Package" href="M2Crypto.SSL.html" />
+ <link rel="prev" title="M2Crypto Package" href="M2Crypto.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="M2Crypto.SSL.html" title="SSL Package"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="M2Crypto.html" title="M2Crypto Package"
+ accesskey="P">previous</a> |</li>
+ <li><a href="index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="M2Crypto.html" accesskey="U">M2Crypto Package</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <div class="section" id="pgp-package">
+<h1>PGP Package<a class="headerlink" href="#pgp-package" title="Permalink to this headline">¶</a></h1>
+<div class="section" id="id1">
+<h2><tt class="xref py py-mod docutils literal"><span class="pre">PGP</span></tt> Package<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h2>
+<span class="target" id="module-M2Crypto.PGP"></span></div>
+<div class="section" id="module-M2Crypto.PGP.PublicKey">
+<span id="publickey-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">PublicKey</span></tt> Module<a class="headerlink" href="#module-M2Crypto.PGP.PublicKey" title="Permalink to this headline">¶</a></h2>
+<dl class="class">
+<dt id="M2Crypto.PGP.PublicKey.PublicKey">
+<em class="property">class </em><tt class="descclassname">M2Crypto.PGP.PublicKey.</tt><tt class="descname">PublicKey</tt><big>(</big><em>pubkey_pkt</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/PublicKey.html#PublicKey"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.PublicKey.PublicKey" title="Permalink to this definition">¶</a></dt>
+<dd><dl class="method">
+<dt id="M2Crypto.PGP.PublicKey.PublicKey.add_signature">
+<tt class="descname">add_signature</tt><big>(</big><em>userid</em>, <em>s_pkt</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/PublicKey.html#PublicKey.add_signature"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.PublicKey.PublicKey.add_signature" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.PGP.PublicKey.PublicKey.add_userid">
+<tt class="descname">add_userid</tt><big>(</big><em>u_pkt</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/PublicKey.html#PublicKey.add_userid"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.PublicKey.PublicKey.add_userid" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.PGP.PublicKey.PublicKey.decrypt">
+<tt class="descname">decrypt</tt><big>(</big><em>ctxt</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/PublicKey.html#PublicKey.decrypt"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.PublicKey.PublicKey.decrypt" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.PGP.PublicKey.PublicKey.encrypt">
+<tt class="descname">encrypt</tt><big>(</big><em>ptxt</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/PublicKey.html#PublicKey.encrypt"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.PublicKey.PublicKey.encrypt" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.PGP.PublicKey.PublicKey.keyid">
+<tt class="descname">keyid</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/PublicKey.html#PublicKey.keyid"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.PublicKey.PublicKey.keyid" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.PGP.PublicKey.PublicKey.remove_userid">
+<tt class="descname">remove_userid</tt><big>(</big><em>userid</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/PublicKey.html#PublicKey.remove_userid"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.PublicKey.PublicKey.remove_userid" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.PGP.PublicKey.PublicKey.write">
+<tt class="descname">write</tt><big>(</big><em>stream</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/PublicKey.html#PublicKey.write"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.PublicKey.PublicKey.write" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.PGP.PublicKeyRing">
+<span id="publickeyring-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">PublicKeyRing</span></tt> Module<a class="headerlink" href="#module-M2Crypto.PGP.PublicKeyRing" title="Permalink to this headline">¶</a></h2>
+<dl class="class">
+<dt id="M2Crypto.PGP.PublicKeyRing.PublicKeyRing">
+<em class="property">class </em><tt class="descclassname">M2Crypto.PGP.PublicKeyRing.</tt><tt class="descname">PublicKeyRing</tt><big>(</big><em>keyring</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/PublicKeyRing.html#PublicKeyRing"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.PublicKeyRing.PublicKeyRing" title="Permalink to this definition">¶</a></dt>
+<dd><dl class="method">
+<dt id="M2Crypto.PGP.PublicKeyRing.PublicKeyRing.load">
+<tt class="descname">load</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/PublicKeyRing.html#PublicKeyRing.load"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.PublicKeyRing.PublicKeyRing.load" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.PGP.PublicKeyRing.PublicKeyRing.save">
+<tt class="descname">save</tt><big>(</big><em>keyring</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/PublicKeyRing.html#PublicKeyRing.save"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.PublicKeyRing.PublicKeyRing.save" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.PGP.PublicKeyRing.PublicKeyRing.spurious">
+<tt class="descname">spurious</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/PublicKeyRing.html#PublicKeyRing.spurious"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.PublicKeyRing.PublicKeyRing.spurious" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.PGP.PublicKeyRing.load_pubring">
+<tt class="descclassname">M2Crypto.PGP.PublicKeyRing.</tt><tt class="descname">load_pubring</tt><big>(</big><em>filename='pubring.pgp'</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/PublicKeyRing.html#load_pubring"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.PublicKeyRing.load_pubring" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.PGP.RSA">
+<span id="rsa-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">RSA</span></tt> Module<a class="headerlink" href="#module-M2Crypto.PGP.RSA" title="Permalink to this headline">¶</a></h2>
+<p>M2Crypto PGP2 RSA.</p>
+<p>Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.</p>
+<dl class="function">
+<dt id="M2Crypto.PGP.RSA.new_pub_key">
+<tt class="descclassname">M2Crypto.PGP.RSA.</tt><tt class="descname">new_pub_key</tt><big>(</big><em>e_n</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/RSA.html#new_pub_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.RSA.new_pub_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Factory function that instantiates an RSA_pub object from a (e, n) tuple.</p>
+<p>&#8216;e&#8217; is the RSA public exponent; it is a string in OpenSSL&#8217;s binary format,
+i.e., a number of bytes in big-endian.</p>
+<dl class="docutils">
+<dt>&#8216;n&#8217; is the RSA composite of primes; it is a string in OpenSSL&#8217;s</dt>
+<dd>binary format, i.e., a number of bytes in big-endian.</dd>
+</dl>
+</dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.PGP.constants">
+<span id="constants-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">constants</span></tt> Module<a class="headerlink" href="#module-M2Crypto.PGP.constants" title="Permalink to this headline">¶</a></h2>
+<p>M2Crypto PGP2.</p>
+<p>Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.</p>
+</div>
+<div class="section" id="module-M2Crypto.PGP.packet">
+<span id="packet-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">packet</span></tt> Module<a class="headerlink" href="#module-M2Crypto.PGP.packet" title="Permalink to this headline">¶</a></h2>
+<dl class="class">
+<dt id="M2Crypto.PGP.packet.CKEPacket">
+<em class="property">class </em><tt class="descclassname">M2Crypto.PGP.packet.</tt><tt class="descname">CKEPacket</tt><big>(</big><em>ctb</em>, <em>body=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#CKEPacket"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.CKEPacket" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.PGP.packet.Packet" title="M2Crypto.PGP.packet.Packet"><tt class="xref py py-class docutils literal"><span class="pre">M2Crypto.PGP.packet.Packet</span></tt></a></p>
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.PGP.packet.CommentPacket">
+<em class="property">class </em><tt class="descclassname">M2Crypto.PGP.packet.</tt><tt class="descname">CommentPacket</tt><big>(</big><em>ctb</em>, <em>body=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#CommentPacket"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.CommentPacket" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.PGP.packet.Packet" title="M2Crypto.PGP.packet.Packet"><tt class="xref py py-class docutils literal"><span class="pre">M2Crypto.PGP.packet.Packet</span></tt></a></p>
+<dl class="method">
+<dt id="M2Crypto.PGP.packet.CommentPacket.pack">
+<tt class="descname">pack</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#CommentPacket.pack"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.CommentPacket.pack" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.PGP.packet.CompressedPacket">
+<em class="property">class </em><tt class="descclassname">M2Crypto.PGP.packet.</tt><tt class="descname">CompressedPacket</tt><big>(</big><em>ctb</em>, <em>stream</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#CompressedPacket"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.CompressedPacket" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.PGP.packet.Packet" title="M2Crypto.PGP.packet.Packet"><tt class="xref py py-class docutils literal"><span class="pre">M2Crypto.PGP.packet.Packet</span></tt></a></p>
+<dl class="method">
+<dt id="M2Crypto.PGP.packet.CompressedPacket.uncompress">
+<tt class="descname">uncompress</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#CompressedPacket.uncompress"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.CompressedPacket.uncompress" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.PGP.packet.CompressedPacket.validate">
+<tt class="descname">validate</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#CompressedPacket.validate"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.CompressedPacket.validate" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.PGP.packet.LiteralPacket">
+<em class="property">class </em><tt class="descclassname">M2Crypto.PGP.packet.</tt><tt class="descname">LiteralPacket</tt><big>(</big><em>ctb</em>, <em>body=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#LiteralPacket"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.LiteralPacket" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.PGP.packet.Packet" title="M2Crypto.PGP.packet.Packet"><tt class="xref py py-class docutils literal"><span class="pre">M2Crypto.PGP.packet.Packet</span></tt></a></p>
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.PGP.packet.PKEPacket">
+<em class="property">class </em><tt class="descclassname">M2Crypto.PGP.packet.</tt><tt class="descname">PKEPacket</tt><big>(</big><em>ctb</em>, <em>body=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#PKEPacket"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.PKEPacket" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.PGP.packet.Packet" title="M2Crypto.PGP.packet.Packet"><tt class="xref py py-class docutils literal"><span class="pre">M2Crypto.PGP.packet.Packet</span></tt></a></p>
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.PGP.packet.Packet">
+<em class="property">class </em><tt class="descclassname">M2Crypto.PGP.packet.</tt><tt class="descname">Packet</tt><big>(</big><em>ctb</em>, <em>body=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#Packet"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.Packet" title="Permalink to this definition">¶</a></dt>
+<dd><dl class="method">
+<dt id="M2Crypto.PGP.packet.Packet.pack">
+<tt class="descname">pack</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#Packet.pack"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.Packet.pack" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.PGP.packet.Packet.pkc">
+<tt class="descname">pkc</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#Packet.pkc"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.Packet.pkc" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.PGP.packet.Packet.timestamp">
+<tt class="descname">timestamp</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#Packet.timestamp"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.Packet.timestamp" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.PGP.packet.Packet.validate">
+<tt class="descname">validate</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#Packet.validate"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.Packet.validate" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.PGP.packet.Packet.validity">
+<tt class="descname">validity</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#Packet.validity"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.Packet.validity" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.PGP.packet.Packet.version">
+<tt class="descname">version</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#Packet.version"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.Packet.version" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.PGP.packet.PacketStream">
+<em class="property">class </em><tt class="descclassname">M2Crypto.PGP.packet.</tt><tt class="descname">PacketStream</tt><big>(</big><em>input</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#PacketStream"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.PacketStream" title="Permalink to this definition">¶</a></dt>
+<dd><dl class="method">
+<dt id="M2Crypto.PGP.packet.PacketStream.close">
+<tt class="descname">close</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#PacketStream.close"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.PacketStream.close" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.PGP.packet.PacketStream.count">
+<tt class="descname">count</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#PacketStream.count"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.PacketStream.count" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.PGP.packet.PacketStream.read">
+<tt class="descname">read</tt><big>(</big><em>keep_trying=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#PacketStream.read"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.PacketStream.read" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.PGP.packet.PrivateKeyPacket">
+<em class="property">class </em><tt class="descclassname">M2Crypto.PGP.packet.</tt><tt class="descname">PrivateKeyPacket</tt><big>(</big><em>ctb</em>, <em>body=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#PrivateKeyPacket"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.PrivateKeyPacket" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.PGP.packet.Packet" title="M2Crypto.PGP.packet.Packet"><tt class="xref py py-class docutils literal"><span class="pre">M2Crypto.PGP.packet.Packet</span></tt></a></p>
+<dl class="method">
+<dt id="M2Crypto.PGP.packet.PrivateKeyPacket.is_encrypted">
+<tt class="descname">is_encrypted</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#PrivateKeyPacket.is_encrypted"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.PrivateKeyPacket.is_encrypted" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.PGP.packet.PublicKeyPacket">
+<em class="property">class </em><tt class="descclassname">M2Crypto.PGP.packet.</tt><tt class="descname">PublicKeyPacket</tt><big>(</big><em>ctb</em>, <em>body=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#PublicKeyPacket"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.PublicKeyPacket" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.PGP.packet.Packet" title="M2Crypto.PGP.packet.Packet"><tt class="xref py py-class docutils literal"><span class="pre">M2Crypto.PGP.packet.Packet</span></tt></a></p>
+<dl class="method">
+<dt id="M2Crypto.PGP.packet.PublicKeyPacket.pack">
+<tt class="descname">pack</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#PublicKeyPacket.pack"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.PublicKeyPacket.pack" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.PGP.packet.PublicKeyPacket.pubkey">
+<tt class="descname">pubkey</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#PublicKeyPacket.pubkey"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.PublicKeyPacket.pubkey" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.PGP.packet.SignaturePacket">
+<em class="property">class </em><tt class="descclassname">M2Crypto.PGP.packet.</tt><tt class="descname">SignaturePacket</tt><big>(</big><em>ctb</em>, <em>body=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#SignaturePacket"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.SignaturePacket" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.PGP.packet.Packet" title="M2Crypto.PGP.packet.Packet"><tt class="xref py py-class docutils literal"><span class="pre">M2Crypto.PGP.packet.Packet</span></tt></a></p>
+<dl class="method">
+<dt id="M2Crypto.PGP.packet.SignaturePacket.pack">
+<tt class="descname">pack</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#SignaturePacket.pack"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.SignaturePacket.pack" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.PGP.packet.SignaturePacket.validate">
+<tt class="descname">validate</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#SignaturePacket.validate"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.SignaturePacket.validate" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.PGP.packet.TrustPacket">
+<em class="property">class </em><tt class="descclassname">M2Crypto.PGP.packet.</tt><tt class="descname">TrustPacket</tt><big>(</big><em>ctb</em>, <em>body=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#TrustPacket"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.TrustPacket" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.PGP.packet.Packet" title="M2Crypto.PGP.packet.Packet"><tt class="xref py py-class docutils literal"><span class="pre">M2Crypto.PGP.packet.Packet</span></tt></a></p>
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.PGP.packet.UserIDPacket">
+<em class="property">class </em><tt class="descclassname">M2Crypto.PGP.packet.</tt><tt class="descname">UserIDPacket</tt><big>(</big><em>ctb</em>, <em>body=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#UserIDPacket"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.UserIDPacket" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.PGP.packet.Packet" title="M2Crypto.PGP.packet.Packet"><tt class="xref py py-class docutils literal"><span class="pre">M2Crypto.PGP.packet.Packet</span></tt></a></p>
+<dl class="method">
+<dt id="M2Crypto.PGP.packet.UserIDPacket.pack">
+<tt class="descname">pack</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#UserIDPacket.pack"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.UserIDPacket.pack" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.PGP.packet.UserIDPacket.userid">
+<tt class="descname">userid</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#UserIDPacket.userid"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.UserIDPacket.userid" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="exception">
+<dt id="M2Crypto.PGP.packet.XXXError">
+<em class="property">exception </em><tt class="descclassname">M2Crypto.PGP.packet.</tt><tt class="descname">XXXError</tt><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#XXXError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.XXXError" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></tt></p>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.PGP.packet.is_ctb">
+<tt class="descclassname">M2Crypto.PGP.packet.</tt><tt class="descname">is_ctb</tt><big>(</big><em>ctb</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#is_ctb"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.is_ctb" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.PGP.packet.make_ctb">
+<tt class="descclassname">M2Crypto.PGP.packet.</tt><tt class="descname">make_ctb</tt><big>(</big><em>value</em>, <em>llf</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/PGP/packet.html#make_ctb"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.PGP.packet.make_ctb" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</div>
+</div>
+
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+ <h3><a href="index.html">Table Of Contents</a></h3>
+ <ul>
+<li><a class="reference internal" href="#">PGP Package</a><ul>
+<li><a class="reference internal" href="#id1"><tt class="docutils literal"><span class="pre">PGP</span></tt> Package</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.PGP.PublicKey"><tt class="docutils literal"><span class="pre">PublicKey</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.PGP.PublicKeyRing"><tt class="docutils literal"><span class="pre">PublicKeyRing</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.PGP.RSA"><tt class="docutils literal"><span class="pre">RSA</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.PGP.constants"><tt class="docutils literal"><span class="pre">constants</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.PGP.packet"><tt class="docutils literal"><span class="pre">packet</span></tt> Module</a></li>
+</ul>
+</li>
+</ul>
+
+ <h4>Previous topic</h4>
+ <p class="topless"><a href="M2Crypto.html"
+ title="previous chapter">M2Crypto Package</a></p>
+ <h4>Next topic</h4>
+ <p class="topless"><a href="M2Crypto.SSL.html"
+ title="next chapter">SSL Package</a></p>
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="_sources/M2Crypto.PGP.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="M2Crypto.SSL.html" title="SSL Package"
+ >next</a> |</li>
+ <li class="right" >
+ <a href="M2Crypto.html" title="M2Crypto Package"
+ >previous</a> |</li>
+ <li><a href="index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="M2Crypto.html" >M2Crypto Package</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/M2Crypto.SSL.html b/doc/html/M2Crypto.SSL.html
new file mode 100644
index 0000000..1c1eb09
--- /dev/null
+++ b/doc/html/M2Crypto.SSL.html
@@ -0,0 +1,1606 @@
+
+
+<!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 Package &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '',
+ VERSION: '',
+ 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="M2Crypto documentation" href="index.html" />
+ <link rel="up" title="M2Crypto Package" href="M2Crypto.html" />
+ <link rel="prev" title="PGP Package" href="M2Crypto.PGP.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="M2Crypto.PGP.html" title="PGP Package"
+ accesskey="P">previous</a> |</li>
+ <li><a href="index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="M2Crypto.html" accesskey="U">M2Crypto Package</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <div class="section" id="ssl-package">
+<h1>SSL Package<a class="headerlink" href="#ssl-package" title="Permalink to this headline">¶</a></h1>
+<div class="section" id="id1">
+<h2><tt class="xref py py-mod docutils literal"><span class="pre">SSL</span></tt> Package<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h2>
+<span class="target" id="module-M2Crypto.SSL"></span><dl class="exception">
+<dt id="M2Crypto.SSL.SSLError">
+<em class="property">exception </em><tt class="descclassname">M2Crypto.SSL.</tt><tt class="descname">SSLError</tt><a class="reference internal" href="_modules/M2Crypto/SSL.html#SSLError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.SSLError" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></tt></p>
+</dd></dl>
+
+<dl class="exception">
+<dt id="M2Crypto.SSL.SSLTimeoutError">
+<em class="property">exception </em><tt class="descclassname">M2Crypto.SSL.</tt><tt class="descname">SSLTimeoutError</tt><a class="reference internal" href="_modules/M2Crypto/SSL.html#SSLTimeoutError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.SSLTimeoutError" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.SSL.SSLError" title="M2Crypto.SSL.SSLError"><tt class="xref py py-class docutils literal"><span class="pre">M2Crypto.SSL.SSLError</span></tt></a>, <tt class="xref py py-class docutils literal"><span class="pre">socket.timeout</span></tt></p>
+</dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.SSL.Checker">
+<span id="checker-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">Checker</span></tt> Module<a class="headerlink" href="#module-M2Crypto.SSL.Checker" title="Permalink to this headline">¶</a></h2>
+<p>SSL peer certificate checking routines</p>
+<p>Copyright (c) 2004-2007 Open Source Applications Foundation.
+All rights reserved.</p>
+<p>Copyright 2008 Heikki Toivonen. All rights reserved.</p>
+<dl class="exception">
+<dt id="M2Crypto.SSL.Checker.SSLVerificationError">
+<em class="property">exception </em><tt class="descclassname">M2Crypto.SSL.Checker.</tt><tt class="descname">SSLVerificationError</tt><a class="reference internal" href="_modules/M2Crypto/SSL/Checker.html#SSLVerificationError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Checker.SSLVerificationError" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></tt></p>
+</dd></dl>
+
+<dl class="exception">
+<dt id="M2Crypto.SSL.Checker.NoCertificate">
+<em class="property">exception </em><tt class="descclassname">M2Crypto.SSL.Checker.</tt><tt class="descname">NoCertificate</tt><a class="reference internal" href="_modules/M2Crypto/SSL/Checker.html#NoCertificate"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Checker.NoCertificate" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.SSL.Checker.SSLVerificationError" title="M2Crypto.SSL.Checker.SSLVerificationError"><tt class="xref py py-class docutils literal"><span class="pre">M2Crypto.SSL.Checker.SSLVerificationError</span></tt></a></p>
+</dd></dl>
+
+<dl class="exception">
+<dt id="M2Crypto.SSL.Checker.WrongCertificate">
+<em class="property">exception </em><tt class="descclassname">M2Crypto.SSL.Checker.</tt><tt class="descname">WrongCertificate</tt><a class="reference internal" href="_modules/M2Crypto/SSL/Checker.html#WrongCertificate"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Checker.WrongCertificate" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.SSL.Checker.SSLVerificationError" title="M2Crypto.SSL.Checker.SSLVerificationError"><tt class="xref py py-class docutils literal"><span class="pre">M2Crypto.SSL.Checker.SSLVerificationError</span></tt></a></p>
+</dd></dl>
+
+<dl class="exception">
+<dt id="M2Crypto.SSL.Checker.WrongHost">
+<em class="property">exception </em><tt class="descclassname">M2Crypto.SSL.Checker.</tt><tt class="descname">WrongHost</tt><big>(</big><em>expectedHost</em>, <em>actualHost</em>, <em>fieldName='commonName'</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Checker.html#WrongHost"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Checker.WrongHost" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.SSL.Checker.SSLVerificationError" title="M2Crypto.SSL.Checker.SSLVerificationError"><tt class="xref py py-class docutils literal"><span class="pre">M2Crypto.SSL.Checker.SSLVerificationError</span></tt></a></p>
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.SSL.Checker.Checker">
+<em class="property">class </em><tt class="descclassname">M2Crypto.SSL.Checker.</tt><tt class="descname">Checker</tt><big>(</big><em>host=None</em>, <em>peerCertHash=None</em>, <em>peerCertDigest='sha1'</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Checker.html#Checker"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Checker.Checker" title="Permalink to this definition">¶</a></dt>
+<dd><dl class="attribute">
+<dt id="M2Crypto.SSL.Checker.Checker.numericIpMatch">
+<tt class="descname">numericIpMatch</tt><em class="property"> = &lt;_sre.SRE_Pattern object at 0x1fe7dd0&gt;</em><a class="headerlink" href="#M2Crypto.SSL.Checker.Checker.numericIpMatch" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.SSL.Cipher">
+<span id="cipher-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">Cipher</span></tt> Module<a class="headerlink" href="#module-M2Crypto.SSL.Cipher" title="Permalink to this headline">¶</a></h2>
+<p>SSL Ciphers</p>
+<p>Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.</p>
+<dl class="class">
+<dt id="M2Crypto.SSL.Cipher.Cipher">
+<em class="property">class </em><tt class="descclassname">M2Crypto.SSL.Cipher.</tt><tt class="descname">Cipher</tt><big>(</big><em>cipher</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Cipher.html#Cipher"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Cipher.Cipher" title="Permalink to this definition">¶</a></dt>
+<dd><dl class="method">
+<dt id="M2Crypto.SSL.Cipher.Cipher.name">
+<tt class="descname">name</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Cipher.html#Cipher.name"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Cipher.Cipher.name" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Cipher.Cipher.version">
+<tt class="descname">version</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Cipher.html#Cipher.version"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Cipher.Cipher.version" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.SSL.Cipher.Cipher_Stack">
+<em class="property">class </em><tt class="descclassname">M2Crypto.SSL.Cipher.</tt><tt class="descname">Cipher_Stack</tt><big>(</big><em>stack</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Cipher.html#Cipher_Stack"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Cipher.Cipher_Stack" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.SSL.Connection">
+<span id="connection-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">Connection</span></tt> Module<a class="headerlink" href="#module-M2Crypto.SSL.Connection" title="Permalink to this headline">¶</a></h2>
+<dl class="class">
+<dt id="M2Crypto.SSL.Connection.Connection">
+<em class="property">class </em><tt class="descclassname">M2Crypto.SSL.Connection.</tt><tt class="descname">Connection</tt><big>(</big><em>ctx</em>, <em>sock=None</em>, <em>family=2</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection" title="Permalink to this definition">¶</a></dt>
+<dd><p>An SSL connection.</p>
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.accept">
+<tt class="descname">accept</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.accept"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.accept" title="Permalink to this definition">¶</a></dt>
+<dd><p>Accept an SSL connection.</p>
+<p>The return value is a pair (ssl, addr) where ssl is a new SSL
+connection object and addr is the address bound to the other end
+of the SSL connection.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">tuple of Connection and addr. Address can take very
+various forms (see socket documentation), for IPv4 it
+is tuple(str, int), for IPv6 a tuple of four (host,
+port, flowinfo, scopeid), where the last two are
+optional ints.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.accept_ssl">
+<tt class="descname">accept_ssl</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.accept_ssl"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.accept_ssl" title="Permalink to this definition">¶</a></dt>
+<dd><p>Waits for a TLS/SSL client to initiate the TLS/SSL handshake.</p>
+<p>The communication channel must already have been set and
+assigned to the ssl by setting an underlying BIO.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body"><dl class="docutils">
+<dt>0 The TLS/SSL handshake was not successful but was shut</dt>
+<dd>down controlled and by the specifications of the
+TLS/SSL protocol. Call get_error() with the return
+value ret to find out the reason.</dd>
+<dt>1 The TLS/SSL handshake was successfully completed,</dt>
+<dd>a TLS/SSL connection has been established.</dd>
+<dt>&lt;0 The TLS/SSL handshake was not successful because</dt>
+<dd>a fatal error occurred either at the protocol level
+or a connection failure occurred. The shutdown was
+not clean. It can also occur of action is need to
+continue the operation for non-blocking BIOs. Call
+get_error() with the return value ret to find
+out the reason.</dd>
+</dl>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.bind">
+<tt class="descname">bind</tt><big>(</big><em>addr</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.bind"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.bind" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.clear">
+<tt class="descname">clear</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.clear"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.clear" title="Permalink to this definition">¶</a></dt>
+<dd><p>If there were errors in this connection, call clear() rather
+than close() to end it, so that bad sessions will be cleared
+from cache.</p>
+</dd></dl>
+
+<dl class="attribute">
+<dt id="M2Crypto.SSL.Connection.Connection.clientPostConnectionCheck">
+<tt class="descname">clientPostConnectionCheck</tt><em class="property"> = &lt;M2Crypto.SSL.Checker.Checker instance at 0x2057cf8&gt;</em><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.clientPostConnectionCheck" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.close">
+<tt class="descname">close</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.close"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.close" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.connect">
+<tt class="descname">connect</tt><big>(</big><em>addr</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.connect"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.connect" title="Permalink to this definition">¶</a></dt>
+<dd><p>Overloading socket.connect()</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>addr</strong> &#8211; addresses have various depending on their type</td>
+</tr>
+</tbody>
+</table>
+<p>:return:status of ssl_connect()</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.connect_ssl">
+<tt class="descname">connect_ssl</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.connect_ssl"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.connect_ssl" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.fileno">
+<tt class="descname">fileno</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.fileno"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.fileno" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.get_cipher">
+<tt class="descname">get_cipher</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.get_cipher"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.get_cipher" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return an M2Crypto.SSL.Cipher object for this connection; if the
+connection has not been initialised with a cipher suite, return None.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.get_cipher_list">
+<tt class="descname">get_cipher_list</tt><big>(</big><em>idx=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.get_cipher_list"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.get_cipher_list" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return the cipher suites for this connection as a string object.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.get_ciphers">
+<tt class="descname">get_ciphers</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.get_ciphers"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.get_ciphers" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return an M2Crypto.SSL.Cipher_Stack object for this
+connection; if the connection has not been initialised with
+cipher suites, return None.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.get_context">
+<tt class="descname">get_context</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.get_context"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.get_context" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return the SSL.Context object associated with this connection.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.get_default_session_timeout">
+<tt class="descname">get_default_session_timeout</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.get_default_session_timeout"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.get_default_session_timeout" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.get_peer_cert">
+<tt class="descname">get_peer_cert</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.get_peer_cert"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.get_peer_cert" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return the peer certificate.</p>
+<p>If the peer did not provide a certificate, return None.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.get_peer_cert_chain">
+<tt class="descname">get_peer_cert_chain</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.get_peer_cert_chain"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.get_peer_cert_chain" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return the peer certificate chain; if the peer did not provide
+a certificate chain, return None.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Warning :</th><td class="field-body">The returned chain will be valid only for as long as the
+connection object is alive. Once the connection object
+gets freed, the chain will be freed as well.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.get_session">
+<tt class="descname">get_session</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.get_session"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.get_session" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.get_shutdown">
+<tt class="descname">get_shutdown</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.get_shutdown"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.get_shutdown" title="Permalink to this definition">¶</a></dt>
+<dd><p>Get the current shutdown mode of the Connection.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.get_socket_read_timeout">
+<tt class="descname">get_socket_read_timeout</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.get_socket_read_timeout"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.get_socket_read_timeout" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.get_socket_write_timeout">
+<tt class="descname">get_socket_write_timeout</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.get_socket_write_timeout"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.get_socket_write_timeout" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.get_state">
+<tt class="descname">get_state</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.get_state"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.get_state" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return the SSL state of this connection.</p>
+<p>During its use, an SSL objects passes several states. The state
+is internally maintained. Querying the state information is not
+very informative before or when a connection has been
+established. It however can be of significant interest during
+the handshake.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">6 letter string indicating the current state of the SSL
+object ssl.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.get_verify_depth">
+<tt class="descname">get_verify_depth</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.get_verify_depth"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.get_verify_depth" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return the peer certificate verification depth.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.get_verify_mode">
+<tt class="descname">get_verify_mode</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.get_verify_mode"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.get_verify_mode" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return the peer certificate verification mode.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.get_verify_result">
+<tt class="descname">get_verify_result</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.get_verify_result"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.get_verify_result" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return the peer certificate verification result.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.get_version">
+<tt class="descname">get_version</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.get_version"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.get_version" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return the TLS/SSL protocol version for this connection.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.getpeername">
+<tt class="descname">getpeername</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.getpeername"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.getpeername" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return the remote address to which the socket is connected.</p>
+<p>This is useful to find out the port number of a remote IPv4/v6 socket,
+for instance.
+On some systems this function is not supported.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body"></td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.getsockname">
+<tt class="descname">getsockname</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.getsockname"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.getsockname" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return the socket&#8217;s own address.</p>
+<p>This is useful to find out the port number of an IPv4/v6 socket,
+for instance. (The format of the address returned depends
+on the address family &#8211; see above.)</p>
+<p>:return:socket&#8217;s address as addr type</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.getsockopt">
+<tt class="descname">getsockopt</tt><big>(</big><em>level</em>, <em>optname</em>, <em>buflen=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.getsockopt"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.getsockopt" title="Permalink to this definition">¶</a></dt>
+<dd><p>Get the value of the given socket option.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>level</strong> &#8211; level at which the option resides.
+To manipulate options at the sockets API level, level is
+specified as socket.SOL_SOCKET. To manipulate options at
+any other level the protocol number of the appropriate
+protocol controlling the option is supplied. For example,
+to indicate that an option is to be interpreted by the
+TCP protocol, level should be set to the protocol number
+of socket.SOL_TCP; see getprotoent(3).</li>
+<li><strong>optname</strong> &#8211; The value of the given socket option is
+described in the Unix man page getsockopt(2)). The needed
+symbolic constants (SO_* etc.) are defined in the socket
+module.</li>
+<li><strong>buflen</strong> &#8211; If it is absent, an integer option is assumed
+and its integer value is returned by the function. If
+buflen is present, it specifies the maximum length of the
+buffer used to receive the option in, and this buffer is
+returned as a bytes object.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">Either integer or bytes value of the option. It is up
+to the caller to decode the contents of the buffer (see
+the optional built-in module struct for a way to decode
+C structures encoded as byte strings).</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.listen">
+<tt class="descname">listen</tt><big>(</big><em>qlen=5</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.listen"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.listen" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.m2_bio_free">
+<tt class="descname">m2_bio_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.m2_bio_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.m2_ssl_free">
+<tt class="descname">m2_ssl_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.m2_ssl_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.makefile">
+<tt class="descname">makefile</tt><big>(</big><em>mode='rb'</em>, <em>bufsize=-1</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.makefile"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.makefile" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.pending">
+<tt class="descname">pending</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.pending"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.pending" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return the numbers of octets that can be read from the connection.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.read">
+<tt class="descname">read</tt><big>(</big><em>size=1024</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.read"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.read" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.recv">
+<tt class="descname">recv</tt><big>(</big><em>size=1024</em><big>)</big><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.recv" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.renegotiate">
+<tt class="descname">renegotiate</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.renegotiate"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.renegotiate" title="Permalink to this definition">¶</a></dt>
+<dd><p>Renegotiate this connection&#8217;s SSL parameters.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.send">
+<tt class="descname">send</tt><big>(</big><em>data</em><big>)</big><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.send" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.sendall">
+<tt class="descname">sendall</tt><big>(</big><em>data</em><big>)</big><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.sendall" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.serverPostConnectionCheck">
+<tt class="descname">serverPostConnectionCheck</tt><big>(</big><em>*args</em>, <em>**kw</em><big>)</big><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.serverPostConnectionCheck" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.set_accept_state">
+<tt class="descname">set_accept_state</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.set_accept_state"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.set_accept_state" title="Permalink to this definition">¶</a></dt>
+<dd><p>Sets Connection to work in the server mode.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.set_bio">
+<tt class="descname">set_bio</tt><big>(</big><em>readbio</em>, <em>writebio</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.set_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.set_bio" title="Permalink to this definition">¶</a></dt>
+<dd><p>Explicitly set read and write bios</p>
+<p>Connects the BIOs for the read and write operations of the
+TLS/SSL (encrypted) side of ssl.</p>
+<p>The SSL engine inherits the behaviour of both BIO objects,
+respectively. If a BIO is non-blocking, the Connection will also
+have non-blocking behaviour.</p>
+<p>If there was already a BIO connected to Connection, BIO_free()
+will be called (for both the reading and writing side, if
+different).</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
+<li><strong>readbio</strong> &#8211; BIO for reading</li>
+<li><strong>writebio</strong> &#8211; BIO for writing.</li>
+</ul>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.set_cipher_list">
+<tt class="descname">set_cipher_list</tt><big>(</big><em>cipher_list</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.set_cipher_list"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.set_cipher_list" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set the cipher suites for this connection.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.set_client_CA_list_from_context">
+<tt class="descname">set_client_CA_list_from_context</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.set_client_CA_list_from_context"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.set_client_CA_list_from_context" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set the acceptable client CA list. If the client
+returns a certificate, it must have been issued by
+one of the CAs listed in context.</p>
+<p>Makes sense only for servers.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.set_client_CA_list_from_file">
+<tt class="descname">set_client_CA_list_from_file</tt><big>(</big><em>cafile</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.set_client_CA_list_from_file"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.set_client_CA_list_from_file" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set the acceptable client CA list.</p>
+<p>If the client returns a certificate, it must have been issued by
+one of the CAs listed in cafile.</p>
+<p>Makes sense only for servers.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>cafile</strong> &#8211; Filename from which to load the CA list.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><dl class="docutils">
+<dt>0 A failure while manipulating the STACK_OF(X509_NAME)</dt>
+<dd>object occurred or the X509_NAME could not be
+extracted from cacert. Check the error stack to find
+out the reason.</dd>
+</dl>
+<p>1 The operation succeeded.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.set_connect_state">
+<tt class="descname">set_connect_state</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.set_connect_state"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.set_connect_state" title="Permalink to this definition">¶</a></dt>
+<dd><p>Sets Connection to work in the client mode.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.set_post_connection_check_callback">
+<tt class="descname">set_post_connection_check_callback</tt><big>(</big><em>postConnectionCheck</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.set_post_connection_check_callback"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.set_post_connection_check_callback" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.set_session">
+<tt class="descname">set_session</tt><big>(</big><em>session</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.set_session"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.set_session" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.set_session_id_ctx">
+<tt class="descname">set_session_id_ctx</tt><big>(</big><em>id</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.set_session_id_ctx"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.set_session_id_ctx" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.set_shutdown">
+<tt class="descname">set_shutdown</tt><big>(</big><em>mode</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.set_shutdown"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.set_shutdown" title="Permalink to this definition">¶</a></dt>
+<dd><p>Sets the shutdown state of the Connection to mode.</p>
+<p>The shutdown state of an ssl connection is a bitmask of (use
+m2.SSL_* constants):</p>
+<p>0 No shutdown setting, yet.</p>
+<dl class="docutils">
+<dt>SSL_SENT_SHUTDOWN</dt>
+<dd>A &#8220;close notify&#8221; shutdown alert was sent to the peer, the
+connection is being considered closed and the session is
+closed and correct.</dd>
+<dt>SSL_RECEIVED_SHUTDOWN</dt>
+<dd>A shutdown alert was received form the peer, either a normal
+&#8220;close notify&#8221; or a fatal error.</dd>
+</dl>
+<p>SSL_SENT_SHUTDOWN and SSL_RECEIVED_SHUTDOWN can be set at the
+same time.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>mode</strong> &#8211; set the mode bitmask.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.set_socket_read_timeout">
+<tt class="descname">set_socket_read_timeout</tt><big>(</big><em>timeo</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.set_socket_read_timeout"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.set_socket_read_timeout" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.set_socket_write_timeout">
+<tt class="descname">set_socket_write_timeout</tt><big>(</big><em>timeo</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.set_socket_write_timeout"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.set_socket_write_timeout" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.set_ssl_close_flag">
+<tt class="descname">set_ssl_close_flag</tt><big>(</big><em>flag</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.set_ssl_close_flag"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.set_ssl_close_flag" title="Permalink to this definition">¶</a></dt>
+<dd><p>By default, SSL struct will be freed in __del__. Call with
+m2.bio_close to override this default.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>flag</strong> &#8211; either m2.bio_close or m2.bio_noclose</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.set_tlsext_host_name">
+<tt class="descname">set_tlsext_host_name</tt><big>(</big><em>name</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.set_tlsext_host_name"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.set_tlsext_host_name" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set the requested hostname for the SNI (Server Name Indication)
+extension.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.setblocking">
+<tt class="descname">setblocking</tt><big>(</big><em>mode</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.setblocking"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.setblocking" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set this connection&#8217;s underlying socket to _mode_.</p>
+<p>Set blocking or non-blocking mode of the socket: if flag is 0,
+the socket is set to non-blocking, else to blocking mode.
+Initially all sockets are in blocking mode. In non-blocking mode,
+if a recv() call doesn&#8217;t find any data, or if a send() call can&#8217;t
+immediately dispose of the data, a error exception is raised;
+in blocking mode, the calls block until they can proceed.
+s.setblocking(0) is equivalent to s.settimeout(0.0);
+s.setblocking(1) is equivalent to s.settimeout(None).</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>mode</strong> &#8211; new mode to be set</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.setsockopt">
+<tt class="descname">setsockopt</tt><big>(</big><em>level</em>, <em>optname</em>, <em>value=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.setsockopt"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.setsockopt" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set the value of the given socket option.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>level</strong> &#8211; same as with getsockopt() above</li>
+<li><strong>optname</strong> &#8211; same as with getsockopt() above</li>
+<li><strong>value</strong> &#8211; an integer or a string representing a buffer. In
+the latter case it is up to the caller to ensure
+that the string contains the proper bits (see the
+optional built-in module struct for a way to
+encode C structures as strings).</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">None for success or the error handler for failure.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.settimeout">
+<tt class="descname">settimeout</tt><big>(</big><em>timeout</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.settimeout"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.settimeout" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set this connection&#8217;s underlying socket&#8217;s timeout to _timeout_.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.setup_addr">
+<tt class="descname">setup_addr</tt><big>(</big><em>addr</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.setup_addr"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.setup_addr" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.setup_ssl">
+<tt class="descname">setup_ssl</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.setup_ssl"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.setup_ssl" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.shutdown">
+<tt class="descname">shutdown</tt><big>(</big><em>how</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.shutdown"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.shutdown" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.ssl_get_error">
+<tt class="descname">ssl_get_error</tt><big>(</big><em>ret</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.ssl_get_error"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.ssl_get_error" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.verify_ok">
+<tt class="descname">verify_ok</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.verify_ok"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.verify_ok" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Connection.Connection.write">
+<tt class="descname">write</tt><big>(</big><em>data</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Connection.html#Connection.write"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Connection.Connection.write" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.SSL.Context">
+<span id="context-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">Context</span></tt> Module<a class="headerlink" href="#module-M2Crypto.SSL.Context" title="Permalink to this headline">¶</a></h2>
+<dl class="function">
+<dt id="M2Crypto.SSL.Context.ctxmap">
+<tt class="descclassname">M2Crypto.SSL.Context.</tt><tt class="descname">ctxmap</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#ctxmap"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.ctxmap" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.SSL.Context.Context">
+<em class="property">class </em><tt class="descclassname">M2Crypto.SSL.Context.</tt><tt class="descname">Context</tt><big>(</big><em>protocol='tls'</em>, <em>weak_crypto=None</em>, <em>post_connection_check=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context" title="Permalink to this definition">¶</a></dt>
+<dd><p>&#8216;Context&#8217; for SSL connections.</p>
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.add_session">
+<tt class="descname">add_session</tt><big>(</big><em>session</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.add_session"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.add_session" title="Permalink to this definition">¶</a></dt>
+<dd><p>Add the session to the context.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>session</strong> &#8211; the session to be added.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><dl class="docutils">
+<dt>0 The operation failed. It was tried to add the same</dt>
+<dd>(identical) session twice.</dd>
+</dl>
+<p>1 The operation succeeded.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.close">
+<tt class="descname">close</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.close"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.close" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.get_allow_unknown_ca">
+<tt class="descname">get_allow_unknown_ca</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.get_allow_unknown_ca"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.get_allow_unknown_ca" title="Permalink to this definition">¶</a></dt>
+<dd><p>Get the context&#8217;s setting that accepts/rejects a peer
+certificate if the certificate&#8217;s CA is unknown.</p>
+<p>FIXME 2Bconverted to bool</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.get_cert_store">
+<tt class="descname">get_cert_store</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.get_cert_store"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.get_cert_store" title="Permalink to this definition">¶</a></dt>
+<dd><p>Get the certificate store associated with this context.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Warning :</th><td class="field-body">The store is NOT refcounted, and as such can not be relied
+to be valid once the context goes away or is changed.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.get_session_cache_mode">
+<tt class="descname">get_session_cache_mode</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.get_session_cache_mode"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.get_session_cache_mode" title="Permalink to this definition">¶</a></dt>
+<dd><p>Gets the current session caching.</p>
+<p>The mode is set to m2.SSL_SESS_CACHE_* constants.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">the previously set cache mode value.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.get_session_timeout">
+<tt class="descname">get_session_timeout</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.get_session_timeout"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.get_session_timeout" title="Permalink to this definition">¶</a></dt>
+<dd><p>Get current session timeout.</p>
+<p>Whenever a new session is created, it is assigned a maximum
+lifetime. This lifetime is specified by storing the creation
+time of the session and the timeout value valid at this time. If
+the actual time is later than creation time plus timeout, the
+session is not reused.</p>
+<p>Due to this realization, all sessions behave according to the
+timeout value valid at the time of the session negotiation.
+Changes of the timeout value do not affect already established
+sessions.</p>
+<p>Expired sessions are removed from the internal session cache,
+whenever SSL_CTX_flush_sessions(3) is called, either directly by
+the application or automatically (see
+SSL_CTX_set_session_cache_mode(3))</p>
+<p>The default value for session timeout is decided on a per
+protocol basis, see SSL_get_default_timeout(3). All currently
+supported protocols have the same default timeout value of 300
+seconds.</p>
+<p>SSL_CTX_set_timeout() returns the previously set timeout value.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">the currently set timeout value.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.get_verify_depth">
+<tt class="descname">get_verify_depth</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.get_verify_depth"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.get_verify_depth" title="Permalink to this definition">¶</a></dt>
+<dd><p>Returns the verification mode currently set in the SSL Context.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.get_verify_mode">
+<tt class="descname">get_verify_mode</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.get_verify_mode"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.get_verify_mode" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.load_cert">
+<tt class="descname">load_cert</tt><big>(</big><em>certfile</em>, <em>keyfile=None</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.load_cert"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.load_cert" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load certificate and private key into the context.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
+<li><strong>certfile</strong> &#8211; File that contains the PEM-encoded certificate.</li>
+<li><strong>keyfile</strong> &#8211; File that contains the PEM-encoded private key.
+Default value of None indicates that the private key
+is to be found in &#8216;certfile&#8217;.</li>
+<li><strong>callback</strong> &#8211; Callable object to be invoked if the private key is
+passphrase-protected. Default callback provides a
+simple terminal-style input for the passphrase.</li>
+</ul>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.load_cert_chain">
+<tt class="descname">load_cert_chain</tt><big>(</big><em>certchainfile</em>, <em>keyfile=None</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.load_cert_chain"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.load_cert_chain" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load certificate chain and private key into the context.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
+<li><strong>certchainfile</strong> &#8211; File object containing the PEM-encoded
+certificate chain.</li>
+<li><strong>keyfile</strong> &#8211; File object containing the PEM-encoded private
+key. Default value of None indicates that the
+private key is to be found in &#8216;certchainfile&#8217;.</li>
+<li><strong>callback</strong> &#8211; Callable object to be invoked if the private key
+is passphrase-protected. Default callback
+provides a simple terminal-style input for the
+passphrase.</li>
+</ul>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.load_client_CA">
+<tt class="descname">load_client_CA</tt><big>(</big><em>cafile</em><big>)</big><a class="headerlink" href="#M2Crypto.SSL.Context.Context.load_client_CA" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load CA certs into the context. These CA certs are sent to the
+peer during <em>SSLv3 certificate request</em>.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>cafile</strong> &#8211; File object containing one or more PEM-encoded CA
+certificates concatenated together.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.load_client_ca">
+<tt class="descname">load_client_ca</tt><big>(</big><em>cafile</em><big>)</big><a class="headerlink" href="#M2Crypto.SSL.Context.Context.load_client_ca" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load CA certs into the context. These CA certs are sent to the
+peer during <em>SSLv3 certificate request</em>.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>cafile</strong> &#8211; File object containing one or more PEM-encoded CA
+certificates concatenated together.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.load_verify_info">
+<tt class="descname">load_verify_info</tt><big>(</big><em>cafile=None</em>, <em>capath=None</em><big>)</big><a class="headerlink" href="#M2Crypto.SSL.Context.Context.load_verify_info" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load CA certs into the context.</p>
+<p>These CA certs are used during verification of the peer&#8217;s
+certificate.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>cafile</strong> &#8211; File containing one or more PEM-encoded CA
+certificates concatenated together.</li>
+<li><strong>capath</strong> &#8211; Directory containing PEM-encoded CA certificates
+(one certificate per file).</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last"><dl class="docutils">
+<dt>0 if the operation failed because CAfile and CApath are NULL</dt>
+<dd><p class="first last">or the processing at one of the locations specified failed.
+Check the error stack to find out the reason.</p>
+</dd>
+</dl>
+<p>1 The operation succeeded.</p>
+</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.load_verify_locations">
+<tt class="descname">load_verify_locations</tt><big>(</big><em>cafile=None</em>, <em>capath=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.load_verify_locations"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.load_verify_locations" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load CA certs into the context.</p>
+<p>These CA certs are used during verification of the peer&#8217;s
+certificate.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>cafile</strong> &#8211; File containing one or more PEM-encoded CA
+certificates concatenated together.</li>
+<li><strong>capath</strong> &#8211; Directory containing PEM-encoded CA certificates
+(one certificate per file).</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last"><dl class="docutils">
+<dt>0 if the operation failed because CAfile and CApath are NULL</dt>
+<dd><p class="first last">or the processing at one of the locations specified failed.
+Check the error stack to find out the reason.</p>
+</dd>
+</dl>
+<p>1 The operation succeeded.</p>
+</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.m2_ssl_ctx_free">
+<tt class="descname">m2_ssl_ctx_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.SSL.Context.Context.m2_ssl_ctx_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.remove_session">
+<tt class="descname">remove_session</tt><big>(</big><em>session</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.remove_session"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.remove_session" title="Permalink to this definition">¶</a></dt>
+<dd><p>Remove the session from the context.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>session</strong> &#8211; the session to be removed.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><dl class="docutils">
+<dt>0 The operation failed. The session was not found in</dt>
+<dd>the cache.</dd>
+</dl>
+<p>1 The operation succeeded.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.set_allow_unknown_ca">
+<tt class="descname">set_allow_unknown_ca</tt><big>(</big><em>ok</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.set_allow_unknown_ca"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.set_allow_unknown_ca" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set the context to accept/reject a peer certificate if the
+certificate&#8217;s CA is unknown.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>ok</strong> &#8211; True to accept, False to reject.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.set_cipher_list">
+<tt class="descname">set_cipher_list</tt><big>(</big><em>cipher_list</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.set_cipher_list"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.set_cipher_list" title="Permalink to this definition">¶</a></dt>
+<dd><p>Sets the list of available ciphers.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>cipher_list</strong> &#8211; The format of the string is described in
+ciphers(1).</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">1 if any cipher could be selected and 0 on complete
+failure.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.set_client_CA_list_from_file">
+<tt class="descname">set_client_CA_list_from_file</tt><big>(</big><em>cafile</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.set_client_CA_list_from_file"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.set_client_CA_list_from_file" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load CA certs into the context. These CA certs are sent to the
+peer during <em>SSLv3 certificate request</em>.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>cafile</strong> &#8211; File object containing one or more PEM-encoded CA
+certificates concatenated together.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.set_default_verify_paths">
+<tt class="descname">set_default_verify_paths</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.set_default_verify_paths"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.set_default_verify_paths" title="Permalink to this definition">¶</a></dt>
+<dd><p>Specifies that the default locations from which CA certs are
+loaded should be used.</p>
+<p>There is one default directory and one default file. The default
+CA certificates directory is called &#8220;certs&#8221; in the default
+OpenSSL directory. Alternatively the SSL_CERT_DIR environment
+variable can be defined to override this location. The default
+CA certificates file is called &#8220;cert.pem&#8221; in the default OpenSSL
+directory. Alternatively the SSL_CERT_FILE environment variable
+can be defined to override this location.</p>
+<dl class="docutils">
+<dt>&#64;return 0 if the operation failed. A missing default location is</dt>
+<dd><blockquote class="first">
+<div>still treated as a success. No error code is set.</div></blockquote>
+<p class="last">1 The operation succeeded.</p>
+</dd>
+</dl>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.set_info_callback">
+<tt class="descname">set_info_callback</tt><big>(</big><em>callback=&lt;function ssl_info_callback at 0x202cf50&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.set_info_callback"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.set_info_callback" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set a callback function to get state information.</p>
+<p>It can be used to get state information about the SSL
+connections that are created from this context.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>callback</strong> &#8211; Callback function. The default prints
+information to stderr.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.set_options">
+<tt class="descname">set_options</tt><big>(</big><em>op</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.set_options"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.set_options" title="Permalink to this definition">¶</a></dt>
+<dd><p>Adds the options set via bitmask in options to the Context.</p>
+<p>!!! Options already set before are not cleared!</p>
+<p>The behaviour of the SSL library can be changed by setting
+several options. The options are coded as bitmasks and can be
+combined by a logical or operation (|).</p>
+<p>SSL.Context.set_options() and SSL.set_options() affect the
+(external) protocol behaviour of the SSL library. The (internal)
+behaviour of the API can be changed by using the similar
+SSL.Context.set_mode() and SSL.set_mode() functions.</p>
+<p>During a handshake, the option settings of the SSL object are
+used. When a new SSL object is created from a context using
+SSL(), the current option setting is copied. Changes to ctx
+do not affect already created SSL objects. SSL.clear() does not
+affect the settings.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>op</strong> &#8211; bitmask of additional options specified in
+SSL_CTX_set_options(3) manpage.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">the new options bitmask after adding options.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.set_session_cache_mode">
+<tt class="descname">set_session_cache_mode</tt><big>(</big><em>mode</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.set_session_cache_mode"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.set_session_cache_mode" title="Permalink to this definition">¶</a></dt>
+<dd><p>Enables/disables session caching.</p>
+<p>The mode is set by using m2.SSL_SESS_CACHE_* constants.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>mode</strong> &#8211; new mode value.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">the previously set cache mode value.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.set_session_id_ctx">
+<tt class="descname">set_session_id_ctx</tt><big>(</big><em>id</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.set_session_id_ctx"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.set_session_id_ctx" title="Permalink to this definition">¶</a></dt>
+<dd><p>Sets the session id for the SSL.Context w/in a session can be reused.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>id</strong> &#8211; Sessions are generated within a certain context. When
+exporting/importing sessions with
+i2d_SSL_SESSION/d2i_SSL_SESSION it would be possible,
+to re-import a session generated from another context
+(e.g. another application), which might lead to
+malfunctions. Therefore each application must set its
+own session id context sid_ctx which is used to
+distinguish the contexts and is stored in exported
+sessions. The sid_ctx can be any kind of binary data
+with a given length, it is therefore possible to use
+e.g. the name of the application and/or the hostname
+and/or service name.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.set_session_timeout">
+<tt class="descname">set_session_timeout</tt><big>(</big><em>timeout</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.set_session_timeout"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.set_session_timeout" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set new session timeout.</p>
+<p>See self.get_session_timeout() for explanation of the session
+timeouts.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>timeout</strong> &#8211; new timeout value.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">the previously set timeout value.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.set_tmp_dh">
+<tt class="descname">set_tmp_dh</tt><big>(</big><em>dhpfile</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.set_tmp_dh"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.set_tmp_dh" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load ephemeral DH parameters into the context.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>dhpfile</strong> &#8211; Filename of the file containing the PEM-encoded
+DH parameters.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.set_tmp_dh_callback">
+<tt class="descname">set_tmp_dh_callback</tt><big>(</big><em>callback=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.set_tmp_dh_callback"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.set_tmp_dh_callback" title="Permalink to this definition">¶</a></dt>
+<dd><p>Sets the callback function for SSL.Context.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>callback</strong> &#8211; Callable to be used when a DH parameters are required.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.set_tmp_rsa">
+<tt class="descname">set_tmp_rsa</tt><big>(</big><em>rsa</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.set_tmp_rsa"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.set_tmp_rsa" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load ephemeral RSA key into the context.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>rsa</strong> &#8211; RSA.RSA instance.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.set_tmp_rsa_callback">
+<tt class="descname">set_tmp_rsa_callback</tt><big>(</big><em>callback=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.set_tmp_rsa_callback"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.set_tmp_rsa_callback" title="Permalink to this definition">¶</a></dt>
+<dd><p>Sets the callback function to be used when
+a temporary/ephemeral RSA key is required.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Context.Context.set_verify">
+<tt class="descname">set_verify</tt><big>(</big><em>mode</em>, <em>depth</em>, <em>callback=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Context.html#Context.set_verify"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Context.Context.set_verify" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set verify options. Most applications will need to call this
+method with the right options to make a secure SSL connection.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
+<li><strong>mode</strong> &#8211; The verification mode to use. Typically at least
+SSL.verify_peer is used. Clients would also typically
+add SSL.verify_fail_if_no_peer_cert.</li>
+<li><strong>depth</strong> &#8211; The maximum allowed depth of the certificate chain
+returned by the peer.</li>
+<li><strong>callback</strong> &#8211; Callable that can be used to specify custom
+verification checks.</li>
+</ul>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.SSL.Context.map">
+<tt class="descclassname">M2Crypto.SSL.Context.</tt><tt class="descname">map</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.SSL.Context.map" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.SSL.SSLServer">
+<span id="sslserver-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">SSLServer</span></tt> Module<a class="headerlink" href="#module-M2Crypto.SSL.SSLServer" title="Permalink to this headline">¶</a></h2>
+<dl class="class">
+<dt id="M2Crypto.SSL.SSLServer.SSLServer">
+<em class="property">class </em><tt class="descclassname">M2Crypto.SSL.SSLServer.</tt><tt class="descname">SSLServer</tt><big>(</big><em>server_address</em>, <em>RequestHandlerClass</em>, <em>ssl_context</em>, <em>bind_and_activate=True</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/SSLServer.html#SSLServer"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.SSLServer.SSLServer" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">SocketServer.TCPServer</span></tt></p>
+<dl class="method">
+<dt id="M2Crypto.SSL.SSLServer.SSLServer.handle_error">
+<tt class="descname">handle_error</tt><big>(</big><em>request</em>, <em>client_address</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/SSLServer.html#SSLServer.handle_error"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.SSLServer.SSLServer.handle_error" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.SSLServer.SSLServer.handle_request">
+<tt class="descname">handle_request</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/SSLServer.html#SSLServer.handle_request"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.SSLServer.SSLServer.handle_request" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.SSL.SSLServer.ForkingSSLServer">
+<em class="property">class </em><tt class="descclassname">M2Crypto.SSL.SSLServer.</tt><tt class="descname">ForkingSSLServer</tt><big>(</big><em>server_address</em>, <em>RequestHandlerClass</em>, <em>ssl_context</em>, <em>bind_and_activate=True</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/SSLServer.html#ForkingSSLServer"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.SSLServer.ForkingSSLServer" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">SocketServer.ForkingMixIn</span></tt>, <a class="reference internal" href="#M2Crypto.SSL.SSLServer.SSLServer" title="M2Crypto.SSL.SSLServer.SSLServer"><tt class="xref py py-class docutils literal"><span class="pre">M2Crypto.SSL.SSLServer.SSLServer</span></tt></a></p>
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.SSL.SSLServer.ThreadingSSLServer">
+<em class="property">class </em><tt class="descclassname">M2Crypto.SSL.SSLServer.</tt><tt class="descname">ThreadingSSLServer</tt><big>(</big><em>server_address</em>, <em>RequestHandlerClass</em>, <em>ssl_context</em>, <em>bind_and_activate=True</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/SSLServer.html#ThreadingSSLServer"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.SSLServer.ThreadingSSLServer" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">SocketServer.ThreadingMixIn</span></tt>, <a class="reference internal" href="#M2Crypto.SSL.SSLServer.SSLServer" title="M2Crypto.SSL.SSLServer.SSLServer"><tt class="xref py py-class docutils literal"><span class="pre">M2Crypto.SSL.SSLServer.SSLServer</span></tt></a></p>
+</dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.SSL.Session">
+<span id="session-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">Session</span></tt> Module<a class="headerlink" href="#module-M2Crypto.SSL.Session" title="Permalink to this headline">¶</a></h2>
+<p>SSL Session</p>
+<p>Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.</p>
+<dl class="class">
+<dt id="M2Crypto.SSL.Session.Session">
+<em class="property">class </em><tt class="descclassname">M2Crypto.SSL.Session.</tt><tt class="descname">Session</tt><big>(</big><em>session</em>, <em>_pyfree=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Session.html#Session"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Session.Session" title="Permalink to this definition">¶</a></dt>
+<dd><dl class="method">
+<dt id="M2Crypto.SSL.Session.Session.as_der">
+<tt class="descname">as_der</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Session.html#Session.as_der"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Session.Session.as_der" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Session.Session.as_text">
+<tt class="descname">as_text</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Session.html#Session.as_text"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Session.Session.as_text" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Session.Session.get_time">
+<tt class="descname">get_time</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Session.html#Session.get_time"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Session.Session.get_time" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Session.Session.get_timeout">
+<tt class="descname">get_timeout</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Session.html#Session.get_timeout"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Session.Session.get_timeout" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Session.Session.m2_ssl_session_free">
+<tt class="descname">m2_ssl_session_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.SSL.Session.Session.m2_ssl_session_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Session.Session.set_time">
+<tt class="descname">set_time</tt><big>(</big><em>t</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Session.html#Session.set_time"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Session.Session.set_time" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Session.Session.set_timeout">
+<tt class="descname">set_timeout</tt><big>(</big><em>t</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Session.html#Session.set_timeout"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Session.Session.set_timeout" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.Session.Session.write_bio">
+<tt class="descname">write_bio</tt><big>(</big><em>bio</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Session.html#Session.write_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Session.Session.write_bio" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.SSL.Session.load_session">
+<tt class="descclassname">M2Crypto.SSL.Session.</tt><tt class="descname">load_session</tt><big>(</big><em>pemfile</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/Session.html#load_session"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.Session.load_session" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.SSL.TwistedProtocolWrapper">
+<span id="twistedprotocolwrapper-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">TwistedProtocolWrapper</span></tt> Module<a class="headerlink" href="#module-M2Crypto.SSL.TwistedProtocolWrapper" title="Permalink to this headline">¶</a></h2>
+<p>Make Twisted use M2Crypto for SSL</p>
+<p>Copyright (c) 2004-2007 Open Source Applications Foundation.
+All rights reserved.</p>
+<p>FIXME THIS HAS NOT BEEN FINISHED. NEITHER PEP484 NOR PORT PYTHON3 HAS
+BEEN FINISHED. THE FURTHER WORK WILL BE DONE WHEN THE STATUS OF TWISTED
+IN THE PYTHON 3 (AND ASYNCIO) WORLD WILL BE CLEAR.</p>
+<dl class="function">
+<dt id="M2Crypto.SSL.TwistedProtocolWrapper.connectSSL">
+<tt class="descclassname">M2Crypto.SSL.TwistedProtocolWrapper.</tt><tt class="descname">connectSSL</tt><big>(</big><em>host</em>, <em>port</em>, <em>factory</em>, <em>contextFactory</em>, <em>timeout=30</em>, <em>bindAddress=None</em>, <em>reactor=&lt;twisted.internet.epollreactor.EPollReactor object at 0x4996190&gt;</em>, <em>postConnectionCheck=&lt;M2Crypto.SSL.Checker.Checker instance at 0x3f0bc68&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/TwistedProtocolWrapper.html#connectSSL"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.TwistedProtocolWrapper.connectSSL" title="Permalink to this definition">¶</a></dt>
+<dd><p>A convenience function to start an SSL/TLS connection using Twisted.</p>
+<p>See IReactorSSL interface in Twisted.</p>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.SSL.TwistedProtocolWrapper.connectTCP">
+<tt class="descclassname">M2Crypto.SSL.TwistedProtocolWrapper.</tt><tt class="descname">connectTCP</tt><big>(</big><em>host</em>, <em>port</em>, <em>factory</em>, <em>timeout=30</em>, <em>bindAddress=None</em>, <em>reactor=&lt;twisted.internet.epollreactor.EPollReactor object at 0x4996190&gt;</em>, <em>postConnectionCheck=&lt;M2Crypto.SSL.Checker.Checker instance at 0x3f0b3f8&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/TwistedProtocolWrapper.html#connectTCP"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.TwistedProtocolWrapper.connectTCP" title="Permalink to this definition">¶</a></dt>
+<dd><p>A convenience function to start a TCP connection using Twisted.</p>
+<p>NOTE: You must call startTLS(ctx) to go into SSL/TLS mode.</p>
+<p>See IReactorTCP interface in Twisted.</p>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.SSL.TwistedProtocolWrapper.listenSSL">
+<tt class="descclassname">M2Crypto.SSL.TwistedProtocolWrapper.</tt><tt class="descname">listenSSL</tt><big>(</big><em>port</em>, <em>factory</em>, <em>contextFactory</em>, <em>backlog=5</em>, <em>interface=''</em>, <em>reactor=&lt;twisted.internet.epollreactor.EPollReactor object at 0x4996190&gt;</em>, <em>postConnectionCheck=&lt;function _alwaysSucceedsPostConnectionCheck at 0x49948c0&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/TwistedProtocolWrapper.html#listenSSL"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.TwistedProtocolWrapper.listenSSL" title="Permalink to this definition">¶</a></dt>
+<dd><p>A convenience function to listen for SSL/TLS connections using Twisted.</p>
+<p>See IReactorSSL interface in Twisted.</p>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.SSL.TwistedProtocolWrapper.listenTCP">
+<tt class="descclassname">M2Crypto.SSL.TwistedProtocolWrapper.</tt><tt class="descname">listenTCP</tt><big>(</big><em>port</em>, <em>factory</em>, <em>backlog=5</em>, <em>interface=''</em>, <em>reactor=&lt;twisted.internet.epollreactor.EPollReactor object at 0x4996190&gt;</em>, <em>postConnectionCheck=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/TwistedProtocolWrapper.html#listenTCP"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.TwistedProtocolWrapper.listenTCP" title="Permalink to this definition">¶</a></dt>
+<dd><p>A convenience function to listen for TCP connections using Twisted.</p>
+<p>NOTE: You must call startTLS(ctx) to go into SSL/TLS mode.</p>
+<p>See IReactorTCP interface in Twisted.</p>
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper">
+<em class="property">class </em><tt class="descclassname">M2Crypto.SSL.TwistedProtocolWrapper.</tt><tt class="descname">TLSProtocolWrapper</tt><big>(</big><em>factory</em>, <em>wrappedProtocol</em>, <em>startPassThrough</em>, <em>client</em>, <em>contextFactory</em>, <em>postConnectionCheck</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/TwistedProtocolWrapper.html#TLSProtocolWrapper"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">twisted.protocols.policies.ProtocolWrapper</span></tt></p>
+<p>A SSL/TLS protocol wrapper to be used with Twisted. Typically
+you would not use this class directly. Use connectTCP,
+connectSSL, listenTCP, listenSSL functions defined above,
+which will hook in this class.</p>
+<dl class="method">
+<dt id="M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.clear">
+<tt class="descname">clear</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/TwistedProtocolWrapper.html#TLSProtocolWrapper.clear"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.clear" title="Permalink to this definition">¶</a></dt>
+<dd><p>Clear this instance, after which it is ready for reuse.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.connectionLost">
+<tt class="descname">connectionLost</tt><big>(</big><em>reason</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/TwistedProtocolWrapper.html#TLSProtocolWrapper.connectionLost"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.connectionLost" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.connectionMade">
+<tt class="descname">connectionMade</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/TwistedProtocolWrapper.html#TLSProtocolWrapper.connectionMade"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.connectionMade" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.dataReceived">
+<tt class="descname">dataReceived</tt><big>(</big><em>data</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/TwistedProtocolWrapper.html#TLSProtocolWrapper.dataReceived"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.dataReceived" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.loseConnection">
+<tt class="descname">loseConnection</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/TwistedProtocolWrapper.html#TLSProtocolWrapper.loseConnection"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.loseConnection" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.startTLS">
+<tt class="descname">startTLS</tt><big>(</big><em>ctx</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/TwistedProtocolWrapper.html#TLSProtocolWrapper.startTLS"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.startTLS" title="Permalink to this definition">¶</a></dt>
+<dd><p>Start SSL/TLS. If this is not called, this instance just passes data
+through untouched.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.write">
+<tt class="descname">write</tt><big>(</big><em>data</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/TwistedProtocolWrapper.html#TLSProtocolWrapper.write"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.write" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.writeSequence">
+<tt class="descname">writeSequence</tt><big>(</big><em>data</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/TwistedProtocolWrapper.html#TLSProtocolWrapper.writeSequence"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.writeSequence" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.SSL.cb">
+<span id="cb-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">cb</span></tt> Module<a class="headerlink" href="#module-M2Crypto.SSL.cb" title="Permalink to this headline">¶</a></h2>
+<dl class="function">
+<dt id="M2Crypto.SSL.cb.ssl_verify_callback_stub">
+<tt class="descclassname">M2Crypto.SSL.cb.</tt><tt class="descname">ssl_verify_callback_stub</tt><big>(</big><em>ssl_ctx_ptr</em>, <em>x509_ptr</em>, <em>errnum</em>, <em>errdepth</em>, <em>ok</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/cb.html#ssl_verify_callback_stub"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.cb.ssl_verify_callback_stub" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.SSL.cb.ssl_verify_callback">
+<tt class="descclassname">M2Crypto.SSL.cb.</tt><tt class="descname">ssl_verify_callback</tt><big>(</big><em>ssl_ctx_ptr</em>, <em>x509_ptr</em>, <em>errnum</em>, <em>errdepth</em>, <em>ok</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/cb.html#ssl_verify_callback"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.cb.ssl_verify_callback" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.SSL.cb.ssl_verify_callback_allow_unknown_ca">
+<tt class="descclassname">M2Crypto.SSL.cb.</tt><tt class="descname">ssl_verify_callback_allow_unknown_ca</tt><big>(</big><em>ok</em>, <em>store</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/cb.html#ssl_verify_callback_allow_unknown_ca"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.cb.ssl_verify_callback_allow_unknown_ca" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.SSL.cb.ssl_info_callback">
+<tt class="descclassname">M2Crypto.SSL.cb.</tt><tt class="descname">ssl_info_callback</tt><big>(</big><em>where</em>, <em>ret</em>, <em>ssl_ptr</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/cb.html#ssl_info_callback"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.cb.ssl_info_callback" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.SSL.ssl_dispatcher">
+<span id="ssl-dispatcher-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">ssl_dispatcher</span></tt> Module<a class="headerlink" href="#module-M2Crypto.SSL.ssl_dispatcher" title="Permalink to this headline">¶</a></h2>
+<dl class="class">
+<dt id="M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher">
+<em class="property">class </em><tt class="descclassname">M2Crypto.SSL.ssl_dispatcher.</tt><tt class="descname">ssl_dispatcher</tt><big>(</big><em>sock=None</em>, <em>map=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/ssl_dispatcher.html#ssl_dispatcher"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">asyncore.dispatcher</span></tt></p>
+<dl class="method">
+<dt id="M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher.connect">
+<tt class="descname">connect</tt><big>(</big><em>addr</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/ssl_dispatcher.html#ssl_dispatcher.connect"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher.connect" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher.create_socket">
+<tt class="descname">create_socket</tt><big>(</big><em>ssl_context</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/ssl_dispatcher.html#ssl_dispatcher.create_socket"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher.create_socket" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher.recv">
+<tt class="descname">recv</tt><big>(</big><em>buffer_size=4096</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/ssl_dispatcher.html#ssl_dispatcher.recv"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher.recv" title="Permalink to this definition">¶</a></dt>
+<dd><p>Receive data over SSL.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher.send">
+<tt class="descname">send</tt><big>(</big><em>buffer</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/ssl_dispatcher.html#ssl_dispatcher.send"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher.send" title="Permalink to this definition">¶</a></dt>
+<dd><p>Send data over SSL.</p>
+</dd></dl>
+
+</dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.SSL.timeout">
+<span id="timeout-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">timeout</span></tt> Module<a class="headerlink" href="#module-M2Crypto.SSL.timeout" title="Permalink to this headline">¶</a></h2>
+<p>Support for SSL socket timeouts.</p>
+<p>Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.</p>
+<p>Copyright 2008 Heikki Toivonen. All rights reserved.</p>
+<dl class="class">
+<dt id="M2Crypto.SSL.timeout.timeout">
+<em class="property">class </em><tt class="descclassname">M2Crypto.SSL.timeout.</tt><tt class="descname">timeout</tt><big>(</big><em>sec=600</em>, <em>microsec=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/timeout.html#timeout"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.timeout.timeout" title="Permalink to this definition">¶</a></dt>
+<dd><dl class="method">
+<dt id="M2Crypto.SSL.timeout.timeout.pack">
+<tt class="descname">pack</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/timeout.html#timeout.pack"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.timeout.timeout.pack" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.SSL.timeout.struct_to_timeout">
+<tt class="descclassname">M2Crypto.SSL.timeout.</tt><tt class="descname">struct_to_timeout</tt><big>(</big><em>binstr</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/timeout.html#struct_to_timeout"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.timeout.struct_to_timeout" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.SSL.timeout.struct_size">
+<tt class="descclassname">M2Crypto.SSL.timeout.</tt><tt class="descname">struct_size</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SSL/timeout.html#struct_size"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SSL.timeout.struct_size" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</div>
+</div>
+
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+ <h3><a href="index.html">Table Of Contents</a></h3>
+ <ul>
+<li><a class="reference internal" href="#">SSL Package</a><ul>
+<li><a class="reference internal" href="#id1"><tt class="docutils literal"><span class="pre">SSL</span></tt> Package</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.SSL.Checker"><tt class="docutils literal"><span class="pre">Checker</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.SSL.Cipher"><tt class="docutils literal"><span class="pre">Cipher</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.SSL.Connection"><tt class="docutils literal"><span class="pre">Connection</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.SSL.Context"><tt class="docutils literal"><span class="pre">Context</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.SSL.SSLServer"><tt class="docutils literal"><span class="pre">SSLServer</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.SSL.Session"><tt class="docutils literal"><span class="pre">Session</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.SSL.TwistedProtocolWrapper"><tt class="docutils literal"><span class="pre">TwistedProtocolWrapper</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.SSL.cb"><tt class="docutils literal"><span class="pre">cb</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.SSL.ssl_dispatcher"><tt class="docutils literal"><span class="pre">ssl_dispatcher</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.SSL.timeout"><tt class="docutils literal"><span class="pre">timeout</span></tt> Module</a></li>
+</ul>
+</li>
+</ul>
+
+ <h4>Previous topic</h4>
+ <p class="topless"><a href="M2Crypto.PGP.html"
+ title="previous chapter">PGP Package</a></p>
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="_sources/M2Crypto.SSL.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="M2Crypto.PGP.html" title="PGP Package"
+ >previous</a> |</li>
+ <li><a href="index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="M2Crypto.html" >M2Crypto Package</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/M2Crypto.html b/doc/html/M2Crypto.html
new file mode 100644
index 0000000..f3775c2
--- /dev/null
+++ b/doc/html/M2Crypto.html
@@ -0,0 +1,4720 @@
+
+
+<!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>M2Crypto Package &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '',
+ VERSION: '',
+ 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="M2Crypto documentation" href="index.html" />
+ <link rel="next" title="PGP Package" href="M2Crypto.PGP.html" />
+ <link rel="prev" title="Welcome to M2Crypto’s documentation!" href="index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="M2Crypto.PGP.html" title="PGP Package"
+ accesskey="N">next</a> |</li>
+ <li class="right" >
+ <a href="index.html" title="Welcome to M2Crypto’s documentation!"
+ accesskey="P">previous</a> |</li>
+ <li><a href="index.html">M2Crypto documentation</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <div class="section" id="m2crypto-package">
+<h1>M2Crypto Package<a class="headerlink" href="#m2crypto-package" title="Permalink to this headline">¶</a></h1>
+<div class="section" id="id1">
+<h2><tt class="xref py py-mod docutils literal"><span class="pre">M2Crypto</span></tt> Package<a class="headerlink" href="#id1" title="Permalink to this headline">¶</a></h2>
+<span class="target" id="module-M2Crypto.__init__"></span></div>
+<div class="section" id="module-M2Crypto.ASN1">
+<span id="asn1-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">ASN1</span></tt> Module<a class="headerlink" href="#module-M2Crypto.ASN1" title="Permalink to this headline">¶</a></h2>
+<dl class="class">
+<dt id="M2Crypto.ASN1.ASN1_Integer">
+<em class="property">class </em><tt class="descclassname">M2Crypto.ASN1.</tt><tt class="descname">ASN1_Integer</tt><big>(</big><em>asn1int</em>, <em>_pyfree=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/ASN1.html#ASN1_Integer"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ASN1.ASN1_Integer" title="Permalink to this definition">¶</a></dt>
+<dd><dl class="method">
+<dt id="M2Crypto.ASN1.ASN1_Integer.m2_asn1_integer_free">
+<tt class="descname">m2_asn1_integer_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.ASN1.ASN1_Integer.m2_asn1_integer_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.ASN1.ASN1_Object">
+<em class="property">class </em><tt class="descclassname">M2Crypto.ASN1.</tt><tt class="descname">ASN1_Object</tt><big>(</big><em>asn1obj</em>, <em>_pyfree=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/ASN1.html#ASN1_Object"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ASN1.ASN1_Object" title="Permalink to this definition">¶</a></dt>
+<dd><dl class="method">
+<dt id="M2Crypto.ASN1.ASN1_Object.m2_asn1_object_free">
+<tt class="descname">m2_asn1_object_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.ASN1.ASN1_Object.m2_asn1_object_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.ASN1.ASN1_String">
+<em class="property">class </em><tt class="descclassname">M2Crypto.ASN1.</tt><tt class="descname">ASN1_String</tt><big>(</big><em>asn1str</em>, <em>_pyfree=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/ASN1.html#ASN1_String"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ASN1.ASN1_String" title="Permalink to this definition">¶</a></dt>
+<dd><dl class="method">
+<dt id="M2Crypto.ASN1.ASN1_String.as_text">
+<tt class="descname">as_text</tt><big>(</big><em>flags=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/ASN1.html#ASN1_String.as_text"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ASN1.ASN1_String.as_text" title="Permalink to this definition">¶</a></dt>
+<dd><p>output an ASN1_STRING structure according to the set flags.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>flags</strong> &#8211; determine the format of the output by using
+predetermined constants, see ASN1_STRING_print_ex(3)
+manpage for their meaning.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">output an ASN1_STRING structure.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.ASN1.ASN1_String.m2_asn1_string_free">
+<tt class="descname">m2_asn1_string_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.ASN1.ASN1_String.m2_asn1_string_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.ASN1.ASN1_TIME">
+<em class="property">class </em><tt class="descclassname">M2Crypto.ASN1.</tt><tt class="descname">ASN1_TIME</tt><big>(</big><em>asn1_time=None</em>, <em>_pyfree=0</em>, <em>asn1_utctime=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/ASN1.html#ASN1_TIME"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ASN1.ASN1_TIME" title="Permalink to this definition">¶</a></dt>
+<dd><dl class="method">
+<dt id="M2Crypto.ASN1.ASN1_TIME.get_datetime">
+<tt class="descname">get_datetime</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/ASN1.html#ASN1_TIME.get_datetime"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ASN1.ASN1_TIME.get_datetime" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.ASN1.ASN1_TIME.m2_asn1_time_free">
+<tt class="descname">m2_asn1_time_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.ASN1.ASN1_TIME.m2_asn1_time_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.ASN1.ASN1_TIME.set_datetime">
+<tt class="descname">set_datetime</tt><big>(</big><em>date</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/ASN1.html#ASN1_TIME.set_datetime"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ASN1.ASN1_TIME.set_datetime" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.ASN1.ASN1_TIME.set_string">
+<tt class="descname">set_string</tt><big>(</big><em>string</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/ASN1.html#ASN1_TIME.set_string"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ASN1.ASN1_TIME.set_string" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set time from UTC string.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.ASN1.ASN1_TIME.set_time">
+<tt class="descname">set_time</tt><big>(</big><em>time</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/ASN1.html#ASN1_TIME.set_time"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ASN1.ASN1_TIME.set_time" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set time from seconds since epoch (int).</p>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="attribute">
+<dt id="M2Crypto.ASN1.ASN1_UTCTIME">
+<tt class="descclassname">M2Crypto.ASN1.</tt><tt class="descname">ASN1_UTCTIME</tt><a class="headerlink" href="#M2Crypto.ASN1.ASN1_UTCTIME" title="Permalink to this definition">¶</a></dt>
+<dd><p>alias of <a class="reference internal" href="#M2Crypto.ASN1.ASN1_TIME" title="M2Crypto.ASN1.ASN1_TIME"><tt class="xref py py-class docutils literal"><span class="pre">ASN1_TIME</span></tt></a></p>
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.ASN1.LocalTimezone">
+<em class="property">class </em><tt class="descclassname">M2Crypto.ASN1.</tt><tt class="descname">LocalTimezone</tt><a class="reference internal" href="_modules/M2Crypto/ASN1.html#LocalTimezone"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ASN1.LocalTimezone" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">datetime.tzinfo</span></tt></p>
+<p>Localtimezone from datetime manual</p>
+<dl class="method">
+<dt id="M2Crypto.ASN1.LocalTimezone.dst">
+<tt class="descname">dst</tt><big>(</big><em>dt</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/ASN1.html#LocalTimezone.dst"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ASN1.LocalTimezone.dst" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.ASN1.LocalTimezone.tzname">
+<tt class="descname">tzname</tt><big>(</big><em>dt</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/ASN1.html#LocalTimezone.tzname"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ASN1.LocalTimezone.tzname" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.ASN1.LocalTimezone.utcoffset">
+<tt class="descname">utcoffset</tt><big>(</big><em>dt</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/ASN1.html#LocalTimezone.utcoffset"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ASN1.LocalTimezone.utcoffset" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.AuthCookie">
+<span id="authcookie-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">AuthCookie</span></tt> Module<a class="headerlink" href="#module-M2Crypto.AuthCookie" title="Permalink to this headline">¶</a></h2>
+<dl class="class">
+<dt id="M2Crypto.AuthCookie.AuthCookie">
+<em class="property">class </em><tt class="descclassname">M2Crypto.AuthCookie.</tt><tt class="descname">AuthCookie</tt><big>(</big><em>expiry</em>, <em>data</em>, <em>dough</em>, <em>mac</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/AuthCookie.html#AuthCookie"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.AuthCookie.AuthCookie" title="Permalink to this definition">¶</a></dt>
+<dd><dl class="method">
+<dt id="M2Crypto.AuthCookie.AuthCookie.data">
+<tt class="descname">data</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/AuthCookie.html#AuthCookie.data"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.AuthCookie.AuthCookie.data" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return the data portion of the cookie.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.AuthCookie.AuthCookie.expiry">
+<tt class="descname">expiry</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/AuthCookie.html#AuthCookie.expiry"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.AuthCookie.AuthCookie.expiry" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return the cookie&#8217;s expiry time.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.AuthCookie.AuthCookie.headerValue">
+<tt class="descname">headerValue</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/AuthCookie.html#AuthCookie.headerValue"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.AuthCookie.AuthCookie.headerValue" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.AuthCookie.AuthCookie.isExpired">
+<tt class="descname">isExpired</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/AuthCookie.html#AuthCookie.isExpired"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.AuthCookie.AuthCookie.isExpired" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return 1 if the cookie has expired, 0 otherwise.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.AuthCookie.AuthCookie.mac">
+<tt class="descname">mac</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/AuthCookie.html#AuthCookie.mac"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.AuthCookie.AuthCookie.mac" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return the cookie&#8217;s MAC.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.AuthCookie.AuthCookie.name">
+<tt class="descname">name</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/AuthCookie.html#AuthCookie.name"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.AuthCookie.AuthCookie.name" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.AuthCookie.AuthCookie.output">
+<tt class="descname">output</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/AuthCookie.html#AuthCookie.output"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.AuthCookie.AuthCookie.output" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return the cookie&#8217;s output in &#8220;Set-Cookie&#8221; format.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.AuthCookie.AuthCookie.value">
+<tt class="descname">value</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/AuthCookie.html#AuthCookie.value"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.AuthCookie.AuthCookie.value" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return the cookie&#8217;s output minus the &#8220;Set-Cookie: &#8221; portion.</p>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.AuthCookie.AuthCookieJar">
+<em class="property">class </em><tt class="descclassname">M2Crypto.AuthCookie.</tt><tt class="descname">AuthCookieJar</tt><a class="reference internal" href="_modules/M2Crypto/AuthCookie.html#AuthCookieJar"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.AuthCookie.AuthCookieJar" title="Permalink to this definition">¶</a></dt>
+<dd><dl class="method">
+<dt id="M2Crypto.AuthCookie.AuthCookieJar.isGoodCookie">
+<tt class="descname">isGoodCookie</tt><big>(</big><em>cookie</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/AuthCookie.html#AuthCookieJar.isGoodCookie"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.AuthCookie.AuthCookieJar.isGoodCookie" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.AuthCookie.AuthCookieJar.isGoodCookieString">
+<tt class="descname">isGoodCookieString</tt><big>(</big><em>cookie_str</em>, <em>_debug=False</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/AuthCookie.html#AuthCookieJar.isGoodCookieString"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.AuthCookie.AuthCookieJar.isGoodCookieString" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.AuthCookie.AuthCookieJar.makeCookie">
+<tt class="descname">makeCookie</tt><big>(</big><em>expiry</em>, <em>data</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/AuthCookie.html#AuthCookieJar.makeCookie"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.AuthCookie.AuthCookieJar.makeCookie" title="Permalink to this definition">¶</a></dt>
+<dd><p>Make a cookie</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>expiry</strong> &#8211; expiration time (float in seconds)</li>
+<li><strong>data</strong> &#8211; cookie content</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">AuthCookie object</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.AuthCookie.mix">
+<tt class="descclassname">M2Crypto.AuthCookie.</tt><tt class="descname">mix</tt><big>(</big><em>expiry</em>, <em>data</em>, <em>format='exp=%f&amp;data=%s&amp;digest='</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/AuthCookie.html#mix"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.AuthCookie.mix" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.AuthCookie.unmix">
+<tt class="descclassname">M2Crypto.AuthCookie.</tt><tt class="descname">unmix</tt><big>(</big><em>dough</em>, <em>regex=&lt;_sre.SRE_Pattern object at 0x1ec24a0&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/AuthCookie.html#unmix"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.AuthCookie.unmix" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.AuthCookie.unmix3">
+<tt class="descclassname">M2Crypto.AuthCookie.</tt><tt class="descname">unmix3</tt><big>(</big><em>dough</em>, <em>regex=&lt;_sre.SRE_Pattern object at 0x1ec24a0&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/AuthCookie.html#unmix3"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.AuthCookie.unmix3" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.BIO">
+<span id="bio-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">BIO</span></tt> Module<a class="headerlink" href="#module-M2Crypto.BIO" title="Permalink to this headline">¶</a></h2>
+<dl class="class">
+<dt id="M2Crypto.BIO.BIO">
+<em class="property">class </em><tt class="descclassname">M2Crypto.BIO.</tt><tt class="descname">BIO</tt><big>(</big><em>bio=None</em>, <em>_pyfree=0</em>, <em>_close_cb=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#BIO"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.BIO" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">object</span></tt></p>
+<p>Abstract object interface to the BIO API.</p>
+<dl class="method">
+<dt id="M2Crypto.BIO.BIO.bio_ptr">
+<tt class="descname">bio_ptr</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.BIO.BIO.bio_ptr" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.BIO.close">
+<tt class="descname">close</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#BIO.close"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.BIO.close" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.BIO.fileno">
+<tt class="descname">fileno</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#BIO.fileno"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.BIO.fileno" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.BIO.flush">
+<tt class="descname">flush</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#BIO.flush"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.BIO.flush" title="Permalink to this definition">¶</a></dt>
+<dd><table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">1 for success, and 0 or -1 for failure</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.BIO.m2_bio_free">
+<tt class="descname">m2_bio_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.BIO.BIO.m2_bio_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.BIO.read">
+<tt class="descname">read</tt><big>(</big><em>size=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#BIO.read"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.BIO.read" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.BIO.readable">
+<tt class="descname">readable</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#BIO.readable"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.BIO.readable" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.BIO.readline">
+<tt class="descname">readline</tt><big>(</big><em>size=4096</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#BIO.readline"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.BIO.readline" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.BIO.readlines">
+<tt class="descname">readlines</tt><big>(</big><em>sizehint='ignored'</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#BIO.readlines"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.BIO.readlines" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.BIO.reset">
+<tt class="descname">reset</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#BIO.reset"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.BIO.reset" title="Permalink to this definition">¶</a></dt>
+<dd><p>Sets the bio to its initial state
+:return: 1 for success, and 0 or -1 for failure</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.BIO.seek">
+<tt class="descname">seek</tt><big>(</big><em>off</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#BIO.seek"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.BIO.seek" title="Permalink to this definition">¶</a></dt>
+<dd><p>Seek to the specified absolute offset.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.BIO.should_read">
+<tt class="descname">should_read</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#BIO.should_read"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.BIO.should_read" title="Permalink to this definition">¶</a></dt>
+<dd><p>Returns whether the cause of the condition is the bio
+should read more data</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.BIO.should_retry">
+<tt class="descname">should_retry</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#BIO.should_retry"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.BIO.should_retry" title="Permalink to this definition">¶</a></dt>
+<dd><p>Can the call be attempted again, or was there an error
+ie do_handshake</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.BIO.should_write">
+<tt class="descname">should_write</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#BIO.should_write"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.BIO.should_write" title="Permalink to this definition">¶</a></dt>
+<dd><p>Returns whether the cause of the condition is the bio
+should write more data</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.BIO.tell">
+<tt class="descname">tell</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#BIO.tell"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.BIO.tell" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return the current offset.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.BIO.write">
+<tt class="descname">write</tt><big>(</big><em>data</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#BIO.write"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.BIO.write" title="Permalink to this definition">¶</a></dt>
+<dd><table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">either data written, or [0, -1] for nothing written,
+-2 not implemented</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.BIO.write_close">
+<tt class="descname">write_close</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#BIO.write_close"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.BIO.write_close" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.BIO.writeable">
+<tt class="descname">writeable</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#BIO.writeable"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.BIO.writeable" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="exception">
+<dt id="M2Crypto.BIO.BIOError">
+<em class="property">exception </em><tt class="descclassname">M2Crypto.BIO.</tt><tt class="descname">BIOError</tt><a class="reference internal" href="_modules/M2Crypto/BIO.html#BIOError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.BIOError" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></tt></p>
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.BIO.CipherStream">
+<em class="property">class </em><tt class="descclassname">M2Crypto.BIO.</tt><tt class="descname">CipherStream</tt><big>(</big><em>obio</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#CipherStream"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.CipherStream" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.BIO.BIO" title="M2Crypto.BIO.BIO"><tt class="xref py py-class docutils literal"><span class="pre">M2Crypto.BIO.BIO</span></tt></a></p>
+<p>Object interface to BIO_f_cipher.</p>
+<dl class="attribute">
+<dt id="M2Crypto.BIO.CipherStream.SALT_LEN">
+<tt class="descname">SALT_LEN</tt><em class="property"> = 8</em><a class="headerlink" href="#M2Crypto.BIO.CipherStream.SALT_LEN" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.CipherStream.close">
+<tt class="descname">close</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#CipherStream.close"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.CipherStream.close" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.CipherStream.m2_bio_free">
+<tt class="descname">m2_bio_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.BIO.CipherStream.m2_bio_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.CipherStream.m2_bio_pop">
+<tt class="descname">m2_bio_pop</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.BIO.CipherStream.m2_bio_pop" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.CipherStream.set_cipher">
+<tt class="descname">set_cipher</tt><big>(</big><em>algo</em>, <em>key</em>, <em>iv</em>, <em>op</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#CipherStream.set_cipher"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.CipherStream.set_cipher" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.CipherStream.write_close">
+<tt class="descname">write_close</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#CipherStream.write_close"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.CipherStream.write_close" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.BIO.File">
+<em class="property">class </em><tt class="descclassname">M2Crypto.BIO.</tt><tt class="descname">File</tt><big>(</big><em>pyfile</em>, <em>close_pyfile=1</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#File"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.File" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.BIO.BIO" title="M2Crypto.BIO.BIO"><tt class="xref py py-class docutils literal"><span class="pre">M2Crypto.BIO.BIO</span></tt></a></p>
+<p>Object interface to BIO_s_pyfd</p>
+<p>This class interfaces Python to OpenSSL functions that expect BIO *. For
+general file manipulation in Python, use Python&#8217;s builtin file object.</p>
+<dl class="method">
+<dt id="M2Crypto.BIO.File.close">
+<tt class="descname">close</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#File.close"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.File.close" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.File.reset">
+<tt class="descname">reset</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#File.reset"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.File.reset" title="Permalink to this definition">¶</a></dt>
+<dd><p>Sets the bio to its initial state
+:return: 0 for success, and -1 for failure</p>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.BIO.IOBuffer">
+<em class="property">class </em><tt class="descclassname">M2Crypto.BIO.</tt><tt class="descname">IOBuffer</tt><big>(</big><em>under_bio</em>, <em>mode='rwb'</em>, <em>_pyfree=1</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#IOBuffer"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.IOBuffer" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.BIO.BIO" title="M2Crypto.BIO.BIO"><tt class="xref py py-class docutils literal"><span class="pre">M2Crypto.BIO.BIO</span></tt></a></p>
+<p>Object interface to BIO_f_buffer.</p>
+<p>Its principal function is to be BIO_push()&#8217;ed on top of a BIO_f_ssl, so
+that makefile() of said underlying SSL socket works.</p>
+<dl class="method">
+<dt id="M2Crypto.BIO.IOBuffer.close">
+<tt class="descname">close</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#IOBuffer.close"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.IOBuffer.close" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.IOBuffer.m2_bio_free">
+<tt class="descname">m2_bio_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.BIO.IOBuffer.m2_bio_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.IOBuffer.m2_bio_pop">
+<tt class="descname">m2_bio_pop</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.BIO.IOBuffer.m2_bio_pop" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.BIO.MemoryBuffer">
+<em class="property">class </em><tt class="descclassname">M2Crypto.BIO.</tt><tt class="descname">MemoryBuffer</tt><big>(</big><em>data=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#MemoryBuffer"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.MemoryBuffer" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.BIO.BIO" title="M2Crypto.BIO.BIO"><tt class="xref py py-class docutils literal"><span class="pre">M2Crypto.BIO.BIO</span></tt></a></p>
+<p>Object interface to BIO_s_mem.</p>
+<p>Empirical testing suggests that this class performs less well than
+cStringIO, because cStringIO is implemented in C, whereas this class
+is implemented in Python. Thus, the recommended practice is to use
+cStringIO for regular work and convert said cStringIO object to
+a MemoryBuffer object only when necessary.</p>
+<dl class="method">
+<dt id="M2Crypto.BIO.MemoryBuffer.close">
+<tt class="descname">close</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.BIO.MemoryBuffer.close" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.MemoryBuffer.getvalue">
+<tt class="descname">getvalue</tt><big>(</big><em>size=0</em><big>)</big><a class="headerlink" href="#M2Crypto.BIO.MemoryBuffer.getvalue" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.MemoryBuffer.read">
+<tt class="descname">read</tt><big>(</big><em>size=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#MemoryBuffer.read"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.MemoryBuffer.read" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.MemoryBuffer.read_all">
+<tt class="descname">read_all</tt><big>(</big><em>size=0</em><big>)</big><a class="headerlink" href="#M2Crypto.BIO.MemoryBuffer.read_all" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.MemoryBuffer.write_close">
+<tt class="descname">write_close</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#MemoryBuffer.write_close"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.MemoryBuffer.write_close" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.BIO.SSLBio">
+<em class="property">class </em><tt class="descclassname">M2Crypto.BIO.</tt><tt class="descname">SSLBio</tt><big>(</big><em>_pyfree=1</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#SSLBio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.SSLBio" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.BIO.BIO" title="M2Crypto.BIO.BIO"><tt class="xref py py-class docutils literal"><span class="pre">M2Crypto.BIO.BIO</span></tt></a></p>
+<p>Object interface to BIO_f_ssl</p>
+<dl class="method">
+<dt id="M2Crypto.BIO.SSLBio.do_handshake">
+<tt class="descname">do_handshake</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#SSLBio.do_handshake"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.SSLBio.do_handshake" title="Permalink to this definition">¶</a></dt>
+<dd><p>Do the handshake.</p>
+<p>Return 1 if the handshake completes
+Return 0 or a negative number if there is a problem</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.BIO.SSLBio.set_ssl">
+<tt class="descname">set_ssl</tt><big>(</big><em>conn</em>, <em>close_flag=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#SSLBio.set_ssl"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.SSLBio.set_ssl" title="Permalink to this definition">¶</a></dt>
+<dd><p>Sets the bio to the SSL pointer which is
+contained in the connection object.</p>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.BIO.openfile">
+<tt class="descclassname">M2Crypto.BIO.</tt><tt class="descname">openfile</tt><big>(</big><em>filename</em>, <em>mode='rb'</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/BIO.html#openfile"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BIO.openfile" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.BN">
+<span id="bn-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">BN</span></tt> Module<a class="headerlink" href="#module-M2Crypto.BN" title="Permalink to this headline">¶</a></h2>
+<dl class="function">
+<dt id="M2Crypto.BN.rand">
+<tt class="descclassname">M2Crypto.BN.</tt><tt class="descname">rand</tt><big>(</big><em>bits</em>, <em>top=-1</em>, <em>bottom=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/BN.html#rand"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BN.rand" title="Permalink to this definition">¶</a></dt>
+<dd><p>Generate cryptographically strong random number.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
+<li><strong>bits</strong> &#8211; Length of random number in bits.</li>
+<li><strong>top</strong> &#8211; If -1, the most significant bit can be 0. If 0, the most
+significant bit is 1, and if 1, the two most significant
+bits will be 1.</li>
+<li><strong>bottom</strong> &#8211; If bottom is true, the number will be odd.</li>
+</ul>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.BN.rand_range">
+<tt class="descclassname">M2Crypto.BN.</tt><tt class="descname">rand_range</tt><big>(</big><em>range</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/BN.html#rand_range"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BN.rand_range" title="Permalink to this definition">¶</a></dt>
+<dd><p>Generate a random number in a range.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>range</strong> &#8211; Upper limit for range.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">A random number in the range [0, range)</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.BN.randfname">
+<tt class="descclassname">M2Crypto.BN.</tt><tt class="descname">randfname</tt><big>(</big><em>length</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/BN.html#randfname"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.BN.randfname" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return a random filename, which is simply a string where all
+the characters are from the set [a-zA-Z0-9].</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>length</strong> &#8211; Length of filename to return.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">random filename string</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.DH">
+<span id="dh-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">DH</span></tt> Module<a class="headerlink" href="#module-M2Crypto.DH" title="Permalink to this headline">¶</a></h2>
+<dl class="class">
+<dt id="M2Crypto.DH.DH">
+<em class="property">class </em><tt class="descclassname">M2Crypto.DH.</tt><tt class="descname">DH</tt><big>(</big><em>dh</em>, <em>_pyfree=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DH.html#DH"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DH.DH" title="Permalink to this definition">¶</a></dt>
+<dd><p>Object interface to the Diffie-Hellman key exchange
+protocol.</p>
+<dl class="method">
+<dt id="M2Crypto.DH.DH.check_params">
+<tt class="descname">check_params</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/DH.html#DH.check_params"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DH.DH.check_params" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.DH.DH.compute_key">
+<tt class="descname">compute_key</tt><big>(</big><em>pubkey</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DH.html#DH.compute_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DH.DH.compute_key" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.DH.DH.gen_key">
+<tt class="descname">gen_key</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/DH.html#DH.gen_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DH.DH.gen_key" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.DH.DH.m2_dh_free">
+<tt class="descname">m2_dh_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.DH.DH.m2_dh_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.DH.DH.print_params">
+<tt class="descname">print_params</tt><big>(</big><em>bio</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DH.html#DH.print_params"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DH.DH.print_params" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="exception">
+<dt id="M2Crypto.DH.DHError">
+<em class="property">exception </em><tt class="descclassname">M2Crypto.DH.</tt><tt class="descname">DHError</tt><a class="reference internal" href="_modules/M2Crypto/DH.html#DHError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DH.DHError" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></tt></p>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.DH.gen_params">
+<tt class="descclassname">M2Crypto.DH.</tt><tt class="descname">gen_params</tt><big>(</big><em>plen</em>, <em>g</em>, <em>callback=&lt;function genparam_callback at 0x1faa758&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DH.html#gen_params"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DH.gen_params" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.DH.load_params">
+<tt class="descclassname">M2Crypto.DH.</tt><tt class="descname">load_params</tt><big>(</big><em>file</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DH.html#load_params"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DH.load_params" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.DH.load_params_bio">
+<tt class="descclassname">M2Crypto.DH.</tt><tt class="descname">load_params_bio</tt><big>(</big><em>bio</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DH.html#load_params_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DH.load_params_bio" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.DH.set_params">
+<tt class="descclassname">M2Crypto.DH.</tt><tt class="descname">set_params</tt><big>(</big><em>p</em>, <em>g</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DH.html#set_params"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DH.set_params" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.DSA">
+<span id="dsa-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">DSA</span></tt> Module<a class="headerlink" href="#module-M2Crypto.DSA" title="Permalink to this headline">¶</a></h2>
+<dl class="class">
+<dt id="M2Crypto.DSA.DSA">
+<em class="property">class </em><tt class="descclassname">M2Crypto.DSA.</tt><tt class="descname">DSA</tt><big>(</big><em>dsa</em>, <em>_pyfree=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DSA.html#DSA"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.DSA" title="Permalink to this definition">¶</a></dt>
+<dd><p>This class is a context supporting DSA key and parameter
+values, signing and verifying.</p>
+<p>Simple example:</p>
+<div class="highlight-python"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">EVP</span><span class="p">,</span> <span class="n">DSA</span><span class="p">,</span> <span class="n">util</span>
+
+<span class="n">message</span> <span class="o">=</span> <span class="s1">&#39;Kilroy was here!&#39;</span>
+<span class="n">md</span> <span class="o">=</span> <span class="n">EVP</span><span class="o">.</span><span class="n">MessageDigest</span><span class="p">(</span><span class="s1">&#39;sha1&#39;</span><span class="p">)</span>
+<span class="n">md</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+<span class="n">digest</span> <span class="o">=</span> <span class="n">md</span><span class="o">.</span><span class="n">final</span><span class="p">()</span>
+
+<span class="n">dsa</span> <span class="o">=</span> <span class="n">DSA</span><span class="o">.</span><span class="n">gen_params</span><span class="p">(</span><span class="mi">1024</span><span class="p">)</span>
+<span class="n">dsa</span><span class="o">.</span><span class="n">gen_key</span><span class="p">()</span>
+<span class="n">r</span><span class="p">,</span> <span class="n">s</span> <span class="o">=</span> <span class="n">dsa</span><span class="o">.</span><span class="n">sign</span><span class="p">(</span><span class="n">digest</span><span class="p">)</span>
+<span class="n">good</span> <span class="o">=</span> <span class="n">dsa</span><span class="o">.</span><span class="n">verify</span><span class="p">(</span><span class="n">digest</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span>
+<span class="k">if</span> <span class="n">good</span><span class="p">:</span>
+ <span class="k">print</span><span class="p">(</span><span class="s1">&#39; ** success **&#39;</span><span class="p">)</span>
+<span class="k">else</span><span class="p">:</span>
+ <span class="k">print</span><span class="p">(</span><span class="s1">&#39; ** verification failed **&#39;</span><span class="p">)</span>
+</pre></div>
+</div>
+<dl class="method">
+<dt id="M2Crypto.DSA.DSA.check_key">
+<tt class="descname">check_key</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/DSA.html#DSA.check_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.DSA.check_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Check to be sure the DSA object has a valid private key.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">1 (true) if a valid private key</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.DSA.DSA.gen_key">
+<tt class="descname">gen_key</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/DSA.html#DSA.gen_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.DSA.gen_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Generate a key pair.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.DSA.DSA.m2_dsa_free">
+<tt class="descname">m2_dsa_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.DSA.DSA.m2_dsa_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.DSA.DSA.save_key">
+<tt class="descname">save_key</tt><big>(</big><em>filename</em>, <em>cipher='aes_128_cbc'</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DSA.html#DSA.save_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.DSA.save_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Save the DSA key pair to a file.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>filename</strong> &#8211; Save the DSA key pair to this file.</li>
+<li><strong>cipher</strong> &#8211; name of symmetric key algorithm and mode
+to encrypt the private key.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">1 (true) if successful</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.DSA.DSA.save_key_bio">
+<tt class="descname">save_key_bio</tt><big>(</big><em>bio</em>, <em>cipher='aes_128_cbc'</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DSA.html#DSA.save_key_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.DSA.save_key_bio" title="Permalink to this definition">¶</a></dt>
+<dd><p>Save DSA key pair to a BIO object.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>bio</strong> &#8211; Save DSA parameters to this object.</li>
+<li><strong>cipher</strong> &#8211; name of symmetric key algorithm and mode
+to encrypt the private key.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">1 (true) if successful</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.DSA.DSA.save_params">
+<tt class="descname">save_params</tt><big>(</big><em>filename</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DSA.html#DSA.save_params"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.DSA.save_params" title="Permalink to this definition">¶</a></dt>
+<dd><p>Save the DSA parameters to a file.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>filename</strong> &#8211; Save the DSA parameters to this file.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">1 (true) if successful</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.DSA.DSA.save_params_bio">
+<tt class="descname">save_params_bio</tt><big>(</big><em>bio</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DSA.html#DSA.save_params_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.DSA.save_params_bio" title="Permalink to this definition">¶</a></dt>
+<dd><p>Save DSA parameters to a BIO object.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>bio</strong> &#8211; Save DSA parameters to this object.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">1 (true) if successful</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.DSA.DSA.save_pub_key">
+<tt class="descname">save_pub_key</tt><big>(</big><em>filename</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DSA.html#DSA.save_pub_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.DSA.save_pub_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Save the DSA public key (with parameters) to a file.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>filename</strong> &#8211; Save DSA public key (with parameters)
+to this file.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">1 (true) if successful</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.DSA.DSA.save_pub_key_bio">
+<tt class="descname">save_pub_key_bio</tt><big>(</big><em>bio</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DSA.html#DSA.save_pub_key_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.DSA.save_pub_key_bio" title="Permalink to this definition">¶</a></dt>
+<dd><p>Save DSA public key (with parameters) to a BIO object.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>bio</strong> &#8211; Save DSA public key (with parameters)
+to this object.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">1 (true) if successful</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.DSA.DSA.set_params">
+<tt class="descname">set_params</tt><big>(</big><em>p</em>, <em>q</em>, <em>g</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DSA.html#DSA.set_params"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.DSA.set_params" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set new parameters.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
+<li><strong>p</strong> &#8211; MPI binary representation ... format that consists of
+the number&#8217;s length in bytes represented as a 4-byte
+big-endian number, and the number itself in big-endian
+format, where the most significant bit signals
+a negative number (the representation of numbers with
+the MSB set is prefixed with null byte).</li>
+<li><strong>q</strong> &#8211; ditto</li>
+<li><strong>g</strong> &#8211; ditto</li>
+</ul>
+</td>
+</tr>
+</tbody>
+</table>
+<dl class="docutils">
+<dt>&#64;warning: This does not change the private key, so it may be</dt>
+<dd>unsafe to use this method. It is better to use
+gen_params function to create a new DSA object.</dd>
+</dl>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.DSA.DSA.sign">
+<tt class="descname">sign</tt><big>(</big><em>digest</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DSA.html#DSA.sign"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.DSA.sign" title="Permalink to this definition">¶</a></dt>
+<dd><p>Sign the digest.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>digest</strong> &#8211; SHA-1 hash of message (same as output
+from MessageDigest, a &#8220;byte string&#8221;)</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">DSA signature, a tuple of two values, r and s,
+both &#8220;byte strings&#8221;.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.DSA.DSA.sign_asn1">
+<tt class="descname">sign_asn1</tt><big>(</big><em>digest</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DSA.html#DSA.sign_asn1"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.DSA.sign_asn1" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.DSA.DSA.verify">
+<tt class="descname">verify</tt><big>(</big><em>digest</em>, <em>r</em>, <em>s</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DSA.html#DSA.verify"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.DSA.verify" title="Permalink to this definition">¶</a></dt>
+<dd><p>Verify a newly calculated digest against the signature
+values r and s.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>digest</strong> &#8211; SHA-1 hash of message (same as output
+from MessageDigest, a &#8220;byte string&#8221;)</li>
+<li><strong>r</strong> &#8211; r value of the signature, a &#8220;byte string&#8221;</li>
+<li><strong>s</strong> &#8211; s value of the signature, a &#8220;byte string&#8221;</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">1 (true) if verify succeeded, 0 if failed</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.DSA.DSA.verify_asn1">
+<tt class="descname">verify_asn1</tt><big>(</big><em>digest</em>, <em>blob</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DSA.html#DSA.verify_asn1"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.DSA.verify_asn1" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="exception">
+<dt id="M2Crypto.DSA.DSAError">
+<em class="property">exception </em><tt class="descclassname">M2Crypto.DSA.</tt><tt class="descname">DSAError</tt><a class="reference internal" href="_modules/M2Crypto/DSA.html#DSAError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.DSAError" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></tt></p>
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.DSA.DSA_pub">
+<em class="property">class </em><tt class="descclassname">M2Crypto.DSA.</tt><tt class="descname">DSA_pub</tt><big>(</big><em>dsa</em>, <em>_pyfree=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DSA.html#DSA_pub"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.DSA_pub" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.DSA.DSA" title="M2Crypto.DSA.DSA"><tt class="xref py py-class docutils literal"><span class="pre">M2Crypto.DSA.DSA</span></tt></a></p>
+<p>This class is a DSA context that only supports a public key
+and verification. It does NOT support a private key or
+signing.</p>
+<dl class="method">
+<dt id="M2Crypto.DSA.DSA_pub.check_key">
+<tt class="descname">check_key</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/DSA.html#DSA_pub.check_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.DSA_pub.check_key" title="Permalink to this definition">¶</a></dt>
+<dd><table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">does DSA_pub contain a pub key?</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.DSA.DSA_pub.save_key">
+<tt class="descname">save_key</tt><big>(</big><em>filename</em><big>)</big><a class="headerlink" href="#M2Crypto.DSA.DSA_pub.save_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Save the DSA public key (with parameters) to a file.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>filename</strong> &#8211; Save DSA public key (with parameters)
+to this file.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">1 (true) if successful</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.DSA.DSA_pub.save_key_bio">
+<tt class="descname">save_key_bio</tt><big>(</big><em>bio</em><big>)</big><a class="headerlink" href="#M2Crypto.DSA.DSA_pub.save_key_bio" title="Permalink to this definition">¶</a></dt>
+<dd><p>Save DSA public key (with parameters) to a BIO object.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>bio</strong> &#8211; Save DSA public key (with parameters)
+to this object.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">1 (true) if successful</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.DSA.DSA_pub.sign">
+<tt class="descname">sign</tt><big>(</big><em>*argv</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DSA.html#DSA_pub.sign"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.DSA_pub.sign" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.DSA.DSA_pub.sign_asn1">
+<tt class="descname">sign_asn1</tt><big>(</big><em>*argv</em><big>)</big><a class="headerlink" href="#M2Crypto.DSA.DSA_pub.sign_asn1" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.DSA.gen_params">
+<tt class="descclassname">M2Crypto.DSA.</tt><tt class="descname">gen_params</tt><big>(</big><em>bits</em>, <em>callback=&lt;function genparam_callback at 0x1faa758&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DSA.html#gen_params"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.gen_params" title="Permalink to this definition">¶</a></dt>
+<dd><p>Factory function that generates DSA parameters and
+instantiates a DSA object from the output.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>bits</strong> &#8211; The length of the prime to be generated. If
+&#8216;bits&#8217; &lt; 512, it is set to 512.</li>
+<li><strong>callback</strong> &#8211; A Python callback object that will be
+invoked during parameter generation; it usual
+purpose is to provide visual feedback.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">instance of DSA.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.DSA.load_key">
+<tt class="descclassname">M2Crypto.DSA.</tt><tt class="descname">load_key</tt><big>(</big><em>file</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DSA.html#load_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.load_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Factory function that instantiates a DSA object from a
+PEM encoded DSA key pair.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>file</strong> &#8211; Names the file (a path) that contains the PEM
+representation of the DSA key pair.</li>
+<li><strong>callback</strong> &#8211; A Python callback object that will be
+invoked if the DSA key pair is
+passphrase-protected.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">instance of DSA.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.DSA.load_key_bio">
+<tt class="descclassname">M2Crypto.DSA.</tt><tt class="descname">load_key_bio</tt><big>(</big><em>bio</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DSA.html#load_key_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.load_key_bio" title="Permalink to this definition">¶</a></dt>
+<dd><p>Factory function that instantiates a DSA object from a
+PEM encoded DSA key pair.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>bio</strong> &#8211; Contains the PEM representation of the DSA
+key pair.</li>
+<li><strong>callback</strong> &#8211; A Python callback object that will be
+invoked if the DSA key pair is
+passphrase-protected.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">instance of DSA.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.DSA.load_params">
+<tt class="descclassname">M2Crypto.DSA.</tt><tt class="descname">load_params</tt><big>(</big><em>file</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DSA.html#load_params"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.load_params" title="Permalink to this definition">¶</a></dt>
+<dd><p>Factory function that instantiates a DSA object with DSA
+parameters from a file.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>file</strong> &#8211; Names the file (a path) that contains the PEM
+representation of the DSA parameters.</li>
+<li><strong>callback</strong> &#8211; A Python callback object that will be
+invoked if the DSA parameters file is
+passphrase-protected.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">instance of DSA.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.DSA.load_params_bio">
+<tt class="descclassname">M2Crypto.DSA.</tt><tt class="descname">load_params_bio</tt><big>(</big><em>bio</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DSA.html#load_params_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.load_params_bio" title="Permalink to this definition">¶</a></dt>
+<dd><p>Factory function that instantiates a DSA object with DSA
+parameters from a M2Crypto.BIO object.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>bio</strong> &#8211; Contains the PEM representation of the DSA
+parameters.</li>
+<li><strong>callback</strong> &#8211; A Python callback object that will be
+invoked if the DSA parameters file is
+passphrase-protected.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">instance of DSA.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.DSA.load_pub_key">
+<tt class="descclassname">M2Crypto.DSA.</tt><tt class="descname">load_pub_key</tt><big>(</big><em>file</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DSA.html#load_pub_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.load_pub_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Factory function that instantiates a DSA_pub object using
+a DSA public key contained in PEM file. The PEM file
+must contain the parameters in addition to the public key.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>file</strong> &#8211; Names the file (a path) that contains the PEM
+representation of the DSA public key.</li>
+<li><strong>callback</strong> &#8211; A Python callback object that will be
+invoked should the DSA public key be
+passphrase-protected.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">instance of DSA_pub.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.DSA.load_pub_key_bio">
+<tt class="descclassname">M2Crypto.DSA.</tt><tt class="descname">load_pub_key_bio</tt><big>(</big><em>bio</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DSA.html#load_pub_key_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.load_pub_key_bio" title="Permalink to this definition">¶</a></dt>
+<dd><p>Factory function that instantiates a DSA_pub object using
+a DSA public key contained in PEM format. The PEM
+must contain the parameters in addition to the public key.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>bio</strong> &#8211; Contains the PEM representation of the DSA
+public key (with params).</li>
+<li><strong>callback</strong> &#8211; A Python callback object that will be
+invoked should the DSA public key be
+passphrase-protected.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">instance of DSA_pub.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.DSA.pub_key_from_params">
+<tt class="descclassname">M2Crypto.DSA.</tt><tt class="descname">pub_key_from_params</tt><big>(</big><em>p</em>, <em>q</em>, <em>g</em>, <em>pub</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DSA.html#pub_key_from_params"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.pub_key_from_params" title="Permalink to this definition">¶</a></dt>
+<dd><p>Factory function that instantiates a DSA_pub object using
+the parameters and public key specified.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>p</strong> &#8211; value of p</li>
+<li><strong>q</strong> &#8211; value of q</li>
+<li><strong>g</strong> &#8211; value of g</li>
+<li><strong>pub</strong> &#8211; value of the public key</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">instance of DSA_pub.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.DSA.set_params">
+<tt class="descclassname">M2Crypto.DSA.</tt><tt class="descname">set_params</tt><big>(</big><em>p</em>, <em>q</em>, <em>g</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/DSA.html#set_params"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.DSA.set_params" title="Permalink to this definition">¶</a></dt>
+<dd><p>Factory function that instantiates a DSA object with DSA
+parameters.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>p</strong> &#8211; value of p, a &#8220;byte string&#8221;</li>
+<li><strong>q</strong> &#8211; value of q, a &#8220;byte string&#8221;</li>
+<li><strong>g</strong> &#8211; value of g, a &#8220;byte string&#8221;</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">instance of DSA.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.EC">
+<span id="ec-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">EC</span></tt> Module<a class="headerlink" href="#module-M2Crypto.EC" title="Permalink to this headline">¶</a></h2>
+<dl class="class">
+<dt id="M2Crypto.EC.EC">
+<em class="property">class </em><tt class="descclassname">M2Crypto.EC.</tt><tt class="descname">EC</tt><big>(</big><em>ec</em>, <em>_pyfree=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#EC"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.EC" title="Permalink to this definition">¶</a></dt>
+<dd><p>Object interface to a EC key pair.</p>
+<dl class="method">
+<dt id="M2Crypto.EC.EC.as_pem">
+<tt class="descname">as_pem</tt><big>(</big><em>cipher='aes_128_cbc'</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#EC.as_pem"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.EC.as_pem" title="Permalink to this definition">¶</a></dt>
+<dd><p>Returns the key(pair) as a string in PEM format.
+If no password is passed and the cipher is set
+it exits with error</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EC.EC.check_key">
+<tt class="descname">check_key</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#EC.check_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.EC.check_key" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EC.EC.compute_dh_key">
+<tt class="descname">compute_dh_key</tt><big>(</big><em>pub_key</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#EC.compute_dh_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.EC.compute_dh_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Compute the ECDH shared key of this key pair and the given public
+key object. They must both use the same curve. Returns the
+shared key in binary as a buffer object. No Key Derivation Function is
+applied.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EC.EC.gen_key">
+<tt class="descname">gen_key</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#EC.gen_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.EC.gen_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Generates the key pair from its parameters. Use:</p>
+<div class="highlight-python"><div class="highlight"><pre><span></span><span class="n">keypair</span> <span class="o">=</span> <span class="n">EC</span><span class="o">.</span><span class="n">gen_params</span><span class="p">(</span><span class="n">curve</span><span class="p">)</span>
+<span class="n">keypair</span><span class="o">.</span><span class="n">gen_key</span><span class="p">()</span>
+</pre></div>
+</div>
+<p>to create an EC key pair.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EC.EC.m2_ec_key_free">
+<tt class="descname">m2_ec_key_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.EC.EC.m2_ec_key_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EC.EC.pub">
+<tt class="descname">pub</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#EC.pub"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.EC.pub" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EC.EC.save_key">
+<tt class="descname">save_key</tt><big>(</big><em>file</em>, <em>cipher='aes_128_cbc'</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#EC.save_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.EC.save_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Save the key pair to a file in PEM format.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
+<li><strong>file</strong> &#8211; Name of filename to save key to.</li>
+<li><strong>cipher</strong> &#8211; Symmetric cipher to protect the key. The default
+cipher is &#8216;aes_128_cbc&#8217;. If cipher is None, then
+the key is saved in the clear.</li>
+<li><strong>callback</strong> &#8211; A Python callable object that is invoked
+to acquire a passphrase with which to protect
+the key. The default is
+util.passphrase_callback.</li>
+</ul>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EC.EC.save_key_bio">
+<tt class="descname">save_key_bio</tt><big>(</big><em>bio</em>, <em>cipher='aes_128_cbc'</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#EC.save_key_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.EC.save_key_bio" title="Permalink to this definition">¶</a></dt>
+<dd><p>Save the key pair to an M2Crypto.BIO.BIO object in PEM format.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
+<li><strong>bio</strong> &#8211; M2Crypto.BIO.BIO object to save key to.</li>
+<li><strong>cipher</strong> &#8211; Symmetric cipher to protect the key. The default
+cipher is &#8216;aes_128_cbc&#8217;. If cipher is None, then
+the key is saved in the clear.</li>
+<li><strong>callback</strong> &#8211; A Python callable object that is invoked
+to acquire a passphrase with which to protect
+the key. The default is
+util.passphrase_callback.</li>
+</ul>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EC.EC.save_pub_key">
+<tt class="descname">save_pub_key</tt><big>(</big><em>file</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#EC.save_pub_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.EC.save_pub_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Save the public key to a filename in PEM format.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>file</strong> &#8211; Name of filename to save key to.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EC.EC.save_pub_key_bio">
+<tt class="descname">save_pub_key_bio</tt><big>(</big><em>bio</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#EC.save_pub_key_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.EC.save_pub_key_bio" title="Permalink to this definition">¶</a></dt>
+<dd><p>Save the public key to an M2Crypto.BIO.BIO object in PEM format.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>bio</strong> &#8211; M2Crypto.BIO.BIO object to save key to.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EC.EC.sign_dsa">
+<tt class="descname">sign_dsa</tt><big>(</big><em>digest</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#EC.sign_dsa"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.EC.sign_dsa" title="Permalink to this definition">¶</a></dt>
+<dd><p>Sign the given digest using ECDSA. Returns a tuple (r,s), the two
+ECDSA signature parameters.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EC.EC.sign_dsa_asn1">
+<tt class="descname">sign_dsa_asn1</tt><big>(</big><em>digest</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#EC.sign_dsa_asn1"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.EC.sign_dsa_asn1" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EC.EC.verify_dsa">
+<tt class="descname">verify_dsa</tt><big>(</big><em>digest</em>, <em>r</em>, <em>s</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#EC.verify_dsa"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.EC.verify_dsa" title="Permalink to this definition">¶</a></dt>
+<dd><p>Verify the given digest using ECDSA. r and s are the ECDSA
+signature parameters.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EC.EC.verify_dsa_asn1">
+<tt class="descname">verify_dsa_asn1</tt><big>(</big><em>digest</em>, <em>blob</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#EC.verify_dsa_asn1"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.EC.verify_dsa_asn1" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="exception">
+<dt id="M2Crypto.EC.ECError">
+<em class="property">exception </em><tt class="descclassname">M2Crypto.EC.</tt><tt class="descname">ECError</tt><a class="reference internal" href="_modules/M2Crypto/EC.html#ECError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.ECError" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></tt></p>
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.EC.EC_pub">
+<em class="property">class </em><tt class="descclassname">M2Crypto.EC.</tt><tt class="descname">EC_pub</tt><big>(</big><em>ec</em>, <em>_pyfree=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#EC_pub"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.EC_pub" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.EC.EC" title="M2Crypto.EC.EC"><tt class="xref py py-class docutils literal"><span class="pre">M2Crypto.EC.EC</span></tt></a></p>
+<p>Object interface to an EC public key.
+((don&#8217;t like this implementation inheritance))</p>
+<dl class="method">
+<dt id="M2Crypto.EC.EC_pub.get_der">
+<tt class="descname">get_der</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#EC_pub.get_der"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.EC_pub.get_der" title="Permalink to this definition">¶</a></dt>
+<dd><p>Returns the public key in DER format as a buffer object.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EC.EC_pub.get_key">
+<tt class="descname">get_key</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#EC_pub.get_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.EC_pub.get_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Returns the public key as a byte string.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EC.EC_pub.save_key">
+<tt class="descname">save_key</tt><big>(</big><em>file</em><big>)</big><a class="headerlink" href="#M2Crypto.EC.EC_pub.save_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Save the public key to a filename in PEM format.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>file</strong> &#8211; Name of filename to save key to.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EC.EC_pub.save_key_bio">
+<tt class="descname">save_key_bio</tt><big>(</big><em>bio</em><big>)</big><a class="headerlink" href="#M2Crypto.EC.EC_pub.save_key_bio" title="Permalink to this definition">¶</a></dt>
+<dd><p>Save the public key to an M2Crypto.BIO.BIO object in PEM format.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>bio</strong> &#8211; M2Crypto.BIO.BIO object to save key to.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.EC.ec_error">
+<tt class="descclassname">M2Crypto.EC.</tt><tt class="descname">ec_error</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#ec_error"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.ec_error" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.EC.gen_params">
+<tt class="descclassname">M2Crypto.EC.</tt><tt class="descname">gen_params</tt><big>(</big><em>curve</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#gen_params"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.gen_params" title="Permalink to this definition">¶</a></dt>
+<dd><p>Factory function that generates EC parameters and
+instantiates a EC object from the output.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>curve</strong> &#8211; This is the OpenSSL nid of the curve to use.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.EC.get_builtin_curves">
+<tt class="descclassname">M2Crypto.EC.</tt><tt class="descname">get_builtin_curves</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#get_builtin_curves"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.get_builtin_curves" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.EC.load_key">
+<tt class="descclassname">M2Crypto.EC.</tt><tt class="descname">load_key</tt><big>(</big><em>file</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#load_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.load_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Factory function that instantiates a EC object.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
+<li><strong>file</strong> &#8211; Names the filename that contains the PEM representation
+of the EC key pair.</li>
+<li><strong>callback</strong> &#8211; Python callback object that will be invoked
+if the EC key pair is passphrase-protected.</li>
+</ul>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.EC.load_key_bio">
+<tt class="descclassname">M2Crypto.EC.</tt><tt class="descname">load_key_bio</tt><big>(</big><em>bio</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#load_key_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.load_key_bio" title="Permalink to this definition">¶</a></dt>
+<dd><p>Factory function that instantiates a EC object.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
+<li><strong>bio</strong> &#8211; M2Crypto.BIO object that contains the PEM
+representation of the EC key pair.</li>
+<li><strong>callback</strong> &#8211; Python callback object that will be invoked
+if the EC key pair is passphrase-protected.</li>
+</ul>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.EC.load_key_string">
+<tt class="descclassname">M2Crypto.EC.</tt><tt class="descname">load_key_string</tt><big>(</big><em>string</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#load_key_string"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.load_key_string" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load an EC key pair from a string.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>string</strong> &#8211; String containing EC key pair in PEM format.</li>
+<li><strong>callback</strong> &#8211; A Python callable object that is invoked
+to acquire a passphrase with which to unlock the
+key. The default is util.passphrase_callback.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">M2Crypto.EC.EC object.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.EC.load_key_string_pubkey">
+<tt class="descclassname">M2Crypto.EC.</tt><tt class="descname">load_key_string_pubkey</tt><big>(</big><em>string</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#load_key_string_pubkey"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.load_key_string_pubkey" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load an M2Crypto.EC.PKey from a public key as a string.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>string</strong> &#8211; String containing the key in PEM format.</li>
+<li><strong>callback</strong> &#8211; A Python callable object that is invoked
+to acquire a passphrase with which to protect the
+key.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">M2Crypto.EC.PKey object.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.EC.load_pub_key">
+<tt class="descclassname">M2Crypto.EC.</tt><tt class="descname">load_pub_key</tt><big>(</big><em>file</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#load_pub_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.load_pub_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load an EC public key from filename.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>file</strong> &#8211; Name of filename containing EC public key in PEM
+format.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">M2Crypto.EC.EC_pub object.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.EC.load_pub_key_bio">
+<tt class="descclassname">M2Crypto.EC.</tt><tt class="descname">load_pub_key_bio</tt><big>(</big><em>bio</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#load_pub_key_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.load_pub_key_bio" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load an EC public key from an M2Crypto.BIO.BIO object.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>bio</strong> &#8211; M2Crypto.BIO.BIO object containing EC public key in PEM
+format.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">M2Crypto.EC.EC_pub object.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.EC.pub_key_from_der">
+<tt class="descclassname">M2Crypto.EC.</tt><tt class="descname">pub_key_from_der</tt><big>(</big><em>der</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#pub_key_from_der"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.pub_key_from_der" title="Permalink to this definition">¶</a></dt>
+<dd><p>Create EC_pub from DER.</p>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.EC.pub_key_from_params">
+<tt class="descclassname">M2Crypto.EC.</tt><tt class="descname">pub_key_from_params</tt><big>(</big><em>curve</em>, <em>bytes</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EC.html#pub_key_from_params"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EC.pub_key_from_params" title="Permalink to this definition">¶</a></dt>
+<dd><p>Create EC_pub from curve name and octet string.</p>
+</dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.EVP">
+<span id="evp-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">EVP</span></tt> Module<a class="headerlink" href="#module-M2Crypto.EVP" title="Permalink to this headline">¶</a></h2>
+<dl class="class">
+<dt id="M2Crypto.EVP.Cipher">
+<em class="property">class </em><tt class="descclassname">M2Crypto.EVP.</tt><tt class="descname">Cipher</tt><big>(</big><em>alg</em>, <em>key</em>, <em>iv</em>, <em>op</em>, <em>key_as_bytes=0</em>, <em>d='md5'</em>, <em>salt='12345678'</em>, <em>i=1</em>, <em>padding=1</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#Cipher"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.Cipher" title="Permalink to this definition">¶</a></dt>
+<dd><dl class="method">
+<dt id="M2Crypto.EVP.Cipher.final">
+<tt class="descname">final</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#Cipher.final"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.Cipher.final" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.Cipher.m2_cipher_ctx_free">
+<tt class="descname">m2_cipher_ctx_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.EVP.Cipher.m2_cipher_ctx_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.Cipher.set_padding">
+<tt class="descname">set_padding</tt><big>(</big><em>padding=1</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#Cipher.set_padding"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.Cipher.set_padding" title="Permalink to this definition">¶</a></dt>
+<dd><p>Actually always return 1</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.Cipher.update">
+<tt class="descname">update</tt><big>(</big><em>data</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#Cipher.update"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.Cipher.update" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="exception">
+<dt id="M2Crypto.EVP.EVPError">
+<em class="property">exception </em><tt class="descclassname">M2Crypto.EVP.</tt><tt class="descname">EVPError</tt><a class="reference internal" href="_modules/M2Crypto/EVP.html#EVPError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.EVPError" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></tt></p>
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.EVP.HMAC">
+<em class="property">class </em><tt class="descclassname">M2Crypto.EVP.</tt><tt class="descname">HMAC</tt><big>(</big><em>key</em>, <em>algo='sha1'</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#HMAC"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.HMAC" title="Permalink to this definition">¶</a></dt>
+<dd><dl class="method">
+<dt id="M2Crypto.EVP.HMAC.digest">
+<tt class="descname">digest</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.EVP.HMAC.digest" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.HMAC.final">
+<tt class="descname">final</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#HMAC.final"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.HMAC.final" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.HMAC.m2_hmac_ctx_free">
+<tt class="descname">m2_hmac_ctx_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.EVP.HMAC.m2_hmac_ctx_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.HMAC.reset">
+<tt class="descname">reset</tt><big>(</big><em>key</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#HMAC.reset"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.HMAC.reset" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.HMAC.update">
+<tt class="descname">update</tt><big>(</big><em>data</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#HMAC.update"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.HMAC.update" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.EVP.MessageDigest">
+<em class="property">class </em><tt class="descclassname">M2Crypto.EVP.</tt><tt class="descname">MessageDigest</tt><big>(</big><em>algo</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#MessageDigest"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.MessageDigest" title="Permalink to this definition">¶</a></dt>
+<dd><p>Message Digest</p>
+<dl class="method">
+<dt id="M2Crypto.EVP.MessageDigest.digest">
+<tt class="descname">digest</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.EVP.MessageDigest.digest" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.MessageDigest.final">
+<tt class="descname">final</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#MessageDigest.final"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.MessageDigest.final" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.MessageDigest.m2_md_ctx_free">
+<tt class="descname">m2_md_ctx_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.EVP.MessageDigest.m2_md_ctx_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.MessageDigest.update">
+<tt class="descname">update</tt><big>(</big><em>data</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#MessageDigest.update"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.MessageDigest.update" title="Permalink to this definition">¶</a></dt>
+<dd><p>Add data to be digested.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">-1 for Python error, 1 for success, 0 for OpenSSL failure.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.EVP.PKey">
+<em class="property">class </em><tt class="descclassname">M2Crypto.EVP.</tt><tt class="descname">PKey</tt><big>(</big><em>pkey=None</em>, <em>_pyfree=0</em>, <em>md='sha1'</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#PKey"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.PKey" title="Permalink to this definition">¶</a></dt>
+<dd><p>Public Key</p>
+<dl class="method">
+<dt id="M2Crypto.EVP.PKey.as_der">
+<tt class="descname">as_der</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#PKey.as_der"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.PKey.as_der" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return key in DER format in a string</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.PKey.as_pem">
+<tt class="descname">as_pem</tt><big>(</big><em>cipher='aes_128_cbc'</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#PKey.as_pem"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.PKey.as_pem" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return key in PEM format in a string.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
+<li><strong>cipher</strong> &#8211; Symmetric cipher to protect the key. The default
+cipher is <tt class="docutils literal"><span class="pre">'aes_128_cbc'</span></tt>. If cipher is None,
+then the key is saved in the clear.</li>
+<li><strong>callback</strong> &#8211; A Python callable object that is invoked
+to acquire a passphrase with which to protect
+the key. The default is
+util.passphrase_callback.</li>
+</ul>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.PKey.assign_rsa">
+<tt class="descname">assign_rsa</tt><big>(</big><em>rsa</em>, <em>capture=1</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#PKey.assign_rsa"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.PKey.assign_rsa" title="Permalink to this definition">¶</a></dt>
+<dd><p>Assign the RSA key pair to self.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>rsa</strong> &#8211; M2Crypto.RSA.RSA object to be assigned to self.</li>
+<li><strong>capture</strong> &#8211; If true (default), this PKey object will own the RSA
+object, meaning that once the PKey object gets
+deleted it is no longer safe to use the RSA object.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">Return 1 for success and 0 for failure.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.PKey.final">
+<tt class="descname">final</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.EVP.PKey.final" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return signature.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">The signature.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.PKey.get_modulus">
+<tt class="descname">get_modulus</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#PKey.get_modulus"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.PKey.get_modulus" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return the modulus in hex format.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.PKey.get_rsa">
+<tt class="descname">get_rsa</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#PKey.get_rsa"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.PKey.get_rsa" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return the underlying RSA key if that is what the EVP
+instance is holding.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.PKey.m2_md_ctx_free">
+<tt class="descname">m2_md_ctx_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.EVP.PKey.m2_md_ctx_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.PKey.m2_pkey_free">
+<tt class="descname">m2_pkey_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.EVP.PKey.m2_pkey_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.PKey.reset_context">
+<tt class="descname">reset_context</tt><big>(</big><em>md='sha1'</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#PKey.reset_context"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.PKey.reset_context" title="Permalink to this definition">¶</a></dt>
+<dd><p>Reset internal message digest context.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>md</strong> &#8211; The message digest algorithm.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.PKey.save_key">
+<tt class="descname">save_key</tt><big>(</big><em>file</em>, <em>cipher='aes_128_cbc'</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#PKey.save_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.PKey.save_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Save the key pair to a file in PEM format.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
+<li><strong>file</strong> &#8211; Name of file to save key to.</li>
+<li><strong>cipher</strong> &#8211; Symmetric cipher to protect the key. The default
+cipher is &#8216;aes_128_cbc&#8217;. If cipher is None, then
+the key is saved in the clear.</li>
+<li><strong>callback</strong> &#8211; A Python callable object that is invoked
+to acquire a passphrase with which to protect
+the key. The default is
+util.passphrase_callback.</li>
+</ul>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.PKey.save_key_bio">
+<tt class="descname">save_key_bio</tt><big>(</big><em>bio</em>, <em>cipher='aes_128_cbc'</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#PKey.save_key_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.PKey.save_key_bio" title="Permalink to this definition">¶</a></dt>
+<dd><p>Save the key pair to the M2Crypto.BIO object &#8216;bio&#8217; in PEM format.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
+<li><strong>bio</strong> &#8211; M2Crypto.BIO object to save key to.</li>
+<li><strong>cipher</strong> &#8211; Symmetric cipher to protect the key. The default
+cipher is &#8216;aes_128_cbc&#8217;. If cipher is None, then
+the key is saved in the clear.</li>
+<li><strong>callback</strong> &#8211; A Python callable object that is invoked
+to acquire a passphrase with which to protect
+the key. The default is
+util.passphrase_callback.</li>
+</ul>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.PKey.sign_final">
+<tt class="descname">sign_final</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#PKey.sign_final"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.PKey.sign_final" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return signature.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">The signature.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.PKey.sign_init">
+<tt class="descname">sign_init</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#PKey.sign_init"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.PKey.sign_init" title="Permalink to this definition">¶</a></dt>
+<dd><p>Initialise signing operation with self.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.PKey.sign_update">
+<tt class="descname">sign_update</tt><big>(</big><em>data</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#PKey.sign_update"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.PKey.sign_update" title="Permalink to this definition">¶</a></dt>
+<dd><p>Feed data to signing operation.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>data</strong> &#8211; Data to be signed.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.PKey.size">
+<tt class="descname">size</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#PKey.size"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.PKey.size" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return the size of the key in bytes.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.PKey.update">
+<tt class="descname">update</tt><big>(</big><em>data</em><big>)</big><a class="headerlink" href="#M2Crypto.EVP.PKey.update" title="Permalink to this definition">¶</a></dt>
+<dd><p>Feed data to signing operation.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>data</strong> &#8211; Data to be signed.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.PKey.verify_final">
+<tt class="descname">verify_final</tt><big>(</big><em>sign</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#PKey.verify_final"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.PKey.verify_final" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return result of verification.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>sign</strong> &#8211; Signature to use for verification</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">Result of verification: 1 for success, 0 for failure, -1 on
+other error.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.PKey.verify_init">
+<tt class="descname">verify_init</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#PKey.verify_init"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.PKey.verify_init" title="Permalink to this definition">¶</a></dt>
+<dd><p>Initialise signature verification operation with self.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.EVP.PKey.verify_update">
+<tt class="descname">verify_update</tt><big>(</big><em>data</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#PKey.verify_update"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.PKey.verify_update" title="Permalink to this definition">¶</a></dt>
+<dd><p>Feed data to verification operation.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>data</strong> &#8211; Data to be verified.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">-1 on Python error, 1 for success, 0 for OpenSSL error</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.EVP.hmac">
+<tt class="descclassname">M2Crypto.EVP.</tt><tt class="descname">hmac</tt><big>(</big><em>key</em>, <em>data</em>, <em>algo='sha1'</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#hmac"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.hmac" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.EVP.load_key">
+<tt class="descclassname">M2Crypto.EVP.</tt><tt class="descname">load_key</tt><big>(</big><em>file</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#load_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.load_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load an M2Crypto.EVP.PKey from file.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>file</strong> &#8211; Name of file containing the key in PEM format.</li>
+<li><strong>callback</strong> &#8211; A Python callable object that is invoked
+to acquire a passphrase with which to protect the
+key.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">M2Crypto.EVP.PKey object.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.EVP.load_key_bio">
+<tt class="descclassname">M2Crypto.EVP.</tt><tt class="descname">load_key_bio</tt><big>(</big><em>bio</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#load_key_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.load_key_bio" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load an M2Crypto.EVP.PKey from an M2Crypto.BIO object.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>bio</strong> &#8211; M2Crypto.BIO object containing the key in PEM format.</li>
+<li><strong>callback</strong> &#8211; A Python callable object that is invoked
+to acquire a passphrase with which to protect the
+key.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">M2Crypto.EVP.PKey object.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.EVP.load_key_bio_pubkey">
+<tt class="descclassname">M2Crypto.EVP.</tt><tt class="descname">load_key_bio_pubkey</tt><big>(</big><em>bio</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#load_key_bio_pubkey"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.load_key_bio_pubkey" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load an M2Crypto.EVP.PKey from a public key as a M2Crypto.BIO object.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>bio</strong> &#8211; M2Crypto.BIO object containing the key in PEM format.</li>
+<li><strong>callback</strong> &#8211; A Python callable object that is invoked
+to acquire a passphrase with which to protect the
+key.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">M2Crypto.EVP.PKey object.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.EVP.load_key_string">
+<tt class="descclassname">M2Crypto.EVP.</tt><tt class="descname">load_key_string</tt><big>(</big><em>string</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#load_key_string"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.load_key_string" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load an M2Crypto.EVP.PKey from a string.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>string</strong> &#8211; String containing the key in PEM format.</li>
+<li><strong>callback</strong> &#8211; A Python callable object that is invoked
+to acquire a passphrase with which to protect the
+key.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">M2Crypto.EVP.PKey object.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.EVP.load_key_string_pubkey">
+<tt class="descclassname">M2Crypto.EVP.</tt><tt class="descname">load_key_string_pubkey</tt><big>(</big><em>string</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#load_key_string_pubkey"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.load_key_string_pubkey" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load an M2Crypto.EVP.PKey from a public key as a string.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>string</strong> &#8211; String containing the key in PEM format.</li>
+<li><strong>callback</strong> &#8211; A Python callable object that is invoked
+to acquire a passphrase with which to protect the
+key.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">M2Crypto.EVP.PKey object.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.EVP.pbkdf2">
+<tt class="descclassname">M2Crypto.EVP.</tt><tt class="descname">pbkdf2</tt><big>(</big><em>password</em>, <em>salt</em>, <em>iter</em>, <em>keylen</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/EVP.html#pbkdf2"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.EVP.pbkdf2" title="Permalink to this definition">¶</a></dt>
+<dd><p>Derive a key from password using PBKDF2 algorithm specified in RFC 2898.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>password</strong> &#8211; Derive the key from this password.</li>
+<li><strong>salt</strong> &#8211; Salt.</li>
+<li><strong>iter</strong> &#8211; Number of iterations to perform.</li>
+<li><strong>keylen</strong> &#8211; Length of key to produce.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">Key.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.Engine">
+<span id="engine-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">Engine</span></tt> Module<a class="headerlink" href="#module-M2Crypto.Engine" title="Permalink to this headline">¶</a></h2>
+<p>M2Crypto wrapper for OpenSSL ENGINE API.</p>
+<p>Pavel Shramov
+IMEC MSU</p>
+<dl class="class">
+<dt id="M2Crypto.Engine.Engine">
+<em class="property">class </em><tt class="descclassname">M2Crypto.Engine.</tt><tt class="descname">Engine</tt><big>(</big><em>id=None</em>, <em>_ptr=None</em>, <em>_pyfree=1</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/Engine.html#Engine"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Engine.Engine" title="Permalink to this definition">¶</a></dt>
+<dd><p>Wrapper for ENGINE object.</p>
+<dl class="method">
+<dt id="M2Crypto.Engine.Engine.ctrl_cmd_string">
+<tt class="descname">ctrl_cmd_string</tt><big>(</big><em>cmd</em>, <em>arg</em>, <em>optional=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/Engine.html#Engine.ctrl_cmd_string"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Engine.Engine.ctrl_cmd_string" title="Permalink to this definition">¶</a></dt>
+<dd><p>Call ENGINE_ctrl_cmd_string</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.Engine.Engine.finish">
+<tt class="descname">finish</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/Engine.html#Engine.finish"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Engine.Engine.finish" title="Permalink to this definition">¶</a></dt>
+<dd><p>Release a functional and structural reference to the engine.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.Engine.Engine.get_id">
+<tt class="descname">get_id</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/Engine.html#Engine.get_id"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Engine.Engine.get_id" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return engine id</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.Engine.Engine.get_name">
+<tt class="descname">get_name</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/Engine.html#Engine.get_name"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Engine.Engine.get_name" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return engine name</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.Engine.Engine.init">
+<tt class="descname">init</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/Engine.html#Engine.init"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Engine.Engine.init" title="Permalink to this definition">¶</a></dt>
+<dd><p>Obtain a functional reference to the engine.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">0 on error, non-zero on success.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.Engine.Engine.load_certificate">
+<tt class="descname">load_certificate</tt><big>(</big><em>name</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/Engine.html#Engine.load_certificate"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Engine.Engine.load_certificate" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load certificate from engine (e.g from smartcard).
+NOTE: This function may be not implemented by engine!</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.Engine.Engine.load_private_key">
+<tt class="descname">load_private_key</tt><big>(</big><em>name</em>, <em>pin=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/Engine.html#Engine.load_private_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Engine.Engine.load_private_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load private key with engine methods (e.g from smartcard).
+If pin is not set it will be asked</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.Engine.Engine.load_public_key">
+<tt class="descname">load_public_key</tt><big>(</big><em>name</em>, <em>pin=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/Engine.html#Engine.load_public_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Engine.Engine.load_public_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load public key with engine methods (e.g from smartcard).</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.Engine.Engine.m2_engine_free">
+<tt class="descname">m2_engine_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.Engine.Engine.m2_engine_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.Engine.Engine.set_default">
+<tt class="descname">set_default</tt><big>(</big><em>methods=65535</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/Engine.html#Engine.set_default"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Engine.Engine.set_default" title="Permalink to this definition">¶</a></dt>
+<dd><p>Use this engine as default for methods specified in argument</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>methods</strong> &#8211; Possible values are bitwise OR of m2.ENGINE_METHOD_*</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="exception">
+<dt id="M2Crypto.Engine.EngineError">
+<em class="property">exception </em><tt class="descclassname">M2Crypto.Engine.</tt><tt class="descname">EngineError</tt><a class="reference internal" href="_modules/M2Crypto/Engine.html#EngineError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Engine.EngineError" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></tt></p>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.Engine.cleanup">
+<tt class="descclassname">M2Crypto.Engine.</tt><tt class="descname">cleanup</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/Engine.html#cleanup"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Engine.cleanup" title="Permalink to this definition">¶</a></dt>
+<dd><p>If you load any engines, you need to clean up after your application
+is finished with the engines.</p>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.Engine.load_dynamic">
+<tt class="descclassname">M2Crypto.Engine.</tt><tt class="descname">load_dynamic</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/Engine.html#load_dynamic"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Engine.load_dynamic" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load dynamic engine</p>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.Engine.load_dynamic_engine">
+<tt class="descclassname">M2Crypto.Engine.</tt><tt class="descname">load_dynamic_engine</tt><big>(</big><em>id</em>, <em>sopath</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/Engine.html#load_dynamic_engine"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Engine.load_dynamic_engine" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load and return dymanic engine from sopath and assign id to it</p>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.Engine.load_openssl">
+<tt class="descclassname">M2Crypto.Engine.</tt><tt class="descname">load_openssl</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/Engine.html#load_openssl"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Engine.load_openssl" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load openssl engine</p>
+</dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.Err">
+<span id="err-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">Err</span></tt> Module<a class="headerlink" href="#module-M2Crypto.Err" title="Permalink to this headline">¶</a></h2>
+<dl class="exception">
+<dt id="M2Crypto.Err.M2CryptoError">
+<em class="property">exception </em><tt class="descclassname">M2Crypto.Err.</tt><tt class="descname">M2CryptoError</tt><a class="reference internal" href="_modules/M2Crypto/Err.html#M2CryptoError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Err.M2CryptoError" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></tt></p>
+</dd></dl>
+
+<dl class="exception">
+<dt id="M2Crypto.Err.SSLError">
+<em class="property">exception </em><tt class="descclassname">M2Crypto.Err.</tt><tt class="descname">SSLError</tt><big>(</big><em>err</em>, <em>client_addr</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/Err.html#SSLError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Err.SSLError" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></tt></p>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.Err.get_error">
+<tt class="descclassname">M2Crypto.Err.</tt><tt class="descname">get_error</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/Err.html#get_error"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Err.get_error" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.Err.get_error_code">
+<tt class="descclassname">M2Crypto.Err.</tt><tt class="descname">get_error_code</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/Err.html#get_error_code"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Err.get_error_code" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.Err.get_error_func">
+<tt class="descclassname">M2Crypto.Err.</tt><tt class="descname">get_error_func</tt><big>(</big><em>err</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/Err.html#get_error_func"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Err.get_error_func" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.Err.get_error_lib">
+<tt class="descclassname">M2Crypto.Err.</tt><tt class="descname">get_error_lib</tt><big>(</big><em>err</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/Err.html#get_error_lib"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Err.get_error_lib" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.Err.get_error_reason">
+<tt class="descclassname">M2Crypto.Err.</tt><tt class="descname">get_error_reason</tt><big>(</big><em>err</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/Err.html#get_error_reason"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Err.get_error_reason" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.Err.get_x509_verify_error">
+<tt class="descclassname">M2Crypto.Err.</tt><tt class="descname">get_x509_verify_error</tt><big>(</big><em>err</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/Err.html#get_x509_verify_error"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Err.get_x509_verify_error" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.Err.peek_error_code">
+<tt class="descclassname">M2Crypto.Err.</tt><tt class="descname">peek_error_code</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/Err.html#peek_error_code"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Err.peek_error_code" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.RC4">
+<span id="rc4-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">RC4</span></tt> Module<a class="headerlink" href="#module-M2Crypto.RC4" title="Permalink to this headline">¶</a></h2>
+<dl class="class">
+<dt id="M2Crypto.RC4.RC4">
+<em class="property">class </em><tt class="descclassname">M2Crypto.RC4.</tt><tt class="descname">RC4</tt><big>(</big><em>key=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RC4.html#RC4"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RC4.RC4" title="Permalink to this definition">¶</a></dt>
+<dd><p>Object interface to the stream cipher RC4.</p>
+<dl class="method">
+<dt id="M2Crypto.RC4.RC4.final">
+<tt class="descname">final</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/RC4.html#RC4.final"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RC4.RC4.final" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.RC4.RC4.rc4_free">
+<tt class="descname">rc4_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.RC4.RC4.rc4_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.RC4.RC4.set_key">
+<tt class="descname">set_key</tt><big>(</big><em>key</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RC4.html#RC4.set_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RC4.RC4.set_key" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.RC4.RC4.update">
+<tt class="descname">update</tt><big>(</big><em>data</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RC4.html#RC4.update"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RC4.RC4.update" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.RSA">
+<span id="rsa-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">RSA</span></tt> Module<a class="headerlink" href="#module-M2Crypto.RSA" title="Permalink to this headline">¶</a></h2>
+<dl class="class">
+<dt id="M2Crypto.RSA.RSA">
+<em class="property">class </em><tt class="descclassname">M2Crypto.RSA.</tt><tt class="descname">RSA</tt><big>(</big><em>rsa</em>, <em>_pyfree=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA" title="Permalink to this definition">¶</a></dt>
+<dd><p>RSA Key Pair.</p>
+<dl class="method">
+<dt id="M2Crypto.RSA.RSA.as_pem">
+<tt class="descname">as_pem</tt><big>(</big><em>cipher='aes_128_cbc'</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA.as_pem"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA.as_pem" title="Permalink to this definition">¶</a></dt>
+<dd><p>Returns the key(pair) as a string in PEM format.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.RSA.RSA.check_key">
+<tt class="descname">check_key</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA.check_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA.check_key" title="Permalink to this definition">¶</a></dt>
+<dd><table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">returns 1 if rsa is a valid RSA key, and 0 otherwise.
+-1 is returned if an error occurs while checking the key.
+If the key is invalid or an error occurred, the reason
+code can be obtained using ERR_get_error(3).</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.RSA.RSA.m2_rsa_free">
+<tt class="descname">m2_rsa_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.RSA.RSA.m2_rsa_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.RSA.RSA.private_decrypt">
+<tt class="descname">private_decrypt</tt><big>(</big><em>data</em>, <em>padding</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA.private_decrypt"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA.private_decrypt" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.RSA.RSA.private_encrypt">
+<tt class="descname">private_encrypt</tt><big>(</big><em>data</em>, <em>padding</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA.private_encrypt"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA.private_encrypt" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.RSA.RSA.pub">
+<tt class="descname">pub</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA.pub"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA.pub" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.RSA.RSA.public_decrypt">
+<tt class="descname">public_decrypt</tt><big>(</big><em>data</em>, <em>padding</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA.public_decrypt"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA.public_decrypt" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.RSA.RSA.public_encrypt">
+<tt class="descname">public_encrypt</tt><big>(</big><em>data</em>, <em>padding</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA.public_encrypt"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA.public_encrypt" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.RSA.RSA.save_key">
+<tt class="descname">save_key</tt><big>(</big><em>file</em>, <em>cipher='aes_128_cbc'</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA.save_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA.save_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Save the key pair to a file in PEM format.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
+<li><strong>file</strong> &#8211; Name of file to save key to.</li>
+<li><strong>cipher</strong> &#8211; Symmetric cipher to protect the key. The default
+cipher is &#8216;aes_128_cbc&#8217;. If cipher is None, then
+the key is saved in the clear.</li>
+<li><strong>callback</strong> &#8211; A Python callable object that is invoked
+to acquire a passphrase with which to protect
+the key. The default is
+util.passphrase_callback.</li>
+</ul>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.RSA.RSA.save_key_bio">
+<tt class="descname">save_key_bio</tt><big>(</big><em>bio</em>, <em>cipher='aes_128_cbc'</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA.save_key_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA.save_key_bio" title="Permalink to this definition">¶</a></dt>
+<dd><p>Save the key pair to an M2Crypto.BIO.BIO object in PEM format.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
+<li><strong>bio</strong> &#8211; M2Crypto.BIO.BIO object to save key to.</li>
+<li><strong>cipher</strong> &#8211; Symmetric cipher to protect the key. The default
+cipher is &#8216;aes_128_cbc&#8217;. If cipher is None, then
+the key is saved in the clear.</li>
+<li><strong>callback</strong> &#8211; A Python callable object that is invoked
+to acquire a passphrase with which to protect
+the key. The default is
+util.passphrase_callback.</li>
+</ul>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.RSA.RSA.save_key_der">
+<tt class="descname">save_key_der</tt><big>(</big><em>file</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA.save_key_der"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA.save_key_der" title="Permalink to this definition">¶</a></dt>
+<dd><p>Save the key pair to a file in DER format.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>file</strong> &#8211; Filename to save key to</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.RSA.RSA.save_key_der_bio">
+<tt class="descname">save_key_der_bio</tt><big>(</big><em>bio</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA.save_key_der_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA.save_key_der_bio" title="Permalink to this definition">¶</a></dt>
+<dd><p>Save the key pair to an M2Crypto.BIO.BIO object in DER format.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>bio</strong> &#8211; M2Crypto.BIO.BIO object to save key to.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.RSA.RSA.save_pem">
+<tt class="descname">save_pem</tt><big>(</big><em>file</em>, <em>cipher='aes_128_cbc'</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="headerlink" href="#M2Crypto.RSA.RSA.save_pem" title="Permalink to this definition">¶</a></dt>
+<dd><p>Save the key pair to a file in PEM format.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
+<li><strong>file</strong> &#8211; Name of file to save key to.</li>
+<li><strong>cipher</strong> &#8211; Symmetric cipher to protect the key. The default
+cipher is &#8216;aes_128_cbc&#8217;. If cipher is None, then
+the key is saved in the clear.</li>
+<li><strong>callback</strong> &#8211; A Python callable object that is invoked
+to acquire a passphrase with which to protect
+the key. The default is
+util.passphrase_callback.</li>
+</ul>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.RSA.RSA.save_pub_key">
+<tt class="descname">save_pub_key</tt><big>(</big><em>file</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA.save_pub_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA.save_pub_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Save the public key to a file in PEM format.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>file</strong> &#8211; Name of file to save key to.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.RSA.RSA.save_pub_key_bio">
+<tt class="descname">save_pub_key_bio</tt><big>(</big><em>bio</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA.save_pub_key_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA.save_pub_key_bio" title="Permalink to this definition">¶</a></dt>
+<dd><p>Save the public key to an M2Crypto.BIO.BIO object in PEM format.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>bio</strong> &#8211; M2Crypto.BIO.BIO object to save key to.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.RSA.RSA.sign">
+<tt class="descname">sign</tt><big>(</big><em>digest</em>, <em>algo='sha1'</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA.sign"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA.sign" title="Permalink to this definition">¶</a></dt>
+<dd><p>Signs a digest with the private key</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>digest</strong> &#8211; A digest created by using the digest method</li>
+<li><strong>algo</strong> &#8211; The method that created the digest.
+Legal values like &#8216;sha1&#8217;,&#8217;sha224&#8217;, &#8216;sha256&#8217;,
+&#8216;ripemd160&#8217;, and &#8216;md5&#8217;.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">a string which is the signature</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.RSA.RSA.sign_rsassa_pss">
+<tt class="descname">sign_rsassa_pss</tt><big>(</big><em>digest</em>, <em>algo='sha1'</em>, <em>salt_length=20</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA.sign_rsassa_pss"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA.sign_rsassa_pss" title="Permalink to this definition">¶</a></dt>
+<dd><p>Signs a digest with the private key using RSASSA-PSS</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>digest</strong> &#8211; A digest created by using the digest method</li>
+<li><strong>salt_length</strong> &#8211; The length of the salt to use</li>
+<li><strong>algo</strong> &#8211; The hash algorithm to use
+Legal values like &#8216;sha1&#8217;,&#8217;sha224&#8217;, &#8216;sha256&#8217;,
+&#8216;ripemd160&#8217;, and &#8216;md5&#8217;.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">a string which is the signature</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.RSA.RSA.verify">
+<tt class="descname">verify</tt><big>(</big><em>data</em>, <em>signature</em>, <em>algo='sha1'</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA.verify"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA.verify" title="Permalink to this definition">¶</a></dt>
+<dd><p>Verifies the signature with the public key</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>data</strong> &#8211; Data that has been signed</li>
+<li><strong>signature</strong> &#8211; The signature signed with the private key</li>
+<li><strong>algo</strong> &#8211; The method use to create digest from the data
+before it was signed. Legal values like
+&#8216;sha1&#8217;,&#8217;sha224&#8217;, &#8216;sha256&#8217;, &#8216;ripemd160&#8217;, and &#8216;md5&#8217;.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">1 or 0, depending on whether the signature was
+verified or not.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.RSA.RSA.verify_rsassa_pss">
+<tt class="descname">verify_rsassa_pss</tt><big>(</big><em>data</em>, <em>signature</em>, <em>algo='sha1'</em>, <em>salt_length=20</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA.verify_rsassa_pss"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA.verify_rsassa_pss" title="Permalink to this definition">¶</a></dt>
+<dd><p>Verifies the signature RSASSA-PSS</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>data</strong> &#8211; Data that has been signed</li>
+<li><strong>signature</strong> &#8211; The signature signed with RSASSA-PSS</li>
+<li><strong>salt_length</strong> &#8211; The length of the salt that was used</li>
+<li><strong>algo</strong> &#8211; The hash algorithm to use
+Legal values are for example &#8216;sha1&#8217;,&#8217;sha224&#8217;,
+&#8216;sha256&#8217;, &#8216;ripemd160&#8217;, and &#8216;md5&#8217;.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">1 or 0, depending on whether the signature was
+verified or not.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="exception">
+<dt id="M2Crypto.RSA.RSAError">
+<em class="property">exception </em><tt class="descclassname">M2Crypto.RSA.</tt><tt class="descname">RSAError</tt><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSAError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSAError" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></tt></p>
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.RSA.RSA_pub">
+<em class="property">class </em><tt class="descclassname">M2Crypto.RSA.</tt><tt class="descname">RSA_pub</tt><big>(</big><em>rsa</em>, <em>_pyfree=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA_pub"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA_pub" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.RSA.RSA" title="M2Crypto.RSA.RSA"><tt class="xref py py-class docutils literal"><span class="pre">M2Crypto.RSA.RSA</span></tt></a></p>
+<p>Object interface to an RSA public key.</p>
+<dl class="method">
+<dt id="M2Crypto.RSA.RSA_pub.check_key">
+<tt class="descname">check_key</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA_pub.check_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA_pub.check_key" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.RSA.RSA_pub.private_decrypt">
+<tt class="descname">private_decrypt</tt><big>(</big><em>*argv</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA_pub.private_decrypt"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA_pub.private_decrypt" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.RSA.RSA_pub.private_encrypt">
+<tt class="descname">private_encrypt</tt><big>(</big><em>*argv</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA_pub.private_encrypt"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA_pub.private_encrypt" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.RSA.RSA_pub.save_key">
+<tt class="descname">save_key</tt><big>(</big><em>file</em>, <em>*args</em>, <em>**kw</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA_pub.save_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA_pub.save_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Save public key to file.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.RSA.RSA_pub.save_key_bio">
+<tt class="descname">save_key_bio</tt><big>(</big><em>bio</em>, <em>*args</em>, <em>**kw</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#RSA_pub.save_key_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.RSA_pub.save_key_bio" title="Permalink to this definition">¶</a></dt>
+<dd><p>Save public key to BIO.</p>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.RSA.gen_key">
+<tt class="descclassname">M2Crypto.RSA.</tt><tt class="descname">gen_key</tt><big>(</big><em>bits</em>, <em>e</em>, <em>callback=&lt;function keygen_callback at 0x1ffa410&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#gen_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.gen_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Generate an RSA key pair.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>bits</strong> &#8211; Key length, in bits.</li>
+<li><strong>e</strong> &#8211; The RSA public exponent.</li>
+<li><strong>callback</strong> &#8211; A Python callable object that is invoked
+during key generation; its usual purpose is to
+provide visual feedback. The default callback is
+keygen_callback.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">M2Crypto.RSA.RSA object.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.RSA.keygen_callback">
+<tt class="descclassname">M2Crypto.RSA.</tt><tt class="descname">keygen_callback</tt><big>(</big><em>p</em>, <em>n</em>, <em>out=&lt;open file '&lt;stdout&gt;'</em>, <em>mode 'w' at 0x7fc7ebc63150&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#keygen_callback"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.keygen_callback" title="Permalink to this definition">¶</a></dt>
+<dd><p>Default callback for gen_key().</p>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.RSA.load_key">
+<tt class="descclassname">M2Crypto.RSA.</tt><tt class="descname">load_key</tt><big>(</big><em>file</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#load_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.load_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load an RSA key pair from file.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>file</strong> &#8211; Name of file containing RSA public key in PEM format.</li>
+<li><strong>callback</strong> &#8211; A Python callable object that is invoked
+to acquire a passphrase with which to unlock the
+key. The default is util.passphrase_callback.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">M2Crypto.RSA.RSA object.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.RSA.load_key_bio">
+<tt class="descclassname">M2Crypto.RSA.</tt><tt class="descname">load_key_bio</tt><big>(</big><em>bio</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#load_key_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.load_key_bio" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load an RSA key pair from an M2Crypto.BIO.BIO object.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>bio</strong> &#8211; M2Crypto.BIO.BIO object containing RSA key pair in PEM
+format.</li>
+<li><strong>callback</strong> &#8211; A Python callable object that is invoked
+to acquire a passphrase with which to unlock the
+key. The default is util.passphrase_callback.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">M2Crypto.RSA.RSA object.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.RSA.load_key_string">
+<tt class="descclassname">M2Crypto.RSA.</tt><tt class="descname">load_key_string</tt><big>(</big><em>string</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#load_key_string"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.load_key_string" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load an RSA key pair from a string.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>string</strong> &#8211; String containing RSA key pair in PEM format.</li>
+<li><strong>callback</strong> &#8211; A Python callable object that is invoked
+to acquire a passphrase with which to unlock the
+key. The default is util.passphrase_callback.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">M2Crypto.RSA.RSA object.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.RSA.load_pub_key">
+<tt class="descclassname">M2Crypto.RSA.</tt><tt class="descname">load_pub_key</tt><big>(</big><em>file</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#load_pub_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.load_pub_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load an RSA public key from file.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>file</strong> &#8211; Name of file containing RSA public key in PEM format.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">M2Crypto.RSA.RSA_pub object.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.RSA.load_pub_key_bio">
+<tt class="descclassname">M2Crypto.RSA.</tt><tt class="descname">load_pub_key_bio</tt><big>(</big><em>bio</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#load_pub_key_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.load_pub_key_bio" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load an RSA public key from an M2Crypto.BIO.BIO object.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>bio</strong> &#8211; M2Crypto.BIO.BIO object containing RSA public key in PEM
+format.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">M2Crypto.RSA.RSA_pub object.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.RSA.new_pub_key">
+<tt class="descclassname">M2Crypto.RSA.</tt><tt class="descname">new_pub_key</tt><big>(</big><em>e_n</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#new_pub_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.new_pub_key" title="Permalink to this definition">¶</a></dt>
+<dd><p>Instantiate an RSA_pub object from an (e, n) tuple.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>e</strong> &#8211; The RSA public exponent; it is a string in OpenSSL&#8217;s MPINT
+format - 4-byte big-endian bit-count followed by the
+appropriate number of bits.</li>
+<li><strong>n</strong> &#8211; The RSA composite of primes; it is a string in OpenSSL&#8217;s
+MPINT format - 4-byte big-endian bit-count followed by the
+appropriate number of bits.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">M2Crypto.RSA.RSA_pub object.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.RSA.rsa_error">
+<tt class="descclassname">M2Crypto.RSA.</tt><tt class="descname">rsa_error</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/RSA.html#rsa_error"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.RSA.rsa_error" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.Rand">
+<span id="rand-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">Rand</span></tt> Module<a class="headerlink" href="#module-M2Crypto.Rand" title="Permalink to this headline">¶</a></h2>
+<dl class="function">
+<dt id="M2Crypto.Rand.rand_seed">
+<tt class="descclassname">M2Crypto.Rand.</tt><tt class="descname">rand_seed</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.Rand.rand_seed" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.Rand.rand_add">
+<tt class="descclassname">M2Crypto.Rand.</tt><tt class="descname">rand_add</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.Rand.rand_add" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.Rand.load_file">
+<tt class="descclassname">M2Crypto.Rand.</tt><tt class="descname">load_file</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.Rand.load_file" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.Rand.save_file">
+<tt class="descclassname">M2Crypto.Rand.</tt><tt class="descname">save_file</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.Rand.save_file" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.Rand.rand_bytes">
+<tt class="descclassname">M2Crypto.Rand.</tt><tt class="descname">rand_bytes</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.Rand.rand_bytes" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.Rand.rand_pseudo_bytes">
+<tt class="descclassname">M2Crypto.Rand.</tt><tt class="descname">rand_pseudo_bytes</tt><big>(</big><em>n</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/Rand.html#rand_pseudo_bytes"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Rand.rand_pseudo_bytes" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.Rand.rand_file_name">
+<tt class="descclassname">M2Crypto.Rand.</tt><tt class="descname">rand_file_name</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/Rand.html#rand_file_name"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.Rand.rand_file_name" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.Rand.rand_status">
+<tt class="descclassname">M2Crypto.Rand.</tt><tt class="descname">rand_status</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.Rand.rand_status" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.SMIME">
+<span id="smime-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">SMIME</span></tt> Module<a class="headerlink" href="#module-M2Crypto.SMIME" title="Permalink to this headline">¶</a></h2>
+<dl class="class">
+<dt id="M2Crypto.SMIME.Cipher">
+<em class="property">class </em><tt class="descclassname">M2Crypto.SMIME.</tt><tt class="descname">Cipher</tt><big>(</big><em>algo</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#Cipher"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.Cipher" title="Permalink to this definition">¶</a></dt>
+<dd><p>Object interface to EVP_CIPHER without all the frills of
+M2Crypto.EVP.Cipher.</p>
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.SMIME.PKCS7">
+<em class="property">class </em><tt class="descclassname">M2Crypto.SMIME.</tt><tt class="descname">PKCS7</tt><big>(</big><em>pkcs7=None</em>, <em>_pyfree=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#PKCS7"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.PKCS7" title="Permalink to this definition">¶</a></dt>
+<dd><dl class="method">
+<dt id="M2Crypto.SMIME.PKCS7.get0_signers">
+<tt class="descname">get0_signers</tt><big>(</big><em>certs</em>, <em>flags=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#PKCS7.get0_signers"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.PKCS7.get0_signers" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SMIME.PKCS7.m2_pkcs7_free">
+<tt class="descname">m2_pkcs7_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.SMIME.PKCS7.m2_pkcs7_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SMIME.PKCS7.type">
+<tt class="descname">type</tt><big>(</big><em>text_name=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#PKCS7.type"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.PKCS7.type" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SMIME.PKCS7.write">
+<tt class="descname">write</tt><big>(</big><em>bio</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#PKCS7.write"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.PKCS7.write" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SMIME.PKCS7.write_der">
+<tt class="descname">write_der</tt><big>(</big><em>bio</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#PKCS7.write_der"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.PKCS7.write_der" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="exception">
+<dt id="M2Crypto.SMIME.PKCS7_Error">
+<em class="property">exception </em><tt class="descclassname">M2Crypto.SMIME.</tt><tt class="descname">PKCS7_Error</tt><a class="reference internal" href="_modules/M2Crypto/SMIME.html#PKCS7_Error"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.PKCS7_Error" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></tt></p>
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.SMIME.SMIME">
+<em class="property">class </em><tt class="descclassname">M2Crypto.SMIME.</tt><tt class="descname">SMIME</tt><a class="reference internal" href="_modules/M2Crypto/SMIME.html#SMIME"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.SMIME" title="Permalink to this definition">¶</a></dt>
+<dd><dl class="method">
+<dt id="M2Crypto.SMIME.SMIME.decrypt">
+<tt class="descname">decrypt</tt><big>(</big><em>pkcs7</em>, <em>flags=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#SMIME.decrypt"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.SMIME.decrypt" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SMIME.SMIME.encrypt">
+<tt class="descname">encrypt</tt><big>(</big><em>data_bio</em>, <em>flags=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#SMIME.encrypt"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.SMIME.encrypt" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SMIME.SMIME.load_key">
+<tt class="descname">load_key</tt><big>(</big><em>keyfile</em>, <em>certfile=None</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#SMIME.load_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.SMIME.load_key" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SMIME.SMIME.load_key_bio">
+<tt class="descname">load_key_bio</tt><big>(</big><em>keybio</em>, <em>certbio=None</em>, <em>callback=&lt;function passphrase_callback at 0x1faa848&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#SMIME.load_key_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.SMIME.load_key_bio" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SMIME.SMIME.set_cipher">
+<tt class="descname">set_cipher</tt><big>(</big><em>cipher</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#SMIME.set_cipher"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.SMIME.set_cipher" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SMIME.SMIME.set_x509_stack">
+<tt class="descname">set_x509_stack</tt><big>(</big><em>stack</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#SMIME.set_x509_stack"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.SMIME.set_x509_stack" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SMIME.SMIME.set_x509_store">
+<tt class="descname">set_x509_store</tt><big>(</big><em>store</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#SMIME.set_x509_store"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.SMIME.set_x509_store" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SMIME.SMIME.sign">
+<tt class="descname">sign</tt><big>(</big><em>data_bio</em>, <em>flags=0</em>, <em>algo='sha1'</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#SMIME.sign"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.SMIME.sign" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SMIME.SMIME.unset_cipher">
+<tt class="descname">unset_cipher</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#SMIME.unset_cipher"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.SMIME.unset_cipher" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SMIME.SMIME.unset_key">
+<tt class="descname">unset_key</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#SMIME.unset_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.SMIME.unset_key" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SMIME.SMIME.unset_x509_stack">
+<tt class="descname">unset_x509_stack</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#SMIME.unset_x509_stack"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.SMIME.unset_x509_stack" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SMIME.SMIME.unset_x509_store">
+<tt class="descname">unset_x509_store</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#SMIME.unset_x509_store"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.SMIME.unset_x509_store" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SMIME.SMIME.verify">
+<tt class="descname">verify</tt><big>(</big><em>pkcs7</em>, <em>data_bio=None</em>, <em>flags=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#SMIME.verify"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.SMIME.verify" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.SMIME.SMIME.write">
+<tt class="descname">write</tt><big>(</big><em>out_bio</em>, <em>pkcs7</em>, <em>data_bio=None</em>, <em>flags=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#SMIME.write"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.SMIME.write" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="exception">
+<dt id="M2Crypto.SMIME.SMIME_Error">
+<em class="property">exception </em><tt class="descclassname">M2Crypto.SMIME.</tt><tt class="descname">SMIME_Error</tt><a class="reference internal" href="_modules/M2Crypto/SMIME.html#SMIME_Error"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.SMIME_Error" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></tt></p>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.SMIME.load_pkcs7">
+<tt class="descclassname">M2Crypto.SMIME.</tt><tt class="descname">load_pkcs7</tt><big>(</big><em>p7file</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#load_pkcs7"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.load_pkcs7" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.SMIME.load_pkcs7_bio">
+<tt class="descclassname">M2Crypto.SMIME.</tt><tt class="descname">load_pkcs7_bio</tt><big>(</big><em>p7_bio</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#load_pkcs7_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.load_pkcs7_bio" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.SMIME.load_pkcs7_bio_der">
+<tt class="descclassname">M2Crypto.SMIME.</tt><tt class="descname">load_pkcs7_bio_der</tt><big>(</big><em>p7_bio</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#load_pkcs7_bio_der"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.load_pkcs7_bio_der" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.SMIME.load_pkcs7_der">
+<tt class="descclassname">M2Crypto.SMIME.</tt><tt class="descname">load_pkcs7_der</tt><big>(</big><em>p7file</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#load_pkcs7_der"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.load_pkcs7_der" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.SMIME.smime_load_pkcs7">
+<tt class="descclassname">M2Crypto.SMIME.</tt><tt class="descname">smime_load_pkcs7</tt><big>(</big><em>p7file</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#smime_load_pkcs7"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.smime_load_pkcs7" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.SMIME.smime_load_pkcs7_bio">
+<tt class="descclassname">M2Crypto.SMIME.</tt><tt class="descname">smime_load_pkcs7_bio</tt><big>(</big><em>p7_bio</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#smime_load_pkcs7_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.smime_load_pkcs7_bio" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.SMIME.text_crlf">
+<tt class="descclassname">M2Crypto.SMIME.</tt><tt class="descname">text_crlf</tt><big>(</big><em>text</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#text_crlf"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.text_crlf" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.SMIME.text_crlf_bio">
+<tt class="descclassname">M2Crypto.SMIME.</tt><tt class="descname">text_crlf_bio</tt><big>(</big><em>bio_in</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/SMIME.html#text_crlf_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.SMIME.text_crlf_bio" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.X509">
+<span id="x509-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">X509</span></tt> Module<a class="headerlink" href="#module-M2Crypto.X509" title="Permalink to this headline">¶</a></h2>
+<dl class="class">
+<dt id="M2Crypto.X509.CRL">
+<em class="property">class </em><tt class="descclassname">M2Crypto.X509.</tt><tt class="descname">CRL</tt><big>(</big><em>crl=None</em>, <em>_pyfree=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#CRL"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.CRL" title="Permalink to this definition">¶</a></dt>
+<dd><p>X509 Certificate Revocation List</p>
+<dl class="method">
+<dt id="M2Crypto.X509.CRL.as_text">
+<tt class="descname">as_text</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#CRL.as_text"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.CRL.as_text" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return CRL in PEM format in a string.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">String containing the CRL in PEM format.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.CRL.m2_x509_crl_free">
+<tt class="descname">m2_x509_crl_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.X509.CRL.m2_x509_crl_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.X509.Request">
+<em class="property">class </em><tt class="descclassname">M2Crypto.X509.</tt><tt class="descname">Request</tt><big>(</big><em>req=None</em>, <em>_pyfree=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#Request"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.Request" title="Permalink to this definition">¶</a></dt>
+<dd><p>X509 Certificate Request.</p>
+<dl class="method">
+<dt id="M2Crypto.X509.Request.add_extensions">
+<tt class="descname">add_extensions</tt><big>(</big><em>ext_stack</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#Request.add_extensions"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.Request.add_extensions" title="Permalink to this definition">¶</a></dt>
+<dd><p>Add X509 extensions to this request.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>ext_stack</strong> &#8211; Stack of extensions to add.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">1 for success and 0 for failure</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.Request.as_der">
+<tt class="descname">as_der</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#Request.as_der"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.Request.as_der" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.Request.as_pem">
+<tt class="descname">as_pem</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#Request.as_pem"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.Request.as_pem" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.Request.as_text">
+<tt class="descname">as_text</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#Request.as_text"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.Request.as_text" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.Request.get_pubkey">
+<tt class="descname">get_pubkey</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#Request.get_pubkey"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.Request.get_pubkey" title="Permalink to this definition">¶</a></dt>
+<dd><p>Get the public key for the request.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">Public key from the request.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.Request.get_subject">
+<tt class="descname">get_subject</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#Request.get_subject"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.Request.get_subject" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.Request.get_version">
+<tt class="descname">get_version</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#Request.get_version"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.Request.get_version" title="Permalink to this definition">¶</a></dt>
+<dd><p>Get version.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">Returns version.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.Request.m2_x509_req_free">
+<tt class="descname">m2_x509_req_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.X509.Request.m2_x509_req_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.Request.save">
+<tt class="descname">save</tt><big>(</big><em>filename</em>, <em>format=1</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#Request.save"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.Request.save" title="Permalink to this definition">¶</a></dt>
+<dd><p>Saves X.509 certificate request to a file. Default output
+format is PEM.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>filename</strong> &#8211; Name of the file the request will be saved to.</li>
+<li><strong>format</strong> &#8211; Controls what output format is used to save the
+request. Either FORMAT_PEM or FORMAT_DER to save
+in PEM or DER format. Raises ValueError if an
+unknown format is used.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">1 for success, 0 for failure.
+The error code can be obtained by ERR_get_error.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.Request.save_pem">
+<tt class="descname">save_pem</tt><big>(</big><em>filename</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#Request.save_pem"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.Request.save_pem" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.Request.set_pubkey">
+<tt class="descname">set_pubkey</tt><big>(</big><em>pkey</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#Request.set_pubkey"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.Request.set_pubkey" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set the public key for the request.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>pkey</strong> &#8211; Public key</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">Return 1 for success and 0 for failure.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.Request.set_subject">
+<tt class="descname">set_subject</tt><big>(</big><em>name</em><big>)</big><a class="headerlink" href="#M2Crypto.X509.Request.set_subject" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set subject name.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>name</strong> &#8211; subjectName field.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">1 for success and 0 for failure</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.Request.set_subject_name">
+<tt class="descname">set_subject_name</tt><big>(</big><em>name</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#Request.set_subject_name"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.Request.set_subject_name" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set subject name.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>name</strong> &#8211; subjectName field.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">1 for success and 0 for failure</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.Request.set_version">
+<tt class="descname">set_version</tt><big>(</big><em>version</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#Request.set_version"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.Request.set_version" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set version.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>version</strong> &#8211; Version number.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">Returns 0 on failure.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.Request.sign">
+<tt class="descname">sign</tt><big>(</big><em>pkey</em>, <em>md</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#Request.sign"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.Request.sign" title="Permalink to this definition">¶</a></dt>
+<dd><table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>pkey</strong> &#8211; PKey to be signed</li>
+<li><strong>md</strong> &#8211; used algorigthm</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">1 for success and 0 for failure</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.Request.verify">
+<tt class="descname">verify</tt><big>(</big><em>pkey</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#Request.verify"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.Request.verify" title="Permalink to this definition">¶</a></dt>
+<dd><table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>pkey</strong> &#8211; PKey to be verified</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">1 for success and 0 for failure</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.X509.X509">
+<em class="property">class </em><tt class="descclassname">M2Crypto.X509.</tt><tt class="descname">X509</tt><big>(</big><em>x509=None</em>, <em>_pyfree=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509" title="Permalink to this definition">¶</a></dt>
+<dd><p>X.509 Certificate</p>
+<dl class="method">
+<dt id="M2Crypto.X509.X509.add_ext">
+<tt class="descname">add_ext</tt><big>(</big><em>ext</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.add_ext"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.add_ext" title="Permalink to this definition">¶</a></dt>
+<dd><p>Add X509 extension to this certificate.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>ext</strong> &#8211; Extension</td>
+</tr>
+</tbody>
+</table>
+<p>:return 1 for success and 0 for failure</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.as_der">
+<tt class="descname">as_der</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.as_der"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.as_der" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.as_pem">
+<tt class="descname">as_pem</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.as_pem"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.as_pem" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.as_text">
+<tt class="descname">as_text</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.as_text"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.as_text" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.check_ca">
+<tt class="descname">check_ca</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.check_ca"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.check_ca" title="Permalink to this definition">¶</a></dt>
+<dd><p>Check if the certificate is a Certificate Authority (CA) certificate.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">0 if the certificate is not CA, nonzero otherwise.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Requires :</th><td class="field-body">OpenSSL 0.9.8 or newer</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.check_purpose">
+<tt class="descname">check_purpose</tt><big>(</big><em>id</em>, <em>ca</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.check_purpose"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.check_purpose" title="Permalink to this definition">¶</a></dt>
+<dd><p>Check if the certificate&#8217;s purpose matches the asked purpose.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>id</strong> &#8211; Purpose id. See X509_PURPOSE_* constants.</li>
+<li><strong>ca</strong> &#8211; 1 if the certificate should be CA, 0 otherwise.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">0 if the certificate purpose does not match, nonzero
+otherwise.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.get_ext">
+<tt class="descname">get_ext</tt><big>(</big><em>name</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.get_ext"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.get_ext" title="Permalink to this definition">¶</a></dt>
+<dd><p>Get X509 extension by name.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>name</strong> &#8211; Name of the extension</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">X509_Extension</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.get_ext_at">
+<tt class="descname">get_ext_at</tt><big>(</big><em>index</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.get_ext_at"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.get_ext_at" title="Permalink to this definition">¶</a></dt>
+<dd><p>Get X509 extension by index.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>index</strong> &#8211; Name of the extension</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">X509_Extension</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.get_ext_count">
+<tt class="descname">get_ext_count</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.get_ext_count"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.get_ext_count" title="Permalink to this definition">¶</a></dt>
+<dd><p>Get X509 extension count.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.get_fingerprint">
+<tt class="descname">get_fingerprint</tt><big>(</big><em>md='md5'</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.get_fingerprint"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.get_fingerprint" title="Permalink to this definition">¶</a></dt>
+<dd><p>Get the fingerprint of the certificate.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>md</strong> &#8211; Message digest algorithm to use.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">String containing the fingerprint in hex format.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.get_issuer">
+<tt class="descname">get_issuer</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.get_issuer"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.get_issuer" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.get_not_after">
+<tt class="descname">get_not_after</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.get_not_after"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.get_not_after" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.get_not_before">
+<tt class="descname">get_not_before</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.get_not_before"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.get_not_before" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.get_pubkey">
+<tt class="descname">get_pubkey</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.get_pubkey"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.get_pubkey" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.get_serial_number">
+<tt class="descname">get_serial_number</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.get_serial_number"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.get_serial_number" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.get_subject">
+<tt class="descname">get_subject</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.get_subject"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.get_subject" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.get_version">
+<tt class="descname">get_version</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.get_version"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.get_version" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.m2_x509_free">
+<tt class="descname">m2_x509_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.X509.X509.m2_x509_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.save">
+<tt class="descname">save</tt><big>(</big><em>filename</em>, <em>format=1</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.save"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.save" title="Permalink to this definition">¶</a></dt>
+<dd><p>Saves X.509 certificate to a file. Default output
+format is PEM.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>filename</strong> &#8211; Name of the file the cert will be saved to.</li>
+<li><strong>format</strong> &#8211; Controls what output format is used to save the cert.
+Either FORMAT_PEM or FORMAT_DER to save in PEM or
+DER format. Raises a ValueError if an unknow
+format is used.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">1 for success or 0 for failure</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.save_pem">
+<tt class="descname">save_pem</tt><big>(</big><em>filename</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.save_pem"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.save_pem" title="Permalink to this definition">¶</a></dt>
+<dd><table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>filename</strong> &#8211; name of the file to be loaded</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">1 for success or 0 for failure</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.set_issuer">
+<tt class="descname">set_issuer</tt><big>(</big><em>name</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.set_issuer"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.set_issuer" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set issuer name.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>name</strong> &#8211; subjectName field.</td>
+</tr>
+</tbody>
+</table>
+<p>:return 1 for success and 0 for failure</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.set_issuer_name">
+<tt class="descname">set_issuer_name</tt><big>(</big><em>name</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.set_issuer_name"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.set_issuer_name" title="Permalink to this definition">¶</a></dt>
+<dd><table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">1 on success, 0 on failure</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.set_not_after">
+<tt class="descname">set_not_after</tt><big>(</big><em>asn1_time</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.set_not_after"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.set_not_after" title="Permalink to this definition">¶</a></dt>
+<dd><table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">1 on success, 0 on failure</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.set_not_before">
+<tt class="descname">set_not_before</tt><big>(</big><em>asn1_time</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.set_not_before"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.set_not_before" title="Permalink to this definition">¶</a></dt>
+<dd><table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">1 on success, 0 on failure</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.set_pubkey">
+<tt class="descname">set_pubkey</tt><big>(</big><em>pkey</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.set_pubkey"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.set_pubkey" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set the public key for the certificate</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>pkey</strong> &#8211; Public key</td>
+</tr>
+</tbody>
+</table>
+<p>:return 1 for success and 0 for failure</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.set_serial_number">
+<tt class="descname">set_serial_number</tt><big>(</big><em>serial</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.set_serial_number"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.set_serial_number" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set serial number.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>serial</strong> &#8211; Serial number.</td>
+</tr>
+</tbody>
+</table>
+<p>:return 1 for success and 0 for failure.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.set_subject">
+<tt class="descname">set_subject</tt><big>(</big><em>name</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.set_subject"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.set_subject" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set subject name.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>name</strong> &#8211; subjectName field.</td>
+</tr>
+</tbody>
+</table>
+<p>:return 1 for success and 0 for failure</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.set_subject_name">
+<tt class="descname">set_subject_name</tt><big>(</big><em>name</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.set_subject_name"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.set_subject_name" title="Permalink to this definition">¶</a></dt>
+<dd><table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">1 on success, 0 on failure</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.set_version">
+<tt class="descname">set_version</tt><big>(</big><em>version</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.set_version"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.set_version" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set version of the certificate.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>version</strong> &#8211; Version number.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">Returns 0 on failure.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.sign">
+<tt class="descname">sign</tt><big>(</big><em>pkey</em>, <em>md</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.sign"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.sign" title="Permalink to this definition">¶</a></dt>
+<dd><p>Sign the certificate.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
+<li><strong>pkey</strong> &#8211; Public key</li>
+<li><strong>md</strong> &#8211; Message digest algorithm to use for signing,
+for example &#8216;sha1&#8217;.</li>
+</ul>
+</td>
+</tr>
+</tbody>
+</table>
+<p>:return int</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509.verify">
+<tt class="descname">verify</tt><big>(</big><em>pkey=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509.verify"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509.verify" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="exception">
+<dt id="M2Crypto.X509.X509Error">
+<em class="property">exception </em><tt class="descclassname">M2Crypto.X509.</tt><tt class="descname">X509Error</tt><a class="reference internal" href="_modules/M2Crypto/X509.html#X509Error"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509Error" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></tt></p>
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.X509.X509_Extension">
+<em class="property">class </em><tt class="descclassname">M2Crypto.X509.</tt><tt class="descname">X509_Extension</tt><big>(</big><em>x509_ext_ptr=None</em>, <em>_pyfree=1</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Extension"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Extension" title="Permalink to this definition">¶</a></dt>
+<dd><p>X509 Extension</p>
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Extension.get_critical">
+<tt class="descname">get_critical</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Extension.get_critical"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Extension.get_critical" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return whether or not this is a critical extension.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">Nonzero if this is a critical extension.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Extension.get_name">
+<tt class="descname">get_name</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Extension.get_name"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Extension.get_name" title="Permalink to this definition">¶</a></dt>
+<dd><p>Get the extension name, for example &#8216;subjectAltName&#8217;.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Extension.get_value">
+<tt class="descname">get_value</tt><big>(</big><em>flag=0</em>, <em>indent=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Extension.get_value"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Extension.get_value" title="Permalink to this definition">¶</a></dt>
+<dd><p>Get the extension value, for example &#8216;<a class="reference external" href="DNS:www.example.com">DNS:www.example.com</a>&#8216;.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
+<li><strong>flag</strong> &#8211; Flag to control what and how to print.</li>
+<li><strong>indent</strong> &#8211; How many spaces to print before actual value.</li>
+</ul>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Extension.m2_x509_extension_free">
+<tt class="descname">m2_x509_extension_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.X509.X509_Extension.m2_x509_extension_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Extension.set_critical">
+<tt class="descname">set_critical</tt><big>(</big><em>critical=1</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Extension.set_critical"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Extension.set_critical" title="Permalink to this definition">¶</a></dt>
+<dd><p>Mark this extension critical or noncritical. By default an
+extension is not critical.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>critical</strong> &#8211; Nonzero sets this extension as critical.
+Calling this method without arguments will
+set this extension to critical.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">1 for success, 0 for failure</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.X509.X509_Extension_Stack">
+<em class="property">class </em><tt class="descclassname">M2Crypto.X509.</tt><tt class="descname">X509_Extension_Stack</tt><big>(</big><em>stack=None</em>, <em>_pyfree=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Extension_Stack"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Extension_Stack" title="Permalink to this definition">¶</a></dt>
+<dd><p>X509 Extension Stack</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Warning :</th><td class="field-body">Do not modify the underlying OpenSSL stack
+except through this interface, or use any OpenSSL
+functions that do so indirectly. Doing so will get the
+OpenSSL stack and the internal pystack of this class out
+of sync, leading to python memory leaks, exceptions or
+even python crashes!</td>
+</tr>
+</tbody>
+</table>
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Extension_Stack.m2_sk_x509_extension_free">
+<tt class="descname">m2_sk_x509_extension_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.X509.X509_Extension_Stack.m2_sk_x509_extension_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Extension_Stack.pop">
+<tt class="descname">pop</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Extension_Stack.pop"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Extension_Stack.pop" title="Permalink to this definition">¶</a></dt>
+<dd><p>Pop X509_Extension object from the stack.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">X509_Extension popped</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Extension_Stack.push">
+<tt class="descname">push</tt><big>(</big><em>x509_ext</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Extension_Stack.push"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Extension_Stack.push" title="Permalink to this definition">¶</a></dt>
+<dd><p>Push X509_Extension object onto the stack.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>x509_ext</strong> &#8211; X509_Extension object to be pushed onto the stack.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">The number of extensions on the stack.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.X509.X509_Name">
+<em class="property">class </em><tt class="descclassname">M2Crypto.X509.</tt><tt class="descname">X509_Name</tt><big>(</big><em>x509_name=None</em>, <em>_pyfree=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Name"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Name" title="Permalink to this definition">¶</a></dt>
+<dd><p>X509 Name</p>
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Name.add_entry_by_txt">
+<tt class="descname">add_entry_by_txt</tt><big>(</big><em>field</em>, <em>type</em>, <em>entry</em>, <em>len</em>, <em>loc</em>, <em>set</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Name.add_entry_by_txt"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Name.add_entry_by_txt" title="Permalink to this definition">¶</a></dt>
+<dd><p>Add X509_Name field whose name is identified by its name.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
+<li><strong>field</strong> &#8211; name of the entry</li>
+<li><strong>type</strong> &#8211; use MBSTRING_ASC or MBSTRING_UTF8
+(or standard ASN1 type like V_ASN1_IA5STRING)</li>
+<li><strong>entry</strong> &#8211; value</li>
+<li><strong>len</strong> &#8211; buf_len of the entry
+(-1 and the length is computed automagically)</li>
+</ul>
+</td>
+</tr>
+</tbody>
+</table>
+<p>The <tt class="docutils literal"><span class="pre">loc</span></tt> and <tt class="docutils literal"><span class="pre">set</span></tt> parameters determine where a new entry
+should be added.
+For almost all applications loc can be set to -1 and set to 0.
+This adds a new entry to the end of name as a single valued
+RelativeDistinguishedName (RDN).</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>loc</strong> &#8211; determines the index where the new entry is
+inserted: if it is -1 it is appended.</li>
+<li><strong>set</strong> &#8211; determines how the new type is added. If it is zero
+a new RDN is created.
+If set is -1 or 1 it is added to the previous or next RDN
+structure respectively. This will then be a multivalued
+RDN: since multivalues RDNs are very seldom used set is
+almost always set to zero.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">1 for success of 0 if an error occurred.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Name.as_der">
+<tt class="descname">as_der</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Name.as_der"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Name.as_der" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Name.as_hash">
+<tt class="descname">as_hash</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Name.as_hash"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Name.as_hash" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Name.as_text">
+<tt class="descname">as_text</tt><big>(</big><em>indent=0</em>, <em>flags=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Name.as_text"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Name.as_text" title="Permalink to this definition">¶</a></dt>
+<dd><p>as_text returns the name as a string.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
+<li><strong>indent</strong> &#8211; Each line in multiline format is indented
+by this many spaces.</li>
+<li><strong>flags</strong> &#8211; Flags that control how the output should be formatted.</li>
+</ul>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Name.entry_count">
+<tt class="descname">entry_count</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Name.entry_count"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Name.entry_count" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Name.get_entries_by_nid">
+<tt class="descname">get_entries_by_nid</tt><big>(</big><em>nid</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Name.get_entries_by_nid"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Name.get_entries_by_nid" title="Permalink to this definition">¶</a></dt>
+<dd><p>Retrieve the next index matching nid.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>nid</strong> &#8211; name of the entry (as m2.NID* constants)</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">list of X509_Name_Entry items</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Name.m2_x509_name_free">
+<tt class="descname">m2_x509_name_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.X509.X509_Name.m2_x509_name_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="attribute">
+<dt id="M2Crypto.X509.X509_Name.nid">
+<tt class="descname">nid</tt><em class="property"> = {'C': 14, 'serialNumber': 105, 'organizationName': 17, 'CN': 13, 'SP': 16, 'commonName': 13, 'L': 15, 'stateOrProvinceName': 16, 'ST': 16, 'emailAddress': 48, 'O': 17, 'localityName': 15, 'GN': 99, 'surname': 100, 'OU': 18, 'givenName': 99, 'Email': 48, 'organizationUnitName': 18, 'SN': 100}</em><a class="headerlink" href="#M2Crypto.X509.X509_Name.nid" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.X509.X509_Name_Entry">
+<em class="property">class </em><tt class="descclassname">M2Crypto.X509.</tt><tt class="descname">X509_Name_Entry</tt><big>(</big><em>x509_name_entry</em>, <em>_pyfree=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Name_Entry"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Name_Entry" title="Permalink to this definition">¶</a></dt>
+<dd><p>X509 Name Entry</p>
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Name_Entry.create_by_txt">
+<tt class="descname">create_by_txt</tt><big>(</big><em>field</em>, <em>type</em>, <em>entry</em>, <em>len</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Name_Entry.create_by_txt"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Name_Entry.create_by_txt" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Name_Entry.get_data">
+<tt class="descname">get_data</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Name_Entry.get_data"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Name_Entry.get_data" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Name_Entry.get_object">
+<tt class="descname">get_object</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Name_Entry.get_object"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Name_Entry.get_object" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Name_Entry.m2_x509_name_entry_free">
+<tt class="descname">m2_x509_name_entry_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.X509.X509_Name_Entry.m2_x509_name_entry_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Name_Entry.set_data">
+<tt class="descname">set_data</tt><big>(</big><em>data</em>, <em>type=4097</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Name_Entry.set_data"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Name_Entry.set_data" title="Permalink to this definition">¶</a></dt>
+<dd><p>Sets the field name to asn1obj</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>data</strong> &#8211; data in a binary form to be set</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">0 on failure, 1 on success</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Name_Entry.set_object">
+<tt class="descname">set_object</tt><big>(</big><em>asn1obj</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Name_Entry.set_object"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Name_Entry.set_object" title="Permalink to this definition">¶</a></dt>
+<dd><p>Sets the field name to asn1obj</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>asn1obj</strong> &#8211; </td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">0 on failure, 1 on success</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.X509.X509_Stack">
+<em class="property">class </em><tt class="descclassname">M2Crypto.X509.</tt><tt class="descname">X509_Stack</tt><big>(</big><em>stack=None</em>, <em>_pyfree=0</em>, <em>_pyfree_x509=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Stack"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Stack" title="Permalink to this definition">¶</a></dt>
+<dd><p>X509 Stack</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Warning :</th><td class="field-body">Do not modify the underlying OpenSSL stack
+except through this interface, or use any OpenSSL
+functions that do so indirectly. Doing so will get the
+OpenSSL stack and the internal pystack of this class out
+of sync, leading to python memory leaks, exceptions or
+even python crashes!</td>
+</tr>
+</tbody>
+</table>
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Stack.as_der">
+<tt class="descname">as_der</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Stack.as_der"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Stack.as_der" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return the stack as a DER encoded string</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Stack.m2_sk_x509_free">
+<tt class="descname">m2_sk_x509_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.X509.X509_Stack.m2_sk_x509_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Stack.pop">
+<tt class="descname">pop</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Stack.pop"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Stack.pop" title="Permalink to this definition">¶</a></dt>
+<dd><p>pop a certificate from the stack.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">X509 object that was popped, or None if there is
+nothing to pop.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Stack.push">
+<tt class="descname">push</tt><big>(</big><em>x509</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Stack.push"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Stack.push" title="Permalink to this definition">¶</a></dt>
+<dd><p>push an X509 certificate onto the stack.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>x509</strong> &#8211; X509 object.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">The number of X509 objects currently on the stack.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.X509.X509_Store">
+<em class="property">class </em><tt class="descclassname">M2Crypto.X509.</tt><tt class="descname">X509_Store</tt><big>(</big><em>store=None</em>, <em>_pyfree=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Store"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Store" title="Permalink to this definition">¶</a></dt>
+<dd><p>X509 Store</p>
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Store.add_cert">
+<tt class="descname">add_cert</tt><big>(</big><em>x509</em><big>)</big><a class="headerlink" href="#M2Crypto.X509.X509_Store.add_cert" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Store.add_x509">
+<tt class="descname">add_x509</tt><big>(</big><em>x509</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Store.add_x509"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Store.add_x509" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Store.load_info">
+<tt class="descname">load_info</tt><big>(</big><em>file</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Store.load_info"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Store.load_info" title="Permalink to this definition">¶</a></dt>
+<dd><table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>file</strong> &#8211; filename</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">1 on success, 0 on failure</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Store.load_locations">
+<tt class="descname">load_locations</tt><big>(</big><em>file</em><big>)</big><a class="headerlink" href="#M2Crypto.X509.X509_Store.load_locations" title="Permalink to this definition">¶</a></dt>
+<dd><table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>file</strong> &#8211; filename</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">1 on success, 0 on failure</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Store.m2_x509_store_free">
+<tt class="descname">m2_x509_store_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.X509.X509_Store.m2_x509_store_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Store.set_verify_cb">
+<tt class="descname">set_verify_cb</tt><big>(</big><em>callback=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Store.set_verify_cb"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Store.set_verify_cb" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set callback which will be called when the store is verified.
+Wrapper over OpenSSL X509_STORE_set_verify_cb().</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>callback</strong> &#8211; Callable to specify verification options.
+Type of the callable must be:
+(int, X509_Store_Context) -&gt; int.
+If None: set the standard options.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Note :</th><td class="field-body">compile-time or run-time errors in the callback would result
+in mysterious errors during verification, which could be hard
+to trace.</td>
+</tr>
+<tr class="field-odd field"><th class="field-name">Note :</th><td class="field-body">Python exceptions raised in callbacks do not propagate to
+verify() call.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">None</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.X509.X509_Store_Context">
+<em class="property">class </em><tt class="descclassname">M2Crypto.X509.</tt><tt class="descname">X509_Store_Context</tt><big>(</big><em>x509_store_ctx</em>, <em>_pyfree=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Store_Context"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Store_Context" title="Permalink to this definition">¶</a></dt>
+<dd><p>X509 Store Context</p>
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Store_Context.get1_chain">
+<tt class="descname">get1_chain</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Store_Context.get1_chain"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Store_Context.get1_chain" title="Permalink to this definition">¶</a></dt>
+<dd><p>Get certificate chain.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">Reference counted (i.e. safe to use even after the store
+context goes away) stack of certificates in the chain.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Store_Context.get_current_cert">
+<tt class="descname">get_current_cert</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Store_Context.get_current_cert"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Store_Context.get_current_cert" title="Permalink to this definition">¶</a></dt>
+<dd><p>Get current X.509 certificate.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Warning :</th><td class="field-body">The returned certificate is NOT refcounted, so you can not
+rely on it being valid once the store context goes
+away or is modified.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Store_Context.get_error">
+<tt class="descname">get_error</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Store_Context.get_error"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Store_Context.get_error" title="Permalink to this definition">¶</a></dt>
+<dd><p>Get error code.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Store_Context.get_error_depth">
+<tt class="descname">get_error_depth</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#X509_Store_Context.get_error_depth"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.X509_Store_Context.get_error_depth" title="Permalink to this definition">¶</a></dt>
+<dd><p>Get error depth.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.X509.X509_Store_Context.m2_x509_store_ctx_free">
+<tt class="descname">m2_x509_store_ctx_free</tt><big>(</big><big>)</big><a class="headerlink" href="#M2Crypto.X509.X509_Store_Context.m2_x509_store_ctx_free" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.X509.load_cert">
+<tt class="descclassname">M2Crypto.X509.</tt><tt class="descname">load_cert</tt><big>(</big><em>file</em>, <em>format=1</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#load_cert"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.load_cert" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load certificate from file.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>file</strong> &#8211; Name of file containing certificate in either DER or
+PEM format.</li>
+<li><strong>format</strong> &#8211; Describes the format of the file to be loaded,
+either PEM or DER.</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">M2Crypto.X509.X509 object.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.X509.load_cert_bio">
+<tt class="descclassname">M2Crypto.X509.</tt><tt class="descname">load_cert_bio</tt><big>(</big><em>bio</em>, <em>format=1</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#load_cert_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.load_cert_bio" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load certificate from a bio.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>bio</strong> &#8211; BIO pointing at a certificate in either DER or PEM format.</li>
+<li><strong>format</strong> &#8211; Describes the format of the cert to be loaded,
+either PEM or DER (via constants FORMAT_PEM
+and FORMAT_FORMAT_DER)</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">M2Crypto.X509.X509 object.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.X509.load_cert_der_string">
+<tt class="descclassname">M2Crypto.X509.</tt><tt class="descname">load_cert_der_string</tt><big>(</big><em>string</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#load_cert_der_string"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.load_cert_der_string" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load certificate from a string.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>string</strong> &#8211; String containing a certificate in DER format.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">M2Crypto.X509.X509 object.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.X509.load_cert_string">
+<tt class="descclassname">M2Crypto.X509.</tt><tt class="descname">load_cert_string</tt><big>(</big><em>string</em>, <em>format=1</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#load_cert_string"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.load_cert_string" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load certificate from a string.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>string</strong> &#8211; String containing a certificate in either DER or PEM format.</li>
+<li><strong>format</strong> &#8211; Describes the format of the cert to be loaded,
+either PEM or DER (via constants FORMAT_PEM
+and FORMAT_FORMAT_DER)</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">M2Crypto.X509.X509 object.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.X509.load_crl">
+<tt class="descclassname">M2Crypto.X509.</tt><tt class="descname">load_crl</tt><big>(</big><em>file</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#load_crl"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.load_crl" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load CRL from file.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>file</strong> &#8211; Name of file containing CRL in PEM format.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">M2Crypto.X509.CRL object.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.X509.load_request">
+<tt class="descclassname">M2Crypto.X509.</tt><tt class="descname">load_request</tt><big>(</big><em>file</em>, <em>format=1</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#load_request"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.load_request" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load certificate request from file.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>file</strong> &#8211; Name of file containing certificate request in
+either PEM or DER format.</li>
+<li><strong>format</strong> &#8211; Describes the format of the file to be loaded,
+either PEM or DER. (using constants FORMAT_PEM
+and FORMAT_DER)</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">Request object.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.X509.load_request_bio">
+<tt class="descclassname">M2Crypto.X509.</tt><tt class="descname">load_request_bio</tt><big>(</big><em>bio</em>, <em>format=1</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#load_request_bio"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.load_request_bio" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load certificate request from a bio.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>bio</strong> &#8211; BIO pointing at a certificate request in
+either DER or PEM format.</li>
+<li><strong>format</strong> &#8211; Describes the format of the request to be loaded,
+either PEM or DER. (using constants FORMAT_PEM
+and FORMAT_DER)</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">M2Crypto.X509.Request object.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.X509.load_request_der_string">
+<tt class="descclassname">M2Crypto.X509.</tt><tt class="descname">load_request_der_string</tt><big>(</big><em>string</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#load_request_der_string"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.load_request_der_string" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load certificate request from a string.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>string</strong> &#8211; String containing a certificate request in DER format.</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">M2Crypto.X509.Request object.</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.X509.load_request_string">
+<tt class="descclassname">M2Crypto.X509.</tt><tt class="descname">load_request_string</tt><big>(</big><em>string</em>, <em>format=1</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#load_request_string"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.load_request_string" title="Permalink to this definition">¶</a></dt>
+<dd><p>Load certificate request from a string.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>string</strong> &#8211; String containing a certificate request in
+either DER or PEM format.</li>
+<li><strong>format</strong> &#8211; Describes the format of the request to be loaded,
+either PEM or DER. (using constants FORMAT_PEM
+and FORMAT_DER)</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">M2Crypto.X509.Request object.</p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.X509.new_extension">
+<tt class="descclassname">M2Crypto.X509.</tt><tt class="descname">new_extension</tt><big>(</big><em>name</em>, <em>value</em>, <em>critical=0</em>, <em>_pyfree=1</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#new_extension"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.new_extension" title="Permalink to this definition">¶</a></dt>
+<dd><p>Create new X509_Extension instance.</p>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.X509.new_stack_from_der">
+<tt class="descclassname">M2Crypto.X509.</tt><tt class="descname">new_stack_from_der</tt><big>(</big><em>der_string</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#new_stack_from_der"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.new_stack_from_der" title="Permalink to this definition">¶</a></dt>
+<dd><p>Create a new X509_Stack from DER string.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">X509_Stack</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.X509.x509_store_default_cb">
+<tt class="descclassname">M2Crypto.X509.</tt><tt class="descname">x509_store_default_cb</tt><big>(</big><em>ok</em>, <em>ctx</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/X509.html#x509_store_default_cb"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.X509.x509_store_default_cb" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.callback">
+<span id="callback-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">callback</span></tt> Module<a class="headerlink" href="#module-M2Crypto.callback" title="Permalink to this headline">¶</a></h2>
+</div>
+<div class="section" id="module-M2Crypto.ftpslib">
+<span id="ftpslib-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">ftpslib</span></tt> Module<a class="headerlink" href="#module-M2Crypto.ftpslib" title="Permalink to this headline">¶</a></h2>
+<dl class="class">
+<dt id="M2Crypto.ftpslib.FTP_TLS">
+<em class="property">class </em><tt class="descclassname">M2Crypto.ftpslib.</tt><tt class="descname">FTP_TLS</tt><big>(</big><em>host=None</em>, <em>ssl_ctx=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/ftpslib.html#FTP_TLS"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ftpslib.FTP_TLS" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">ftplib.FTP</span></tt></p>
+<p>Python OO interface to client-side FTP/TLS.</p>
+<dl class="method">
+<dt id="M2Crypto.ftpslib.FTP_TLS.auth_ssl">
+<tt class="descname">auth_ssl</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/ftpslib.html#FTP_TLS.auth_ssl"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ftpslib.FTP_TLS.auth_ssl" title="Permalink to this definition">¶</a></dt>
+<dd><p>Secure the control connection per AUTH SSL, aka AUTH TLS-P.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.ftpslib.FTP_TLS.auth_tls">
+<tt class="descname">auth_tls</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/ftpslib.html#FTP_TLS.auth_tls"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ftpslib.FTP_TLS.auth_tls" title="Permalink to this definition">¶</a></dt>
+<dd><p>Secure the control connection per AUTH TLS, aka AUTH TLS-C.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.ftpslib.FTP_TLS.ntransfercmd">
+<tt class="descname">ntransfercmd</tt><big>(</big><em>cmd</em>, <em>rest=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/ftpslib.html#FTP_TLS.ntransfercmd"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ftpslib.FTP_TLS.ntransfercmd" title="Permalink to this definition">¶</a></dt>
+<dd><p>Initiate a data transfer.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.ftpslib.FTP_TLS.prot_c">
+<tt class="descname">prot_c</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/ftpslib.html#FTP_TLS.prot_c"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ftpslib.FTP_TLS.prot_c" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set up data connection in the clear.</p>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.ftpslib.FTP_TLS.prot_p">
+<tt class="descname">prot_p</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/ftpslib.html#FTP_TLS.prot_p"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.ftpslib.FTP_TLS.prot_p" title="Permalink to this definition">¶</a></dt>
+<dd><p>Set up secure data connection.</p>
+</dd></dl>
+
+</dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.httpslib">
+<span id="httpslib-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">httpslib</span></tt> Module<a class="headerlink" href="#module-M2Crypto.httpslib" title="Permalink to this headline">¶</a></h2>
+<dl class="class">
+<dt id="M2Crypto.httpslib.HTTPSConnection">
+<em class="property">class </em><tt class="descclassname">M2Crypto.httpslib.</tt><tt class="descname">HTTPSConnection</tt><big>(</big><em>host</em>, <em>port=None</em>, <em>strict=None</em>, <em>**ssl</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/httpslib.html#HTTPSConnection"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.httpslib.HTTPSConnection" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">httplib.HTTPConnection</span></tt></p>
+<p>This class allows communication via SSL using M2Crypto.</p>
+<dl class="method">
+<dt id="M2Crypto.httpslib.HTTPSConnection.close">
+<tt class="descname">close</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/httpslib.html#HTTPSConnection.close"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.httpslib.HTTPSConnection.close" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.httpslib.HTTPSConnection.connect">
+<tt class="descname">connect</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/httpslib.html#HTTPSConnection.connect"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.httpslib.HTTPSConnection.connect" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="attribute">
+<dt id="M2Crypto.httpslib.HTTPSConnection.default_port">
+<tt class="descname">default_port</tt><em class="property"> = 443</em><a class="headerlink" href="#M2Crypto.httpslib.HTTPSConnection.default_port" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.httpslib.HTTPSConnection.get_session">
+<tt class="descname">get_session</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/httpslib.html#HTTPSConnection.get_session"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.httpslib.HTTPSConnection.get_session" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.httpslib.HTTPSConnection.set_session">
+<tt class="descname">set_session</tt><big>(</big><em>session</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/httpslib.html#HTTPSConnection.set_session"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.httpslib.HTTPSConnection.set_session" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.httpslib.ProxyHTTPSConnection">
+<em class="property">class </em><tt class="descclassname">M2Crypto.httpslib.</tt><tt class="descname">ProxyHTTPSConnection</tt><big>(</big><em>host</em>, <em>port=None</em>, <em>strict=None</em>, <em>username=None</em>, <em>password=None</em>, <em>**ssl</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/httpslib.html#ProxyHTTPSConnection"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.httpslib.ProxyHTTPSConnection" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <a class="reference internal" href="#M2Crypto.httpslib.HTTPSConnection" title="M2Crypto.httpslib.HTTPSConnection"><tt class="xref py py-class docutils literal"><span class="pre">M2Crypto.httpslib.HTTPSConnection</span></tt></a></p>
+<p>An HTTPS Connection that uses a proxy and the CONNECT request.</p>
+<p>When the connection is initiated, CONNECT is first sent to the proxy (along
+with authorization headers, if supplied). If successful, an SSL connection
+will be established over the socket through the proxy and to the target
+host.</p>
+<p>Finally, the actual request is sent over the SSL connection tunneling
+through the proxy.</p>
+<dl class="method">
+<dt id="M2Crypto.httpslib.ProxyHTTPSConnection.connect">
+<tt class="descname">connect</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/httpslib.html#ProxyHTTPSConnection.connect"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.httpslib.ProxyHTTPSConnection.connect" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.httpslib.ProxyHTTPSConnection.endheaders">
+<tt class="descname">endheaders</tt><big>(</big><em>*args</em>, <em>**kwargs</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/httpslib.html#ProxyHTTPSConnection.endheaders"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.httpslib.ProxyHTTPSConnection.endheaders" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.httpslib.ProxyHTTPSConnection.putheader">
+<tt class="descname">putheader</tt><big>(</big><em>header</em>, <em>value</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/httpslib.html#ProxyHTTPSConnection.putheader"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.httpslib.ProxyHTTPSConnection.putheader" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.httpslib.ProxyHTTPSConnection.putrequest">
+<tt class="descname">putrequest</tt><big>(</big><em>method</em>, <em>url</em>, <em>skip_host=0</em>, <em>skip_accept_encoding=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/httpslib.html#ProxyHTTPSConnection.putrequest"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.httpslib.ProxyHTTPSConnection.putrequest" title="Permalink to this definition">¶</a></dt>
+<dd><p>putrequest is called before connect, so can interpret url and get
+real host/port to be used to make CONNECT request to proxy</p>
+</dd></dl>
+
+</dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.m2">
+<span id="m2-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">m2</span></tt> Module<a class="headerlink" href="#module-M2Crypto.m2" title="Permalink to this headline">¶</a></h2>
+</div>
+<div class="section" id="module-M2Crypto.m2crypto">
+<span id="m2crypto-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">m2crypto</span></tt> Module<a class="headerlink" href="#module-M2Crypto.m2crypto" title="Permalink to this headline">¶</a></h2>
+<dl class="class">
+<dt id="M2Crypto.m2crypto.stack_st_OPENSSL_BLOCK">
+<em class="property">class </em><tt class="descclassname">M2Crypto.m2crypto.</tt><tt class="descname">stack_st_OPENSSL_BLOCK</tt><a class="headerlink" href="#M2Crypto.m2crypto.stack_st_OPENSSL_BLOCK" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">SwigPyObject</span></tt></p>
+<p>::stack_st_OPENSSL_BLOCK</p>
+<dl class="attribute">
+<dt id="M2Crypto.m2crypto.stack_st_OPENSSL_BLOCK.stack">
+<tt class="descname">stack</tt><a class="headerlink" href="#M2Crypto.m2crypto.stack_st_OPENSSL_BLOCK.stack" title="Permalink to this definition">¶</a></dt>
+<dd><p>stack_st_OPENSSL_BLOCK.stack</p>
+</dd></dl>
+
+<dl class="attribute">
+<dt id="M2Crypto.m2crypto.stack_st_OPENSSL_BLOCK.this">
+<tt class="descname">this</tt><a class="headerlink" href="#M2Crypto.m2crypto.stack_st_OPENSSL_BLOCK.this" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="attribute">
+<dt id="M2Crypto.m2crypto.stack_st_OPENSSL_BLOCK.thisown">
+<tt class="descname">thisown</tt><a class="headerlink" href="#M2Crypto.m2crypto.stack_st_OPENSSL_BLOCK.thisown" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="M2Crypto.m2crypto.stack_st_OPENSSL_STRING">
+<em class="property">class </em><tt class="descclassname">M2Crypto.m2crypto.</tt><tt class="descname">stack_st_OPENSSL_STRING</tt><a class="headerlink" href="#M2Crypto.m2crypto.stack_st_OPENSSL_STRING" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">SwigPyObject</span></tt></p>
+<p>::stack_st_OPENSSL_STRING</p>
+<dl class="attribute">
+<dt id="M2Crypto.m2crypto.stack_st_OPENSSL_STRING.stack">
+<tt class="descname">stack</tt><a class="headerlink" href="#M2Crypto.m2crypto.stack_st_OPENSSL_STRING.stack" title="Permalink to this definition">¶</a></dt>
+<dd><p>stack_st_OPENSSL_STRING.stack</p>
+</dd></dl>
+
+<dl class="attribute">
+<dt id="M2Crypto.m2crypto.stack_st_OPENSSL_STRING.this">
+<tt class="descname">this</tt><a class="headerlink" href="#M2Crypto.m2crypto.stack_st_OPENSSL_STRING.this" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="attribute">
+<dt id="M2Crypto.m2crypto.stack_st_OPENSSL_STRING.thisown">
+<tt class="descname">thisown</tt><a class="headerlink" href="#M2Crypto.m2crypto.stack_st_OPENSSL_STRING.thisown" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.m2urllib">
+<span id="m2urllib-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">m2urllib</span></tt> Module<a class="headerlink" href="#module-M2Crypto.m2urllib" title="Permalink to this headline">¶</a></h2>
+<dl class="function">
+<dt id="M2Crypto.m2urllib.open_https">
+<tt class="descclassname">M2Crypto.m2urllib.</tt><tt class="descname">open_https</tt><big>(</big><em>self</em>, <em>url</em>, <em>data=None</em>, <em>ssl_context=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/m2urllib.html#open_https"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.m2urllib.open_https" title="Permalink to this definition">¶</a></dt>
+<dd><p>Open URL over the SSL connection.</p>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
+<li><strong>url</strong> &#8211; URL to be opened</li>
+<li><strong>data</strong> &#8211; data for the POST request</li>
+<li><strong>ssl_context</strong> &#8211; SSL.Context to be used</li>
+</ul>
+</td>
+</tr>
+<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last"></p>
+</td>
+</tr>
+</tbody>
+</table>
+</dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.m2urllib2">
+<span id="m2urllib2-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">m2urllib2</span></tt> Module<a class="headerlink" href="#module-M2Crypto.m2urllib2" title="Permalink to this headline">¶</a></h2>
+<dl class="class">
+<dt id="M2Crypto.m2urllib2.HTTPSHandler">
+<em class="property">class </em><tt class="descclassname">M2Crypto.m2urllib2.</tt><tt class="descname">HTTPSHandler</tt><big>(</big><em>ssl_context=None</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/m2urllib2.html#HTTPSHandler"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.m2urllib2.HTTPSHandler" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">urllib2.AbstractHTTPHandler</span></tt></p>
+<dl class="method">
+<dt id="M2Crypto.m2urllib2.HTTPSHandler.https_open">
+<tt class="descname">https_open</tt><big>(</big><em>req</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/m2urllib2.html#HTTPSHandler.https_open"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.m2urllib2.HTTPSHandler.https_open" title="Permalink to this definition">¶</a></dt>
+<dd><p>Return an addinfourl object for the request, using http_class.</p>
+<p>http_class must implement the HTTPConnection API from httplib.
+The addinfourl return value is a file-like object. It also
+has methods and attributes including:</p>
+<blockquote>
+<div><ul class="simple">
+<li>info(): return a mimetools.Message object for the headers</li>
+<li>geturl(): return the original request URL</li>
+<li>code: HTTP status code</li>
+</ul>
+</div></blockquote>
+</dd></dl>
+
+<dl class="method">
+<dt id="M2Crypto.m2urllib2.HTTPSHandler.https_request">
+<tt class="descname">https_request</tt><big>(</big><em>request</em><big>)</big><a class="headerlink" href="#M2Crypto.m2urllib2.HTTPSHandler.https_request" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.m2urllib2.build_opener">
+<tt class="descclassname">M2Crypto.m2urllib2.</tt><tt class="descname">build_opener</tt><big>(</big><em>ssl_context=None</em>, <em>*handlers</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/m2urllib2.html#build_opener"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.m2urllib2.build_opener" title="Permalink to this definition">¶</a></dt>
+<dd><p>Create an opener object from a list of handlers.</p>
+<p>The opener will use several default handlers, including support
+for HTTP and FTP.</p>
+<p>If any of the handlers passed as arguments are subclasses of the
+default handlers, the default handlers will not be used.</p>
+</dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.m2xmlrpclib">
+<span id="m2xmlrpclib-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">m2xmlrpclib</span></tt> Module<a class="headerlink" href="#module-M2Crypto.m2xmlrpclib" title="Permalink to this headline">¶</a></h2>
+<dl class="class">
+<dt id="M2Crypto.m2xmlrpclib.SSL_Transport">
+<em class="property">class </em><tt class="descclassname">M2Crypto.m2xmlrpclib.</tt><tt class="descname">SSL_Transport</tt><big>(</big><em>ssl_context=None</em>, <em>*args</em>, <em>**kw</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/m2xmlrpclib.html#SSL_Transport"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.m2xmlrpclib.SSL_Transport" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">xmlrpclib.Transport</span></tt></p>
+<dl class="method">
+<dt id="M2Crypto.m2xmlrpclib.SSL_Transport.request">
+<tt class="descname">request</tt><big>(</big><em>host</em>, <em>handler</em>, <em>request_body</em>, <em>verbose=0</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/m2xmlrpclib.html#SSL_Transport.request"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.m2xmlrpclib.SSL_Transport.request" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="attribute">
+<dt id="M2Crypto.m2xmlrpclib.SSL_Transport.user_agent">
+<tt class="descname">user_agent</tt><em class="property"> = 'M2Crypto_XMLRPC/0.26.0 - xmlrpclib.py/1.0.1 (by www.pythonware.com)'</em><a class="headerlink" href="#M2Crypto.m2xmlrpclib.SSL_Transport.user_agent" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.threading">
+<span id="threading-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">threading</span></tt> Module<a class="headerlink" href="#module-M2Crypto.threading" title="Permalink to this headline">¶</a></h2>
+<dl class="function">
+<dt id="M2Crypto.threading.cleanup">
+<tt class="descclassname">M2Crypto.threading.</tt><tt class="descname">cleanup</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/threading.html#cleanup"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.threading.cleanup" title="Permalink to this definition">¶</a></dt>
+<dd><p>End and cleanup threading support.</p>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.threading.init">
+<tt class="descclassname">M2Crypto.threading.</tt><tt class="descname">init</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/M2Crypto/threading.html#init"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.threading.init" title="Permalink to this definition">¶</a></dt>
+<dd><p>Initialize threading support.</p>
+</dd></dl>
+
+</div>
+<div class="section" id="module-M2Crypto.util">
+<span id="util-module"></span><h2><tt class="xref py py-mod docutils literal"><span class="pre">util</span></tt> Module<a class="headerlink" href="#module-M2Crypto.util" title="Permalink to this headline">¶</a></h2>
+<dl class="exception">
+<dt id="M2Crypto.util.UtilError">
+<em class="property">exception </em><tt class="descclassname">M2Crypto.util.</tt><tt class="descname">UtilError</tt><a class="reference internal" href="_modules/M2Crypto/util.html#UtilError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.util.UtilError" title="Permalink to this definition">¶</a></dt>
+<dd><p>Bases: <tt class="xref py py-class docutils literal"><span class="pre">exceptions.Exception</span></tt></p>
+</dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.util.bin_to_hex">
+<tt class="descclassname">M2Crypto.util.</tt><tt class="descname">bin_to_hex</tt><big>(</big><em>b</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/util.html#bin_to_hex"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.util.bin_to_hex" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.util.genparam_callback">
+<tt class="descclassname">M2Crypto.util.</tt><tt class="descname">genparam_callback</tt><big>(</big><em>p</em>, <em>n</em>, <em>out=&lt;open file '&lt;stdout&gt;'</em>, <em>mode 'w' at 0x7fc7ebc63150&gt;</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/util.html#genparam_callback"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.util.genparam_callback" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.util.no_passphrase_callback">
+<tt class="descclassname">M2Crypto.util.</tt><tt class="descname">no_passphrase_callback</tt><big>(</big><em>*args</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/util.html#no_passphrase_callback"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.util.no_passphrase_callback" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.util.octx_to_num">
+<tt class="descclassname">M2Crypto.util.</tt><tt class="descname">octx_to_num</tt><big>(</big><em>x</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/util.html#octx_to_num"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.util.octx_to_num" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.util.passphrase_callback">
+<tt class="descclassname">M2Crypto.util.</tt><tt class="descname">passphrase_callback</tt><big>(</big><em>v</em>, <em>prompt1='Enter passphrase:'</em>, <em>prompt2='Verify passphrase:'</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/util.html#passphrase_callback"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.util.passphrase_callback" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.util.pkcs5_pad">
+<tt class="descclassname">M2Crypto.util.</tt><tt class="descname">pkcs5_pad</tt><big>(</big><em>data</em>, <em>blklen=8</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/util.html#pkcs5_pad"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.util.pkcs5_pad" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.util.pkcs7_pad">
+<tt class="descclassname">M2Crypto.util.</tt><tt class="descname">pkcs7_pad</tt><big>(</big><em>data</em>, <em>blklen</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/util.html#pkcs7_pad"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.util.pkcs7_pad" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.util.py3bytes">
+<tt class="descclassname">M2Crypto.util.</tt><tt class="descname">py3bytes</tt><big>(</big><em>x</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/util.html#py3bytes"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.util.py3bytes" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.util.py3str">
+<tt class="descclassname">M2Crypto.util.</tt><tt class="descname">py3str</tt><big>(</big><em>x</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/util.html#py3str"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.util.py3str" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+<dl class="function">
+<dt id="M2Crypto.util.quiet_genparam_callback">
+<tt class="descclassname">M2Crypto.util.</tt><tt class="descname">quiet_genparam_callback</tt><big>(</big><em>p</em>, <em>n</em>, <em>out</em><big>)</big><a class="reference internal" href="_modules/M2Crypto/util.html#quiet_genparam_callback"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#M2Crypto.util.quiet_genparam_callback" title="Permalink to this definition">¶</a></dt>
+<dd></dd></dl>
+
+</div>
+<div class="section" id="subpackages">
+<h2>Subpackages<a class="headerlink" href="#subpackages" title="Permalink to this headline">¶</a></h2>
+<div class="toctree-wrapper compound">
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="M2Crypto.PGP.html">PGP Package</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.PGP.html#id1"><tt class="docutils literal"><span class="pre">PGP</span></tt> Package</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.PGP.html#module-M2Crypto.PGP.PublicKey"><tt class="docutils literal"><span class="pre">PublicKey</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.PGP.html#module-M2Crypto.PGP.PublicKeyRing"><tt class="docutils literal"><span class="pre">PublicKeyRing</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.PGP.html#module-M2Crypto.PGP.RSA"><tt class="docutils literal"><span class="pre">RSA</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.PGP.html#module-M2Crypto.PGP.constants"><tt class="docutils literal"><span class="pre">constants</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.PGP.html#module-M2Crypto.PGP.packet"><tt class="docutils literal"><span class="pre">packet</span></tt> Module</a></li>
+</ul>
+</li>
+<li class="toctree-l1"><a class="reference internal" href="M2Crypto.SSL.html">SSL Package</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#id1"><tt class="docutils literal"><span class="pre">SSL</span></tt> Package</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Checker"><tt class="docutils literal"><span class="pre">Checker</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Cipher"><tt class="docutils literal"><span class="pre">Cipher</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Connection"><tt class="docutils literal"><span class="pre">Connection</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Context"><tt class="docutils literal"><span class="pre">Context</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.SSLServer"><tt class="docutils literal"><span class="pre">SSLServer</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Session"><tt class="docutils literal"><span class="pre">Session</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.TwistedProtocolWrapper"><tt class="docutils literal"><span class="pre">TwistedProtocolWrapper</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.cb"><tt class="docutils literal"><span class="pre">cb</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.ssl_dispatcher"><tt class="docutils literal"><span class="pre">ssl_dispatcher</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.timeout"><tt class="docutils literal"><span class="pre">timeout</span></tt> Module</a></li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+</div>
+
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+ <h3><a href="index.html">Table Of Contents</a></h3>
+ <ul>
+<li><a class="reference internal" href="#">M2Crypto Package</a><ul>
+<li><a class="reference internal" href="#id1"><tt class="docutils literal"><span class="pre">M2Crypto</span></tt> Package</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.ASN1"><tt class="docutils literal"><span class="pre">ASN1</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.AuthCookie"><tt class="docutils literal"><span class="pre">AuthCookie</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.BIO"><tt class="docutils literal"><span class="pre">BIO</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.BN"><tt class="docutils literal"><span class="pre">BN</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.DH"><tt class="docutils literal"><span class="pre">DH</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.DSA"><tt class="docutils literal"><span class="pre">DSA</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.EC"><tt class="docutils literal"><span class="pre">EC</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.EVP"><tt class="docutils literal"><span class="pre">EVP</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.Engine"><tt class="docutils literal"><span class="pre">Engine</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.Err"><tt class="docutils literal"><span class="pre">Err</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.RC4"><tt class="docutils literal"><span class="pre">RC4</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.RSA"><tt class="docutils literal"><span class="pre">RSA</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.Rand"><tt class="docutils literal"><span class="pre">Rand</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.SMIME"><tt class="docutils literal"><span class="pre">SMIME</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.X509"><tt class="docutils literal"><span class="pre">X509</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.callback"><tt class="docutils literal"><span class="pre">callback</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.ftpslib"><tt class="docutils literal"><span class="pre">ftpslib</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.httpslib"><tt class="docutils literal"><span class="pre">httpslib</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.m2"><tt class="docutils literal"><span class="pre">m2</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.m2crypto"><tt class="docutils literal"><span class="pre">m2crypto</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.m2urllib"><tt class="docutils literal"><span class="pre">m2urllib</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.m2urllib2"><tt class="docutils literal"><span class="pre">m2urllib2</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.m2xmlrpclib"><tt class="docutils literal"><span class="pre">m2xmlrpclib</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.threading"><tt class="docutils literal"><span class="pre">threading</span></tt> Module</a></li>
+<li><a class="reference internal" href="#module-M2Crypto.util"><tt class="docutils literal"><span class="pre">util</span></tt> Module</a></li>
+<li><a class="reference internal" href="#subpackages">Subpackages</a><ul>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+
+ <h4>Previous topic</h4>
+ <p class="topless"><a href="index.html"
+ title="previous chapter">Welcome to M2Crypto&#8217;s documentation!</a></p>
+ <h4>Next topic</h4>
+ <p class="topless"><a href="M2Crypto.PGP.html"
+ title="next chapter">PGP Package</a></p>
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="_sources/M2Crypto.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="M2Crypto.PGP.html" title="PGP Package"
+ >next</a> |</li>
+ <li class="right" >
+ <a href="index.html" title="Welcome to M2Crypto’s documentation!"
+ >previous</a> |</li>
+ <li><a href="index.html">M2Crypto documentation</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/ZServerSSL-HOWTO.html b/doc/html/ZServerSSL-HOWTO.html
new file mode 100644
index 0000000..dc1dc32
--- /dev/null
+++ b/doc/html/ZServerSSL-HOWTO.html
@@ -0,0 +1,359 @@
+
+
+<!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>1.   ZServerSSL-HOWTO &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '',
+ VERSION: '',
+ 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="M2Crypto documentation" href="index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="index.html">M2Crypto documentation</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <div class="section" id="zserverssl-howto">
+<span id="id1"></span><h1><a class="toc-backref" href="#id3">1.&nbsp;&nbsp;&nbsp;ZServerSSL-HOWTO</a><a class="headerlink" href="#zserverssl-howto" title="Permalink to this headline">¶</a></h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">author:</th><td class="field-body">Pheng Siong Ng &lt;<a class="reference external" href="mailto:ngps&#37;&#52;&#48;post1&#46;com">ngps<span>&#64;</span>post1<span>&#46;</span>com</a>&gt;</td>
+</tr>
+<tr class="field-even field"><th class="field-name">copyright:</th><td class="field-body">© 2000, 2001 by Ng Pheng Siong.</td>
+</tr>
+<tr class="field-odd field"><th class="field-name">date:</th><td class="field-body">2003-06-22</td>
+</tr>
+</tbody>
+</table>
+<div class="contents topic" id="contents">
+<p class="topic-title first">Contents</p>
+<ul class="auto-toc simple">
+<li><a class="reference internal" href="#zserverssl-howto" id="id3">1.&nbsp;&nbsp;&nbsp;ZServerSSL-HOWTO</a><ul class="auto-toc">
+<li><a class="reference internal" href="#introduction" id="id4">1.1.&nbsp;&nbsp;&nbsp;Introduction</a></li>
+<li><a class="reference internal" href="#preparation" id="id5">1.2.&nbsp;&nbsp;&nbsp;Preparation</a></li>
+<li><a class="reference internal" href="#installation" id="id6">1.3.&nbsp;&nbsp;&nbsp;Installation</a></li>
+<li><a class="reference internal" href="#testing" id="id7">1.4.&nbsp;&nbsp;&nbsp;Testing</a></li>
+<li><a class="reference internal" href="#https" id="id8">1.5.&nbsp;&nbsp;&nbsp;HTTPS</a></li>
+<li><a class="reference internal" href="#webdav-over-https" id="id9">1.6.&nbsp;&nbsp;&nbsp;WebDAV-over-HTTPS</a></li>
+<li><a class="reference internal" href="#webdav-source-over-https" id="id10">1.7.&nbsp;&nbsp;&nbsp;WebDAV-Source-over-HTTPS</a></li>
+<li><a class="reference internal" href="#python-with-m2crypto" id="id11">1.8.&nbsp;&nbsp;&nbsp;Python with M2Crypto</a></li>
+<li><a class="reference internal" href="#id2" id="id12">1.9.&nbsp;&nbsp;&nbsp;HTTPS</a></li>
+<li><a class="reference internal" href="#xmlrpc-over-https" id="id13">1.10.&nbsp;&nbsp;&nbsp;XMLRPC-over-HTTPS</a></li>
+<li><a class="reference internal" href="#conclusion" id="id14">1.11.&nbsp;&nbsp;&nbsp;Conclusion</a></li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="section" id="introduction">
+<h2><a class="toc-backref" href="#id4">1.1.&nbsp;&nbsp;&nbsp;Introduction</a><a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
+<p>ZServerSSL adds to Zope&#8217;s ZServer the following:</p>
+<ul class="simple">
+<li>HTTPS server</li>
+<li>WebDAV-source-over-HTTPS server</li>
+</ul>
+<p>With the HTTPS server, ZServerSSL also provides WebDAV-over-HTTPS and
+XMLRPC-over-HTTPS access to Zope.</p>
+<p>These instructions apply to both Un*x and Windows installations of Zope
+2.6.1. To avoid cluttering the presentation, Windows pathnames are shown
+in Un*x fashion.</p>
+</div>
+<div class="section" id="preparation">
+<h2><a class="toc-backref" href="#id5">1.2.&nbsp;&nbsp;&nbsp;Preparation</a><a class="headerlink" href="#preparation" title="Permalink to this headline">¶</a></h2>
+<ol class="arabic simple">
+<li>Download M2Crypto 0.11, contained in the file <tt class="docutils literal"><span class="pre">m2crypto-0.11.zip</span></tt>.</li>
+<li>Unpack <tt class="docutils literal"><span class="pre">m2crypto-0.11.zip</span></tt>. This will create a directory
+<tt class="docutils literal"><span class="pre">m2crypto-0.11</span></tt>. Henceforth, we refer to this directory as <tt class="docutils literal"><span class="pre">$M2</span></tt>.</li>
+<li>Install M2Crypto per the instructions in <tt class="docutils literal"><span class="pre">$M2/INSTALL</span></tt>.</li>
+</ol>
+<p>The ZServerSSL distribution is in <tt class="docutils literal"><span class="pre">$M2/demo/Zope</span></tt>. We shall refer to
+this directory as <tt class="docutils literal"><span class="pre">$ZSSL</span></tt>.</p>
+</div>
+<div class="section" id="installation">
+<h2><a class="toc-backref" href="#id6">1.3.&nbsp;&nbsp;&nbsp;Installation</a><a class="headerlink" href="#installation" title="Permalink to this headline">¶</a></h2>
+<p>Below, we refer to your Zope top-level directory as <tt class="docutils literal"><span class="pre">$ZOPE</span></tt>.</p>
+<ol class="arabic">
+<li><p class="first">Copy <tt class="docutils literal"><span class="pre">$ZSSL/z2s.py</span></tt> into <tt class="docutils literal"><span class="pre">$ZOPE</span></tt>.</p>
+</li>
+<li><p class="first">Depending on your operating system, modify <tt class="docutils literal"><span class="pre">$ZOPE/start</span></tt> or
+<tt class="docutils literal"><span class="pre">$ZOPE/start.bat</span></tt> to invoke <tt class="docutils literal"><span class="pre">$ZOPE/z2s.py</span></tt>, instead of
+<tt class="docutils literal"><span class="pre">$ZOPE/z2.py</span></tt>. The files <tt class="docutils literal"><span class="pre">$ZSSL/starts</span></tt> and <tt class="docutils literal"><span class="pre">$ZSSL/starts.bat</span></tt>
+serve as examples.</p>
+</li>
+<li><p class="first">Copy <tt class="docutils literal"><span class="pre">$ZSSL/dh1024.pem</span></tt> into <tt class="docutils literal"><span class="pre">$ZOPE</span></tt>. This file contains
+Diffie-Hellman parameters for use by the SSL protocol.</p>
+</li>
+<li><p class="first">Copy <tt class="docutils literal"><span class="pre">$ZSSL/randpool.dat</span></tt> into <tt class="docutils literal"><span class="pre">$ZOPE</span></tt>. This file contains seed
+material for the OpenSSL PRNG. Alternatively, create
+<tt class="docutils literal"><span class="pre">$ZOPE/randpool.dat</span></tt> thusly:</p>
+<div class="highlight-python"><pre>$ dd if=/dev/urandom of=randpool.dat bs=1024 count=1</pre>
+</div>
+</li>
+<li><p class="first">Copy <tt class="docutils literal"><span class="pre">$ZSSL/ca.pem</span></tt> to <tt class="docutils literal"><span class="pre">$ZOPE</span></tt>. This file contains an
+example Certification Authority (CA) certificate. For
+information on operating your own CA, see <a class="reference internal" href="howto.ca.html#howto-ca"><em>HOWTO: Creating your own CA with OpenSSL</em></a> or
+one of numerous similar documents available on the web.</p>
+</li>
+<li><p class="first">Copy <tt class="docutils literal"><span class="pre">$ZSSL/server.pem</span></tt> to <tt class="docutils literal"><span class="pre">$ZOPE</span></tt>. This file contains an RSA key
+pair and its X.509v3 certificate issued by the above CA. You may also
+create your own key/certificate bundle.</p>
+</li>
+<li><p class="first">Copy <tt class="docutils literal"><span class="pre">$ZSSL/ZServer/HTTPS_Server.py</span></tt> to <tt class="docutils literal"><span class="pre">$ZOPE/ZServer</span></tt>.</p>
+</li>
+<li><p class="first">Copy <tt class="docutils literal"><span class="pre">$ZSSL/ZServer/__init__.py</span></tt> to <tt class="docutils literal"><span class="pre">$ZOPE/ZServer</span></tt>. This
+overwrites the existing <tt class="docutils literal"><span class="pre">$ZOPE/ZServer/__init__.py</span></tt>. Alternatively,
+apply the following patch to <tt class="docutils literal"><span class="pre">$ZOPE/ZServer/__init__.py</span></tt>:</p>
+<div class="highlight-python"><pre>--- __init__.py.org Sat Jun 21 23:20:41 2003
++++ __init__.py Tue Jan 7 23:30:53 2003
+@@ -84,6 +84,7 @@
+ import asyncore
+ from medusa import resolver, logger
+ from HTTPServer import zhttp_server, zhttp_handler
++from HTTPS_Server import zhttps_server, zhttps_handler
+ from PCGIServer import PCGIServer
+ from FCGIServer import FCGIServer
+ from FTPServer import FTPServer</pre>
+</div>
+</li>
+<li><p class="first">Copy <tt class="docutils literal"><span class="pre">$ZSSL/ZServer/medusa/https_server.py</span></tt> to
+<tt class="docutils literal"><span class="pre">$ZOPE/ZServer/medusa</span></tt>.</p>
+</li>
+<li><p class="first">Stop Zope, if it is running.</p>
+</li>
+<li><p class="first">Start Zope with ZServerSSL thusly:</p>
+<div class="highlight-python"><pre>./starts -X -f 9021 -w 9080 -W 9081 -y 9443 -Y 9444</pre>
+</div>
+<p>This starts the following:</p>
+<ul class="simple">
+<li>an FTP server on port 9021</li>
+<li>a HTTP server on port 9080</li>
+<li>a WebDAV-source server on port 9081</li>
+<li>a HTTPS server on port 9443</li>
+<li>a WebDAV-source-over-HTTPS server on port 9444</li>
+</ul>
+</li>
+</ol>
+</div>
+<div class="section" id="testing">
+<h2><a class="toc-backref" href="#id7">1.4.&nbsp;&nbsp;&nbsp;Testing</a><a class="headerlink" href="#testing" title="Permalink to this headline">¶</a></h2>
+<p>Below, we assume your Zope server is running on <tt class="docutils literal"><span class="pre">localhost</span></tt>.</p>
+</div>
+<div class="section" id="https">
+<h2><a class="toc-backref" href="#id8">1.5.&nbsp;&nbsp;&nbsp;HTTPS</a><a class="headerlink" href="#https" title="Permalink to this headline">¶</a></h2>
+<p>This testing is done with Mozilla 1.1 on FreeBSD.</p>
+<ol class="arabic simple">
+<li>With a browser, connect to <a class="reference external" href="https://localhost:9443/">https://localhost:9443/</a>. Browse around.
+Check out your browser&#8217;s HTTPS informational screens.</li>
+<li>Connect to <a class="reference external" href="https://localhost:9443/manage">https://localhost:9443/manage</a>. Verify that you can access
+Zope&#8217;s management functionality.</li>
+</ol>
+</div>
+<div class="section" id="webdav-over-https">
+<h2><a class="toc-backref" href="#id9">1.6.&nbsp;&nbsp;&nbsp;WebDAV-over-HTTPS</a><a class="headerlink" href="#webdav-over-https" title="Permalink to this headline">¶</a></h2>
+<p>This testing is done with Cadaver 0.21.0 on FreeBSD.:</p>
+<div class="highlight-python"><pre>$ cadaver https://localhost:9443/
+WARNING: Untrusted server certificate presented:
+Issued to: M2Crypto, SG
+Issued by: M2Crypto, SG
+Do you wish to accept the certificate? (y/n) y
+dav:/&gt; ls
+Listing collection `/&#x27;: succeeded.
+Coll: Channels 0 Jun 19 00:04
+Coll: Control_Panel 0 Jun 6 00:13
+Coll: Examples 0 Jun 6 00:12
+Coll: catalog 0 Jun 12 11:53
+Coll: ngps 0 Jun 16 15:34
+Coll: portal 0 Jun 21 15:21
+Coll: skunk 0 Jun 18 21:18
+Coll: temp_folder 0 Jun 22 17:57
+Coll: zope 0 Jun 20 15:27
+ acl_users 0 Dec 30 1998
+ browser_id_manager 0 Jun 6 00:12
+ default.css 3037 Jun 21 16:38
+ error_log 0 Jun 6 00:12
+ index_html 313 Jun 12 13:36
+ portal0 0 Jun 21 15:21
+ session_data_manager 0 Jun 6 00:12
+ standard_error_message 1365 Jan 21 2001
+ standard_html_footer 50 Jun 12 12:30
+ standard_html_header 80 Jan 21 2001
+ standard_template.pt 282 Jun 6 00:12
+ zsyncer 0 Jun 17 15:28
+dav:/&gt; quit
+Connection to `localhost&#x27; closed.
+$</pre>
+</div>
+</div>
+<div class="section" id="webdav-source-over-https">
+<h2><a class="toc-backref" href="#id10">1.7.&nbsp;&nbsp;&nbsp;WebDAV-Source-over-HTTPS</a><a class="headerlink" href="#webdav-source-over-https" title="Permalink to this headline">¶</a></h2>
+<p>This testing is done with Mozilla 1.1 on FreeBSD.</p>
+<ol class="arabic simple">
+<li>Open the Mozilla Composer window.</li>
+<li>Click &#8220;File&#8221;, &#8220;Open Web Location&#8221;. A dialog box appears.</li>
+<li>Enter <tt class="docutils literal"><span class="pre">https://localhost:9444/index_html</span></tt> for the URL.</li>
+<li>Select &#8220;Open in new Composer window.&#8221;</li>
+<li>Click &#8220;Open&#8221;. A new Composer window will open with <tt class="docutils literal"><span class="pre">index_html</span></tt>
+loaded.</li>
+</ol>
+</div>
+<div class="section" id="python-with-m2crypto">
+<h2><a class="toc-backref" href="#id11">1.8.&nbsp;&nbsp;&nbsp;Python with M2Crypto</a><a class="headerlink" href="#python-with-m2crypto" title="Permalink to this headline">¶</a></h2>
+<p>This testing is done with M2Crypto 0.11 and Python 2.2.2 on FreeBSD.</p>
+</div>
+<div class="section" id="id2">
+<h2><a class="toc-backref" href="#id12">1.9.&nbsp;&nbsp;&nbsp;HTTPS</a><a class="headerlink" href="#id2" title="Permalink to this headline">¶</a></h2>
+<div class="highlight-python"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">Rand</span><span class="p">,</span> <span class="n">SSL</span><span class="p">,</span> <span class="n">m2urllib</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">url</span> <span class="o">=</span> <span class="n">m2urllib</span><span class="o">.</span><span class="n">FancyURLopener</span><span class="p">()</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">url</span><span class="o">.</span><span class="n">addheader</span><span class="p">(</span><span class="s1">&#39;Connection&#39;</span><span class="p">,</span> <span class="s1">&#39;close&#39;</span><span class="p">)</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">u</span> <span class="o">=</span> <span class="n">url</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">&#39;https://127.0.0.1:9443/&#39;</span><span class="p">)</span>
+<span class="go">send: &#39;GET / HTTP/1.1\r\nHost: 127.0.0.1:9443\r\nAccept-Encoding: identity\r\nUser-agent: Python-urllib/1.15\r\nConnection: close\r\n\r\n&#39;</span>
+<span class="go">reply: &#39;HTTP/1.1 200 OK\r\n&#39;</span>
+<span class="go">header: Server: ZServerSSL/0.11</span>
+<span class="go">header: Date: Sun, 22 Jun 2003 13:42:34 GMT</span>
+<span class="go">header: Connection: close</span>
+<span class="go">header: Content-Type: text/html</span>
+<span class="go">header: Etag:</span>
+<span class="go">header: Content-Length: 535</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="k">while</span> <span class="mi">1</span><span class="p">:</span>
+<span class="gp">... </span> <span class="n">data</span> <span class="o">=</span> <span class="n">u</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
+<span class="gp">... </span> <span class="k">if</span> <span class="ow">not</span> <span class="n">data</span><span class="p">:</span> <span class="k">break</span>
+<span class="gp">... </span> <span class="k">print</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+<span class="gp">...</span>
+</pre></div>
+</div>
+<div class="highlight-python"><pre>&lt;html&gt;&lt;head&gt;
+&lt;base href=&quot;https://127.0.0.1:9443/&quot; /&gt;
+&lt;title&gt;Zope&lt;/title&gt;&lt;/head&gt;&lt;body bgcolor=&quot;#FFFFFF&quot;&gt;
+
+&lt;h1&gt;NgPS Desktop Portal&lt;/h1&gt;
+
+&amp;nbsp;&amp;nbsp;So many hacks.&lt;br&gt;
+&amp;nbsp;&amp;nbsp;So little time.&lt;br&gt;
+
+&lt;h2&gt;Link Farm&lt;/h2&gt;
+&lt;ul&gt;
+&lt;li&gt;&lt;a href=&quot;http://localhost:8080/portal&quot;&gt;Portal&lt;/a&gt;&lt;/li&gt;
+&lt;li&gt;&lt;a href=&quot;http://localhost/&quot;&gt;Local Apache Home Page&lt;/a&gt;&lt;/li&gt;
+&lt;/ul&gt;
+
+&lt;hr&gt;&lt;a href=&quot;http://www.zope.org/Credits&quot; target=&quot;_top&quot;&gt;&lt;img src=&quot;https://127.0.0.1:9443/p_/ZopeButton&quot; width=&quot;115&quot; height=&quot;50&quot; border=&quot;0&quot; alt=&quot;Powered by Zope&quot; /&gt;&lt;/a&gt;&lt;/body&gt;&lt;/html&gt;</pre>
+</div>
+<div class="highlight-python"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">u</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+<span class="go">&gt;&gt;&gt;</span>
+</pre></div>
+</div>
+</div>
+<div class="section" id="xmlrpc-over-https">
+<h2><a class="toc-backref" href="#id13">1.10.&nbsp;&nbsp;&nbsp;XMLRPC-over-HTTPS</a><a class="headerlink" href="#xmlrpc-over-https" title="Permalink to this headline">¶</a></h2>
+<div class="highlight-python"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">M2Crypto.m2xmlrpclib</span> <span class="kn">import</span> <span class="n">Server</span><span class="p">,</span> <span class="n">SSL_Transport</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="n">zs</span> <span class="o">=</span> <span class="n">Server</span><span class="p">(</span><span class="s1">&#39;https://127.0.0.1:9443/&#39;</span><span class="p">,</span> <span class="n">SSL_Transport</span><span class="p">())</span>
+<span class="gp">&gt;&gt;&gt; </span><span class="k">print</span><span class="p">(</span><span class="n">zs</span><span class="o">.</span><span class="n">propertyMap</span><span class="p">())</span>
+<span class="go">[{&#39;type&#39;: &#39;string&#39;, &#39;id&#39;: &#39;title&#39;, &#39;mode&#39;: &#39;w&#39;}]</span>
+<span class="go">&gt;&gt;&gt;</span>
+</pre></div>
+</div>
+</div>
+<div class="section" id="conclusion">
+<h2><a class="toc-backref" href="#id14">1.11.&nbsp;&nbsp;&nbsp;Conclusion</a><a class="headerlink" href="#conclusion" title="Permalink to this headline">¶</a></h2>
+<p>Well, it works! ;-)</p>
+</div>
+</div>
+
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+ <h3><a href="index.html">Table Of Contents</a></h3>
+ <ul>
+<li><a class="reference internal" href="#">1.&nbsp;&nbsp;&nbsp;ZServerSSL-HOWTO</a><ul>
+<li><a class="reference internal" href="#introduction">1.1.&nbsp;&nbsp;&nbsp;Introduction</a></li>
+<li><a class="reference internal" href="#preparation">1.2.&nbsp;&nbsp;&nbsp;Preparation</a></li>
+<li><a class="reference internal" href="#installation">1.3.&nbsp;&nbsp;&nbsp;Installation</a></li>
+<li><a class="reference internal" href="#testing">1.4.&nbsp;&nbsp;&nbsp;Testing</a></li>
+<li><a class="reference internal" href="#https">1.5.&nbsp;&nbsp;&nbsp;HTTPS</a></li>
+<li><a class="reference internal" href="#webdav-over-https">1.6.&nbsp;&nbsp;&nbsp;WebDAV-over-HTTPS</a></li>
+<li><a class="reference internal" href="#webdav-source-over-https">1.7.&nbsp;&nbsp;&nbsp;WebDAV-Source-over-HTTPS</a></li>
+<li><a class="reference internal" href="#python-with-m2crypto">1.8.&nbsp;&nbsp;&nbsp;Python with M2Crypto</a></li>
+<li><a class="reference internal" href="#id2">1.9.&nbsp;&nbsp;&nbsp;HTTPS</a></li>
+<li><a class="reference internal" href="#xmlrpc-over-https">1.10.&nbsp;&nbsp;&nbsp;XMLRPC-over-HTTPS</a></li>
+<li><a class="reference internal" href="#conclusion">1.11.&nbsp;&nbsp;&nbsp;Conclusion</a></li>
+</ul>
+</li>
+</ul>
+
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="_sources/ZServerSSL-HOWTO.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="index.html">M2Crypto documentation</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/ASN1.html b/doc/html/_modules/M2Crypto/ASN1.html
new file mode 100644
index 0000000..c290e6a
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/ASN1.html
@@ -0,0 +1,347 @@
+
+
+<!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>M2Crypto.ASN1 &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../index.html" />
+ <link rel="up" title="Module code" href="../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.ASN1</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">M2Crypto wrapper for OpenSSL ASN1 API.</span>
+
+<span class="sd">Copyright (c) 1999-2004 Ng Pheng Siong. All rights reserved.</span>
+
+<span class="sd">Portions created by Open Source Applications Foundation (OSAF) are</span>
+<span class="sd">Copyright (C) 2005 OSAF. All Rights Reserved.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">datetime</span>
+<span class="kn">import</span> <span class="nn">time</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Any</span><span class="p">,</span> <span class="n">Callable</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Tuple</span> <span class="c1"># noqa</span>
+
+<span class="n">MBSTRING_FLAG</span> <span class="o">=</span> <span class="mh">0x1000</span>
+<span class="n">MBSTRING_ASC</span> <span class="o">=</span> <span class="n">MBSTRING_FLAG</span> <span class="o">|</span> <span class="mi">1</span>
+<span class="n">MBSTRING_BMP</span> <span class="o">=</span> <span class="n">MBSTRING_FLAG</span> <span class="o">|</span> <span class="mi">2</span>
+
+
+<div class="viewcode-block" id="ASN1_Integer"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ASN1.ASN1_Integer">[docs]</a><span class="k">class</span> <span class="nc">ASN1_Integer</span><span class="p">:</span> <span class="c1"># noqa</span>
+
+ <span class="n">m2_asn1_integer_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">asn1_integer_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">asn1int</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (ASN1_Integer, int) -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">asn1int</span> <span class="o">=</span> <span class="n">asn1int</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="n">_pyfree</span>
+
+ <span class="k">def</span> <span class="nf">__cmp__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
+ <span class="c1"># type: (ASN1_Integer) -&gt; int</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">ASN1_Integer</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
+ <span class="s2">&quot;Comparisons supported only between ANS1_Integer objects&quot;</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">asn1_integer_cmp</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">asn1int</span><span class="p">,</span> <span class="n">other</span><span class="o">.</span><span class="n">asn1int</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_asn1_integer_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">asn1int</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__int__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">asn1_integer_get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">asn1int</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="ASN1_String"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ASN1.ASN1_String">[docs]</a><span class="k">class</span> <span class="nc">ASN1_String</span><span class="p">:</span> <span class="c1"># noqa</span>
+
+ <span class="n">m2_asn1_string_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">asn1_string_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">asn1str</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (ASN1_String, int) -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">asn1str</span> <span class="o">=</span> <span class="n">asn1str</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="n">_pyfree</span>
+
+ <span class="k">def</span> <span class="nf">__bytes__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="n">buf</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">asn1_string_print</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">asn1str</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; str</span>
+ <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__bytes__</span><span class="p">())</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_pyfree&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_asn1_string_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">asn1str</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">_ptr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">asn1str</span>
+
+<div class="viewcode-block" id="ASN1_String.as_text"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ASN1.ASN1_String.as_text">[docs]</a> <span class="k">def</span> <span class="nf">as_text</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; str</span>
+ <span class="sd">&quot;&quot;&quot;output an ASN1_STRING structure according to the set flags.</span>
+
+<span class="sd"> :param flags: determine the format of the output by using</span>
+<span class="sd"> predetermined constants, see ASN1_STRING_print_ex(3)</span>
+<span class="sd"> manpage for their meaning.</span>
+<span class="sd"> :return: output an ASN1_STRING structure.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">buf</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">asn1_string_print_ex</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">asn1str</span><span class="p">,</span> <span class="n">flags</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">())</span>
+
+</div></div>
+<div class="viewcode-block" id="ASN1_Object"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ASN1.ASN1_Object">[docs]</a><span class="k">class</span> <span class="nc">ASN1_Object</span><span class="p">:</span> <span class="c1"># noqa</span>
+
+ <span class="n">m2_asn1_object_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">asn1_object_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">asn1obj</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (ASN1_Object, int) -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">asn1obj</span> <span class="o">=</span> <span class="n">asn1obj</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="n">_pyfree</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_asn1_object_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">asn1obj</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">_ptr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">asn1obj</span>
+
+</div>
+<span class="k">class</span> <span class="nc">_UTC</span><span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">tzinfo</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">tzname</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dt</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[datetime.datetime]) -&gt; str</span>
+ <span class="k">return</span> <span class="s2">&quot;UTC&quot;</span>
+
+ <span class="k">def</span> <span class="nf">dst</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dt</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[datetime.datetime]) -&gt; datetime.timedelta</span>
+ <span class="k">return</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">utcoffset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dt</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[datetime.datetime]) -&gt; datetime.timedelta</span>
+ <span class="k">return</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="s2">&quot;&lt;Timezone: </span><span class="si">%s</span><span class="s2">&gt;&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">tzname</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
+<span class="n">UTC</span> <span class="o">=</span> <span class="n">_UTC</span><span class="p">()</span> <span class="c1"># type: _UTC</span>
+
+
+<div class="viewcode-block" id="LocalTimezone"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ASN1.LocalTimezone">[docs]</a><span class="k">class</span> <span class="nc">LocalTimezone</span><span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">tzinfo</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot; Localtimezone from datetime manual &quot;&quot;&quot;</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_stdoffset</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">seconds</span><span class="o">=-</span><span class="n">time</span><span class="o">.</span><span class="n">timezone</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">time</span><span class="o">.</span><span class="n">daylight</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_dstoffset</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">seconds</span><span class="o">=-</span><span class="n">time</span><span class="o">.</span><span class="n">altzone</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_dstoffset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_stdoffset</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_dstdiff</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_dstoffset</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">_stdoffset</span>
+
+<div class="viewcode-block" id="LocalTimezone.utcoffset"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ASN1.LocalTimezone.utcoffset">[docs]</a> <span class="k">def</span> <span class="nf">utcoffset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dt</span><span class="p">):</span>
+ <span class="c1"># type: (datetime.datetime) -&gt; datetime.timedelta</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_isdst</span><span class="p">(</span><span class="n">dt</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_dstoffset</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_stdoffset</span>
+</div>
+<div class="viewcode-block" id="LocalTimezone.dst"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ASN1.LocalTimezone.dst">[docs]</a> <span class="k">def</span> <span class="nf">dst</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dt</span><span class="p">):</span>
+ <span class="c1"># type: (datetime.datetime) -&gt; datetime.timedelta</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_isdst</span><span class="p">(</span><span class="n">dt</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_dstdiff</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="LocalTimezone.tzname"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ASN1.LocalTimezone.tzname">[docs]</a> <span class="k">def</span> <span class="nf">tzname</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dt</span><span class="p">):</span>
+ <span class="c1"># type: (datetime.datetime) -&gt; str</span>
+ <span class="k">return</span> <span class="n">time</span><span class="o">.</span><span class="n">tzname</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_isdst</span><span class="p">(</span><span class="n">dt</span><span class="p">)</span><span class="o">.</span><span class="n">real</span><span class="p">]</span>
+</div>
+ <span class="k">def</span> <span class="nf">_isdst</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dt</span><span class="p">):</span>
+ <span class="c1"># type: (datetime.datetime) -&gt; bool</span>
+ <span class="n">tt</span> <span class="o">=</span> <span class="p">(</span><span class="n">dt</span><span class="o">.</span><span class="n">year</span><span class="p">,</span> <span class="n">dt</span><span class="o">.</span><span class="n">month</span><span class="p">,</span> <span class="n">dt</span><span class="o">.</span><span class="n">day</span><span class="p">,</span>
+ <span class="n">dt</span><span class="o">.</span><span class="n">hour</span><span class="p">,</span> <span class="n">dt</span><span class="o">.</span><span class="n">minute</span><span class="p">,</span> <span class="n">dt</span><span class="o">.</span><span class="n">second</span><span class="p">,</span>
+ <span class="n">dt</span><span class="o">.</span><span class="n">weekday</span><span class="p">(),</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
+ <span class="n">stamp</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">mktime</span><span class="p">(</span><span class="n">tt</span><span class="p">)</span>
+ <span class="n">tt</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">localtime</span><span class="p">(</span><span class="n">stamp</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">tt</span><span class="o">.</span><span class="n">tm_isdst</span> <span class="o">&gt;</span> <span class="mi">0</span>
+
+</div>
+<div class="viewcode-block" id="ASN1_TIME"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ASN1.ASN1_TIME">[docs]</a><span class="k">class</span> <span class="nc">ASN1_TIME</span><span class="p">:</span> <span class="c1"># noqa</span>
+ <span class="n">_ssl_months</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;Jan&quot;</span><span class="p">,</span> <span class="s2">&quot;Feb&quot;</span><span class="p">,</span> <span class="s2">&quot;Mar&quot;</span><span class="p">,</span> <span class="s2">&quot;Apr&quot;</span><span class="p">,</span> <span class="s2">&quot;May&quot;</span><span class="p">,</span> <span class="s2">&quot;Jun&quot;</span><span class="p">,</span> <span class="s2">&quot;Jul&quot;</span><span class="p">,</span> <span class="s2">&quot;Aug&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;Sep&quot;</span><span class="p">,</span> <span class="s2">&quot;Oct&quot;</span><span class="p">,</span> <span class="s2">&quot;Nov&quot;</span><span class="p">,</span> <span class="s2">&quot;Dec&quot;</span><span class="p">]</span>
+ <span class="n">m2_asn1_time_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">asn1_time_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">asn1_time</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">asn1_utctime</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[ASN1_TIME], int) -&gt; None</span>
+ <span class="c1"># handle old keyword parameter</span>
+ <span class="k">if</span> <span class="n">asn1_time</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">asn1_time</span> <span class="o">=</span> <span class="n">asn1_utctime</span>
+ <span class="k">if</span> <span class="n">asn1_time</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">asn1_time_type_check</span><span class="p">(</span><span class="n">asn1_time</span><span class="p">),</span> \
+ <span class="s2">&quot;&#39;asn1_time&#39; type error&#39;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">asn1_time</span> <span class="o">=</span> <span class="n">asn1_time</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="n">_pyfree</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">asn1_time</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">asn1_time_new</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="mi">1</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_pyfree&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_asn1_time_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">asn1_time</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; str</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">asn1_time_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">asn1_time</span><span class="p">),</span> \
+ <span class="s2">&quot;&#39;asn1_time&#39; type error&#39;&quot;</span>
+ <span class="n">buf</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">asn1_time_print</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">asn1_time</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">())</span>
+
+ <span class="k">def</span> <span class="nf">_ptr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">asn1_time_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">asn1_time</span><span class="p">),</span> \
+ <span class="s2">&quot;&#39;asn1_time&#39; type error&#39;&quot;</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">asn1_time</span>
+
+<div class="viewcode-block" id="ASN1_TIME.set_string"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ASN1.ASN1_TIME.set_string">[docs]</a> <span class="k">def</span> <span class="nf">set_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">string</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Set time from UTC string.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">asn1_time_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">asn1_time</span><span class="p">),</span> \
+ <span class="s2">&quot;&#39;asn1_time&#39; type error&#39;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">asn1_time_set_string</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">asn1_time</span><span class="p">,</span> <span class="n">string</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="ASN1_TIME.set_time"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ASN1.ASN1_TIME.set_time">[docs]</a> <span class="k">def</span> <span class="nf">set_time</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">time</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; ASN1_TIME</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Set time from seconds since epoch (int).</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">asn1_time_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">asn1_time</span><span class="p">),</span> \
+ <span class="s2">&quot;&#39;asn1_time&#39; type error&#39;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">asn1_time_set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">asn1_time</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="ASN1_TIME.get_datetime"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ASN1.ASN1_TIME.get_datetime">[docs]</a> <span class="k">def</span> <span class="nf">get_datetime</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; ASN1_TIME</span>
+ <span class="n">date</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+
+ <span class="n">timezone</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="k">if</span> <span class="s1">&#39; &#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">date</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Invalid date: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">date</span><span class="p">)</span>
+ <span class="n">month</span><span class="p">,</span> <span class="n">rest</span> <span class="o">=</span> <span class="n">date</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">month</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_ssl_months</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Invalid date </span><span class="si">%s</span><span class="s2">: Invalid month: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span>
+ <span class="p">(</span><span class="n">date</span><span class="p">,</span> <span class="n">month</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">rest</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39; GMT&#39;</span><span class="p">):</span>
+ <span class="n">timezone</span> <span class="o">=</span> <span class="n">UTC</span>
+ <span class="n">rest</span> <span class="o">=</span> <span class="n">rest</span><span class="p">[:</span><span class="o">-</span><span class="mi">4</span><span class="p">]</span>
+ <span class="k">if</span> <span class="s1">&#39;.&#39;</span> <span class="ow">in</span> <span class="n">rest</span><span class="p">:</span>
+ <span class="n">dt</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">rest</span><span class="p">,</span> <span class="s2">&quot;</span><span class="si">%d</span><span class="s2"> %H:%M:%S.</span><span class="si">%f</span><span class="s2"> %Y&quot;</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">dt</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">rest</span><span class="p">,</span> <span class="s2">&quot;</span><span class="si">%d</span><span class="s2"> %H:%M:%S %Y&quot;</span><span class="p">)</span>
+ <span class="n">dt</span> <span class="o">=</span> <span class="n">dt</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">month</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_ssl_months</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">month</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">timezone</span><span class="p">:</span>
+ <span class="n">dt</span> <span class="o">=</span> <span class="n">dt</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">tzinfo</span><span class="o">=</span><span class="n">UTC</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">dt</span>
+</div>
+<div class="viewcode-block" id="ASN1_TIME.set_datetime"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ASN1.ASN1_TIME.set_datetime">[docs]</a> <span class="k">def</span> <span class="nf">set_datetime</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">date</span><span class="p">):</span>
+ <span class="c1"># type: (datetime.datetime) -&gt; ASN1_TIME</span>
+ <span class="n">local</span> <span class="o">=</span> <span class="n">LocalTimezone</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">date</span><span class="o">.</span><span class="n">tzinfo</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">date</span> <span class="o">=</span> <span class="n">date</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="n">tzinfo</span><span class="o">=</span><span class="n">local</span><span class="p">)</span>
+ <span class="n">date</span> <span class="o">=</span> <span class="n">date</span><span class="o">.</span><span class="n">astimezone</span><span class="p">(</span><span class="n">local</span><span class="p">)</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">set_time</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">mktime</span><span class="p">(</span><span class="n">date</span><span class="o">.</span><span class="n">timetuple</span><span class="p">())))</span>
+</div></div>
+<span class="n">ASN1_UTCTIME</span> <span class="o">=</span> <span class="n">ASN1_TIME</span>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/AuthCookie.html b/doc/html/_modules/M2Crypto/AuthCookie.html
new file mode 100644
index 0000000..a35c736
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/AuthCookie.html
@@ -0,0 +1,263 @@
+
+
+<!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>M2Crypto.AuthCookie &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../index.html" />
+ <link rel="up" title="Module code" href="../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.AuthCookie</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+
+<span class="sd">&quot;&quot;&quot;Secure Authenticator Cookies</span>
+
+<span class="sd">Copyright (c) 1999-2002 Ng Pheng Siong. All rights reserved.&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">logging</span>
+<span class="kn">import</span> <span class="nn">re</span>
+<span class="kn">import</span> <span class="nn">time</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">Rand</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span><span class="p">,</span> <span class="n">six</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.six.moves.http_cookies</span> <span class="kn">import</span> <span class="n">SimpleCookie</span> <span class="c1"># pylint: disable=no-name-in-module,import-error</span>
+
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">re</span> <span class="k">as</span> <span class="n">type_re</span><span class="p">,</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Union</span> <span class="c1"># noqa</span>
+
+<span class="n">_MIX_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;exp=</span><span class="si">%f</span><span class="s1">&amp;data=</span><span class="si">%s</span><span class="s1">&amp;digest=&#39;</span>
+<span class="n">_MIX_RE</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">r&#39;exp=(\d+\.\d+)&amp;data=(.+)&amp;digest=(\S*)&#39;</span><span class="p">)</span>
+
+<span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="mix"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.AuthCookie.mix">[docs]</a><span class="k">def</span> <span class="nf">mix</span><span class="p">(</span><span class="n">expiry</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="n">_MIX_FORMAT</span><span class="p">):</span>
+ <span class="c1"># type: (float, AnyStr, str) -&gt; AnyStr</span>
+ <span class="k">return</span> <span class="n">format</span> <span class="o">%</span> <span class="p">(</span><span class="n">expiry</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="unmix"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.AuthCookie.unmix">[docs]</a><span class="k">def</span> <span class="nf">unmix</span><span class="p">(</span><span class="n">dough</span><span class="p">,</span> <span class="n">regex</span><span class="o">=</span><span class="n">_MIX_RE</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, type_re) -&gt; object</span>
+ <span class="n">mo</span> <span class="o">=</span> <span class="n">regex</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">dough</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">mo</span><span class="p">:</span>
+ <span class="k">return</span> <span class="nb">float</span><span class="p">(</span><span class="n">mo</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)),</span> <span class="n">mo</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">None</span>
+
+</div>
+<div class="viewcode-block" id="unmix3"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.AuthCookie.unmix3">[docs]</a><span class="k">def</span> <span class="nf">unmix3</span><span class="p">(</span><span class="n">dough</span><span class="p">,</span> <span class="n">regex</span><span class="o">=</span><span class="n">_MIX_RE</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, type_re) -&gt; Optional[tuple[float, AnyStr, AnyStr]]</span>
+ <span class="n">mo</span> <span class="o">=</span> <span class="n">regex</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">dough</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">mo</span><span class="p">:</span>
+ <span class="k">return</span> <span class="nb">float</span><span class="p">(</span><span class="n">mo</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)),</span> <span class="n">mo</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">2</span><span class="p">),</span> <span class="n">mo</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">None</span>
+
+</div>
+<span class="n">_TOKEN</span> <span class="o">=</span> <span class="s1">&#39;_M2AUTH_&#39;</span> <span class="c1"># type: str</span>
+
+
+<div class="viewcode-block" id="AuthCookieJar"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.AuthCookie.AuthCookieJar">[docs]</a><span class="k">class</span> <span class="nc">AuthCookieJar</span><span class="p">:</span>
+
+ <span class="n">_keylen</span> <span class="o">=</span> <span class="mi">20</span> <span class="c1"># type: int</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_key</span> <span class="o">=</span> <span class="n">Rand</span><span class="o">.</span><span class="n">rand_bytes</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_keylen</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">_hmac</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, str) -&gt; str</span>
+ <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">bin_to_hex</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">hmac</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">util</span><span class="o">.</span><span class="n">py3bytes</span><span class="p">(</span><span class="n">data</span><span class="p">),</span> <span class="n">m2</span><span class="o">.</span><span class="n">sha1</span><span class="p">()))</span>
+
+<div class="viewcode-block" id="AuthCookieJar.makeCookie"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.AuthCookie.AuthCookieJar.makeCookie">[docs]</a> <span class="k">def</span> <span class="nf">makeCookie</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expiry</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="c1"># type: (float, str) -&gt; AuthCookie</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Make a cookie</span>
+
+<span class="sd"> :param expiry: expiration time (float in seconds)</span>
+<span class="sd"> :param data: cookie content</span>
+<span class="sd"> :return: AuthCookie object</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">expiry</span><span class="p">,</span> <span class="p">(</span><span class="n">six</span><span class="o">.</span><span class="n">integer_types</span><span class="p">,</span> <span class="nb">float</span><span class="p">)):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Expiration time must be number, not &quot;</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">expiry</span><span class="p">)</span>
+ <span class="n">dough</span> <span class="o">=</span> <span class="n">mix</span><span class="p">(</span><span class="n">expiry</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">AuthCookie</span><span class="p">(</span><span class="n">expiry</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">dough</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_hmac</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_key</span><span class="p">,</span> <span class="n">dough</span><span class="p">))</span>
+</div>
+<div class="viewcode-block" id="AuthCookieJar.isGoodCookie"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.AuthCookie.AuthCookieJar.isGoodCookie">[docs]</a> <span class="k">def</span> <span class="nf">isGoodCookie</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cookie</span><span class="p">):</span>
+ <span class="c1"># type: (AuthCookie) -&gt; Union[bool, int]</span>
+ <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">cookie</span><span class="p">,</span> <span class="n">AuthCookie</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">cookie</span><span class="o">.</span><span class="n">isExpired</span><span class="p">():</span>
+ <span class="k">return</span> <span class="mi">0</span>
+ <span class="n">c</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">makeCookie</span><span class="p">(</span><span class="n">cookie</span><span class="o">.</span><span class="n">_expiry</span><span class="p">,</span> <span class="n">cookie</span><span class="o">.</span><span class="n">_data</span><span class="p">)</span>
+ <span class="k">return</span> <span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">_expiry</span> <span class="o">==</span> <span class="n">cookie</span><span class="o">.</span><span class="n">_expiry</span><span class="p">)</span> \
+ <span class="ow">and</span> <span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">_data</span> <span class="o">==</span> <span class="n">cookie</span><span class="o">.</span><span class="n">_data</span><span class="p">)</span> \
+ <span class="ow">and</span> <span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">_mac</span> <span class="o">==</span> <span class="n">cookie</span><span class="o">.</span><span class="n">_mac</span><span class="p">)</span> \
+ <span class="ow">and</span> <span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">output</span><span class="p">()</span> <span class="o">==</span> <span class="n">cookie</span><span class="o">.</span><span class="n">output</span><span class="p">())</span>
+</div>
+<div class="viewcode-block" id="AuthCookieJar.isGoodCookieString"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.AuthCookie.AuthCookieJar.isGoodCookieString">[docs]</a> <span class="k">def</span> <span class="nf">isGoodCookieString</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cookie_str</span><span class="p">,</span> <span class="n">_debug</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
+ <span class="c1"># type: (Union[dict, bytes], bool) -&gt; Union[bool, int]</span>
+ <span class="n">c</span> <span class="o">=</span> <span class="n">SimpleCookie</span><span class="p">()</span>
+ <span class="n">c</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">cookie_str</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">_TOKEN</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">c</span><span class="p">:</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s1">&#39;_TOKEN not in c (keys = </span><span class="si">%s</span><span class="s1">)&#39;</span><span class="p">,</span> <span class="nb">dir</span><span class="p">(</span><span class="n">c</span><span class="p">))</span>
+ <span class="k">return</span> <span class="mi">0</span>
+ <span class="n">undough</span> <span class="o">=</span> <span class="n">unmix3</span><span class="p">(</span><span class="n">c</span><span class="p">[</span><span class="n">_TOKEN</span><span class="p">]</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">undough</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s1">&#39;undough is None&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="mi">0</span>
+ <span class="n">exp</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">mac</span> <span class="o">=</span> <span class="n">undough</span>
+ <span class="n">c2</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">makeCookie</span><span class="p">(</span><span class="n">exp</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">_debug</span> <span class="ow">and</span> <span class="p">(</span><span class="n">c2</span><span class="o">.</span><span class="n">_mac</span> <span class="o">==</span> <span class="n">mac</span><span class="p">):</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s1">&#39;cookie_str = </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">cookie_str</span><span class="p">)</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s1">&#39;c2.isExpired = </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">c2</span><span class="o">.</span><span class="n">isExpired</span><span class="p">())</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s1">&#39;mac = </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">mac</span><span class="p">)</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s1">&#39;c2._mac = </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">c2</span><span class="o">.</span><span class="n">_mac</span><span class="p">)</span>
+ <span class="n">log</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s1">&#39;c2._mac == mac: </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">c2</span><span class="o">.</span><span class="n">_mac</span> <span class="o">==</span> <span class="n">mac</span><span class="p">))</span>
+ <span class="k">return</span> <span class="p">(</span><span class="ow">not</span> <span class="n">c2</span><span class="o">.</span><span class="n">isExpired</span><span class="p">())</span> <span class="ow">and</span> <span class="p">(</span><span class="n">c2</span><span class="o">.</span><span class="n">_mac</span> <span class="o">==</span> <span class="n">mac</span><span class="p">)</span>
+
+</div></div>
+<div class="viewcode-block" id="AuthCookie"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.AuthCookie.AuthCookie">[docs]</a><span class="k">class</span> <span class="nc">AuthCookie</span><span class="p">:</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expiry</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">dough</span><span class="p">,</span> <span class="n">mac</span><span class="p">):</span>
+ <span class="c1"># type: (float, str, str, str) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Create new authentication cookie</span>
+
+<span class="sd"> :param expiry: expiration time (in seconds)</span>
+<span class="sd"> :param data: cookie payload (as a string)</span>
+<span class="sd"> :param dough: expiry &amp; data concatenated to URL compliant</span>
+<span class="sd"> string</span>
+<span class="sd"> :param mac: SHA1-based HMAC of dough and random key</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_expiry</span> <span class="o">=</span> <span class="n">expiry</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_data</span> <span class="o">=</span> <span class="n">data</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_mac</span> <span class="o">=</span> <span class="n">mac</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_cookie</span> <span class="o">=</span> <span class="n">SimpleCookie</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_cookie</span><span class="p">[</span><span class="n">_TOKEN</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%s%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">dough</span><span class="p">,</span> <span class="n">mac</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_name</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%s%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">dough</span><span class="p">,</span> <span class="n">mac</span><span class="p">)</span> <span class="c1"># WebKit only.</span>
+
+<div class="viewcode-block" id="AuthCookie.expiry"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.AuthCookie.AuthCookie.expiry">[docs]</a> <span class="k">def</span> <span class="nf">expiry</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; float</span>
+ <span class="sd">&quot;&quot;&quot;Return the cookie&#39;s expiry time.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_expiry</span>
+</div>
+<div class="viewcode-block" id="AuthCookie.data"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.AuthCookie.AuthCookie.data">[docs]</a> <span class="k">def</span> <span class="nf">data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; str</span>
+ <span class="sd">&quot;&quot;&quot;Return the data portion of the cookie.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_data</span>
+</div>
+<div class="viewcode-block" id="AuthCookie.mac"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.AuthCookie.AuthCookie.mac">[docs]</a> <span class="k">def</span> <span class="nf">mac</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; str</span>
+ <span class="sd">&quot;&quot;&quot;Return the cookie&#39;s MAC.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mac</span>
+</div>
+<div class="viewcode-block" id="AuthCookie.output"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.AuthCookie.AuthCookie.output">[docs]</a> <span class="k">def</span> <span class="nf">output</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; str</span>
+ <span class="sd">&quot;&quot;&quot;Return the cookie&#39;s output in &quot;Set-Cookie&quot; format.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cookie</span><span class="o">.</span><span class="n">output</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="AuthCookie.value"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.AuthCookie.AuthCookie.value">[docs]</a> <span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; str</span>
+ <span class="sd">&quot;&quot;&quot;Return the cookie&#39;s output minus the &quot;Set-Cookie: &quot; portion.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cookie</span><span class="p">[</span><span class="n">_TOKEN</span><span class="p">]</span><span class="o">.</span><span class="n">value</span>
+</div>
+<div class="viewcode-block" id="AuthCookie.isExpired"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.AuthCookie.AuthCookie.isExpired">[docs]</a> <span class="k">def</span> <span class="nf">isExpired</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bool</span>
+ <span class="sd">&quot;&quot;&quot;Return 1 if the cookie has expired, 0 otherwise.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_expiry</span><span class="p">,</span> <span class="p">(</span><span class="nb">float</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">integer_types</span><span class="p">))</span> <span class="ow">and</span> \
+ <span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">&gt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">_expiry</span><span class="p">)</span>
+
+ <span class="c1"># Following two methods are for WebKit only.</span>
+ <span class="c1"># I may wish to push them to WKAuthCookie, but they are part</span>
+ <span class="c1"># of the API now. Oh well.</span></div>
+<div class="viewcode-block" id="AuthCookie.name"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.AuthCookie.AuthCookie.name">[docs]</a> <span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; str</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_name</span>
+</div>
+<div class="viewcode-block" id="AuthCookie.headerValue"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.AuthCookie.AuthCookie.headerValue">[docs]</a> <span class="k">def</span> <span class="nf">headerValue</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; str</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">()</span></div></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/BIO.html b/doc/html/_modules/M2Crypto/BIO.html
new file mode 100644
index 0000000..753291c
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/BIO.html
@@ -0,0 +1,472 @@
+
+
+<!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>M2Crypto.BIO &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../index.html" />
+ <link rel="up" title="Module code" href="../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.BIO</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+
+<span class="sd">&quot;&quot;&quot;M2Crypto wrapper for OpenSSL BIO API.</span>
+
+<span class="sd">Copyright (c) 1999-2004 Ng Pheng Siong. All rights reserved.&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">logging</span>
+<span class="kn">import</span> <span class="nn">io</span> <span class="c1"># noqa</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">m2</span><span class="p">,</span> <span class="n">six</span><span class="p">,</span> <span class="n">util</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Callable</span><span class="p">,</span> <span class="n">Iterable</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Union</span> <span class="c1"># noqa</span>
+
+<span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s1">&#39;BIO&#39;</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="BIOError"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.BIOError">[docs]</a><span class="k">class</span> <span class="nc">BIOError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
+ <span class="k">pass</span>
+</div>
+<span class="n">m2</span><span class="o">.</span><span class="n">bio_init</span><span class="p">(</span><span class="n">BIOError</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="BIO"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.BIO">[docs]</a><span class="k">class</span> <span class="nc">BIO</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+
+ <span class="sd">&quot;&quot;&quot;Abstract object interface to the BIO API.&quot;&quot;&quot;</span>
+
+ <span class="n">m2_bio_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bio</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">_close_cb</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[BIO], int, Optional[Callable]) -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">bio</span> <span class="o">=</span> <span class="n">bio</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="n">_pyfree</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_close_cb</span> <span class="o">=</span> <span class="n">_close_cb</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">closed</span> <span class="o">=</span> <span class="mi">0</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">write_closed</span> <span class="o">=</span> <span class="mi">0</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_bio_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">_ptr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">bio</span>
+
+ <span class="c1"># Deprecated.</span>
+ <span class="n">bio_ptr</span> <span class="o">=</span> <span class="n">_ptr</span>
+
+<div class="viewcode-block" id="BIO.fileno"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.BIO.fileno">[docs]</a> <span class="k">def</span> <span class="nf">fileno</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_get_fd</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="BIO.readable"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.BIO.readable">[docs]</a> <span class="k">def</span> <span class="nf">readable</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bool</span>
+ <span class="k">return</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">closed</span>
+</div>
+<div class="viewcode-block" id="BIO.read"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.BIO.read">[docs]</a> <span class="k">def</span> <span class="nf">read</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; Union[bytes, bytearray]</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">readable</span><span class="p">():</span>
+ <span class="k">raise</span> <span class="ne">IOError</span><span class="p">(</span><span class="s1">&#39;cannot read&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">size</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">buf</span> <span class="o">=</span> <span class="nb">bytearray</span><span class="p">()</span>
+ <span class="k">while</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_read</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">,</span> <span class="mi">4096</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">data</span><span class="p">:</span>
+ <span class="k">break</span>
+ <span class="n">buf</span> <span class="o">+=</span> <span class="n">data</span>
+ <span class="k">return</span> <span class="n">buf</span>
+ <span class="k">elif</span> <span class="n">size</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">b</span><span class="s1">&#39;&#39;</span>
+ <span class="k">elif</span> <span class="n">size</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;read count is negative&#39;</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="nb">bytes</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">bio_read</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">,</span> <span class="n">size</span><span class="p">))</span>
+</div>
+<div class="viewcode-block" id="BIO.readline"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.BIO.readline">[docs]</a> <span class="k">def</span> <span class="nf">readline</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="mi">4096</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; bytes</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">readable</span><span class="p">():</span>
+ <span class="k">raise</span> <span class="ne">IOError</span><span class="p">(</span><span class="s1">&#39;cannot read&#39;</span><span class="p">)</span>
+ <span class="n">buf</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_gets</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">buf</span>
+</div>
+<div class="viewcode-block" id="BIO.readlines"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.BIO.readlines">[docs]</a> <span class="k">def</span> <span class="nf">readlines</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sizehint</span><span class="o">=</span><span class="s1">&#39;ignored&#39;</span><span class="p">):</span>
+ <span class="c1"># type: (Union[AnyStr, int]) -&gt; Iterable[bytes]</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">readable</span><span class="p">():</span>
+ <span class="k">raise</span> <span class="ne">IOError</span><span class="p">(</span><span class="s1">&#39;cannot read&#39;</span><span class="p">)</span>
+ <span class="n">lines</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="k">while</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="n">buf</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_gets</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">,</span> <span class="mi">4096</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">buf</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">break</span>
+ <span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">lines</span>
+</div>
+<div class="viewcode-block" id="BIO.writeable"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.BIO.writeable">[docs]</a> <span class="k">def</span> <span class="nf">writeable</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bool</span>
+ <span class="k">return</span> <span class="p">(</span><span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">closed</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">write_closed</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="BIO.write"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.BIO.write">[docs]</a> <span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+
+<span class="sd"> :return: either data written, or [0, -1] for nothing written,</span>
+<span class="sd"> -2 not implemented</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">writeable</span><span class="p">():</span>
+ <span class="k">raise</span> <span class="ne">IOError</span><span class="p">(</span><span class="s1">&#39;cannot write&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">text_type</span><span class="p">):</span>
+ <span class="n">data</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;utf8&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="BIO.write_close"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.BIO.write_close">[docs]</a> <span class="k">def</span> <span class="nf">write_close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">write_closed</span> <span class="o">=</span> <span class="mi">1</span>
+</div>
+<div class="viewcode-block" id="BIO.flush"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.BIO.flush">[docs]</a> <span class="k">def</span> <span class="nf">flush</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+
+<span class="sd"> :return: 1 for success, and 0 or -1 for failure</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">bio_flush</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="BIO.reset"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.BIO.reset">[docs]</a> <span class="k">def</span> <span class="nf">reset</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Sets the bio to its initial state</span>
+<span class="sd"> :return: 1 for success, and 0 or -1 for failure</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_reset</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="BIO.close"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.BIO.close">[docs]</a> <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">closed</span> <span class="o">=</span> <span class="mi">1</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_close_cb</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_close_cb</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="BIO.should_retry"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.BIO.should_retry">[docs]</a> <span class="k">def</span> <span class="nf">should_retry</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Can the call be attempted again, or was there an error</span>
+<span class="sd"> ie do_handshake</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_should_retry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="BIO.should_read"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.BIO.should_read">[docs]</a> <span class="k">def</span> <span class="nf">should_read</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Returns whether the cause of the condition is the bio</span>
+<span class="sd"> should read more data</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_should_read</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="BIO.should_write"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.BIO.should_write">[docs]</a> <span class="k">def</span> <span class="nf">should_write</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Returns whether the cause of the condition is the bio</span>
+<span class="sd"> should write more data</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_should_write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="BIO.tell"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.BIO.tell">[docs]</a> <span class="k">def</span> <span class="nf">tell</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Return the current offset.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_tell</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="BIO.seek"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.BIO.seek">[docs]</a> <span class="k">def</span> <span class="nf">seek</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">off</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Seek to the specified absolute offset.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_seek</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">,</span> <span class="n">off</span><span class="p">)</span>
+</div>
+ <span class="k">def</span> <span class="nf">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span>
+
+ <span class="k">def</span> <span class="nf">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+
+</div>
+<div class="viewcode-block" id="MemoryBuffer"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.MemoryBuffer">[docs]</a><span class="k">class</span> <span class="nc">MemoryBuffer</span><span class="p">(</span><span class="n">BIO</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Object interface to BIO_s_mem.</span>
+
+<span class="sd"> Empirical testing suggests that this class performs less well than</span>
+<span class="sd"> cStringIO, because cStringIO is implemented in C, whereas this class</span>
+<span class="sd"> is implemented in Python. Thus, the recommended practice is to use</span>
+<span class="sd"> cStringIO for regular work and convert said cStringIO object to</span>
+<span class="sd"> a MemoryBuffer object only when necessary.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[bytes]) -&gt; None</span>
+ <span class="k">if</span> <span class="n">data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span>
+ <span class="s2">&quot;data must be bytes or None, not </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">data</span><span class="p">)</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span> <span class="p">))</span>
+ <span class="n">BIO</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">bio</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_new</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">bio_s_mem</span><span class="p">())</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="mi">1</span>
+ <span class="k">if</span> <span class="n">data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">bio_write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_ctrl_pending</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">)</span>
+
+<div class="viewcode-block" id="MemoryBuffer.read"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.MemoryBuffer.read">[docs]</a> <span class="k">def</span> <span class="nf">read</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; bytes</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">readable</span><span class="p">():</span>
+ <span class="k">raise</span> <span class="ne">IOError</span><span class="p">(</span><span class="s1">&#39;cannot read&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">size</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_read</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_read</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">,</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_ctrl_pending</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">))</span>
+
+ <span class="c1"># Backwards-compatibility.</span></div>
+ <span class="n">getvalue</span> <span class="o">=</span> <span class="n">read_all</span> <span class="o">=</span> <span class="n">read</span>
+
+<div class="viewcode-block" id="MemoryBuffer.write_close"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.MemoryBuffer.write_close">[docs]</a> <span class="k">def</span> <span class="nf">write_close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">write_closed</span> <span class="o">=</span> <span class="mi">1</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">bio_set_mem_eof_return</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
+</div>
+ <span class="n">close</span> <span class="o">=</span> <span class="n">write_close</span>
+
+</div>
+<div class="viewcode-block" id="File"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.File">[docs]</a><span class="k">class</span> <span class="nc">File</span><span class="p">(</span><span class="n">BIO</span><span class="p">):</span>
+
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Object interface to BIO_s_pyfd</span>
+
+<span class="sd"> This class interfaces Python to OpenSSL functions that expect BIO \*. For</span>
+<span class="sd"> general file manipulation in Python, use Python&#39;s builtin file object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pyfile</span><span class="p">,</span> <span class="n">close_pyfile</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
+ <span class="c1"># type: (io.BytesIO, int) -&gt; None</span>
+ <span class="n">BIO</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">pyfile</span> <span class="o">=</span> <span class="n">pyfile</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">close_pyfile</span> <span class="o">=</span> <span class="n">close_pyfile</span>
+ <span class="c1"># Be wary of https://github.com/openssl/openssl/pull/1925</span>
+ <span class="c1"># BIO_new_fd is NEVER to be used before OpenSSL 1.1.1</span>
+ <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">m2</span><span class="p">,</span> <span class="s2">&quot;bio_new_pyfd&quot;</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">bio</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_new_pyfd</span><span class="p">(</span><span class="n">pyfile</span><span class="o">.</span><span class="n">fileno</span><span class="p">(),</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_noclose</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">bio</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_new_pyfile</span><span class="p">(</span><span class="n">pyfile</span><span class="p">,</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_noclose</span><span class="p">)</span>
+
+<div class="viewcode-block" id="File.close"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.File.close">[docs]</a> <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">closed</span> <span class="o">=</span> <span class="mi">1</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">close_pyfile</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">pyfile</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="File.reset"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.File.reset">[docs]</a> <span class="k">def</span> <span class="nf">reset</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Sets the bio to its initial state</span>
+<span class="sd"> :return: 0 for success, and -1 for failure</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">File</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
+
+</div></div>
+<div class="viewcode-block" id="openfile"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.openfile">[docs]</a><span class="k">def</span> <span class="nf">openfile</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s1">&#39;rb&#39;</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, AnyStr) -&gt; File</span>
+ <span class="k">return</span> <span class="n">File</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">mode</span><span class="p">))</span>
+
+</div>
+<div class="viewcode-block" id="IOBuffer"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.IOBuffer">[docs]</a><span class="k">class</span> <span class="nc">IOBuffer</span><span class="p">(</span><span class="n">BIO</span><span class="p">):</span>
+
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Object interface to BIO_f_buffer.</span>
+
+<span class="sd"> Its principal function is to be BIO_push()&#39;ed on top of a BIO_f_ssl, so</span>
+<span class="sd"> that makefile() of said underlying SSL socket works.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">m2_bio_pop</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_pop</span>
+ <span class="n">m2_bio_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">under_bio</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s1">&#39;rwb&#39;</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
+ <span class="c1"># type: (BIO, str, int) -&gt; None</span>
+ <span class="n">BIO</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="n">_pyfree</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">io</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_new</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">bio_f_buffer</span><span class="p">())</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">bio</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_push</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">io</span><span class="p">,</span> <span class="n">under_bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+ <span class="c1"># This reference keeps the underlying BIO alive while we&#39;re not closed.</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_under_bio</span> <span class="o">=</span> <span class="n">under_bio</span>
+ <span class="k">if</span> <span class="s1">&#39;w&#39;</span> <span class="ow">in</span> <span class="n">mode</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">write_closed</span> <span class="o">=</span> <span class="mi">0</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">write_closed</span> <span class="o">=</span> <span class="mi">1</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_pyfree&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_bio_pop</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_bio_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">io</span><span class="p">)</span>
+
+<div class="viewcode-block" id="IOBuffer.close"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.IOBuffer.close">[docs]</a> <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="n">BIO</span><span class="o">.</span><span class="n">close</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+
+</div></div>
+<div class="viewcode-block" id="CipherStream"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.CipherStream">[docs]</a><span class="k">class</span> <span class="nc">CipherStream</span><span class="p">(</span><span class="n">BIO</span><span class="p">):</span>
+
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Object interface to BIO_f_cipher.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">SALT_LEN</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">PKCS5_SALT_LEN</span>
+
+ <span class="n">m2_bio_pop</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_pop</span>
+ <span class="n">m2_bio_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obio</span><span class="p">):</span>
+ <span class="c1"># type: (BIO) -&gt; None</span>
+ <span class="n">BIO</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">obio</span> <span class="o">=</span> <span class="n">obio</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">bio</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_new</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">bio_f_cipher</span><span class="p">())</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">closed</span> <span class="o">=</span> <span class="mi">0</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;closed&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+
+<div class="viewcode-block" id="CipherStream.close"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.CipherStream.close">[docs]</a> <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_bio_pop</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_bio_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">closed</span> <span class="o">=</span> <span class="mi">1</span>
+</div>
+<div class="viewcode-block" id="CipherStream.write_close"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.CipherStream.write_close">[docs]</a> <span class="k">def</span> <span class="nf">write_close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">obio</span><span class="o">.</span><span class="n">write_close</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="CipherStream.set_cipher"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.CipherStream.set_cipher">[docs]</a> <span class="k">def</span> <span class="nf">set_cipher</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">algo</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">iv</span><span class="p">,</span> <span class="n">op</span><span class="p">):</span>
+ <span class="c1"># type: (str, AnyStr, AnyStr, int) -&gt; None</span>
+ <span class="n">cipher</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">m2</span><span class="p">,</span> <span class="n">algo</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">cipher</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown cipher&#39;</span><span class="p">,</span> <span class="n">algo</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">):</span>
+ <span class="n">key</span> <span class="o">=</span> <span class="n">key</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;utf8&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">iv</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">):</span>
+ <span class="n">iv</span> <span class="o">=</span> <span class="n">iv</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;utf8&#39;</span><span class="p">)</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">bio_set_cipher</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">,</span> <span class="n">cipher</span><span class="p">(),</span> <span class="n">key</span><span class="p">,</span> <span class="n">iv</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">op</span><span class="p">))</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">bio_push</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">obio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+
+</div></div>
+<div class="viewcode-block" id="SSLBio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.SSLBio">[docs]</a><span class="k">class</span> <span class="nc">SSLBio</span><span class="p">(</span><span class="n">BIO</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Object interface to BIO_f_ssl</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; None</span>
+ <span class="n">BIO</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="n">_pyfree</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">bio</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_new</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">bio_f_ssl</span><span class="p">())</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">closed</span> <span class="o">=</span> <span class="mi">0</span>
+
+<div class="viewcode-block" id="SSLBio.set_ssl"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.SSLBio.set_ssl">[docs]</a> <span class="k">def</span> <span class="nf">set_ssl</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">conn</span><span class="p">,</span> <span class="n">close_flag</span><span class="o">=</span><span class="n">m2</span><span class="o">.</span><span class="n">bio_noclose</span><span class="p">):</span>
+ <span class="c1"># type: (Connection, int) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Sets the bio to the SSL pointer which is</span>
+<span class="sd"> contained in the connection object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="mi">0</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">bio_set_ssl</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">,</span> <span class="n">conn</span><span class="o">.</span><span class="n">ssl</span><span class="p">,</span> <span class="n">close_flag</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">close_flag</span> <span class="o">==</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_noclose</span><span class="p">:</span>
+ <span class="n">conn</span><span class="o">.</span><span class="n">set_ssl_close_flag</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">bio_close</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="SSLBio.do_handshake"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BIO.SSLBio.do_handshake">[docs]</a> <span class="k">def</span> <span class="nf">do_handshake</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Do the handshake.</span>
+
+<span class="sd"> Return 1 if the handshake completes</span>
+<span class="sd"> Return 0 or a negative number if there is a problem</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_do_handshake</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">)</span></div></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/BN.html b/doc/html/_modules/M2Crypto/BN.html
new file mode 100644
index 0000000..139fb19
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/BN.html
@@ -0,0 +1,152 @@
+
+
+<!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>M2Crypto.BN &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../index.html" />
+ <link rel="up" title="Module code" href="../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.BN</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">M2Crypto wrapper for OpenSSL BN (BIGNUM) API.</span>
+
+<span class="sd">Copyright (c) 2005 Open Source Applications Foundation. All rights reserved.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Optional</span> <span class="c1"># noqa</span>
+
+
+<div class="viewcode-block" id="rand"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BN.rand">[docs]</a><span class="k">def</span> <span class="nf">rand</span><span class="p">(</span><span class="n">bits</span><span class="p">,</span> <span class="n">top</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span> <span class="n">bottom</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (int, int, int) -&gt; Optional[int]</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Generate cryptographically strong random number.</span>
+
+<span class="sd"> :param bits: Length of random number in bits.</span>
+<span class="sd"> :param top: If -1, the most significant bit can be 0. If 0, the most</span>
+<span class="sd"> significant bit is 1, and if 1, the two most significant</span>
+<span class="sd"> bits will be 1.</span>
+<span class="sd"> :param bottom: If bottom is true, the number will be odd.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">bn_rand</span><span class="p">(</span><span class="n">bits</span><span class="p">,</span> <span class="n">top</span><span class="p">,</span> <span class="n">bottom</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="rand_range"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BN.rand_range">[docs]</a><span class="k">def</span> <span class="nf">rand_range</span><span class="p">(</span><span class="nb">range</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Generate a random number in a range.</span>
+
+<span class="sd"> :param range: Upper limit for range.</span>
+<span class="sd"> :return: A random number in the range [0, range)</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">bn_rand_range</span><span class="p">(</span><span class="nb">range</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="randfname"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.BN.randfname">[docs]</a><span class="k">def</span> <span class="nf">randfname</span><span class="p">(</span><span class="n">length</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; str</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Return a random filename, which is simply a string where all</span>
+<span class="sd"> the characters are from the set [a-zA-Z0-9].</span>
+
+<span class="sd"> :param length: Length of filename to return.</span>
+<span class="sd"> :return: random filename string</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="kn">import</span> <span class="nn">warnings</span>
+ <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
+ <span class="s2">&quot;Don&#39;t use BN.randfname(), use tempfile methods instead.&quot;</span><span class="p">,</span>
+ <span class="ne">DeprecationWarning</span><span class="p">,</span> <span class="n">stacklevel</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
+ <span class="n">letters</span> <span class="o">=</span> <span class="s1">&#39;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890&#39;</span>
+ <span class="n">lettersLen</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">letters</span><span class="p">)</span>
+ <span class="n">fname</span> <span class="o">=</span> <span class="p">[]</span> <span class="c1"># type: list</span>
+ <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">length</span><span class="p">):</span>
+ <span class="n">fname</span> <span class="o">+=</span> <span class="p">[</span><span class="n">letters</span><span class="p">[</span><span class="n">m2</span><span class="o">.</span><span class="n">bn_rand_range</span><span class="p">(</span><span class="n">lettersLen</span><span class="p">)]]</span>
+
+ <span class="k">return</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">fname</span><span class="p">)</span></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/DH.html b/doc/html/_modules/M2Crypto/DH.html
new file mode 100644
index 0000000..20e4120
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/DH.html
@@ -0,0 +1,209 @@
+
+
+<!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>M2Crypto.DH &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../index.html" />
+ <link rel="up" title="Module code" href="../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.DH</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+
+<span class="sd">&quot;&quot;&quot;M2Crypto wrapper for OpenSSL DH API.</span>
+
+<span class="sd">Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.util</span> <span class="kn">import</span> <span class="n">genparam_callback</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Callable</span> <span class="c1"># noqa</span>
+
+
+<div class="viewcode-block" id="DHError"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DH.DHError">[docs]</a><span class="k">class</span> <span class="nc">DHError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
+ <span class="k">pass</span>
+</div>
+<span class="n">m2</span><span class="o">.</span><span class="n">dh_init</span><span class="p">(</span><span class="n">DHError</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="DH"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DH.DH">[docs]</a><span class="k">class</span> <span class="nc">DH</span><span class="p">:</span>
+
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Object interface to the Diffie-Hellman key exchange</span>
+<span class="sd"> protocol.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">m2_dh_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">dh_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dh</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, int) -&gt; None</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">dh_type_check</span><span class="p">(</span><span class="n">dh</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">dh</span> <span class="o">=</span> <span class="n">dh</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="n">_pyfree</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_pyfree&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_dh_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dh</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">dh_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dh</span><span class="p">),</span> <span class="s2">&quot;&#39;dh&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">dh_size</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dh</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="c1"># type: (str) -&gt; bytes</span>
+ <span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;p&#39;</span><span class="p">,</span> <span class="s1">&#39;g&#39;</span><span class="p">,</span> <span class="s1">&#39;pub&#39;</span><span class="p">,</span> <span class="s1">&#39;priv&#39;</span><span class="p">):</span>
+ <span class="n">method</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">m2</span><span class="p">,</span> <span class="s1">&#39;dh_get_</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,))</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">dh_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dh</span><span class="p">),</span> <span class="s2">&quot;&#39;dh&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">method</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dh</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">AttributeError</span>
+
+ <span class="k">def</span> <span class="nf">__setattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="c1"># type: (str, bytes) -&gt; bytes</span>
+ <span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;p&#39;</span><span class="p">,</span> <span class="s1">&#39;g&#39;</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">DHError</span><span class="p">(</span><span class="s1">&#39;set (p, g) via set_params()&#39;</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="n">name</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;pub&#39;</span><span class="p">,</span> <span class="s1">&#39;priv&#39;</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">DHError</span><span class="p">(</span><span class="s1">&#39;generate (pub, priv) via gen_key()&#39;</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__dict__</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+
+ <span class="k">def</span> <span class="nf">_ptr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">dh</span>
+
+<div class="viewcode-block" id="DH.check_params"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DH.DH.check_params">[docs]</a> <span class="k">def</span> <span class="nf">check_params</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">dh_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dh</span><span class="p">),</span> <span class="s2">&quot;&#39;dh&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">dh_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dh</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="DH.gen_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DH.DH.gen_key">[docs]</a> <span class="k">def</span> <span class="nf">gen_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">dh_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dh</span><span class="p">),</span> <span class="s2">&quot;&#39;dh&#39; type error&quot;</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">dh_generate_key</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dh</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="DH.compute_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DH.DH.compute_key">[docs]</a> <span class="k">def</span> <span class="nf">compute_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pubkey</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; bytes</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">dh_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dh</span><span class="p">),</span> <span class="s2">&quot;&#39;dh&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">dh_compute_key</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dh</span><span class="p">,</span> <span class="n">pubkey</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="DH.print_params"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DH.DH.print_params">[docs]</a> <span class="k">def</span> <span class="nf">print_params</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bio</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO) -&gt; int</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">dh_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dh</span><span class="p">),</span> <span class="s2">&quot;&#39;dh&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">dhparams_print</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">dh</span><span class="p">)</span>
+
+</div></div>
+<div class="viewcode-block" id="gen_params"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DH.gen_params">[docs]</a><span class="k">def</span> <span class="nf">gen_params</span><span class="p">(</span><span class="n">plen</span><span class="p">,</span> <span class="n">g</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">genparam_callback</span><span class="p">):</span>
+ <span class="c1"># type: (int, int, Optional[Callable]) -&gt; DH</span>
+ <span class="n">dh_parms</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">dh_generate_parameters</span><span class="p">(</span><span class="n">plen</span><span class="p">,</span> <span class="n">g</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+ <span class="n">dh_obj</span> <span class="o">=</span> <span class="n">DH</span><span class="p">(</span><span class="n">dh_parms</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">dh_obj</span>
+
+</div>
+<div class="viewcode-block" id="load_params"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DH.load_params">[docs]</a><span class="k">def</span> <span class="nf">load_params</span><span class="p">(</span><span class="nb">file</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr) -&gt; DH</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="nb">file</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">load_params_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="load_params_bio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DH.load_params_bio">[docs]</a><span class="k">def</span> <span class="nf">load_params_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO) -&gt; DH</span>
+ <span class="k">return</span> <span class="n">DH</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">dh_read_parameters</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">()),</span> <span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="set_params"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DH.set_params">[docs]</a><span class="k">def</span> <span class="nf">set_params</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">g</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, bytes) -&gt; DH</span>
+ <span class="n">dh</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">dh_new</span><span class="p">()</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">dh_set_pg</span><span class="p">(</span><span class="n">dh</span><span class="p">,</span> <span class="n">p</span><span class="p">,</span> <span class="n">g</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">DH</span><span class="p">(</span><span class="n">dh</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+
+<span class="c1"># def free_params(cptr):</span>
+<span class="c1"># m2.dh_free(cptr)</span>
+
+</div>
+<span class="n">DH_GENERATOR_2</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">DH_GENERATOR_2</span>
+<span class="n">DH_GENERATOR_5</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">DH_GENERATOR_5</span>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/DSA.html b/doc/html/_modules/M2Crypto/DSA.html
new file mode 100644
index 0000000..680b32e
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/DSA.html
@@ -0,0 +1,550 @@
+
+
+<!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>M2Crypto.DSA &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../index.html" />
+ <link rel="up" title="Module code" href="../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.DSA</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span><span class="p">,</span> <span class="n">print_function</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> M2Crypto wrapper for OpenSSL DSA API.</span>
+
+<span class="sd"> Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.</span>
+
+<span class="sd"> Portions created by Open Source Applications Foundation (OSAF) are</span>
+<span class="sd"> Copyright (C) 2004 OSAF. All Rights Reserved.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Callable</span><span class="p">,</span> <span class="n">Tuple</span> <span class="c1"># noqa</span>
+
+
+<div class="viewcode-block" id="DSAError"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.DSAError">[docs]</a><span class="k">class</span> <span class="nc">DSAError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
+ <span class="k">pass</span>
+</div>
+<span class="n">m2</span><span class="o">.</span><span class="n">dsa_init</span><span class="p">(</span><span class="n">DSAError</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="DSA"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.DSA">[docs]</a><span class="k">class</span> <span class="nc">DSA</span><span class="p">:</span>
+
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> This class is a context supporting DSA key and parameter</span>
+<span class="sd"> values, signing and verifying.</span>
+
+<span class="sd"> Simple example::</span>
+
+<span class="sd"> from M2Crypto import EVP, DSA, util</span>
+
+<span class="sd"> message = &#39;Kilroy was here!&#39;</span>
+<span class="sd"> md = EVP.MessageDigest(&#39;sha1&#39;)</span>
+<span class="sd"> md.update(message)</span>
+<span class="sd"> digest = md.final()</span>
+
+<span class="sd"> dsa = DSA.gen_params(1024)</span>
+<span class="sd"> dsa.gen_key()</span>
+<span class="sd"> r, s = dsa.sign(digest)</span>
+<span class="sd"> good = dsa.verify(digest, r, s)</span>
+<span class="sd"> if good:</span>
+<span class="sd"> print(&#39; ** success **&#39;)</span>
+<span class="sd"> else:</span>
+<span class="sd"> print(&#39; ** verification failed **&#39;)</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">m2_dsa_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dsa</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, int) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Use one of the factory functions to create an instance.</span>
+<span class="sd"> :param dsa: binary representation of OpenSSL DSA type</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_type_check</span><span class="p">(</span><span class="n">dsa</span><span class="p">),</span> <span class="s2">&quot;&#39;dsa&#39; type error&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">dsa</span> <span class="o">=</span> <span class="n">dsa</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="n">_pyfree</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_pyfree&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_dsa_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dsa</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Return the key length.</span>
+
+<span class="sd"> :return: the DSA key length in bits</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dsa</span><span class="p">),</span> <span class="s2">&quot;&#39;dsa&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_keylen</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dsa</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="c1"># type: (str) -&gt; bytes</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Return specified DSA parameters and key values.</span>
+
+<span class="sd"> :param name: name of variable to be returned. Must be</span>
+<span class="sd"> one of &#39;p&#39;, &#39;q&#39;, &#39;g&#39;, &#39;pub&#39;, &#39;priv&#39;.</span>
+<span class="sd"> :return: value of specified variable (a &quot;byte string&quot;)</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">&#39;p&#39;</span><span class="p">,</span> <span class="s1">&#39;q&#39;</span><span class="p">,</span> <span class="s1">&#39;g&#39;</span><span class="p">,</span> <span class="s1">&#39;pub&#39;</span><span class="p">,</span> <span class="s1">&#39;priv&#39;</span><span class="p">]:</span>
+ <span class="n">method</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">m2</span><span class="p">,</span> <span class="s1">&#39;dsa_get_</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,))</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dsa</span><span class="p">),</span> <span class="s2">&quot;&#39;dsa&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">method</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dsa</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">AttributeError</span>
+
+ <span class="k">def</span> <span class="nf">__setattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="c1"># type: (str, bytes) -&gt; None</span>
+ <span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">&#39;p&#39;</span><span class="p">,</span> <span class="s1">&#39;q&#39;</span><span class="p">,</span> <span class="s1">&#39;g&#39;</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="n">DSAError</span><span class="p">(</span><span class="s1">&#39;set (p, q, g) via set_params()&#39;</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="n">name</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">&#39;pub&#39;</span><span class="p">,</span> <span class="s1">&#39;priv&#39;</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="n">DSAError</span><span class="p">(</span><span class="s1">&#39;generate (pub, priv) via gen_key()&#39;</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__dict__</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+
+<div class="viewcode-block" id="DSA.set_params"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.DSA.set_params">[docs]</a> <span class="k">def</span> <span class="nf">set_params</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">p</span><span class="p">,</span> <span class="n">q</span><span class="p">,</span> <span class="n">g</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, bytes, bytes) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Set new parameters.</span>
+
+<span class="sd"> :param p: MPI binary representation ... format that consists of</span>
+<span class="sd"> the number&#39;s length in bytes represented as a 4-byte</span>
+<span class="sd"> big-endian number, and the number itself in big-endian</span>
+<span class="sd"> format, where the most significant bit signals</span>
+<span class="sd"> a negative number (the representation of numbers with</span>
+<span class="sd"> the MSB set is prefixed with null byte).</span>
+<span class="sd"> :param q: ditto</span>
+<span class="sd"> :param g: ditto</span>
+
+<span class="sd"> @warning: This does not change the private key, so it may be</span>
+<span class="sd"> unsafe to use this method. It is better to use</span>
+<span class="sd"> gen_params function to create a new DSA object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">dsa_set_pqg</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dsa</span><span class="p">,</span> <span class="n">p</span><span class="p">,</span> <span class="n">q</span><span class="p">,</span> <span class="n">g</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="DSA.gen_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.DSA.gen_key">[docs]</a> <span class="k">def</span> <span class="nf">gen_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Generate a key pair.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dsa</span><span class="p">),</span> <span class="s2">&quot;&#39;dsa&#39; type error&quot;</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">dsa_gen_key</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dsa</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="DSA.save_params"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.DSA.save_params">[docs]</a> <span class="k">def</span> <span class="nf">save_params</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Save the DSA parameters to a file.</span>
+
+<span class="sd"> :param filename: Save the DSA parameters to this file.</span>
+<span class="sd"> :return: 1 (true) if successful</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="n">ret</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_write_params_bio</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dsa</span><span class="p">,</span> <span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+
+ <span class="k">return</span> <span class="n">ret</span>
+</div>
+<div class="viewcode-block" id="DSA.save_params_bio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.DSA.save_params_bio">[docs]</a> <span class="k">def</span> <span class="nf">save_params_bio</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bio</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Save DSA parameters to a BIO object.</span>
+
+<span class="sd"> :param bio: Save DSA parameters to this object.</span>
+<span class="sd"> :return: 1 (true) if successful</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_write_params_bio</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dsa</span><span class="p">,</span> <span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+</div>
+<div class="viewcode-block" id="DSA.save_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.DSA.save_key">[docs]</a> <span class="k">def</span> <span class="nf">save_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">cipher</span><span class="o">=</span><span class="s1">&#39;aes_128_cbc&#39;</span><span class="p">,</span>
+ <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, str, Callable) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Save the DSA key pair to a file.</span>
+
+<span class="sd"> :param filename: Save the DSA key pair to this file.</span>
+<span class="sd"> :param cipher: name of symmetric key algorithm and mode</span>
+<span class="sd"> to encrypt the private key.</span>
+<span class="sd"> :return: 1 (true) if successful</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="n">ret</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">save_key_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">cipher</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">ret</span>
+</div>
+<div class="viewcode-block" id="DSA.save_key_bio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.DSA.save_key_bio">[docs]</a> <span class="k">def</span> <span class="nf">save_key_bio</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bio</span><span class="p">,</span> <span class="n">cipher</span><span class="o">=</span><span class="s1">&#39;aes_128_cbc&#39;</span><span class="p">,</span>
+ <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO, str, Callable) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Save DSA key pair to a BIO object.</span>
+
+<span class="sd"> :param bio: Save DSA parameters to this object.</span>
+<span class="sd"> :param cipher: name of symmetric key algorithm and mode</span>
+<span class="sd"> to encrypt the private key.</span>
+<span class="sd"> :return: 1 (true) if successful</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">cipher</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_write_key_bio_no_cipher</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dsa</span><span class="p">,</span>
+ <span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">callback</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">ciph</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">m2</span><span class="p">,</span> <span class="n">cipher</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">ciph</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">DSAError</span><span class="p">(</span><span class="s1">&#39;no such cipher: </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">cipher</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">ciph</span> <span class="o">=</span> <span class="n">ciph</span><span class="p">()</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_write_key_bio</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dsa</span><span class="p">,</span> <span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">ciph</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="DSA.save_pub_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.DSA.save_pub_key">[docs]</a> <span class="k">def</span> <span class="nf">save_pub_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Save the DSA public key (with parameters) to a file.</span>
+
+<span class="sd"> :param filename: Save DSA public key (with parameters)</span>
+<span class="sd"> to this file.</span>
+<span class="sd"> :return: 1 (true) if successful</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="n">ret</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">save_pub_key_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">ret</span>
+</div>
+<div class="viewcode-block" id="DSA.save_pub_key_bio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.DSA.save_pub_key_bio">[docs]</a> <span class="k">def</span> <span class="nf">save_pub_key_bio</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bio</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Save DSA public key (with parameters) to a BIO object.</span>
+
+<span class="sd"> :param bio: Save DSA public key (with parameters)</span>
+<span class="sd"> to this object.</span>
+<span class="sd"> :return: 1 (true) if successful</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_write_pub_key_bio</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dsa</span><span class="p">,</span> <span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+</div>
+<div class="viewcode-block" id="DSA.sign"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.DSA.sign">[docs]</a> <span class="k">def</span> <span class="nf">sign</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">digest</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; Tuple[bytes, bytes]</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Sign the digest.</span>
+
+<span class="sd"> :param digest: SHA-1 hash of message (same as output</span>
+<span class="sd"> from MessageDigest, a &quot;byte string&quot;)</span>
+<span class="sd"> :return: DSA signature, a tuple of two values, r and s,</span>
+<span class="sd"> both &quot;byte strings&quot;.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_key</span><span class="p">(),</span> <span class="s1">&#39;key is not initialised&#39;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_sign</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dsa</span><span class="p">,</span> <span class="n">digest</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="DSA.verify"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.DSA.verify">[docs]</a> <span class="k">def</span> <span class="nf">verify</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">digest</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">s</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, bytes, bytes) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Verify a newly calculated digest against the signature</span>
+<span class="sd"> values r and s.</span>
+
+<span class="sd"> :param digest: SHA-1 hash of message (same as output</span>
+<span class="sd"> from MessageDigest, a &quot;byte string&quot;)</span>
+<span class="sd"> :param r: r value of the signature, a &quot;byte string&quot;</span>
+<span class="sd"> :param s: s value of the signature, a &quot;byte string&quot;</span>
+<span class="sd"> :return: 1 (true) if verify succeeded, 0 if failed</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_key</span><span class="p">(),</span> <span class="s1">&#39;key is not initialised&#39;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_verify</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dsa</span><span class="p">,</span> <span class="n">digest</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="DSA.sign_asn1"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.DSA.sign_asn1">[docs]</a> <span class="k">def</span> <span class="nf">sign_asn1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">digest</span><span class="p">):</span>
+ <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_key</span><span class="p">(),</span> <span class="s1">&#39;key is not initialised&#39;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_sign_asn1</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dsa</span><span class="p">,</span> <span class="n">digest</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="DSA.verify_asn1"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.DSA.verify_asn1">[docs]</a> <span class="k">def</span> <span class="nf">verify_asn1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">digest</span><span class="p">,</span> <span class="n">blob</span><span class="p">):</span>
+ <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_key</span><span class="p">(),</span> <span class="s1">&#39;key is not initialised&#39;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_verify_asn1</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dsa</span><span class="p">,</span> <span class="n">digest</span><span class="p">,</span> <span class="n">blob</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="DSA.check_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.DSA.check_key">[docs]</a> <span class="k">def</span> <span class="nf">check_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Check to be sure the DSA object has a valid private key.</span>
+
+<span class="sd"> :return: 1 (true) if a valid private key</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dsa</span><span class="p">),</span> <span class="s2">&quot;&#39;dsa&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_check_key</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dsa</span><span class="p">)</span>
+
+</div></div>
+<div class="viewcode-block" id="DSA_pub"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.DSA_pub">[docs]</a><span class="k">class</span> <span class="nc">DSA_pub</span><span class="p">(</span><span class="n">DSA</span><span class="p">):</span> <span class="c1"># noqa</span>
+
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> This class is a DSA context that only supports a public key</span>
+<span class="sd"> and verification. It does NOT support a private key or</span>
+<span class="sd"> signing.</span>
+
+<span class="sd"> &quot;&quot;&quot;</span>
+
+<div class="viewcode-block" id="DSA_pub.sign"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.DSA_pub.sign">[docs]</a> <span class="k">def</span> <span class="nf">sign</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">argv</span><span class="p">):</span>
+ <span class="c1"># type: (Any) -&gt; None</span>
+ <span class="k">raise</span> <span class="n">DSAError</span><span class="p">(</span><span class="s1">&#39;DSA_pub object has no private key&#39;</span><span class="p">)</span>
+</div>
+ <span class="n">sign_asn1</span> <span class="o">=</span> <span class="n">sign</span>
+
+<div class="viewcode-block" id="DSA_pub.check_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.DSA_pub.check_key">[docs]</a> <span class="k">def</span> <span class="nf">check_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> :return: does DSA_pub contain a pub key?</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_check_pub_key</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dsa</span><span class="p">)</span>
+</div>
+ <span class="n">save_key</span> <span class="o">=</span> <span class="n">DSA</span><span class="o">.</span><span class="n">save_pub_key</span>
+
+ <span class="n">save_key_bio</span> <span class="o">=</span> <span class="n">DSA</span><span class="o">.</span><span class="n">save_pub_key_bio</span>
+
+<span class="c1"># --------------------------------------------------------------</span>
+<span class="c1"># factories and other functions</span>
+
+</div>
+<div class="viewcode-block" id="gen_params"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.gen_params">[docs]</a><span class="k">def</span> <span class="nf">gen_params</span><span class="p">(</span><span class="n">bits</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">genparam_callback</span><span class="p">):</span>
+ <span class="c1"># type: (int, Callable) -&gt; DSA</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Factory function that generates DSA parameters and</span>
+<span class="sd"> instantiates a DSA object from the output.</span>
+
+<span class="sd"> :param bits: The length of the prime to be generated. If</span>
+<span class="sd"> &#39;bits&#39; &lt; 512, it is set to 512.</span>
+<span class="sd"> :param callback: A Python callback object that will be</span>
+<span class="sd"> invoked during parameter generation; it usual</span>
+<span class="sd"> purpose is to provide visual feedback.</span>
+<span class="sd"> :return: instance of DSA.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">dsa</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_generate_parameters</span><span class="p">(</span><span class="n">bits</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">dsa</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">DSAError</span><span class="p">(</span><span class="s1">&#39;problem generating DSA parameters&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">DSA</span><span class="p">(</span><span class="n">dsa</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="set_params"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.set_params">[docs]</a><span class="k">def</span> <span class="nf">set_params</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">q</span><span class="p">,</span> <span class="n">g</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, bytes, bytes) -&gt; DSA</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Factory function that instantiates a DSA object with DSA</span>
+<span class="sd"> parameters.</span>
+
+<span class="sd"> :param p: value of p, a &quot;byte string&quot;</span>
+<span class="sd"> :param q: value of q, a &quot;byte string&quot;</span>
+<span class="sd"> :param g: value of g, a &quot;byte string&quot;</span>
+<span class="sd"> :return: instance of DSA.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">dsa</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_new</span><span class="p">()</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">dsa_set_pqg</span><span class="p">(</span><span class="n">dsa</span><span class="p">,</span> <span class="n">p</span><span class="p">,</span> <span class="n">q</span><span class="p">,</span> <span class="n">g</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">DSA</span><span class="p">(</span><span class="n">dsa</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_params"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.load_params">[docs]</a><span class="k">def</span> <span class="nf">load_params</span><span class="p">(</span><span class="nb">file</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, Callable) -&gt; DSA</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Factory function that instantiates a DSA object with DSA</span>
+<span class="sd"> parameters from a file.</span>
+
+<span class="sd"> :param file: Names the file (a path) that contains the PEM</span>
+<span class="sd"> representation of the DSA parameters.</span>
+<span class="sd"> :param callback: A Python callback object that will be</span>
+<span class="sd"> invoked if the DSA parameters file is</span>
+<span class="sd"> passphrase-protected.</span>
+<span class="sd"> :return: instance of DSA.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="nb">file</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="n">ret</span> <span class="o">=</span> <span class="n">load_params_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">ret</span>
+
+</div>
+<div class="viewcode-block" id="load_params_bio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.load_params_bio">[docs]</a><span class="k">def</span> <span class="nf">load_params_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO, Callable) -&gt; DSA</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Factory function that instantiates a DSA object with DSA</span>
+<span class="sd"> parameters from a M2Crypto.BIO object.</span>
+
+<span class="sd"> :param bio: Contains the PEM representation of the DSA</span>
+<span class="sd"> parameters.</span>
+<span class="sd"> :param callback: A Python callback object that will be</span>
+<span class="sd"> invoked if the DSA parameters file is</span>
+<span class="sd"> passphrase-protected.</span>
+<span class="sd"> :return: instance of DSA.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">dsa</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_read_params</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">callback</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">dsa</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">DSAError</span><span class="p">(</span><span class="s1">&#39;problem loading DSA parameters&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">DSA</span><span class="p">(</span><span class="n">dsa</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.load_key">[docs]</a><span class="k">def</span> <span class="nf">load_key</span><span class="p">(</span><span class="nb">file</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, Callable) -&gt; DSA</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Factory function that instantiates a DSA object from a</span>
+<span class="sd"> PEM encoded DSA key pair.</span>
+
+<span class="sd"> :param file: Names the file (a path) that contains the PEM</span>
+<span class="sd"> representation of the DSA key pair.</span>
+<span class="sd"> :param callback: A Python callback object that will be</span>
+<span class="sd"> invoked if the DSA key pair is</span>
+<span class="sd"> passphrase-protected.</span>
+<span class="sd"> :return: instance of DSA.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="nb">file</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="n">ret</span> <span class="o">=</span> <span class="n">load_key_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">ret</span>
+
+</div>
+<div class="viewcode-block" id="load_key_bio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.load_key_bio">[docs]</a><span class="k">def</span> <span class="nf">load_key_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO, Callable) -&gt; DSA</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Factory function that instantiates a DSA object from a</span>
+<span class="sd"> PEM encoded DSA key pair.</span>
+
+<span class="sd"> :param bio: Contains the PEM representation of the DSA</span>
+<span class="sd"> key pair.</span>
+<span class="sd"> :param callback: A Python callback object that will be</span>
+<span class="sd"> invoked if the DSA key pair is</span>
+<span class="sd"> passphrase-protected.</span>
+<span class="sd"> :return: instance of DSA.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">dsa</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_read_key</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">callback</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">dsa</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">DSAError</span><span class="p">(</span><span class="s1">&#39;problem loading DSA key pair&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">DSA</span><span class="p">(</span><span class="n">dsa</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="pub_key_from_params"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.pub_key_from_params">[docs]</a><span class="k">def</span> <span class="nf">pub_key_from_params</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">q</span><span class="p">,</span> <span class="n">g</span><span class="p">,</span> <span class="n">pub</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, bytes, bytes, bytes) -&gt; DSA_pub</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Factory function that instantiates a DSA_pub object using</span>
+<span class="sd"> the parameters and public key specified.</span>
+
+<span class="sd"> :param p: value of p</span>
+<span class="sd"> :param q: value of q</span>
+<span class="sd"> :param g: value of g</span>
+<span class="sd"> :param pub: value of the public key</span>
+<span class="sd"> :return: instance of DSA_pub.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">dsa</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_new</span><span class="p">()</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">dsa_set_pqg</span><span class="p">(</span><span class="n">dsa</span><span class="p">,</span> <span class="n">p</span><span class="p">,</span> <span class="n">q</span><span class="p">,</span> <span class="n">g</span><span class="p">)</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">dsa_set_pub</span><span class="p">(</span><span class="n">dsa</span><span class="p">,</span> <span class="n">pub</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">DSA_pub</span><span class="p">(</span><span class="n">dsa</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_pub_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.load_pub_key">[docs]</a><span class="k">def</span> <span class="nf">load_pub_key</span><span class="p">(</span><span class="nb">file</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, Callable) -&gt; DSA_pub</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Factory function that instantiates a DSA_pub object using</span>
+<span class="sd"> a DSA public key contained in PEM file. The PEM file</span>
+<span class="sd"> must contain the parameters in addition to the public key.</span>
+
+<span class="sd"> :param file: Names the file (a path) that contains the PEM</span>
+<span class="sd"> representation of the DSA public key.</span>
+<span class="sd"> :param callback: A Python callback object that will be</span>
+<span class="sd"> invoked should the DSA public key be</span>
+<span class="sd"> passphrase-protected.</span>
+<span class="sd"> :return: instance of DSA_pub.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="nb">file</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="n">ret</span> <span class="o">=</span> <span class="n">load_pub_key_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">ret</span>
+
+</div>
+<div class="viewcode-block" id="load_pub_key_bio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.DSA.load_pub_key_bio">[docs]</a><span class="k">def</span> <span class="nf">load_pub_key_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO, Callable) -&gt; DSA_pub</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Factory function that instantiates a DSA_pub object using</span>
+<span class="sd"> a DSA public key contained in PEM format. The PEM</span>
+<span class="sd"> must contain the parameters in addition to the public key.</span>
+
+<span class="sd"> :param bio: Contains the PEM representation of the DSA</span>
+<span class="sd"> public key (with params).</span>
+<span class="sd"> :param callback: A Python callback object that will be</span>
+<span class="sd"> invoked should the DSA public key be</span>
+<span class="sd"> passphrase-protected.</span>
+<span class="sd"> :return: instance of DSA_pub.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">dsapub</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">dsa_read_pub_key</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">callback</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">dsapub</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">DSAError</span><span class="p">(</span><span class="s1">&#39;problem loading DSA public key&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">DSA_pub</span><span class="p">(</span><span class="n">dsapub</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/EC.html b/doc/html/_modules/M2Crypto/EC.html
new file mode 100644
index 0000000..65e6690
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/EC.html
@@ -0,0 +1,553 @@
+
+
+<!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>M2Crypto.EC &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../index.html" />
+ <link rel="up" title="Module code" href="../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.EC</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">M2Crypto wrapper for OpenSSL ECDH/ECDSA API.</span>
+
+<span class="sd">@requires: OpenSSL 0.9.8 or newer</span>
+
+<span class="sd">Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.</span>
+
+<span class="sd">Portions copyright (c) 2005-2006 Vrije Universiteit Amsterdam.</span>
+<span class="sd">All rights reserved.&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Callable</span><span class="p">,</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Tuple</span><span class="p">,</span> <span class="n">Union</span> <span class="c1"># noqa</span>
+
+<span class="n">EC_Key</span> <span class="o">=</span> <span class="nb">bytes</span>
+
+
+<div class="viewcode-block" id="ECError"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.ECError">[docs]</a><span class="k">class</span> <span class="nc">ECError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
+ <span class="k">pass</span>
+</div>
+<span class="n">m2</span><span class="o">.</span><span class="n">ec_init</span><span class="p">(</span><span class="n">ECError</span><span class="p">)</span>
+
+<span class="c1"># Curve identifier constants</span>
+<span class="n">NID_secp112r1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_secp112r1</span> <span class="c1"># type: int</span>
+<span class="n">NID_secp112r2</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_secp112r2</span> <span class="c1"># type: int</span>
+<span class="n">NID_secp128r1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_secp128r1</span> <span class="c1"># type: int</span>
+<span class="n">NID_secp128r2</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_secp128r2</span> <span class="c1"># type: int</span>
+<span class="n">NID_secp160k1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_secp160k1</span> <span class="c1"># type: int</span>
+<span class="n">NID_secp160r1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_secp160r1</span> <span class="c1"># type: int</span>
+<span class="n">NID_secp160r2</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_secp160r2</span> <span class="c1"># type: int</span>
+<span class="n">NID_secp192k1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_secp192k1</span> <span class="c1"># type: int</span>
+<span class="n">NID_secp224k1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_secp224k1</span> <span class="c1"># type: int</span>
+<span class="n">NID_secp224r1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_secp224r1</span> <span class="c1"># type: int</span>
+<span class="n">NID_secp256k1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_secp256k1</span> <span class="c1"># type: int</span>
+<span class="n">NID_secp384r1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_secp384r1</span> <span class="c1"># type: int</span>
+<span class="n">NID_secp521r1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_secp521r1</span> <span class="c1"># type: int</span>
+<span class="n">NID_sect113r1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_sect113r1</span> <span class="c1"># type: int</span>
+<span class="n">NID_sect113r2</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_sect113r2</span> <span class="c1"># type: int</span>
+<span class="n">NID_sect131r1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_sect131r1</span> <span class="c1"># type: int</span>
+<span class="n">NID_sect131r2</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_sect131r2</span> <span class="c1"># type: int</span>
+<span class="n">NID_sect163k1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_sect163k1</span> <span class="c1"># type: int</span>
+<span class="n">NID_sect163r1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_sect163r1</span> <span class="c1"># type: int</span>
+<span class="n">NID_sect163r2</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_sect163r2</span> <span class="c1"># type: int</span>
+<span class="n">NID_sect193r1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_sect193r1</span> <span class="c1"># type: int</span>
+<span class="n">NID_sect193r2</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_sect193r2</span> <span class="c1"># type: int</span>
+<span class="c1"># default for secg.org TLS test server</span>
+<span class="n">NID_sect233k1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_sect233k1</span> <span class="c1"># type: int</span>
+<span class="n">NID_sect233r1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_sect233r1</span> <span class="c1"># type: int</span>
+<span class="n">NID_sect239k1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_sect239k1</span> <span class="c1"># type: int</span>
+<span class="n">NID_sect283k1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_sect283k1</span> <span class="c1"># type: int</span>
+<span class="n">NID_sect283r1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_sect283r1</span> <span class="c1"># type: int</span>
+<span class="n">NID_sect409k1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_sect409k1</span> <span class="c1"># type: int</span>
+<span class="n">NID_sect409r1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_sect409r1</span> <span class="c1"># type: int</span>
+<span class="n">NID_sect571k1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_sect571k1</span> <span class="c1"># type: int</span>
+<span class="n">NID_sect571r1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_sect571r1</span> <span class="c1"># type: int</span>
+
+<span class="n">NID_prime192v1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_X9_62_prime192v1</span> <span class="c1"># type: int</span>
+<span class="n">NID_prime192v2</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_X9_62_prime192v2</span> <span class="c1"># type: int</span>
+<span class="n">NID_prime192v3</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_X9_62_prime192v3</span> <span class="c1"># type: int</span>
+<span class="n">NID_prime239v1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_X9_62_prime239v1</span> <span class="c1"># type: int</span>
+<span class="n">NID_prime239v2</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_X9_62_prime239v2</span> <span class="c1"># type: int</span>
+<span class="n">NID_prime239v3</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_X9_62_prime239v3</span> <span class="c1"># type: int</span>
+<span class="n">NID_prime256v1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_X9_62_prime256v1</span> <span class="c1"># type: int</span>
+<span class="n">NID_c2pnb163v1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_X9_62_c2pnb163v1</span> <span class="c1"># type: int</span>
+<span class="n">NID_c2pnb163v2</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_X9_62_c2pnb163v2</span> <span class="c1"># type: int</span>
+<span class="n">NID_c2pnb163v3</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_X9_62_c2pnb163v3</span> <span class="c1"># type: int</span>
+<span class="n">NID_c2pnb176v1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_X9_62_c2pnb176v1</span> <span class="c1"># type: int</span>
+<span class="n">NID_c2tnb191v1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_X9_62_c2tnb191v1</span> <span class="c1"># type: int</span>
+<span class="n">NID_c2tnb191v2</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_X9_62_c2tnb191v2</span> <span class="c1"># type: int</span>
+<span class="n">NID_c2tnb191v3</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_X9_62_c2tnb191v3</span> <span class="c1"># type: int</span>
+<span class="n">NID_c2pnb208w1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_X9_62_c2pnb208w1</span> <span class="c1"># type: int</span>
+<span class="n">NID_c2tnb239v1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_X9_62_c2tnb239v1</span> <span class="c1"># type: int</span>
+<span class="n">NID_c2tnb239v2</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_X9_62_c2tnb239v2</span> <span class="c1"># type: int</span>
+<span class="n">NID_c2tnb239v3</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_X9_62_c2tnb239v3</span> <span class="c1"># type: int</span>
+<span class="n">NID_c2pnb272w1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_X9_62_c2pnb272w1</span> <span class="c1"># type: int</span>
+<span class="n">NID_c2pnb304w1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_X9_62_c2pnb304w1</span> <span class="c1"># type: int</span>
+<span class="n">NID_c2tnb359v1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_X9_62_c2tnb359v1</span> <span class="c1"># type: int</span>
+<span class="n">NID_c2pnb368w1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_X9_62_c2pnb368w1</span> <span class="c1"># type: int</span>
+<span class="n">NID_c2tnb431r1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_X9_62_c2tnb431r1</span> <span class="c1"># type: int</span>
+
+<span class="c1"># To preserve compatibility with older names</span>
+<span class="n">NID_X9_62_prime192v1</span> <span class="o">=</span> <span class="n">NID_prime192v1</span> <span class="c1"># type: int</span>
+<span class="n">NID_X9_62_prime192v2</span> <span class="o">=</span> <span class="n">NID_prime192v2</span> <span class="c1"># type: int</span>
+<span class="n">NID_X9_62_prime192v3</span> <span class="o">=</span> <span class="n">NID_prime192v3</span> <span class="c1"># type: int</span>
+<span class="n">NID_X9_62_prime239v1</span> <span class="o">=</span> <span class="n">NID_prime239v1</span> <span class="c1"># type: int</span>
+<span class="n">NID_X9_62_prime239v2</span> <span class="o">=</span> <span class="n">NID_prime239v2</span> <span class="c1"># type: int</span>
+<span class="n">NID_X9_62_prime239v3</span> <span class="o">=</span> <span class="n">NID_prime239v3</span> <span class="c1"># type: int</span>
+<span class="n">NID_X9_62_prime256v1</span> <span class="o">=</span> <span class="n">NID_prime256v1</span> <span class="c1"># type: int</span>
+<span class="n">NID_X9_62_c2pnb163v1</span> <span class="o">=</span> <span class="n">NID_c2pnb163v1</span> <span class="c1"># type: int</span>
+<span class="n">NID_X9_62_c2pnb163v2</span> <span class="o">=</span> <span class="n">NID_c2pnb163v2</span> <span class="c1"># type: int</span>
+<span class="n">NID_X9_62_c2pnb163v3</span> <span class="o">=</span> <span class="n">NID_c2pnb163v3</span> <span class="c1"># type: int</span>
+<span class="n">NID_X9_62_c2pnb176v1</span> <span class="o">=</span> <span class="n">NID_c2pnb176v1</span> <span class="c1"># type: int</span>
+<span class="n">NID_X9_62_c2tnb191v1</span> <span class="o">=</span> <span class="n">NID_c2tnb191v1</span> <span class="c1"># type: int</span>
+<span class="n">NID_X9_62_c2tnb191v2</span> <span class="o">=</span> <span class="n">NID_c2tnb191v2</span> <span class="c1"># type: int</span>
+<span class="n">NID_X9_62_c2tnb191v3</span> <span class="o">=</span> <span class="n">NID_c2tnb191v3</span> <span class="c1"># type: int</span>
+<span class="n">NID_X9_62_c2pnb208w1</span> <span class="o">=</span> <span class="n">NID_c2pnb208w1</span> <span class="c1"># type: int</span>
+<span class="n">NID_X9_62_c2tnb239v1</span> <span class="o">=</span> <span class="n">NID_c2tnb239v1</span> <span class="c1"># type: int</span>
+<span class="n">NID_X9_62_c2tnb239v2</span> <span class="o">=</span> <span class="n">NID_c2tnb239v2</span> <span class="c1"># type: int</span>
+<span class="n">NID_X9_62_c2tnb239v3</span> <span class="o">=</span> <span class="n">NID_c2tnb239v3</span> <span class="c1"># type: int</span>
+<span class="n">NID_X9_62_c2pnb272w1</span> <span class="o">=</span> <span class="n">NID_c2pnb272w1</span> <span class="c1"># type: int</span>
+<span class="n">NID_X9_62_c2pnb304w1</span> <span class="o">=</span> <span class="n">NID_c2pnb304w1</span> <span class="c1"># type: int</span>
+<span class="n">NID_X9_62_c2tnb359v1</span> <span class="o">=</span> <span class="n">NID_c2tnb359v1</span> <span class="c1"># type: int</span>
+<span class="n">NID_X9_62_c2pnb368w1</span> <span class="o">=</span> <span class="n">NID_c2pnb368w1</span> <span class="c1"># type: int</span>
+<span class="n">NID_X9_62_c2tnb431r1</span> <span class="o">=</span> <span class="n">NID_c2tnb431r1</span> <span class="c1"># type: int</span>
+
+<span class="n">NID_wap_wsg_idm_ecid_wtls1</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_wap_wsg_idm_ecid_wtls1</span> <span class="c1"># type: int</span>
+<span class="n">NID_wap_wsg_idm_ecid_wtls3</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_wap_wsg_idm_ecid_wtls3</span> <span class="c1"># type: int</span>
+<span class="n">NID_wap_wsg_idm_ecid_wtls4</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_wap_wsg_idm_ecid_wtls4</span> <span class="c1"># type: int</span>
+<span class="n">NID_wap_wsg_idm_ecid_wtls5</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_wap_wsg_idm_ecid_wtls5</span> <span class="c1"># type: int</span>
+<span class="n">NID_wap_wsg_idm_ecid_wtls6</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_wap_wsg_idm_ecid_wtls6</span> <span class="c1"># type: int</span>
+<span class="n">NID_wap_wsg_idm_ecid_wtls7</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_wap_wsg_idm_ecid_wtls7</span> <span class="c1"># type: int</span>
+<span class="n">NID_wap_wsg_idm_ecid_wtls8</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_wap_wsg_idm_ecid_wtls8</span> <span class="c1"># type: int</span>
+<span class="n">NID_wap_wsg_idm_ecid_wtls9</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_wap_wsg_idm_ecid_wtls9</span> <span class="c1"># type: int</span>
+<span class="n">NID_wap_wsg_idm_ecid_wtls10</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_wap_wsg_idm_ecid_wtls10</span> <span class="c1"># type: int</span>
+<span class="n">NID_wap_wsg_idm_ecid_wtls11</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_wap_wsg_idm_ecid_wtls11</span> <span class="c1"># type: int</span>
+<span class="n">NID_wap_wsg_idm_ecid_wtls12</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_wap_wsg_idm_ecid_wtls12</span> <span class="c1"># type: int</span>
+
+<span class="c1"># The following two curves, according to OpenSSL, have a</span>
+<span class="c1"># &quot;Questionable extension field!&quot; and are not supported by</span>
+<span class="c1"># the OpenSSL inverse function. ECError: no inverse.</span>
+<span class="c1"># As such they cannot be used for signing. They might,</span>
+<span class="c1"># however, be usable for encryption but that has not</span>
+<span class="c1"># been tested. Until thir usefulness can be established,</span>
+<span class="c1"># they are not supported at this time.</span>
+<span class="c1"># NID_ipsec3 = m2.NID_ipsec3</span>
+<span class="c1"># NID_ipsec4 = m2.NID_ipsec4</span>
+
+
+<div class="viewcode-block" id="EC"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.EC">[docs]</a><span class="k">class</span> <span class="nc">EC</span><span class="p">:</span>
+
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Object interface to a EC key pair.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">m2_ec_key_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">ec_key_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ec</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (EC, int) -&gt; None</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">ec_key_type_check</span><span class="p">(</span><span class="n">ec</span><span class="p">),</span> <span class="s2">&quot;&#39;ec&#39; type error&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ec</span> <span class="o">=</span> <span class="n">ec</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="n">_pyfree</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_pyfree&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_ec_key_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">ec_key_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="p">),</span> <span class="s2">&quot;&#39;ec&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ec_key_keylen</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="p">)</span>
+
+<div class="viewcode-block" id="EC.gen_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.EC.gen_key">[docs]</a> <span class="k">def</span> <span class="nf">gen_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Generates the key pair from its parameters. Use::</span>
+
+<span class="sd"> keypair = EC.gen_params(curve)</span>
+<span class="sd"> keypair.gen_key()</span>
+
+<span class="sd"> to create an EC key pair.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">ec_key_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="p">),</span> <span class="s2">&quot;&#39;ec&#39; type error&quot;</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ec_key_gen_key</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="EC.pub"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.EC.pub">[docs]</a> <span class="k">def</span> <span class="nf">pub</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; EC_pub</span>
+ <span class="c1"># Don&#39;t let python free</span>
+ <span class="k">return</span> <span class="n">EC_pub</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="EC.sign_dsa"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.EC.sign_dsa">[docs]</a> <span class="k">def</span> <span class="nf">sign_dsa</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">digest</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; Tuple[bytes, bytes]</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Sign the given digest using ECDSA. Returns a tuple (r,s), the two</span>
+<span class="sd"> ECDSA signature parameters.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">_check_key_type</span><span class="p">(),</span> <span class="s2">&quot;&#39;ec&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ecdsa_sign</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="p">,</span> <span class="n">digest</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="EC.verify_dsa"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.EC.verify_dsa">[docs]</a> <span class="k">def</span> <span class="nf">verify_dsa</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">digest</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">s</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, bytes, bytes) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Verify the given digest using ECDSA. r and s are the ECDSA</span>
+<span class="sd"> signature parameters.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">_check_key_type</span><span class="p">(),</span> <span class="s2">&quot;&#39;ec&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ecdsa_verify</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="p">,</span> <span class="n">digest</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="EC.sign_dsa_asn1"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.EC.sign_dsa_asn1">[docs]</a> <span class="k">def</span> <span class="nf">sign_dsa_asn1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">digest</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; bytes</span>
+ <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">_check_key_type</span><span class="p">(),</span> <span class="s2">&quot;&#39;ec&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ecdsa_sign_asn1</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="p">,</span> <span class="n">digest</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="EC.verify_dsa_asn1"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.EC.verify_dsa_asn1">[docs]</a> <span class="k">def</span> <span class="nf">verify_dsa_asn1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">digest</span><span class="p">,</span> <span class="n">blob</span><span class="p">):</span>
+ <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">_check_key_type</span><span class="p">(),</span> <span class="s2">&quot;&#39;ec&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ecdsa_verify_asn1</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="p">,</span> <span class="n">digest</span><span class="p">,</span> <span class="n">blob</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="EC.compute_dh_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.EC.compute_dh_key">[docs]</a> <span class="k">def</span> <span class="nf">compute_dh_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pub_key</span><span class="p">):</span>
+ <span class="c1"># type: (EC) -&gt; Optional[bytes]</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Compute the ECDH shared key of this key pair and the given public</span>
+<span class="sd"> key object. They must both use the same curve. Returns the</span>
+<span class="sd"> shared key in binary as a buffer object. No Key Derivation Function is</span>
+<span class="sd"> applied.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_key</span><span class="p">(),</span> <span class="s1">&#39;key is not initialised&#39;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ecdh_compute_key</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="p">,</span> <span class="n">pub_key</span><span class="o">.</span><span class="n">ec</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="EC.save_key_bio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.EC.save_key_bio">[docs]</a> <span class="k">def</span> <span class="nf">save_key_bio</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bio</span><span class="p">,</span> <span class="n">cipher</span><span class="o">=</span><span class="s1">&#39;aes_128_cbc&#39;</span><span class="p">,</span>
+ <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO, Optional[str], Callable) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Save the key pair to an M2Crypto.BIO.BIO object in PEM format.</span>
+
+<span class="sd"> :param bio: M2Crypto.BIO.BIO object to save key to.</span>
+
+<span class="sd"> :param cipher: Symmetric cipher to protect the key. The default</span>
+<span class="sd"> cipher is &#39;aes_128_cbc&#39;. If cipher is None, then</span>
+<span class="sd"> the key is saved in the clear.</span>
+
+<span class="sd"> :param callback: A Python callable object that is invoked</span>
+<span class="sd"> to acquire a passphrase with which to protect</span>
+<span class="sd"> the key. The default is</span>
+<span class="sd"> util.passphrase_callback.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">cipher</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ec_key_write_bio_no_cipher</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="p">,</span> <span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">callback</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">ciph</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">m2</span><span class="p">,</span> <span class="n">cipher</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">ciph</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;not such cipher </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">cipher</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ec_key_write_bio</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="p">,</span> <span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">ciph</span><span class="p">(),</span> <span class="n">callback</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="EC.save_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.EC.save_key">[docs]</a> <span class="k">def</span> <span class="nf">save_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">file</span><span class="p">,</span> <span class="n">cipher</span><span class="o">=</span><span class="s1">&#39;aes_128_cbc&#39;</span><span class="p">,</span>
+ <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, Optional[str], Callable) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Save the key pair to a file in PEM format.</span>
+
+<span class="sd"> :param file: Name of filename to save key to.</span>
+
+<span class="sd"> :param cipher: Symmetric cipher to protect the key. The default</span>
+<span class="sd"> cipher is &#39;aes_128_cbc&#39;. If cipher is None, then</span>
+<span class="sd"> the key is saved in the clear.</span>
+
+<span class="sd"> :param callback: A Python callable object that is invoked</span>
+<span class="sd"> to acquire a passphrase with which to protect</span>
+<span class="sd"> the key. The default is</span>
+<span class="sd"> util.passphrase_callback.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="nb">file</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">save_key_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">cipher</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="EC.save_pub_key_bio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.EC.save_pub_key_bio">[docs]</a> <span class="k">def</span> <span class="nf">save_pub_key_bio</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bio</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Save the public key to an M2Crypto.BIO.BIO object in PEM format.</span>
+
+<span class="sd"> :param bio: M2Crypto.BIO.BIO object to save key to.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ec_key_write_pubkey</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="p">,</span> <span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+</div>
+<div class="viewcode-block" id="EC.save_pub_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.EC.save_pub_key">[docs]</a> <span class="k">def</span> <span class="nf">save_pub_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">file</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Save the public key to a filename in PEM format.</span>
+
+<span class="sd"> :param file: Name of filename to save key to.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="nb">file</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ec_key_write_pubkey</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="p">,</span> <span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+</div>
+<div class="viewcode-block" id="EC.as_pem"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.EC.as_pem">[docs]</a> <span class="k">def</span> <span class="nf">as_pem</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cipher</span><span class="o">=</span><span class="s1">&#39;aes_128_cbc&#39;</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Returns the key(pair) as a string in PEM format.</span>
+<span class="sd"> If no password is passed and the cipher is set</span>
+<span class="sd"> it exits with error</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">save_key_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">cipher</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">bio</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
+</div>
+ <span class="k">def</span> <span class="nf">_check_key_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ec_key_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="p">)</span>
+
+<div class="viewcode-block" id="EC.check_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.EC.check_key">[docs]</a> <span class="k">def</span> <span class="nf">check_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">ec_key_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="p">),</span> <span class="s2">&quot;&#39;ec&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ec_key_check_key</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="p">)</span>
+
+</div></div>
+<div class="viewcode-block" id="EC_pub"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.EC_pub">[docs]</a><span class="k">class</span> <span class="nc">EC_pub</span><span class="p">(</span><span class="n">EC</span><span class="p">):</span> <span class="c1"># noqa</span>
+
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Object interface to an EC public key.</span>
+<span class="sd"> ((don&#39;t like this implementation inheritance))</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ec</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (EC, int) -&gt; None</span>
+ <span class="n">EC</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ec</span><span class="p">,</span> <span class="n">_pyfree</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">der</span> <span class="o">=</span> <span class="bp">None</span> <span class="c1"># type: Optional[bytes]</span>
+
+<div class="viewcode-block" id="EC_pub.get_der"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.EC_pub.get_der">[docs]</a> <span class="k">def</span> <span class="nf">get_der</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Returns the public key in DER format as a buffer object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_key</span><span class="p">(),</span> <span class="s1">&#39;key is not initialised&#39;</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">der</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">der</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">ec_key_get_public_der</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="p">)</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">der</span>
+</div>
+<div class="viewcode-block" id="EC_pub.get_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.EC_pub.get_key">[docs]</a> <span class="k">def</span> <span class="nf">get_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Returns the public key as a byte string.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_key</span><span class="p">(),</span> <span class="s1">&#39;key is not initialised&#39;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ec_key_get_public_key</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ec</span><span class="p">)</span>
+</div>
+ <span class="n">save_key</span> <span class="o">=</span> <span class="n">EC</span><span class="o">.</span><span class="n">save_pub_key</span>
+
+ <span class="n">save_key_bio</span> <span class="o">=</span> <span class="n">EC</span><span class="o">.</span><span class="n">save_pub_key_bio</span>
+
+</div>
+<div class="viewcode-block" id="gen_params"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.gen_params">[docs]</a><span class="k">def</span> <span class="nf">gen_params</span><span class="p">(</span><span class="n">curve</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; EC</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Factory function that generates EC parameters and</span>
+<span class="sd"> instantiates a EC object from the output.</span>
+
+<span class="sd"> :param curve: This is the OpenSSL nid of the curve to use.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="n">curve</span> <span class="ow">in</span> <span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="s1">&#39;NID&#39;</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">m2</span><span class="o">.</span><span class="n">ec_get_builtin_curves</span><span class="p">()],</span> \
+ <span class="s1">&#39;Elliptic curve </span><span class="si">%s</span><span class="s1"> is not available on this system.&#39;</span> <span class="o">%</span> \
+ <span class="n">m2</span><span class="o">.</span><span class="n">obj_nid2sn</span><span class="p">(</span><span class="n">curve</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">EC</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">ec_key_new_by_curve_name</span><span class="p">(</span><span class="n">curve</span><span class="p">),</span> <span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.load_key">[docs]</a><span class="k">def</span> <span class="nf">load_key</span><span class="p">(</span><span class="nb">file</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, Callable) -&gt; EC</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Factory function that instantiates a EC object.</span>
+
+<span class="sd"> :param file: Names the filename that contains the PEM representation</span>
+<span class="sd"> of the EC key pair.</span>
+
+<span class="sd"> :param callback: Python callback object that will be invoked</span>
+<span class="sd"> if the EC key pair is passphrase-protected.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="nb">file</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">load_key_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_key_string"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.load_key_string">[docs]</a><span class="k">def</span> <span class="nf">load_key_string</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (str, Callable) -&gt; EC</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Load an EC key pair from a string.</span>
+
+<span class="sd"> :param string: String containing EC key pair in PEM format.</span>
+
+<span class="sd"> :param callback: A Python callable object that is invoked</span>
+<span class="sd"> to acquire a passphrase with which to unlock the</span>
+<span class="sd"> key. The default is util.passphrase_callback.</span>
+
+<span class="sd"> :return: M2Crypto.EC.EC object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">(</span><span class="n">string</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">load_key_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_key_bio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.load_key_bio">[docs]</a><span class="k">def</span> <span class="nf">load_key_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO, Callable) -&gt; EC</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Factory function that instantiates a EC object.</span>
+
+<span class="sd"> :param bio: M2Crypto.BIO object that contains the PEM</span>
+<span class="sd"> representation of the EC key pair.</span>
+
+<span class="sd"> :param callback: Python callback object that will be invoked</span>
+<span class="sd"> if the EC key pair is passphrase-protected.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">EC</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">ec_key_read_bio</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">callback</span><span class="p">),</span> <span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_pub_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.load_pub_key">[docs]</a><span class="k">def</span> <span class="nf">load_pub_key</span><span class="p">(</span><span class="nb">file</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr) -&gt; EC_pub</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Load an EC public key from filename.</span>
+
+<span class="sd"> :param file: Name of filename containing EC public key in PEM</span>
+<span class="sd"> format.</span>
+
+<span class="sd"> :return: M2Crypto.EC.EC_pub object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="nb">file</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">load_pub_key_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_key_string_pubkey"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.load_key_string_pubkey">[docs]</a><span class="k">def</span> <span class="nf">load_key_string_pubkey</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (str, Callable) -&gt; PKey</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Load an M2Crypto.EC.PKey from a public key as a string.</span>
+
+<span class="sd"> :param string: String containing the key in PEM format.</span>
+
+<span class="sd"> :param callback: A Python callable object that is invoked</span>
+<span class="sd"> to acquire a passphrase with which to protect the</span>
+<span class="sd"> key.</span>
+
+<span class="sd"> :return: M2Crypto.EC.PKey object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">(</span><span class="n">string</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">load_key_bio_pubkey</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_pub_key_bio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.load_pub_key_bio">[docs]</a><span class="k">def</span> <span class="nf">load_pub_key_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO) -&gt; EC_pub</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Load an EC public key from an M2Crypto.BIO.BIO object.</span>
+
+<span class="sd"> :param bio: M2Crypto.BIO.BIO object containing EC public key in PEM</span>
+<span class="sd"> format.</span>
+
+<span class="sd"> :return: M2Crypto.EC.EC_pub object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">ec</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">ec_key_read_pubkey</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+ <span class="k">if</span> <span class="n">ec</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">ec_error</span><span class="p">()</span>
+ <span class="k">return</span> <span class="n">EC_pub</span><span class="p">(</span><span class="n">ec</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="ec_error"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.ec_error">[docs]</a><span class="k">def</span> <span class="nf">ec_error</span><span class="p">():</span>
+ <span class="c1"># type: () -&gt; ECError</span>
+ <span class="k">raise</span> <span class="n">ECError</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">err_reason_error_string</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">err_get_error</span><span class="p">()))</span>
+
+</div>
+<div class="viewcode-block" id="pub_key_from_der"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.pub_key_from_der">[docs]</a><span class="k">def</span> <span class="nf">pub_key_from_der</span><span class="p">(</span><span class="n">der</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; EC_pub</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Create EC_pub from DER.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">EC_pub</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">ec_key_from_pubkey_der</span><span class="p">(</span><span class="n">der</span><span class="p">),</span> <span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="pub_key_from_params"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.pub_key_from_params">[docs]</a><span class="k">def</span> <span class="nf">pub_key_from_params</span><span class="p">(</span><span class="n">curve</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, bytes) -&gt; EC_pub</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Create EC_pub from curve name and octet string.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">EC_pub</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">ec_key_from_pubkey_params</span><span class="p">(</span><span class="n">curve</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">),</span> <span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="get_builtin_curves"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EC.get_builtin_curves">[docs]</a><span class="k">def</span> <span class="nf">get_builtin_curves</span><span class="p">():</span>
+ <span class="c1"># type: () -&gt; Tuple[Dict[str, Union[int, str]]]</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ec_get_builtin_curves</span><span class="p">()</span></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/EVP.html b/doc/html/_modules/M2Crypto/EVP.html
new file mode 100644
index 0000000..4c7d6e0
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/EVP.html
@@ -0,0 +1,569 @@
+
+
+<!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>M2Crypto.EVP &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../index.html" />
+ <link rel="up" title="Module code" href="../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.EVP</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+
+<span class="sd">&quot;&quot;&quot;M2Crypto wrapper for OpenSSL EVP API.</span>
+
+<span class="sd">Copyright (c) 1999-2004 Ng Pheng Siong. All rights reserved.</span>
+
+<span class="sd">Portions Copyright (c) 2004-2007 Open Source Applications Foundation.</span>
+<span class="sd">Author: Heikki Toivonen</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">Err</span><span class="p">,</span> <span class="n">RSA</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Callable</span> <span class="c1"># noqa</span>
+
+
+<div class="viewcode-block" id="EVPError"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.EVPError">[docs]</a><span class="k">class</span> <span class="nc">EVPError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
+ <span class="k">pass</span>
+</div>
+<span class="n">m2</span><span class="o">.</span><span class="n">evp_init</span><span class="p">(</span><span class="n">EVPError</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="pbkdf2"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.pbkdf2">[docs]</a><span class="k">def</span> <span class="nf">pbkdf2</span><span class="p">(</span><span class="n">password</span><span class="p">,</span> <span class="n">salt</span><span class="p">,</span> <span class="nb">iter</span><span class="p">,</span> <span class="n">keylen</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, bytes, int, int) -&gt; bytes</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Derive a key from password using PBKDF2 algorithm specified in RFC 2898.</span>
+
+<span class="sd"> :param password: Derive the key from this password.</span>
+<span class="sd"> :param salt: Salt.</span>
+<span class="sd"> :param iter: Number of iterations to perform.</span>
+<span class="sd"> :param keylen: Length of key to produce.</span>
+<span class="sd"> :return: Key.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs5_pbkdf2_hmac_sha1</span><span class="p">(</span><span class="n">password</span><span class="p">,</span> <span class="n">salt</span><span class="p">,</span> <span class="nb">iter</span><span class="p">,</span> <span class="n">keylen</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="MessageDigest"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.MessageDigest">[docs]</a><span class="k">class</span> <span class="nc">MessageDigest</span><span class="p">:</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Message Digest</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">m2_md_ctx_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">md_ctx_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">algo</span><span class="p">):</span>
+ <span class="c1"># type: (str) -&gt; None</span>
+ <span class="n">md</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">m2</span><span class="p">,</span> <span class="n">algo</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span> <span class="c1"># type: Optional[Callable]</span>
+ <span class="k">if</span> <span class="n">md</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="c1"># if the digest algorithm isn&#39;t found as an attribute of the m2</span>
+ <span class="c1"># module, try to look up the digest using get_digestbyname()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">md</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">get_digestbyname</span><span class="p">(</span><span class="n">algo</span><span class="p">)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">md</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown algorithm&#39;</span><span class="p">,</span> <span class="n">algo</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">md</span> <span class="o">=</span> <span class="n">md</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ctx</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">md_ctx_new</span><span class="p">()</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">digest_init</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">md</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;ctx&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_md_ctx_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">)</span>
+
+<div class="viewcode-block" id="MessageDigest.update"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.MessageDigest.update">[docs]</a> <span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Add data to be digested.</span>
+
+<span class="sd"> :return: -1 for Python error, 1 for success, 0 for OpenSSL failure.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">digest_update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="MessageDigest.final"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.MessageDigest.final">[docs]</a> <span class="k">def</span> <span class="nf">final</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">digest_final</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">)</span>
+
+ <span class="c1"># Deprecated.</span></div>
+ <span class="n">digest</span> <span class="o">=</span> <span class="n">final</span>
+
+</div>
+<div class="viewcode-block" id="HMAC"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.HMAC">[docs]</a><span class="k">class</span> <span class="nc">HMAC</span><span class="p">:</span>
+
+ <span class="n">m2_hmac_ctx_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">hmac_ctx_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">algo</span><span class="o">=</span><span class="s1">&#39;sha1&#39;</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, str) -&gt; None</span>
+ <span class="n">md</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">m2</span><span class="p">,</span> <span class="n">algo</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">md</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown algorithm&#39;</span><span class="p">,</span> <span class="n">algo</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">md</span> <span class="o">=</span> <span class="n">md</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ctx</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">hmac_ctx_new</span><span class="p">()</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">hmac_init</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">md</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;ctx&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_hmac_ctx_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">)</span>
+
+<div class="viewcode-block" id="HMAC.reset"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.HMAC.reset">[docs]</a> <span class="k">def</span> <span class="nf">reset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; None</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">hmac_init</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">md</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="HMAC.update"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.HMAC.update">[docs]</a> <span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; None</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">hmac_update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="HMAC.final"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.HMAC.final">[docs]</a> <span class="k">def</span> <span class="nf">final</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">hmac_final</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">)</span>
+</div>
+ <span class="n">digest</span> <span class="o">=</span> <span class="n">final</span>
+
+</div>
+<div class="viewcode-block" id="hmac"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.hmac">[docs]</a><span class="k">def</span> <span class="nf">hmac</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">algo</span><span class="o">=</span><span class="s1">&#39;sha1&#39;</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, bytes, str) -&gt; bytes</span>
+ <span class="n">md</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">m2</span><span class="p">,</span> <span class="n">algo</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">md</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown algorithm&#39;</span><span class="p">,</span> <span class="n">algo</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">hmac</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">md</span><span class="p">())</span>
+
+</div>
+<div class="viewcode-block" id="Cipher"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.Cipher">[docs]</a><span class="k">class</span> <span class="nc">Cipher</span><span class="p">:</span>
+
+ <span class="n">m2_cipher_ctx_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">cipher_ctx_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">alg</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">iv</span><span class="p">,</span> <span class="n">op</span><span class="p">,</span> <span class="n">key_as_bytes</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">d</span><span class="o">=</span><span class="s1">&#39;md5&#39;</span><span class="p">,</span>
+ <span class="n">salt</span><span class="o">=</span><span class="s1">&#39;12345678&#39;</span><span class="p">,</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">padding</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
+ <span class="c1"># type: (str, bytes, bytes, object, int, str, bytes, int, int) -&gt; None</span>
+ <span class="n">cipher</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">m2</span><span class="p">,</span> <span class="n">alg</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">cipher</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown cipher&#39;</span><span class="p">,</span> <span class="n">alg</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">cipher</span> <span class="o">=</span> <span class="n">cipher</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">key_as_bytes</span><span class="p">:</span>
+ <span class="n">kmd</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">m2</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">kmd</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown message digest&#39;</span><span class="p">,</span> <span class="n">d</span><span class="p">)</span>
+ <span class="n">key</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bytes_to_key</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cipher</span><span class="p">,</span> <span class="n">kmd</span><span class="p">(),</span> <span class="n">key</span><span class="p">,</span> <span class="n">salt</span><span class="p">,</span> <span class="n">iv</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ctx</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">cipher_ctx_new</span><span class="p">()</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">cipher_init</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">cipher</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">iv</span><span class="p">,</span> <span class="n">op</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">set_padding</span><span class="p">(</span><span class="n">padding</span><span class="p">)</span>
+ <span class="k">del</span> <span class="n">key</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;ctx&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_cipher_ctx_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">)</span>
+
+<div class="viewcode-block" id="Cipher.update"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.Cipher.update">[docs]</a> <span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; bytes</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">cipher_update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Cipher.final"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.Cipher.final">[docs]</a> <span class="k">def</span> <span class="nf">final</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">cipher_final</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Cipher.set_padding"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.Cipher.set_padding">[docs]</a> <span class="k">def</span> <span class="nf">set_padding</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">padding</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Actually always return 1</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">cipher_set_padding</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">padding</span><span class="p">)</span>
+
+</div></div>
+<div class="viewcode-block" id="PKey"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.PKey">[docs]</a><span class="k">class</span> <span class="nc">PKey</span><span class="p">:</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Public Key</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">m2_pkey_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkey_free</span>
+ <span class="n">m2_md_ctx_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">md_ctx_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pkey</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">md</span><span class="o">=</span><span class="s1">&#39;sha1&#39;</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[bytes], int, str) -&gt; None</span>
+ <span class="k">if</span> <span class="n">pkey</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">pkey</span> <span class="o">=</span> <span class="n">pkey</span> <span class="c1"># type: bytes</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="n">_pyfree</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">pkey</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkey_new</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="mi">1</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_set_context</span><span class="p">(</span><span class="n">md</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_pyfree&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_pkey_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pkey</span><span class="p">)</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;ctx&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_md_ctx_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">_ptr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">pkey</span>
+
+ <span class="k">def</span> <span class="nf">_set_context</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">md</span><span class="p">):</span>
+ <span class="c1"># type: (str) -&gt; None</span>
+ <span class="n">mda</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">m2</span><span class="p">,</span> <span class="n">md</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span> <span class="c1"># type: Optional[Callable]</span>
+ <span class="k">if</span> <span class="n">mda</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown message digest&#39;</span><span class="p">,</span> <span class="n">md</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">md</span> <span class="o">=</span> <span class="n">mda</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ctx</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">md_ctx_new</span><span class="p">()</span> <span class="c1"># type: Context</span>
+
+<div class="viewcode-block" id="PKey.reset_context"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.PKey.reset_context">[docs]</a> <span class="k">def</span> <span class="nf">reset_context</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">md</span><span class="o">=</span><span class="s1">&#39;sha1&#39;</span><span class="p">):</span>
+ <span class="c1"># type: (str) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Reset internal message digest context.</span>
+
+<span class="sd"> :param md: The message digest algorithm.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_set_context</span><span class="p">(</span><span class="n">md</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="PKey.sign_init"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.PKey.sign_init">[docs]</a> <span class="k">def</span> <span class="nf">sign_init</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Initialise signing operation with self.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">sign_init</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">md</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="PKey.sign_update"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.PKey.sign_update">[docs]</a> <span class="k">def</span> <span class="nf">sign_update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Feed data to signing operation.</span>
+
+<span class="sd"> :param data: Data to be signed.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">sign_update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="PKey.sign_final"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.PKey.sign_final">[docs]</a> <span class="k">def</span> <span class="nf">sign_final</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Return signature.</span>
+
+<span class="sd"> :return: The signature.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">sign_final</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">pkey</span><span class="p">)</span>
+
+ <span class="c1"># Deprecated</span></div>
+ <span class="n">update</span> <span class="o">=</span> <span class="n">sign_update</span>
+ <span class="n">final</span> <span class="o">=</span> <span class="n">sign_final</span>
+
+<div class="viewcode-block" id="PKey.verify_init"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.PKey.verify_init">[docs]</a> <span class="k">def</span> <span class="nf">verify_init</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Initialise signature verification operation with self.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">verify_init</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">md</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="PKey.verify_update"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.PKey.verify_update">[docs]</a> <span class="k">def</span> <span class="nf">verify_update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Feed data to verification operation.</span>
+
+<span class="sd"> :param data: Data to be verified.</span>
+<span class="sd"> :return: -1 on Python error, 1 for success, 0 for OpenSSL error</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">verify_update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="PKey.verify_final"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.PKey.verify_final">[docs]</a> <span class="k">def</span> <span class="nf">verify_final</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sign</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Return result of verification.</span>
+
+<span class="sd"> :param sign: Signature to use for verification</span>
+<span class="sd"> :return: Result of verification: 1 for success, 0 for failure, -1 on</span>
+<span class="sd"> other error.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">verify_final</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">sign</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">pkey</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="PKey.assign_rsa"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.PKey.assign_rsa">[docs]</a> <span class="k">def</span> <span class="nf">assign_rsa</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">rsa</span><span class="p">,</span> <span class="n">capture</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
+ <span class="c1"># type: (RSA.RSA, int) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Assign the RSA key pair to self.</span>
+
+<span class="sd"> :param rsa: M2Crypto.RSA.RSA object to be assigned to self.</span>
+
+<span class="sd"> :param capture: If true (default), this PKey object will own the RSA</span>
+<span class="sd"> object, meaning that once the PKey object gets</span>
+<span class="sd"> deleted it is no longer safe to use the RSA object.</span>
+
+<span class="sd"> :return: Return 1 for success and 0 for failure.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">capture</span><span class="p">:</span>
+ <span class="n">ret</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkey_assign_rsa</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pkey</span><span class="p">,</span> <span class="n">rsa</span><span class="o">.</span><span class="n">rsa</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">ret</span><span class="p">:</span>
+ <span class="n">rsa</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="mi">0</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">ret</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkey_set1_rsa</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pkey</span><span class="p">,</span> <span class="n">rsa</span><span class="o">.</span><span class="n">rsa</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">ret</span>
+</div>
+<div class="viewcode-block" id="PKey.get_rsa"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.PKey.get_rsa">[docs]</a> <span class="k">def</span> <span class="nf">get_rsa</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; RSA.RSA_pub</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Return the underlying RSA key if that is what the EVP</span>
+<span class="sd"> instance is holding.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">rsa_ptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkey_get1_rsa</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pkey</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">rsa_ptr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;PKey instance is not holding a RSA key&quot;</span><span class="p">)</span>
+
+ <span class="n">rsa</span> <span class="o">=</span> <span class="n">RSA</span><span class="o">.</span><span class="n">RSA_pub</span><span class="p">(</span><span class="n">rsa_ptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">rsa</span>
+</div>
+<div class="viewcode-block" id="PKey.save_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.PKey.save_key">[docs]</a> <span class="k">def</span> <span class="nf">save_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">file</span><span class="p">,</span> <span class="n">cipher</span><span class="o">=</span><span class="s1">&#39;aes_128_cbc&#39;</span><span class="p">,</span>
+ <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, Optional[str], Callable) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Save the key pair to a file in PEM format.</span>
+
+<span class="sd"> :param file: Name of file to save key to.</span>
+
+<span class="sd"> :param cipher: Symmetric cipher to protect the key. The default</span>
+<span class="sd"> cipher is &#39;aes_128_cbc&#39;. If cipher is None, then</span>
+<span class="sd"> the key is saved in the clear.</span>
+
+<span class="sd"> :param callback: A Python callable object that is invoked</span>
+<span class="sd"> to acquire a passphrase with which to protect</span>
+<span class="sd"> the key. The default is</span>
+<span class="sd"> util.passphrase_callback.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="nb">file</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">save_key_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">cipher</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="PKey.save_key_bio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.PKey.save_key_bio">[docs]</a> <span class="k">def</span> <span class="nf">save_key_bio</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bio</span><span class="p">,</span> <span class="n">cipher</span><span class="o">=</span><span class="s1">&#39;aes_128_cbc&#39;</span><span class="p">,</span>
+ <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO, Optional[str], Callable) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Save the key pair to the M2Crypto.BIO object &#39;bio&#39; in PEM format.</span>
+
+<span class="sd"> :param bio: M2Crypto.BIO object to save key to.</span>
+
+<span class="sd"> :param cipher: Symmetric cipher to protect the key. The default</span>
+<span class="sd"> cipher is &#39;aes_128_cbc&#39;. If cipher is None, then</span>
+<span class="sd"> the key is saved in the clear.</span>
+
+<span class="sd"> :param callback: A Python callable object that is invoked</span>
+<span class="sd"> to acquire a passphrase with which to protect</span>
+<span class="sd"> the key. The default is</span>
+<span class="sd"> util.passphrase_callback.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">cipher</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkey_write_pem_no_cipher</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pkey</span><span class="p">,</span> <span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">callback</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">proto</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">m2</span><span class="p">,</span> <span class="n">cipher</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">proto</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;no such cipher </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">cipher</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkey_write_pem</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pkey</span><span class="p">,</span> <span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">proto</span><span class="p">(),</span> <span class="n">callback</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="PKey.as_pem"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.PKey.as_pem">[docs]</a> <span class="k">def</span> <span class="nf">as_pem</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cipher</span><span class="o">=</span><span class="s1">&#39;aes_128_cbc&#39;</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[str], Callable) -&gt; bytes</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Return key in PEM format in a string.</span>
+
+<span class="sd"> :param cipher: Symmetric cipher to protect the key. The default</span>
+<span class="sd"> cipher is ``&#39;aes_128_cbc&#39;``. If cipher is None,</span>
+<span class="sd"> then the key is saved in the clear.</span>
+
+<span class="sd"> :param callback: A Python callable object that is invoked</span>
+<span class="sd"> to acquire a passphrase with which to protect</span>
+<span class="sd"> the key. The default is</span>
+<span class="sd"> util.passphrase_callback.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">bio</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">save_key_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">cipher</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">bio</span><span class="o">.</span><span class="n">read_all</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="PKey.as_der"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.PKey.as_der">[docs]</a> <span class="k">def</span> <span class="nf">as_der</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Return key in DER format in a string</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">buf</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkey_as_der</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pkey</span><span class="p">)</span>
+ <span class="n">bio</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">bio</span><span class="o">.</span><span class="n">read_all</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="PKey.size"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.PKey.size">[docs]</a> <span class="k">def</span> <span class="nf">size</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Return the size of the key in bytes.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkey_size</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pkey</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="PKey.get_modulus"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.PKey.get_modulus">[docs]</a> <span class="k">def</span> <span class="nf">get_modulus</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; Optional[bytes]</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Return the modulus in hex format.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkey_get_modulus</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pkey</span><span class="p">)</span>
+
+</div></div>
+<div class="viewcode-block" id="load_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.load_key">[docs]</a><span class="k">def</span> <span class="nf">load_key</span><span class="p">(</span><span class="nb">file</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, Callable) -&gt; PKey</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Load an M2Crypto.EVP.PKey from file.</span>
+
+<span class="sd"> :param file: Name of file containing the key in PEM format.</span>
+
+<span class="sd"> :param callback: A Python callable object that is invoked</span>
+<span class="sd"> to acquire a passphrase with which to protect the</span>
+<span class="sd"> key.</span>
+
+<span class="sd"> :return: M2Crypto.EVP.PKey object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">bio</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_new_file</span><span class="p">(</span><span class="nb">file</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">bio</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">BIO</span><span class="o">.</span><span class="n">BIOError</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+ <span class="n">cptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkey_read_pem</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">bio_free</span><span class="p">(</span><span class="n">bio</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">cptr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">EVPError</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">PKey</span><span class="p">(</span><span class="n">cptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_key_bio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.load_key_bio">[docs]</a><span class="k">def</span> <span class="nf">load_key_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO, Callable) -&gt; PKey</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Load an M2Crypto.EVP.PKey from an M2Crypto.BIO object.</span>
+
+<span class="sd"> :param bio: M2Crypto.BIO object containing the key in PEM format.</span>
+
+<span class="sd"> :param callback: A Python callable object that is invoked</span>
+<span class="sd"> to acquire a passphrase with which to protect the</span>
+<span class="sd"> key.</span>
+
+<span class="sd"> :return: M2Crypto.EVP.PKey object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">cptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkey_read_pem</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">callback</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">cptr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">EVPError</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">PKey</span><span class="p">(</span><span class="n">cptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_key_bio_pubkey"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.load_key_bio_pubkey">[docs]</a><span class="k">def</span> <span class="nf">load_key_bio_pubkey</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO, Callable) -&gt; PKey</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Load an M2Crypto.EVP.PKey from a public key as a M2Crypto.BIO object.</span>
+
+<span class="sd"> :param bio: M2Crypto.BIO object containing the key in PEM format.</span>
+
+<span class="sd"> :param callback: A Python callable object that is invoked</span>
+<span class="sd"> to acquire a passphrase with which to protect the</span>
+<span class="sd"> key.</span>
+
+<span class="sd"> :return: M2Crypto.EVP.PKey object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">cptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkey_read_pem_pubkey</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">callback</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">cptr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">EVPError</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">PKey</span><span class="p">(</span><span class="n">cptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_key_string"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.load_key_string">[docs]</a><span class="k">def</span> <span class="nf">load_key_string</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, Callable) -&gt; PKey</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Load an M2Crypto.EVP.PKey from a string.</span>
+
+<span class="sd"> :param string: String containing the key in PEM format.</span>
+
+<span class="sd"> :param callback: A Python callable object that is invoked</span>
+<span class="sd"> to acquire a passphrase with which to protect the</span>
+<span class="sd"> key.</span>
+
+<span class="sd"> :return: M2Crypto.EVP.PKey object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">bio</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">load_key_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_key_string_pubkey"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.EVP.load_key_string_pubkey">[docs]</a><span class="k">def</span> <span class="nf">load_key_string_pubkey</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, Callable) -&gt; PKey</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Load an M2Crypto.EVP.PKey from a public key as a string.</span>
+
+<span class="sd"> :param string: String containing the key in PEM format.</span>
+
+<span class="sd"> :param callback: A Python callable object that is invoked</span>
+<span class="sd"> to acquire a passphrase with which to protect the</span>
+<span class="sd"> key.</span>
+
+<span class="sd"> :return: M2Crypto.EVP.PKey object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">bio</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">load_key_bio_pubkey</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/Engine.html b/doc/html/_modules/M2Crypto/Engine.html
new file mode 100644
index 0000000..9812dbb
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/Engine.html
@@ -0,0 +1,239 @@
+
+
+<!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>M2Crypto.Engine &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../index.html" />
+ <link rel="up" title="Module code" href="../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.Engine</h1><div class="highlight"><pre>
+<span></span><span class="c1"># vim: sts=4 sw=4 et</span>
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">M2Crypto wrapper for OpenSSL ENGINE API.</span>
+
+<span class="sd">Pavel Shramov</span>
+<span class="sd">IMEC MSU</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">EVP</span><span class="p">,</span> <span class="n">Err</span><span class="p">,</span> <span class="n">X509</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">six</span><span class="p">,</span> <span class="n">util</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Callable</span><span class="p">,</span> <span class="n">Optional</span> <span class="c1"># noqa</span>
+
+
+<div class="viewcode-block" id="EngineError"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Engine.EngineError">[docs]</a><span class="k">class</span> <span class="nc">EngineError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
+ <span class="k">pass</span>
+</div>
+<span class="n">m2</span><span class="o">.</span><span class="n">engine_init_error</span><span class="p">(</span><span class="n">EngineError</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="Engine"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Engine.Engine">[docs]</a><span class="k">class</span> <span class="nc">Engine</span><span class="p">:</span>
+ <span class="sd">&quot;&quot;&quot;Wrapper for ENGINE object.&quot;&quot;&quot;</span>
+
+ <span class="n">m2_engine_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">engine_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">_ptr</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[bytes], Optional[bytes], int) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;Create new Engine from ENGINE pointer or obtain by id&quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">_ptr</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">id</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;No engine id specified&quot;</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_ptr</span> <span class="o">=</span> <span class="n">_ptr</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_ptr</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_ptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">engine_by_id</span><span class="p">(</span><span class="nb">id</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_ptr</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Unknown engine: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="nb">id</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="n">_pyfree</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_pyfree&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_engine_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_ptr</span><span class="p">)</span>
+
+<div class="viewcode-block" id="Engine.init"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Engine.Engine.init">[docs]</a> <span class="k">def</span> <span class="nf">init</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;Obtain a functional reference to the engine.</span>
+
+<span class="sd"> :return: 0 on error, non-zero on success.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">engine_init</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_ptr</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Engine.finish"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Engine.Engine.finish">[docs]</a> <span class="k">def</span> <span class="nf">finish</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;Release a functional and structural reference to the engine.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">engine_finish</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_ptr</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Engine.ctrl_cmd_string"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Engine.Engine.ctrl_cmd_string">[docs]</a> <span class="k">def</span> <span class="nf">ctrl_cmd_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cmd</span><span class="p">,</span> <span class="n">arg</span><span class="p">,</span> <span class="n">optional</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, Optional[bytes], int) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;Call ENGINE_ctrl_cmd_string&quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">m2</span><span class="o">.</span><span class="n">engine_ctrl_cmd_string</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_ptr</span><span class="p">,</span> <span class="n">cmd</span><span class="p">,</span> <span class="n">arg</span><span class="p">,</span> <span class="n">optional</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">EngineError</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+</div>
+<div class="viewcode-block" id="Engine.get_name"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Engine.Engine.get_name">[docs]</a> <span class="k">def</span> <span class="nf">get_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="sd">&quot;&quot;&quot;Return engine name&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">engine_get_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_ptr</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Engine.get_id"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Engine.Engine.get_id">[docs]</a> <span class="k">def</span> <span class="nf">get_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="sd">&quot;&quot;&quot;Return engine id&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">engine_get_id</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_ptr</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Engine.set_default"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Engine.Engine.set_default">[docs]</a> <span class="k">def</span> <span class="nf">set_default</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">methods</span><span class="o">=</span><span class="n">m2</span><span class="o">.</span><span class="n">ENGINE_METHOD_ALL</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Use this engine as default for methods specified in argument</span>
+
+<span class="sd"> :param methods: Possible values are bitwise OR of m2.ENGINE_METHOD_*</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">engine_set_default</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_ptr</span><span class="p">,</span> <span class="n">methods</span><span class="p">)</span>
+</div>
+ <span class="k">def</span> <span class="nf">_engine_load_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">func</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">pin</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (Callable, bytes, Optional[bytes]) -&gt; EVP.PKey</span>
+ <span class="sd">&quot;&quot;&quot;Helper function for loading keys&quot;&quot;&quot;</span>
+ <span class="n">ui</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">ui_openssl</span><span class="p">()</span>
+ <span class="n">cbd</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">engine_pkcs11_data_new</span><span class="p">(</span><span class="n">pin</span><span class="p">)</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">kptr</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_ptr</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">ui</span><span class="p">,</span> <span class="n">cbd</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">kptr</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">EngineError</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+ <span class="n">key</span> <span class="o">=</span> <span class="n">EVP</span><span class="o">.</span><span class="n">PKey</span><span class="p">(</span><span class="n">kptr</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
+ <span class="k">finally</span><span class="p">:</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">engine_pkcs11_data_free</span><span class="p">(</span><span class="n">cbd</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">key</span>
+
+<div class="viewcode-block" id="Engine.load_private_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Engine.Engine.load_private_key">[docs]</a> <span class="k">def</span> <span class="nf">load_private_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">pin</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, Optional[bytes]) -&gt; X509.X509</span>
+ <span class="sd">&quot;&quot;&quot;Load private key with engine methods (e.g from smartcard).</span>
+<span class="sd"> If pin is not set it will be asked</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_engine_load_key</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">engine_load_private_key</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">pin</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Engine.load_public_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Engine.Engine.load_public_key">[docs]</a> <span class="k">def</span> <span class="nf">load_public_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">pin</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, Optional[bytes]) -&gt; EVP.PKey</span>
+ <span class="sd">&quot;&quot;&quot;Load public key with engine methods (e.g from smartcard).&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_engine_load_key</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">engine_load_public_key</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">pin</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Engine.load_certificate"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Engine.Engine.load_certificate">[docs]</a> <span class="k">def</span> <span class="nf">load_certificate</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; X509.X509</span>
+ <span class="sd">&quot;&quot;&quot;Load certificate from engine (e.g from smartcard).</span>
+<span class="sd"> NOTE: This function may be not implemented by engine!&quot;&quot;&quot;</span>
+ <span class="n">cptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">engine_load_certificate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_ptr</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">cptr</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">EngineError</span><span class="p">(</span><span class="s2">&quot;Certificate or card not found&quot;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">X509</span><span class="o">.</span><span class="n">X509</span><span class="p">(</span><span class="n">cptr</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
+
+</div></div>
+<div class="viewcode-block" id="load_dynamic_engine"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Engine.load_dynamic_engine">[docs]</a><span class="k">def</span> <span class="nf">load_dynamic_engine</span><span class="p">(</span><span class="nb">id</span><span class="p">,</span> <span class="n">sopath</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, AnyStr) -&gt; Engine</span>
+ <span class="sd">&quot;&quot;&quot;Load and return dymanic engine from sopath and assign id to it&quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">sopath</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">text_type</span><span class="p">):</span>
+ <span class="n">sopath</span> <span class="o">=</span> <span class="n">sopath</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;utf8&#39;</span><span class="p">)</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">engine_load_dynamic</span><span class="p">()</span>
+ <span class="n">e</span> <span class="o">=</span> <span class="n">Engine</span><span class="p">(</span><span class="s1">&#39;dynamic&#39;</span><span class="p">)</span>
+ <span class="n">e</span><span class="o">.</span><span class="n">ctrl_cmd_string</span><span class="p">(</span><span class="n">b</span><span class="s1">&#39;SO_PATH&#39;</span><span class="p">,</span> <span class="n">sopath</span><span class="p">)</span>
+ <span class="n">e</span><span class="o">.</span><span class="n">ctrl_cmd_string</span><span class="p">(</span><span class="n">b</span><span class="s1">&#39;ID&#39;</span><span class="p">,</span> <span class="nb">id</span><span class="p">)</span>
+ <span class="n">e</span><span class="o">.</span><span class="n">ctrl_cmd_string</span><span class="p">(</span><span class="n">b</span><span class="s1">&#39;LIST_ADD&#39;</span><span class="p">,</span> <span class="s1">&#39;1&#39;</span><span class="p">)</span>
+ <span class="n">e</span><span class="o">.</span><span class="n">ctrl_cmd_string</span><span class="p">(</span><span class="n">b</span><span class="s1">&#39;LOAD&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">e</span>
+
+</div>
+<div class="viewcode-block" id="load_dynamic"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Engine.load_dynamic">[docs]</a><span class="k">def</span> <span class="nf">load_dynamic</span><span class="p">():</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;Load dynamic engine&quot;&quot;&quot;</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">engine_load_dynamic</span><span class="p">()</span>
+
+</div>
+<div class="viewcode-block" id="load_openssl"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Engine.load_openssl">[docs]</a><span class="k">def</span> <span class="nf">load_openssl</span><span class="p">():</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;Load openssl engine&quot;&quot;&quot;</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">engine_load_openssl</span><span class="p">()</span>
+
+</div>
+<div class="viewcode-block" id="cleanup"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Engine.cleanup">[docs]</a><span class="k">def</span> <span class="nf">cleanup</span><span class="p">():</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;If you load any engines, you need to clean up after your application</span>
+<span class="sd"> is finished with the engines.&quot;&quot;&quot;</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">engine_cleanup</span><span class="p">()</span></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/Err.html b/doc/html/_modules/M2Crypto/Err.html
new file mode 100644
index 0000000..955ab09
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/Err.html
@@ -0,0 +1,162 @@
+
+
+<!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>M2Crypto.Err &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../index.html" />
+ <link rel="up" title="Module code" href="../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.Err</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+
+<span class="sd">&quot;&quot;&quot;M2Crypto wrapper for OpenSSL Error API.</span>
+
+<span class="sd">Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span><span class="p">,</span> <span class="n">six</span> <span class="c1"># noqa</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Optional</span> <span class="c1"># noqa</span>
+
+
+<div class="viewcode-block" id="get_error"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Err.get_error">[docs]</a><span class="k">def</span> <span class="nf">get_error</span><span class="p">():</span>
+ <span class="c1"># type: () -&gt; Optional[str]</span>
+ <span class="n">err</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">err_print_errors</span><span class="p">(</span><span class="n">err</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">())</span>
+ <span class="n">err_msg</span> <span class="o">=</span> <span class="n">err</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">err_msg</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">err_msg</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="get_error_code"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Err.get_error_code">[docs]</a><span class="k">def</span> <span class="nf">get_error_code</span><span class="p">():</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">err_get_error</span><span class="p">()</span>
+
+</div>
+<div class="viewcode-block" id="peek_error_code"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Err.peek_error_code">[docs]</a><span class="k">def</span> <span class="nf">peek_error_code</span><span class="p">():</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">err_peek_error</span><span class="p">()</span>
+
+</div>
+<div class="viewcode-block" id="get_error_lib"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Err.get_error_lib">[docs]</a><span class="k">def</span> <span class="nf">get_error_lib</span><span class="p">(</span><span class="n">err</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; str</span>
+ <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">err_lib_error_string</span><span class="p">(</span><span class="n">err</span><span class="p">))</span>
+
+</div>
+<div class="viewcode-block" id="get_error_func"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Err.get_error_func">[docs]</a><span class="k">def</span> <span class="nf">get_error_func</span><span class="p">(</span><span class="n">err</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; str</span>
+ <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">err_func_error_string</span><span class="p">(</span><span class="n">err</span><span class="p">))</span>
+
+</div>
+<div class="viewcode-block" id="get_error_reason"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Err.get_error_reason">[docs]</a><span class="k">def</span> <span class="nf">get_error_reason</span><span class="p">(</span><span class="n">err</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; str</span>
+ <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">err_reason_error_string</span><span class="p">(</span><span class="n">err</span><span class="p">))</span>
+
+</div>
+<div class="viewcode-block" id="get_x509_verify_error"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Err.get_x509_verify_error">[docs]</a><span class="k">def</span> <span class="nf">get_x509_verify_error</span><span class="p">(</span><span class="n">err</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; str</span>
+ <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">x509_get_verify_error</span><span class="p">(</span><span class="n">err</span><span class="p">))</span>
+
+</div>
+<div class="viewcode-block" id="SSLError"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Err.SSLError">[docs]</a><span class="k">class</span> <span class="nc">SSLError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">err</span><span class="p">,</span> <span class="n">client_addr</span><span class="p">):</span>
+ <span class="c1"># type: (int, util.AddrType) -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">err</span> <span class="o">=</span> <span class="n">err</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">client_addr</span> <span class="o">=</span> <span class="n">client_addr</span>
+
+ <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; str</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">client_addr</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">text_type</span><span class="p">):</span>
+ <span class="n">s</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">client_addr</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;utf8&#39;</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">s</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">client_addr</span>
+ <span class="k">return</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">get_error_func</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">err</span><span class="p">),</span> <span class="n">s</span><span class="p">,</span>
+ <span class="n">get_error_reason</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">err</span><span class="p">))</span>
+
+</div>
+<div class="viewcode-block" id="M2CryptoError"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Err.M2CryptoError">[docs]</a><span class="k">class</span> <span class="nc">M2CryptoError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
+ <span class="k">pass</span></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/PGP/PublicKey.html b/doc/html/_modules/M2Crypto/PGP/PublicKey.html
new file mode 100644
index 0000000..8e9593b
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/PGP/PublicKey.html
@@ -0,0 +1,169 @@
+
+
+<!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>M2Crypto.PGP.PublicKey &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../../index.html" />
+ <link rel="up" title="Module code" href="../../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.PGP.PublicKey</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+
+<span class="sd">&quot;&quot;&quot;M2Crypto PGP2.</span>
+
+<span class="sd">Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto.PGP.RSA</span> <span class="kn">import</span> <span class="n">new_pub_key</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.RSA</span> <span class="kn">import</span> <span class="n">pkcs1_padding</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.PGP.packet</span> <span class="kn">import</span> <span class="n">PublicKeyPacket</span> <span class="c1"># noqa</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.PGP.constants</span> <span class="kn">import</span> <span class="o">*</span> <span class="c1"># noqa</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.PGP.packet</span> <span class="kn">import</span> <span class="o">*</span> <span class="c1"># noqa</span>
+
+
+<div class="viewcode-block" id="PublicKey"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.PublicKey.PublicKey">[docs]</a><span class="k">class</span> <span class="nc">PublicKey</span><span class="p">:</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pubkey_pkt</span><span class="p">):</span>
+ <span class="c1"># type: (PublicKeyPacket) -&gt; None</span>
+ <span class="kn">import</span> <span class="nn">warnings</span>
+ <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
+ <span class="s1">&#39;Deprecated. No maintainer for PGP. If you use this, &#39;</span> <span class="o">+</span>
+ <span class="s1">&#39;please inform M2Crypto maintainer.&#39;</span><span class="p">,</span>
+ <span class="ne">DeprecationWarning</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pubkey_pkt</span> <span class="o">=</span> <span class="n">pubkey_pkt</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pubkey</span> <span class="o">=</span> <span class="n">new_pub_key</span><span class="p">((</span><span class="n">pubkey_pkt</span><span class="o">.</span><span class="n">_e</span><span class="p">,</span> <span class="n">pubkey_pkt</span><span class="o">.</span><span class="n">_n</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_userid</span> <span class="o">=</span> <span class="p">{}</span> <span class="c1"># type: dict</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_signature</span> <span class="o">=</span> <span class="p">{}</span> <span class="c1"># type: dict</span>
+
+<div class="viewcode-block" id="PublicKey.keyid"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.PublicKey.PublicKey.keyid">[docs]</a> <span class="k">def</span> <span class="nf">keyid</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pubkey</span><span class="o">.</span><span class="n">n</span><span class="p">[</span><span class="o">-</span><span class="mi">8</span><span class="p">:]</span>
+</div>
+<div class="viewcode-block" id="PublicKey.add_userid"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.PublicKey.PublicKey.add_userid">[docs]</a> <span class="k">def</span> <span class="nf">add_userid</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">u_pkt</span><span class="p">):</span>
+ <span class="c1"># type: (Packet.UserIDPacket) -&gt; None</span>
+ <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">u_pkt</span><span class="p">,</span> <span class="n">UserIDPacket</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_userid</span><span class="p">[</span><span class="n">u_pkt</span><span class="o">.</span><span class="n">userid</span><span class="p">()]</span> <span class="o">=</span> <span class="n">u_pkt</span>
+</div>
+<div class="viewcode-block" id="PublicKey.remove_userid"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.PublicKey.PublicKey.remove_userid">[docs]</a> <span class="k">def</span> <span class="nf">remove_userid</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">userid</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; None</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_userid</span><span class="p">[</span><span class="n">userid</span><span class="p">]</span>
+</div>
+<div class="viewcode-block" id="PublicKey.add_signature"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.PublicKey.PublicKey.add_signature">[docs]</a> <span class="k">def</span> <span class="nf">add_signature</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">userid</span><span class="p">,</span> <span class="n">s_pkt</span><span class="p">):</span>
+ <span class="c1"># type: (int, SignaturePacket) -&gt; None</span>
+ <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">s_pkt</span><span class="p">,</span> <span class="n">SignaturePacket</span><span class="p">)</span>
+ <span class="k">assert</span> <span class="n">userid</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_userid</span>
+ <span class="k">if</span> <span class="n">userid</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_signature</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_signature</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">s_pkt</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_signature</span> <span class="o">=</span> <span class="p">[</span><span class="n">s_pkt</span><span class="p">]</span>
+</div>
+ <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; SignaturePacket</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_userid</span><span class="p">[</span><span class="nb">id</span><span class="p">]</span>
+
+ <span class="k">def</span> <span class="nf">__setitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span>
+
+ <span class="k">def</span> <span class="nf">__delitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; None</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_userid</span><span class="p">[</span><span class="nb">id</span><span class="p">]</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_signature</span><span class="p">[</span><span class="nb">id</span><span class="p">]:</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_signature</span><span class="p">[</span><span class="nb">id</span><span class="p">]</span>
+
+<div class="viewcode-block" id="PublicKey.write"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.PublicKey.PublicKey.write">[docs]</a> <span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stream</span><span class="p">):</span>
+ <span class="c1"># type: (IO[bytes]) -&gt; None</span>
+ <span class="k">pass</span>
+</div>
+<div class="viewcode-block" id="PublicKey.encrypt"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.PublicKey.PublicKey.encrypt">[docs]</a> <span class="k">def</span> <span class="nf">encrypt</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ptxt</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; bytes</span>
+ <span class="c1"># XXX Munge ptxt into pgp format.</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pubkey</span><span class="o">.</span><span class="n">public_encrypt</span><span class="p">(</span><span class="n">ptxt</span><span class="p">,</span> <span class="n">pkcs1_padding</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="PublicKey.decrypt"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.PublicKey.PublicKey.decrypt">[docs]</a> <span class="k">def</span> <span class="nf">decrypt</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctxt</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; bytes</span>
+ <span class="c1"># XXX Munge ctxt into pgp format.</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pubkey</span><span class="o">.</span><span class="n">public_encrypt</span><span class="p">(</span><span class="n">ctxt</span><span class="p">,</span> <span class="n">pkcs1_padding</span><span class="p">)</span></div></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/PGP/PublicKeyRing.html b/doc/html/_modules/M2Crypto/PGP/PublicKeyRing.html
new file mode 100644
index 0000000..6ca29ed
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/PGP/PublicKeyRing.html
@@ -0,0 +1,192 @@
+
+
+<!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>M2Crypto.PGP.PublicKeyRing &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../../index.html" />
+ <link rel="up" title="Module code" href="../../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.PGP.PublicKeyRing</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+
+<span class="sd">&quot;&quot;&quot;M2Crypto PGP2.</span>
+
+<span class="sd">Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">util</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.PGP.PublicKey</span> <span class="kn">import</span> <span class="o">*</span> <span class="c1"># noqa</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.PGP.constants</span> <span class="kn">import</span> <span class="o">*</span> <span class="c1"># noqa</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.PGP.packet</span> <span class="kn">import</span> <span class="o">*</span> <span class="c1"># noqa</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Any</span><span class="p">,</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Tuple</span> <span class="c1"># noqa</span>
+
+
+<div class="viewcode-block" id="PublicKeyRing"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.PublicKeyRing.PublicKeyRing">[docs]</a><span class="k">class</span> <span class="nc">PublicKeyRing</span><span class="p">:</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">keyring</span><span class="p">):</span>
+ <span class="c1"># type: (object) -&gt; None</span>
+ <span class="kn">import</span> <span class="nn">warnings</span>
+ <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
+ <span class="s1">&#39;Deprecated. No maintainer for PGP. If you use this, &#39;</span> <span class="o">+</span>
+ <span class="s1">&#39;please inform M2Crypto maintainer.&#39;</span><span class="p">,</span>
+ <span class="ne">DeprecationWarning</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">_keyring</span> <span class="o">=</span> <span class="n">keyring</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_userid</span> <span class="o">=</span> <span class="p">{}</span> <span class="c1"># type: dict</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_keyid</span> <span class="o">=</span> <span class="p">{}</span> <span class="c1"># type: dict</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_spurious</span> <span class="o">=</span> <span class="p">[]</span> <span class="c1"># type: list</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pubkey</span> <span class="o">=</span> <span class="p">[]</span> <span class="c1"># type: list</span>
+
+<div class="viewcode-block" id="PublicKeyRing.load"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.PublicKeyRing.PublicKeyRing.load">[docs]</a> <span class="k">def</span> <span class="nf">load</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="n">curr_pub</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="n">curr_index</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>
+
+ <span class="n">ps</span> <span class="o">=</span> <span class="n">PacketStream</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_keyring</span><span class="p">)</span>
+ <span class="k">while</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="n">pkt</span> <span class="o">=</span> <span class="n">ps</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
+
+ <span class="k">if</span> <span class="n">pkt</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">break</span>
+
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">pkt</span><span class="p">,</span> <span class="n">PublicKeyPacket</span><span class="p">):</span>
+ <span class="n">curr_index</span> <span class="o">=</span> <span class="n">curr_index</span> <span class="o">+</span> <span class="mi">1</span>
+ <span class="n">curr_pub</span> <span class="o">=</span> <span class="n">PublicKey</span><span class="p">(</span><span class="n">pkt</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pubkey</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">curr_pub</span><span class="p">)</span>
+ <span class="c1"># self._keyid[curr_pub.keyid()] = (curr_pub, curr_index)</span>
+
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">pkt</span><span class="p">,</span> <span class="n">UserIDPacket</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">curr_pub</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_spurious</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">pkt</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">curr_pub</span><span class="o">.</span><span class="n">add_userid</span><span class="p">(</span><span class="n">pkt</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_userid</span><span class="p">[</span><span class="n">pkt</span><span class="o">.</span><span class="n">userid</span><span class="p">()]</span> <span class="o">=</span> <span class="p">(</span><span class="n">curr_pub</span><span class="p">,</span> <span class="n">curr_index</span><span class="p">)</span>
+
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">pkt</span><span class="p">,</span> <span class="n">SignaturePacket</span><span class="p">):</span>
+ <span class="k">if</span> <span class="n">curr_pub</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_spurious</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">pkt</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">curr_pub</span><span class="o">.</span><span class="n">add_signature</span><span class="p">(</span><span class="n">pkt</span><span class="p">)</span>
+
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_spurious</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">pkt</span><span class="p">)</span>
+
+ <span class="n">ps</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+</div>
+ <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; int</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_userid</span><span class="p">[</span><span class="nb">id</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
+
+ <span class="k">def</span> <span class="nf">__setitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
+ <span class="c1"># type: (*List[Any]) -&gt; None</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span>
+
+ <span class="k">def</span> <span class="nf">__delitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; None</span>
+ <span class="n">pkt</span><span class="p">,</span> <span class="n">idx</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_userid</span><span class="p">[</span><span class="nb">id</span><span class="p">]</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pubkey</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_userid</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span>
+ <span class="n">pkt</span><span class="p">,</span> <span class="n">idx</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_keyid</span><span class="p">[</span><span class="nb">id</span><span class="p">]</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_keyid</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span>
+
+<div class="viewcode-block" id="PublicKeyRing.spurious"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.PublicKeyRing.PublicKeyRing.spurious">[docs]</a> <span class="k">def</span> <span class="nf">spurious</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; Tuple[SignaturePacket]</span>
+ <span class="k">return</span> <span class="nb">tuple</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_spurious</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="PublicKeyRing.save"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.PublicKeyRing.PublicKeyRing.save">[docs]</a> <span class="k">def</span> <span class="nf">save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">keyring</span><span class="p">):</span>
+ <span class="c1"># type: (file) -&gt; None</span>
+ <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pubkey</span><span class="p">:</span>
+ <span class="n">pp</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">pack</span><span class="p">()</span>
+ <span class="n">keyring</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">pp</span><span class="p">)</span>
+
+</div></div>
+<div class="viewcode-block" id="load_pubring"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.PublicKeyRing.load_pubring">[docs]</a><span class="k">def</span> <span class="nf">load_pubring</span><span class="p">(</span><span class="n">filename</span><span class="o">=</span><span class="s1">&#39;pubring.pgp&#39;</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr) -&gt; PublicKeyRing</span>
+ <span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">pkr_f</span><span class="p">:</span>
+ <span class="n">pkr</span> <span class="o">=</span> <span class="n">PublicKeyRing</span><span class="p">(</span><span class="n">pkr_f</span><span class="p">)</span>
+ <span class="n">pkr</span><span class="o">.</span><span class="n">load</span><span class="p">()</span>
+ <span class="k">return</span> <span class="n">pkr</span></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/PGP/RSA.html b/doc/html/_modules/M2Crypto/PGP/RSA.html
new file mode 100644
index 0000000..4c2151d
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/PGP/RSA.html
@@ -0,0 +1,122 @@
+
+
+<!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>M2Crypto.PGP.RSA &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../../index.html" />
+ <link rel="up" title="Module code" href="../../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.PGP.RSA</h1><div class="highlight"><pre>
+<span></span><span class="sd">&quot;&quot;&quot;M2Crypto PGP2 RSA.</span>
+
+<span class="sd">Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.RSA</span> <span class="kn">import</span> <span class="n">RSA_pub</span> <span class="c1"># noqa</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Tuple</span> <span class="c1"># noqa</span>
+
+
+<div class="viewcode-block" id="new_pub_key"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.RSA.new_pub_key">[docs]</a><span class="k">def</span> <span class="nf">new_pub_key</span><span class="p">(</span><span class="n">e_n</span><span class="p">):</span>
+ <span class="c1"># type: (Tuple[int, int]) -&gt; RSA_pub</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Factory function that instantiates an RSA_pub object from a (e, n) tuple.</span>
+
+<span class="sd"> &#39;e&#39; is the RSA public exponent; it is a string in OpenSSL&#39;s binary format,</span>
+<span class="sd"> i.e., a number of bytes in big-endian.</span>
+
+<span class="sd"> &#39;n&#39; is the RSA composite of primes; it is a string in OpenSSL&#39;s</span>
+<span class="sd"> binary format, i.e., a number of bytes in big-endian.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="kn">import</span> <span class="nn">warnings</span>
+ <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s1">&#39;Deprecated. No maintainer for PGP. If you use this, please inform M2Crypto maintainer.&#39;</span><span class="p">,</span> <span class="ne">DeprecationWarning</span><span class="p">)</span>
+
+ <span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="o">=</span> <span class="n">e_n</span>
+ <span class="n">rsa</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_new</span><span class="p">()</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">rsa_set_en_bin</span><span class="p">(</span><span class="n">rsa</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">RSA_pub</span><span class="p">(</span><span class="n">rsa</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/PGP/packet.html b/doc/html/_modules/M2Crypto/PGP/packet.html
new file mode 100644
index 0000000..bef4f47
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/PGP/packet.html
@@ -0,0 +1,514 @@
+
+
+<!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>M2Crypto.PGP.packet &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../../index.html" />
+ <link rel="up" title="Module code" href="../../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.PGP.packet</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+
+<span class="sd">&quot;&quot;&quot;M2Crypto PGP2.</span>
+
+<span class="sd">This module implements PGP packets per RFC1991 and various source</span>
+<span class="sd">distributions.</span>
+
+<span class="sd">Each Packet type is represented by a class; Packet classes derive from</span>
+<span class="sd">the abstract &#39;Packet&#39; class.</span>
+
+<span class="sd">The &#39;message digest&#39; Packet type, mentioned but not documented in RFC1991,</span>
+<span class="sd">is not implemented.</span>
+
+<span class="sd">Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.&quot;&quot;&quot;</span>
+
+<span class="c1"># XXX Work-in-progress. UNFINISHED, type hinting is probably wrong!!!</span>
+
+<span class="c1"># Be liberal in what you accept.</span>
+<span class="c1"># Be conservative in what you send.</span>
+<span class="c1"># Be lazy in what you eval.</span>
+
+<span class="kn">import</span> <span class="nn">struct</span>
+
+<span class="kn">from</span> <span class="nn">io</span> <span class="kn">import</span> <span class="n">BytesIO</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">util</span> <span class="c1"># noqa</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.util</span> <span class="kn">import</span> <span class="n">octx_to_num</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.PGP</span> <span class="kn">import</span> <span class="n">constants</span> <span class="c1"># noqa</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">IO</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Tuple</span> <span class="c1"># noqa</span>
+
+<span class="n">_OK_VERSION</span> <span class="o">=</span> <span class="p">(</span><span class="s1">&#39;</span><span class="se">\002</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\003</span><span class="s1">&#39;</span><span class="p">)</span>
+<span class="n">_OK_VALIDITY</span> <span class="o">=</span> <span class="p">(</span><span class="s1">&#39;</span><span class="se">\000</span><span class="s1">&#39;</span><span class="p">,)</span>
+<span class="n">_OK_PKC</span> <span class="o">=</span> <span class="p">(</span><span class="s1">&#39;</span><span class="se">\001</span><span class="s1">&#39;</span><span class="p">,)</span>
+
+
+<div class="viewcode-block" id="XXXError"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.XXXError">[docs]</a><span class="k">class</span> <span class="nc">XXXError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
+ <span class="k">pass</span>
+
+</div>
+<div class="viewcode-block" id="Packet"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.Packet">[docs]</a><span class="k">class</span> <span class="nc">Packet</span><span class="p">:</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctb</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (int, Optional[str]) -&gt; None</span>
+ <span class="kn">import</span> <span class="nn">warnings</span>
+ <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
+ <span class="s1">&#39;Deprecated. No maintainer for PGP. If you use this, &#39;</span> <span class="o">+</span>
+ <span class="s1">&#39;please inform M2Crypto maintainer.&#39;</span><span class="p">,</span>
+ <span class="ne">DeprecationWarning</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">ctb</span> <span class="o">=</span> <span class="n">ctb</span>
+ <span class="k">if</span> <span class="n">body</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="o">=</span> <span class="n">BytesIO</span><span class="p">(</span><span class="n">body</span><span class="p">)</span> <span class="c1"># type: Optional[IO[str]]</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="o">=</span> <span class="bp">None</span>
+
+<div class="viewcode-block" id="Packet.validate"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.Packet.validate">[docs]</a> <span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">return</span> <span class="mi">1</span>
+</div>
+<div class="viewcode-block" id="Packet.pack"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.Packet.pack">[docs]</a> <span class="k">def</span> <span class="nf">pack</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%s</span><span class="s1">.pack(): abstract method&#39;</span> <span class="o">%</span>
+ <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="p">,))</span>
+</div>
+<div class="viewcode-block" id="Packet.version"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.Packet.version">[docs]</a> <span class="k">def</span> <span class="nf">version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; Optional[int]</span>
+ <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_version&#39;</span><span class="p">):</span>
+ <span class="k">return</span> <span class="nb">ord</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_version</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">None</span>
+</div>
+<div class="viewcode-block" id="Packet.timestamp"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.Packet.timestamp">[docs]</a> <span class="k">def</span> <span class="nf">timestamp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; Optional[int]</span>
+ <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_timestamp&#39;</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&gt;L&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_timestamp</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">None</span>
+</div>
+<div class="viewcode-block" id="Packet.validity"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.Packet.validity">[docs]</a> <span class="k">def</span> <span class="nf">validity</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; Optional[int]</span>
+ <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_validity&#39;</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&gt;H&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_validity</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">None</span>
+</div>
+<div class="viewcode-block" id="Packet.pkc"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.Packet.pkc">[docs]</a> <span class="k">def</span> <span class="nf">pkc</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; Optional[bytes]</span>
+ <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_pkc&#39;</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pkc</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">None</span>
+</div>
+ <span class="k">def</span> <span class="nf">_llf</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">lenf</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; Tuple[int, bytes]</span>
+ <span class="k">if</span> <span class="n">lenf</span> <span class="o">&lt;</span> <span class="mi">256</span><span class="p">:</span>
+ <span class="k">return</span> <span class="mi">0</span><span class="p">,</span> <span class="nb">chr</span><span class="p">(</span><span class="n">lenf</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="n">lenf</span> <span class="o">&lt;</span> <span class="mi">65536</span><span class="p">:</span>
+ <span class="k">return</span> <span class="mi">1</span><span class="p">,</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&gt;H&#39;</span><span class="p">,</span> <span class="n">lenf</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="n">lenf</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="o">**</span><span class="mi">32</span>
+ <span class="k">return</span> <span class="mi">2</span><span class="p">,</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&gt;L&#39;</span><span class="p">,</span> <span class="n">lenf</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">_ctb</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">llf</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; int</span>
+ <span class="n">ctbv</span> <span class="o">=</span> <span class="n">_FACTORY</span><span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="p">]</span>
+ <span class="k">return</span> <span class="nb">chr</span><span class="p">((</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="mi">7</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="n">ctbv</span> <span class="o">&lt;&lt;</span> <span class="mi">2</span><span class="p">)</span> <span class="o">|</span> <span class="n">llf</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="PublicKeyPacket"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.PublicKeyPacket">[docs]</a><span class="k">class</span> <span class="nc">PublicKeyPacket</span><span class="p">(</span><span class="n">Packet</span><span class="p">):</span> <span class="c1"># noqa</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctb</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (int, Optional[IO[str]) -&gt; None</span>
+ <span class="n">Packet</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctb</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_version</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_timestamp</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_validity</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pkc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">_nlen</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
+ <span class="n">nlen</span> <span class="o">=</span> <span class="p">(</span><span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&gt;H&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_nlen</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="mi">7</span><span class="p">)</span> <span class="o">/</span> <span class="mi">8</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_n</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">nlen</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">_elen</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
+ <span class="n">elen</span> <span class="o">=</span> <span class="p">(</span><span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&gt;H&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_elen</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="mi">7</span><span class="p">)</span> <span class="o">/</span> <span class="mi">8</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_e</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">elen</span><span class="p">)</span>
+
+<div class="viewcode-block" id="PublicKeyPacket.pack"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.PublicKeyPacket.pack">[docs]</a> <span class="k">def</span> <span class="nf">pack</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; str</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="o">=</span> <span class="n">BytesIO</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_version</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_timestamp</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_validity</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_pkc</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_nlen</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_n</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_elen</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_e</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
+ <span class="n">llf</span><span class="p">,</span> <span class="n">lenf</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_llf</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="p">))</span>
+ <span class="n">ctb</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_ctb</span><span class="p">(</span><span class="n">llf</span><span class="p">)</span>
+ <span class="k">return</span> <span class="s1">&#39;</span><span class="si">%s%s%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">ctb</span><span class="p">,</span> <span class="n">lenf</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="PublicKeyPacket.pubkey"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.PublicKeyPacket.pubkey">[docs]</a> <span class="k">def</span> <span class="nf">pubkey</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pubkey</span><span class="o">.</span><span class="n">pub</span><span class="p">()</span>
+
+</div></div>
+<div class="viewcode-block" id="TrustPacket"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.TrustPacket">[docs]</a><span class="k">class</span> <span class="nc">TrustPacket</span><span class="p">(</span><span class="n">Packet</span><span class="p">):</span> <span class="c1"># noqa</span>
+ <span class="c1"># This implementation neither interprets nor emits trust packets.</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctb</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (int, Optional[AnyStr]) -&gt; None</span>
+ <span class="n">Packet</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctb</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">body</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">trust</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="UserIDPacket"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.UserIDPacket">[docs]</a><span class="k">class</span> <span class="nc">UserIDPacket</span><span class="p">(</span><span class="n">Packet</span><span class="p">):</span> <span class="c1"># noqa</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctb</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (int, Optional[str]) -&gt; None</span>
+ <span class="n">Packet</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctb</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">body</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_userid</span> <span class="o">=</span> <span class="n">body</span>
+
+<div class="viewcode-block" id="UserIDPacket.pack"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.UserIDPacket.pack">[docs]</a> <span class="k">def</span> <span class="nf">pack</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="o">+=</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_userid</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_userid</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">ctb</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span>
+</div>
+<div class="viewcode-block" id="UserIDPacket.userid"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.UserIDPacket.userid">[docs]</a> <span class="k">def</span> <span class="nf">userid</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_userid</span>
+
+</div></div>
+<div class="viewcode-block" id="CommentPacket"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.CommentPacket">[docs]</a><span class="k">class</span> <span class="nc">CommentPacket</span><span class="p">(</span><span class="n">Packet</span><span class="p">):</span> <span class="c1"># noqa</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctb</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (int, Optional[int]) -&gt; None</span>
+ <span class="n">Packet</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctb</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">body</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">comment</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
+
+<div class="viewcode-block" id="CommentPacket.pack"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.CommentPacket.pack">[docs]</a> <span class="k">def</span> <span class="nf">pack</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">comment</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">comment</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">ctb</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span>
+
+</div></div>
+<div class="viewcode-block" id="SignaturePacket"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.SignaturePacket">[docs]</a><span class="k">class</span> <span class="nc">SignaturePacket</span><span class="p">(</span><span class="n">Packet</span><span class="p">):</span> <span class="c1"># noqa</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctb</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (int, Optional[IO[bytes]]) -&gt; None</span>
+ <span class="n">Packet</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctb</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">body</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_version</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_len_md_stuff</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_classification</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_timestamp</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_keyid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">8</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pkc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_md_algo</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_md_chksum</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_sig</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
+
+<div class="viewcode-block" id="SignaturePacket.pack"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.SignaturePacket.pack">[docs]</a> <span class="k">def</span> <span class="nf">pack</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; str</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_version</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_len_md_stuff</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_classification</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_timestamp</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_keyid</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pkc</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_md_algo</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_md_chksum</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sig</span>
+ <span class="n">llf</span><span class="p">,</span> <span class="n">lenf</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_llf</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="p">))</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ctb</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ctb</span> <span class="o">|</span> <span class="n">llf</span>
+ <span class="k">return</span> <span class="s1">&#39;</span><span class="si">%s%s%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctb</span><span class="p">,</span> <span class="n">lenf</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="SignaturePacket.validate"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.SignaturePacket.validate">[docs]</a> <span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="c1"># FIXME this looks broken ... returning None always?</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_version</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">_OK_VERSION</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">None</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_len_md_stuff</span> <span class="o">!=</span> <span class="s1">&#39;</span><span class="se">\005</span><span class="s1">&#39;</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">None</span>
+
+</div></div>
+<div class="viewcode-block" id="PrivateKeyPacket"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.PrivateKeyPacket">[docs]</a><span class="k">class</span> <span class="nc">PrivateKeyPacket</span><span class="p">(</span><span class="n">Packet</span><span class="p">):</span> <span class="c1"># noqa</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctb</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (int, IO[bytes]) -&gt; None</span>
+ <span class="n">Packet</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctb</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">body</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_version</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_timestamp</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_validity</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pkc</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">_nlen</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
+ <span class="n">nlen</span> <span class="o">=</span> <span class="p">(</span><span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&gt;H&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_nlen</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="mi">7</span><span class="p">)</span> <span class="o">/</span> <span class="mi">8</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_n</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">nlen</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">_elen</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
+ <span class="n">elen</span> <span class="o">=</span> <span class="p">(</span><span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&gt;H&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_elen</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="mi">7</span><span class="p">)</span> <span class="o">/</span> <span class="mi">8</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_e</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">elen</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">_cipher</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cipher</span> <span class="o">==</span> <span class="s1">&#39;</span><span class="se">\001</span><span class="s1">&#39;</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_iv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">8</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_iv</span> <span class="o">=</span> <span class="bp">None</span>
+
+ <span class="k">for</span> <span class="n">param</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">&#39;d&#39;</span><span class="p">,</span> <span class="s1">&#39;p&#39;</span><span class="p">,</span> <span class="s1">&#39;q&#39;</span><span class="p">,</span> <span class="s1">&#39;u&#39;</span><span class="p">]:</span>
+ <span class="n">_plen</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
+ <span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_&#39;</span> <span class="o">+</span> <span class="n">param</span> <span class="o">+</span> <span class="s1">&#39;len&#39;</span><span class="p">,</span> <span class="n">_plen</span><span class="p">)</span>
+ <span class="n">plen</span> <span class="o">=</span> <span class="p">(</span><span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&gt;H&#39;</span><span class="p">,</span> <span class="n">_plen</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="mi">7</span><span class="p">)</span> <span class="o">/</span> <span class="mi">8</span>
+ <span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_&#39;</span> <span class="o">+</span> <span class="n">param</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">plen</span><span class="p">))</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">_cksum</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
+
+<div class="viewcode-block" id="PrivateKeyPacket.is_encrypted"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.PrivateKeyPacket.is_encrypted">[docs]</a> <span class="k">def</span> <span class="nf">is_encrypted</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">return</span> <span class="nb">ord</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_cipher</span><span class="p">)</span>
+
+</div></div>
+<div class="viewcode-block" id="CKEPacket"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.CKEPacket">[docs]</a><span class="k">class</span> <span class="nc">CKEPacket</span><span class="p">(</span><span class="n">Packet</span><span class="p">):</span> <span class="c1"># noqa</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctb</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (int, IO[bytes]) -&gt; None</span>
+ <span class="n">Packet</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctb</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">body</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_iv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">8</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_cksum</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_ctxt</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
+
+</div>
+<div class="viewcode-block" id="PKEPacket"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.PKEPacket">[docs]</a><span class="k">class</span> <span class="nc">PKEPacket</span><span class="p">(</span><span class="n">Packet</span><span class="p">):</span> <span class="c1"># noqa</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctb</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (int, IO[bytes]) -&gt; None</span>
+ <span class="n">Packet</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctb</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">body</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_version</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_keyid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">8</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pkc</span> <span class="o">=</span> <span class="nb">ord</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>
+
+ <span class="n">deklen</span> <span class="o">=</span> <span class="p">(</span><span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&gt;H&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">2</span><span class="p">))[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="mi">7</span><span class="p">)</span> <span class="o">/</span> <span class="mi">8</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_dek</span> <span class="o">=</span> <span class="n">octx_to_num</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">deklen</span><span class="p">))</span>
+
+</div>
+<div class="viewcode-block" id="LiteralPacket"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.LiteralPacket">[docs]</a><span class="k">class</span> <span class="nc">LiteralPacket</span><span class="p">(</span><span class="n">Packet</span><span class="p">):</span> <span class="c1"># noqa</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctb</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (int, IO[bytes]) -&gt; None</span>
+ <span class="n">Packet</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctb</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">body</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">fmode</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+ <span class="n">fnlen</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">fname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">fnlen</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ftime</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
+ <span class="c1"># self.data = self.body.read()</span>
+
+</div>
+<div class="viewcode-block" id="CompressedPacket"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.CompressedPacket">[docs]</a><span class="k">class</span> <span class="nc">CompressedPacket</span><span class="p">(</span><span class="n">Packet</span><span class="p">):</span> <span class="c1"># noqa</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctb</span><span class="p">,</span> <span class="n">stream</span><span class="p">):</span>
+ <span class="c1"># type: (int, IO[bytes]) -&gt; None</span>
+ <span class="n">Packet</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctb</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">body</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">algo</span> <span class="o">=</span> <span class="n">stream</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+ <span class="c1"># This reads the entire stream into memory.</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">stream</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
+
+<div class="viewcode-block" id="CompressedPacket.validate"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.CompressedPacket.validate">[docs]</a> <span class="k">def</span> <span class="nf">validate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bool</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">algo</span> <span class="o">==</span> <span class="s1">&#39;</span><span class="se">\001</span><span class="s1">&#39;</span>
+</div>
+<div class="viewcode-block" id="CompressedPacket.uncompress"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.CompressedPacket.uncompress">[docs]</a> <span class="k">def</span> <span class="nf">uncompress</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; IO[bytes]</span>
+ <span class="kn">import</span> <span class="nn">zlib</span>
+ <span class="n">decomp</span> <span class="o">=</span> <span class="n">zlib</span><span class="o">.</span><span class="n">decompressobj</span><span class="p">(</span><span class="o">-</span><span class="mi">13</span><span class="p">)</span> <span class="c1"># RFC 2440, pg 61.</span>
+ <span class="c1"># This doubles the memory usage.</span>
+ <span class="n">stream</span> <span class="o">=</span> <span class="n">BytesIO</span><span class="p">(</span><span class="n">decomp</span><span class="o">.</span><span class="n">decompress</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">))</span>
+ <span class="k">return</span> <span class="n">stream</span>
+
+</div></div>
+<span class="n">_FACTORY</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="mi">1</span><span class="p">:</span> <span class="n">PKEPacket</span><span class="p">,</span>
+ <span class="mi">2</span><span class="p">:</span> <span class="n">SignaturePacket</span><span class="p">,</span>
+ <span class="c1"># 3 : message_digest_packet, # XXX not implemented</span>
+ <span class="mi">5</span><span class="p">:</span> <span class="n">PrivateKeyPacket</span><span class="p">,</span>
+ <span class="mi">6</span><span class="p">:</span> <span class="n">PublicKeyPacket</span><span class="p">,</span>
+ <span class="c1"># 8 : CompressedPacket, # special case</span>
+ <span class="mi">9</span><span class="p">:</span> <span class="n">CKEPacket</span><span class="p">,</span>
+ <span class="mi">11</span><span class="p">:</span> <span class="n">LiteralPacket</span><span class="p">,</span>
+ <span class="mi">12</span><span class="p">:</span> <span class="n">TrustPacket</span><span class="p">,</span>
+ <span class="mi">13</span><span class="p">:</span> <span class="n">UserIDPacket</span><span class="p">,</span>
+ <span class="mi">14</span><span class="p">:</span> <span class="n">CommentPacket</span><span class="p">,</span>
+ <span class="n">PKEPacket</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
+ <span class="n">SignaturePacket</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span>
+ <span class="c1"># 3 : message_digest_packet,</span>
+ <span class="n">PrivateKeyPacket</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span>
+ <span class="n">PublicKeyPacket</span><span class="p">:</span> <span class="mi">6</span><span class="p">,</span>
+ <span class="c1"># 8 : CompressedPacket,</span>
+ <span class="n">CKEPacket</span><span class="p">:</span> <span class="mi">9</span><span class="p">,</span>
+ <span class="n">LiteralPacket</span><span class="p">:</span> <span class="mi">11</span><span class="p">,</span>
+ <span class="n">TrustPacket</span><span class="p">:</span> <span class="mi">12</span><span class="p">,</span>
+ <span class="n">UserIDPacket</span><span class="p">:</span> <span class="mi">13</span><span class="p">,</span>
+ <span class="n">CommentPacket</span><span class="p">:</span> <span class="mi">14</span>
+<span class="p">}</span>
+
+
+<div class="viewcode-block" id="PacketStream"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.PacketStream">[docs]</a><span class="k">class</span> <span class="nc">PacketStream</span><span class="p">:</span> <span class="c1"># noqa</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">):</span>
+ <span class="c1"># type: (IO[bytes]) -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">stream</span> <span class="o">=</span> <span class="nb">input</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">under_current</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_count</span> <span class="o">=</span> <span class="mi">0</span>
+
+<div class="viewcode-block" id="PacketStream.close"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.PacketStream.close">[docs]</a> <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">under_current</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">under_current</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="PacketStream.read"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.PacketStream.read">[docs]</a> <span class="k">def</span> <span class="nf">read</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">keep_trying</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; Packet</span>
+ <span class="k">while</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="n">ctb0</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">ctb0</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">None</span>
+ <span class="n">ctb</span> <span class="o">=</span> <span class="nb">ord</span><span class="p">(</span><span class="n">ctb0</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">is_ctb</span><span class="p">(</span><span class="n">ctb</span><span class="p">):</span>
+ <span class="k">break</span>
+ <span class="k">elif</span> <span class="n">keep_trying</span><span class="p">:</span>
+ <span class="k">continue</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">XXXError</span>
+ <span class="n">ctbt</span> <span class="o">=</span> <span class="p">(</span><span class="n">ctb</span> <span class="o">&amp;</span> <span class="mh">0x3c</span><span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mi">2</span>
+
+ <span class="k">if</span> <span class="n">ctbt</span> <span class="o">==</span> <span class="n">constants</span><span class="o">.</span><span class="n">CTB_COMPRESSED_DATA</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">under_current</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stream</span>
+ <span class="n">cp</span> <span class="o">=</span> <span class="n">CompressedPacket</span><span class="p">(</span><span class="n">ctb0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">stream</span> <span class="o">=</span> <span class="n">cp</span><span class="o">.</span><span class="n">uncompress</span><span class="p">()</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
+
+ <span class="c1"># Decode the length of following data. See RFC for details.</span>
+ <span class="n">llf</span> <span class="o">=</span> <span class="n">ctb</span> <span class="o">&amp;</span> <span class="mi">3</span>
+ <span class="k">if</span> <span class="n">llf</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="n">lenf</span> <span class="o">=</span> <span class="nb">ord</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>
+ <span class="k">elif</span> <span class="n">llf</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="n">lenf</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&gt;H&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">2</span><span class="p">))[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="k">elif</span> <span class="n">llf</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
+ <span class="n">lenf</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&gt;L&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">4</span><span class="p">))[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="k">else</span><span class="p">:</span> <span class="c1"># llf == 3</span>
+ <span class="k">raise</span> <span class="n">XXXError</span><span class="p">(</span><span class="s1">&#39;impossible case&#39;</span><span class="p">)</span>
+
+ <span class="n">body</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">lenf</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">body</span> <span class="ow">or</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">body</span><span class="p">)</span> <span class="o">!=</span> <span class="n">lenf</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">XXXError</span><span class="p">(</span><span class="s1">&#39;corrupted Packet&#39;</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">_count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="o">.</span><span class="n">tell</span><span class="p">()</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">_FACTORY</span><span class="p">[</span><span class="n">ctbt</span><span class="p">](</span><span class="n">ctb0</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">Packet</span><span class="p">(</span><span class="n">ctb0</span><span class="p">,</span> <span class="n">body</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="PacketStream.count"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.PacketStream.count">[docs]</a> <span class="k">def</span> <span class="nf">count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_count</span>
+
+</div></div>
+<div class="viewcode-block" id="is_ctb"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.is_ctb">[docs]</a><span class="k">def</span> <span class="nf">is_ctb</span><span class="p">(</span><span class="n">ctb</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; bool</span>
+ <span class="k">return</span> <span class="n">ctb</span> <span class="o">&amp;</span> <span class="mh">0xc0</span>
+
+</div>
+<div class="viewcode-block" id="make_ctb"><a class="viewcode-back" href="../../../M2Crypto.PGP.html#M2Crypto.PGP.packet.make_ctb">[docs]</a><span class="k">def</span> <span class="nf">make_ctb</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">llf</span><span class="p">):</span>
+ <span class="c1"># type: (int, int) -&gt; str</span>
+ <span class="k">return</span> <span class="nb">chr</span><span class="p">((</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="mi">7</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="n">value</span> <span class="o">&lt;&lt;</span> <span class="mi">2</span><span class="p">)</span> <span class="o">|</span> <span class="n">llf</span><span class="p">)</span></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/RC4.html b/doc/html/_modules/M2Crypto/RC4.html
new file mode 100644
index 0000000..dc7b374
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/RC4.html
@@ -0,0 +1,130 @@
+
+
+<!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>M2Crypto.RC4 &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../index.html" />
+ <link rel="up" title="Module code" href="../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.RC4</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+
+<span class="sd">&quot;&quot;&quot;M2Crypto wrapper for OpenSSL RC4 API.</span>
+
+<span class="sd">Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto.m2</span> <span class="kn">import</span> <span class="n">rc4_free</span><span class="p">,</span> <span class="n">rc4_new</span><span class="p">,</span> <span class="n">rc4_set_key</span><span class="p">,</span> <span class="n">rc4_update</span>
+
+<div class="viewcode-block" id="RC4"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RC4.RC4">[docs]</a><span class="k">class</span> <span class="nc">RC4</span><span class="p">:</span>
+
+ <span class="sd">&quot;&quot;&quot;Object interface to the stream cipher RC4.&quot;&quot;&quot;</span>
+
+ <span class="n">rc4_free</span> <span class="o">=</span> <span class="n">rc4_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">cipher</span> <span class="o">=</span> <span class="n">rc4_new</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">key</span><span class="p">:</span>
+ <span class="n">rc4_set_key</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cipher</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;cipher&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">rc4_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cipher</span><span class="p">)</span>
+
+<div class="viewcode-block" id="RC4.set_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RC4.RC4.set_key">[docs]</a> <span class="k">def</span> <span class="nf">set_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; None</span>
+ <span class="n">rc4_set_key</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cipher</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="RC4.update"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RC4.RC4.update">[docs]</a> <span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; bytes</span>
+ <span class="k">return</span> <span class="n">rc4_update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cipher</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="RC4.final"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RC4.RC4.final">[docs]</a> <span class="k">def</span> <span class="nf">final</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; str</span>
+ <span class="k">return</span> <span class="s1">&#39;&#39;</span></div></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/RSA.html b/doc/html/_modules/M2Crypto/RSA.html
new file mode 100644
index 0000000..30933d1
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/RSA.html
@@ -0,0 +1,557 @@
+
+
+<!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>M2Crypto.RSA &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../index.html" />
+ <link rel="up" title="Module code" href="../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.RSA</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+
+<span class="sd">&quot;&quot;&quot;M2Crypto wrapper for OpenSSL RSA API.</span>
+
+<span class="sd">Copyright (c) 1999-2004 Ng Pheng Siong. All rights reserved.&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">sys</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Any</span><span class="p">,</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Callable</span><span class="p">,</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">IO</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Tuple</span> <span class="c1"># noqa</span>
+
+
+<div class="viewcode-block" id="RSAError"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSAError">[docs]</a><span class="k">class</span> <span class="nc">RSAError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
+ <span class="k">pass</span>
+</div>
+<span class="n">m2</span><span class="o">.</span><span class="n">rsa_init</span><span class="p">(</span><span class="n">RSAError</span><span class="p">)</span>
+
+<span class="n">no_padding</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">no_padding</span>
+<span class="n">pkcs1_padding</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs1_padding</span>
+<span class="n">sslv23_padding</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">sslv23_padding</span>
+<span class="n">pkcs1_oaep_padding</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs1_oaep_padding</span>
+
+
+<div class="viewcode-block" id="RSA"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA">[docs]</a><span class="k">class</span> <span class="nc">RSA</span><span class="p">:</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> RSA Key Pair.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">m2_rsa_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">rsa</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, int) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> :param rsa: binary representation of OpenSSL RSA type</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_type_check</span><span class="p">(</span><span class="n">rsa</span><span class="p">),</span> <span class="s2">&quot;&#39;rsa&#39; type error&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">rsa</span> <span class="o">=</span> <span class="n">rsa</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="n">_pyfree</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_pyfree&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_rsa_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rsa</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_size</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rsa</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="mi">3</span>
+
+ <span class="k">def</span> <span class="nf">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="c1"># type: (str) -&gt; bytes</span>
+ <span class="k">if</span> <span class="n">name</span> <span class="o">==</span> <span class="s1">&#39;e&#39;</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_get_e</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rsa</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="n">name</span> <span class="o">==</span> <span class="s1">&#39;n&#39;</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_get_n</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rsa</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">AttributeError</span>
+
+<div class="viewcode-block" id="RSA.pub"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA.pub">[docs]</a> <span class="k">def</span> <span class="nf">pub</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; Tuple[bytes, bytes]</span>
+ <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_key</span><span class="p">(),</span> <span class="s1">&#39;key is not initialised&#39;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_get_e</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rsa</span><span class="p">),</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_get_n</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rsa</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="RSA.public_encrypt"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA.public_encrypt">[docs]</a> <span class="k">def</span> <span class="nf">public_encrypt</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">padding</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, int) -&gt; bytes</span>
+ <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_key</span><span class="p">(),</span> <span class="s1">&#39;key is not initialised&#39;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_public_encrypt</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rsa</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">padding</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="RSA.public_decrypt"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA.public_decrypt">[docs]</a> <span class="k">def</span> <span class="nf">public_decrypt</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">padding</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, int) -&gt; bytes</span>
+ <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_key</span><span class="p">(),</span> <span class="s1">&#39;key is not initialised&#39;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_public_decrypt</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rsa</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">padding</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="RSA.private_encrypt"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA.private_encrypt">[docs]</a> <span class="k">def</span> <span class="nf">private_encrypt</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">padding</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, int) -&gt; bytes</span>
+ <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_key</span><span class="p">(),</span> <span class="s1">&#39;key is not initialised&#39;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_private_encrypt</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rsa</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">padding</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="RSA.private_decrypt"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA.private_decrypt">[docs]</a> <span class="k">def</span> <span class="nf">private_decrypt</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">padding</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, int) -&gt; bytes</span>
+ <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_key</span><span class="p">(),</span> <span class="s1">&#39;key is not initialised&#39;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_private_decrypt</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rsa</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">padding</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="RSA.save_key_bio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA.save_key_bio">[docs]</a> <span class="k">def</span> <span class="nf">save_key_bio</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bio</span><span class="p">,</span> <span class="n">cipher</span><span class="o">=</span><span class="s1">&#39;aes_128_cbc&#39;</span><span class="p">,</span>
+ <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO, Optional[str], Callable) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Save the key pair to an M2Crypto.BIO.BIO object in PEM format.</span>
+
+<span class="sd"> :param bio: M2Crypto.BIO.BIO object to save key to.</span>
+
+<span class="sd"> :param cipher: Symmetric cipher to protect the key. The default</span>
+<span class="sd"> cipher is &#39;aes_128_cbc&#39;. If cipher is None, then</span>
+<span class="sd"> the key is saved in the clear.</span>
+
+<span class="sd"> :param callback: A Python callable object that is invoked</span>
+<span class="sd"> to acquire a passphrase with which to protect</span>
+<span class="sd"> the key. The default is</span>
+<span class="sd"> util.passphrase_callback.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">cipher</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_write_key_no_cipher</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rsa</span><span class="p">,</span> <span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">callback</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">ciph</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">m2</span><span class="p">,</span> <span class="n">cipher</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">ciph</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">RSAError</span><span class="p">(</span><span class="s1">&#39;not such cipher </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">cipher</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">ciph</span> <span class="o">=</span> <span class="n">ciph</span><span class="p">()</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_write_key</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rsa</span><span class="p">,</span> <span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">ciph</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="RSA.save_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA.save_key">[docs]</a> <span class="k">def</span> <span class="nf">save_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">file</span><span class="p">,</span> <span class="n">cipher</span><span class="o">=</span><span class="s1">&#39;aes_128_cbc&#39;</span><span class="p">,</span>
+ <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, Optional[str], Callable) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Save the key pair to a file in PEM format.</span>
+
+<span class="sd"> :param file: Name of file to save key to.</span>
+
+<span class="sd"> :param cipher: Symmetric cipher to protect the key. The default</span>
+<span class="sd"> cipher is &#39;aes_128_cbc&#39;. If cipher is None, then</span>
+<span class="sd"> the key is saved in the clear.</span>
+
+<span class="sd"> :param callback: A Python callable object that is invoked</span>
+<span class="sd"> to acquire a passphrase with which to protect</span>
+<span class="sd"> the key. The default is</span>
+<span class="sd"> util.passphrase_callback.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="nb">file</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">save_key_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">cipher</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+</div>
+ <span class="n">save_pem</span> <span class="o">=</span> <span class="n">save_key</span>
+
+<div class="viewcode-block" id="RSA.as_pem"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA.as_pem">[docs]</a> <span class="k">def</span> <span class="nf">as_pem</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cipher</span><span class="o">=</span><span class="s1">&#39;aes_128_cbc&#39;</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[str], Callable) -&gt; bytes</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Returns the key(pair) as a string in PEM format.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">bio</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">save_key_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">cipher</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">bio</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="RSA.save_key_der_bio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA.save_key_der_bio">[docs]</a> <span class="k">def</span> <span class="nf">save_key_der_bio</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bio</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Save the key pair to an M2Crypto.BIO.BIO object in DER format.</span>
+
+<span class="sd"> :param bio: M2Crypto.BIO.BIO object to save key to.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_write_key_der</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rsa</span><span class="p">,</span> <span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+</div>
+<div class="viewcode-block" id="RSA.save_key_der"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA.save_key_der">[docs]</a> <span class="k">def</span> <span class="nf">save_key_der</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">file</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Save the key pair to a file in DER format.</span>
+
+<span class="sd"> :param file: Filename to save key to</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="nb">file</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">save_key_der_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="RSA.save_pub_key_bio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA.save_pub_key_bio">[docs]</a> <span class="k">def</span> <span class="nf">save_pub_key_bio</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bio</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Save the public key to an M2Crypto.BIO.BIO object in PEM format.</span>
+
+<span class="sd"> :param bio: M2Crypto.BIO.BIO object to save key to.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_write_pub_key</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rsa</span><span class="p">,</span> <span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+</div>
+<div class="viewcode-block" id="RSA.save_pub_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA.save_pub_key">[docs]</a> <span class="k">def</span> <span class="nf">save_pub_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">file</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Save the public key to a file in PEM format.</span>
+
+<span class="sd"> :param file: Name of file to save key to.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="nb">file</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_write_pub_key</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rsa</span><span class="p">,</span> <span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+</div>
+<div class="viewcode-block" id="RSA.check_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA.check_key">[docs]</a> <span class="k">def</span> <span class="nf">check_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+
+<span class="sd"> :return: returns 1 if rsa is a valid RSA key, and 0 otherwise.</span>
+<span class="sd"> -1 is returned if an error occurs while checking the key.</span>
+<span class="sd"> If the key is invalid or an error occurred, the reason</span>
+<span class="sd"> code can be obtained using ERR_get_error(3).</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_check_key</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rsa</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="RSA.sign_rsassa_pss"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA.sign_rsassa_pss">[docs]</a> <span class="k">def</span> <span class="nf">sign_rsassa_pss</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">digest</span><span class="p">,</span> <span class="n">algo</span><span class="o">=</span><span class="s1">&#39;sha1&#39;</span><span class="p">,</span> <span class="n">salt_length</span><span class="o">=</span><span class="mi">20</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, str, int) -&gt; bytes</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Signs a digest with the private key using RSASSA-PSS</span>
+
+<span class="sd"> :param digest: A digest created by using the digest method</span>
+
+<span class="sd"> :param salt_length: The length of the salt to use</span>
+
+<span class="sd"> :param algo: The hash algorithm to use</span>
+<span class="sd"> Legal values like &#39;sha1&#39;,&#39;sha224&#39;, &#39;sha256&#39;,</span>
+<span class="sd"> &#39;ripemd160&#39;, and &#39;md5&#39;.</span>
+
+<span class="sd"> :return: a string which is the signature</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="nb">hash</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">m2</span><span class="p">,</span> <span class="n">algo</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="nb">hash</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">RSAError</span><span class="p">(</span><span class="s1">&#39;not such hash algorithm </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">algo</span><span class="p">)</span>
+
+ <span class="n">signature</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_padding_add_pkcs1_pss</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rsa</span><span class="p">,</span> <span class="n">digest</span><span class="p">,</span> <span class="nb">hash</span><span class="p">(),</span> <span class="n">salt_length</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">private_encrypt</span><span class="p">(</span><span class="n">signature</span><span class="p">,</span> <span class="n">m2</span><span class="o">.</span><span class="n">no_padding</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="RSA.verify_rsassa_pss"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA.verify_rsassa_pss">[docs]</a> <span class="k">def</span> <span class="nf">verify_rsassa_pss</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">signature</span><span class="p">,</span> <span class="n">algo</span><span class="o">=</span><span class="s1">&#39;sha1&#39;</span><span class="p">,</span> <span class="n">salt_length</span><span class="o">=</span><span class="mi">20</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, bytes, str, int) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Verifies the signature RSASSA-PSS</span>
+
+<span class="sd"> :param data: Data that has been signed</span>
+
+<span class="sd"> :param signature: The signature signed with RSASSA-PSS</span>
+
+<span class="sd"> :param salt_length: The length of the salt that was used</span>
+
+<span class="sd"> :param algo: The hash algorithm to use</span>
+<span class="sd"> Legal values are for example &#39;sha1&#39;,&#39;sha224&#39;,</span>
+<span class="sd"> &#39;sha256&#39;, &#39;ripemd160&#39;, and &#39;md5&#39;.</span>
+
+<span class="sd"> :return: 1 or 0, depending on whether the signature was</span>
+<span class="sd"> verified or not.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="nb">hash</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">m2</span><span class="p">,</span> <span class="n">algo</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="nb">hash</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">RSAError</span><span class="p">(</span><span class="s1">&#39;not such hash algorithm </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">algo</span><span class="p">)</span>
+
+ <span class="n">plain_signature</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">public_decrypt</span><span class="p">(</span><span class="n">signature</span><span class="p">,</span> <span class="n">m2</span><span class="o">.</span><span class="n">no_padding</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_verify_pkcs1_pss</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rsa</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">plain_signature</span><span class="p">,</span> <span class="nb">hash</span><span class="p">(),</span> <span class="n">salt_length</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="RSA.sign"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA.sign">[docs]</a> <span class="k">def</span> <span class="nf">sign</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">digest</span><span class="p">,</span> <span class="n">algo</span><span class="o">=</span><span class="s1">&#39;sha1&#39;</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, str) -&gt; bytes</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Signs a digest with the private key</span>
+
+<span class="sd"> :param digest: A digest created by using the digest method</span>
+
+<span class="sd"> :param algo: The method that created the digest.</span>
+<span class="sd"> Legal values like &#39;sha1&#39;,&#39;sha224&#39;, &#39;sha256&#39;,</span>
+<span class="sd"> &#39;ripemd160&#39;, and &#39;md5&#39;.</span>
+
+<span class="sd"> :return: a string which is the signature</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">digest_type</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">m2</span><span class="p">,</span> <span class="s1">&#39;NID_&#39;</span> <span class="o">+</span> <span class="n">algo</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">digest_type</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown algorithm&#39;</span><span class="p">,</span> <span class="n">algo</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_sign</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rsa</span><span class="p">,</span> <span class="n">digest</span><span class="p">,</span> <span class="n">digest_type</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="RSA.verify"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA.verify">[docs]</a> <span class="k">def</span> <span class="nf">verify</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">signature</span><span class="p">,</span> <span class="n">algo</span><span class="o">=</span><span class="s1">&#39;sha1&#39;</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, bytes, str) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Verifies the signature with the public key</span>
+
+<span class="sd"> :param data: Data that has been signed</span>
+
+<span class="sd"> :param signature: The signature signed with the private key</span>
+
+<span class="sd"> :param algo: The method use to create digest from the data</span>
+<span class="sd"> before it was signed. Legal values like</span>
+<span class="sd"> &#39;sha1&#39;,&#39;sha224&#39;, &#39;sha256&#39;, &#39;ripemd160&#39;, and &#39;md5&#39;.</span>
+
+<span class="sd"> :return: 1 or 0, depending on whether the signature was</span>
+<span class="sd"> verified or not.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">digest_type</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">m2</span><span class="p">,</span> <span class="s1">&#39;NID_&#39;</span> <span class="o">+</span> <span class="n">algo</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">digest_type</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown algorithm&#39;</span><span class="p">,</span> <span class="n">algo</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_verify</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rsa</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">signature</span><span class="p">,</span> <span class="n">digest_type</span><span class="p">)</span>
+
+</div></div>
+<div class="viewcode-block" id="RSA_pub"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA_pub">[docs]</a><span class="k">class</span> <span class="nc">RSA_pub</span><span class="p">(</span><span class="n">RSA</span><span class="p">):</span> <span class="c1"># noqa</span>
+
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Object interface to an RSA public key.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="nf">__setattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="c1"># type: (str, bytes) -&gt; None</span>
+ <span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="p">[</span><span class="s1">&#39;e&#39;</span><span class="p">,</span> <span class="s1">&#39;n&#39;</span><span class="p">]:</span>
+ <span class="k">raise</span> <span class="n">RSAError</span><span class="p">(</span><span class="s1">&#39;use factory function new_pub_key() to set (e, n)&#39;</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__dict__</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+
+<div class="viewcode-block" id="RSA_pub.private_encrypt"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA_pub.private_encrypt">[docs]</a> <span class="k">def</span> <span class="nf">private_encrypt</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">argv</span><span class="p">):</span>
+ <span class="c1"># type: (*List[Any]) -&gt; None</span>
+ <span class="k">raise</span> <span class="n">RSAError</span><span class="p">(</span><span class="s1">&#39;RSA_pub object has no private key&#39;</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="RSA_pub.private_decrypt"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA_pub.private_decrypt">[docs]</a> <span class="k">def</span> <span class="nf">private_decrypt</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">argv</span><span class="p">):</span>
+ <span class="c1"># type: (*List[Any]) -&gt; None</span>
+ <span class="k">raise</span> <span class="n">RSAError</span><span class="p">(</span><span class="s1">&#39;RSA_pub object has no private key&#39;</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="RSA_pub.save_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA_pub.save_key">[docs]</a> <span class="k">def</span> <span class="nf">save_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">file</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, *List[Any], **Dict[Any, Any]) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Save public key to file.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">save_pub_key</span><span class="p">(</span><span class="nb">file</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="RSA_pub.save_key_bio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA_pub.save_key_bio">[docs]</a> <span class="k">def</span> <span class="nf">save_key_bio</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bio</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO, *List[Any], **Dict[Any, Any]) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Save public key to BIO.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">save_pub_key_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">)</span>
+
+ <span class="c1"># save_key_der</span>
+
+ <span class="c1"># save_key_der_bio</span>
+</div>
+<div class="viewcode-block" id="RSA_pub.check_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.RSA_pub.check_key">[docs]</a> <span class="k">def</span> <span class="nf">check_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_check_pub_key</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rsa</span><span class="p">)</span>
+
+</div></div>
+<div class="viewcode-block" id="rsa_error"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.rsa_error">[docs]</a><span class="k">def</span> <span class="nf">rsa_error</span><span class="p">():</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">raise</span> <span class="n">RSAError</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">err_reason_error_string</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">err_get_error</span><span class="p">()))</span>
+
+</div>
+<div class="viewcode-block" id="keygen_callback"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.keygen_callback">[docs]</a><span class="k">def</span> <span class="nf">keygen_callback</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">out</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="p">):</span>
+ <span class="c1"># type: (int, Any, IO[str]) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Default callback for gen_key().</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">ch</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;.&#39;</span><span class="p">,</span> <span class="s1">&#39;+&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">]</span>
+ <span class="n">out</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">ch</span><span class="p">[</span><span class="n">p</span><span class="p">])</span>
+ <span class="n">out</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
+
+</div>
+<div class="viewcode-block" id="gen_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.gen_key">[docs]</a><span class="k">def</span> <span class="nf">gen_key</span><span class="p">(</span><span class="n">bits</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">keygen_callback</span><span class="p">):</span>
+ <span class="c1"># type: (int, int, Callable) -&gt; RSA</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Generate an RSA key pair.</span>
+
+<span class="sd"> :param bits: Key length, in bits.</span>
+
+<span class="sd"> :param e: The RSA public exponent.</span>
+
+<span class="sd"> :param callback: A Python callable object that is invoked</span>
+<span class="sd"> during key generation; its usual purpose is to</span>
+<span class="sd"> provide visual feedback. The default callback is</span>
+<span class="sd"> keygen_callback.</span>
+
+<span class="sd"> :return: M2Crypto.RSA.RSA object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">RSA</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">rsa_generate_key</span><span class="p">(</span><span class="n">bits</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">callback</span><span class="p">),</span> <span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.load_key">[docs]</a><span class="k">def</span> <span class="nf">load_key</span><span class="p">(</span><span class="nb">file</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, Callable) -&gt; RSA</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Load an RSA key pair from file.</span>
+
+<span class="sd"> :param file: Name of file containing RSA public key in PEM format.</span>
+
+<span class="sd"> :param callback: A Python callable object that is invoked</span>
+<span class="sd"> to acquire a passphrase with which to unlock the</span>
+<span class="sd"> key. The default is util.passphrase_callback.</span>
+
+<span class="sd"> :return: M2Crypto.RSA.RSA object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="nb">file</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">load_key_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_key_bio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.load_key_bio">[docs]</a><span class="k">def</span> <span class="nf">load_key_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO, Callable) -&gt; RSA</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Load an RSA key pair from an M2Crypto.BIO.BIO object.</span>
+
+<span class="sd"> :param bio: M2Crypto.BIO.BIO object containing RSA key pair in PEM</span>
+<span class="sd"> format.</span>
+
+<span class="sd"> :param callback: A Python callable object that is invoked</span>
+<span class="sd"> to acquire a passphrase with which to unlock the</span>
+<span class="sd"> key. The default is util.passphrase_callback.</span>
+
+<span class="sd"> :return: M2Crypto.RSA.RSA object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">rsa</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_read_key</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">callback</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">rsa</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">rsa_error</span><span class="p">()</span>
+ <span class="k">return</span> <span class="n">RSA</span><span class="p">(</span><span class="n">rsa</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_key_string"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.load_key_string">[docs]</a><span class="k">def</span> <span class="nf">load_key_string</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, Callable) -&gt; RSA</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Load an RSA key pair from a string.</span>
+
+<span class="sd"> :param string: String containing RSA key pair in PEM format.</span>
+
+<span class="sd"> :param callback: A Python callable object that is invoked</span>
+<span class="sd"> to acquire a passphrase with which to unlock the</span>
+<span class="sd"> key. The default is util.passphrase_callback.</span>
+
+<span class="sd"> :return: M2Crypto.RSA.RSA object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">bio</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">load_key_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_pub_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.load_pub_key">[docs]</a><span class="k">def</span> <span class="nf">load_pub_key</span><span class="p">(</span><span class="nb">file</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr) -&gt; RSA_pub</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Load an RSA public key from file.</span>
+
+<span class="sd"> :param file: Name of file containing RSA public key in PEM format.</span>
+
+<span class="sd"> :return: M2Crypto.RSA.RSA_pub object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="nb">file</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">load_pub_key_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_pub_key_bio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.load_pub_key_bio">[docs]</a><span class="k">def</span> <span class="nf">load_pub_key_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO) -&gt; RSA_pub</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Load an RSA public key from an M2Crypto.BIO.BIO object.</span>
+
+<span class="sd"> :param bio: M2Crypto.BIO.BIO object containing RSA public key in PEM</span>
+<span class="sd"> format.</span>
+
+<span class="sd"> :return: M2Crypto.RSA.RSA_pub object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">rsa</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_read_pub_key</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+ <span class="k">if</span> <span class="n">rsa</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">rsa_error</span><span class="p">()</span>
+ <span class="k">return</span> <span class="n">RSA_pub</span><span class="p">(</span><span class="n">rsa</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="new_pub_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.RSA.new_pub_key">[docs]</a><span class="k">def</span> <span class="nf">new_pub_key</span><span class="p">(</span><span class="n">e_n</span><span class="p">):</span>
+ <span class="c1"># type: (Tuple[bytes, bytes]) -&gt; RSA_pub</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Instantiate an RSA_pub object from an (e, n) tuple.</span>
+
+<span class="sd"> :param e: The RSA public exponent; it is a string in OpenSSL&#39;s MPINT</span>
+<span class="sd"> format - 4-byte big-endian bit-count followed by the</span>
+<span class="sd"> appropriate number of bits.</span>
+
+<span class="sd"> :param n: The RSA composite of primes; it is a string in OpenSSL&#39;s</span>
+<span class="sd"> MPINT format - 4-byte big-endian bit-count followed by the</span>
+<span class="sd"> appropriate number of bits.</span>
+
+<span class="sd"> :return: M2Crypto.RSA.RSA_pub object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="o">=</span> <span class="n">e_n</span>
+ <span class="n">rsa</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">rsa_new</span><span class="p">()</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">rsa_set_en</span><span class="p">(</span><span class="n">rsa</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">RSA_pub</span><span class="p">(</span><span class="n">rsa</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/Rand.html b/doc/html/_modules/M2Crypto/Rand.html
new file mode 100644
index 0000000..f22a12f
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/Rand.html
@@ -0,0 +1,127 @@
+
+
+<!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>M2Crypto.Rand &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../index.html" />
+ <link rel="up" title="Module code" href="../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.Rand</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+
+<span class="sd">&quot;&quot;&quot;M2Crypto wrapper for OpenSSL PRNG. Requires OpenSSL 0.9.5 and above.</span>
+
+<span class="sd">Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">List</span> <span class="c1"># noqa</span>
+
+
+<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;rand_seed&#39;</span><span class="p">,</span> <span class="s1">&#39;rand_add&#39;</span><span class="p">,</span> <span class="s1">&#39;load_file&#39;</span><span class="p">,</span> <span class="s1">&#39;save_file&#39;</span><span class="p">,</span> <span class="s1">&#39;rand_bytes&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;rand_pseudo_bytes&#39;</span><span class="p">,</span> <span class="s1">&#39;rand_file_name&#39;</span><span class="p">,</span> <span class="s1">&#39;rand_status&#39;</span><span class="p">]</span>
+
+<span class="n">rand_seed</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">rand_seed</span> <span class="c1"># type: (bytes) -&gt; None</span>
+<span class="n">rand_add</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">rand_add</span> <span class="c1"># type: (bytes, float) -&gt; None</span>
+<span class="n">load_file</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">rand_load_file</span> <span class="c1"># type: (AnyStr, int) -&gt; int</span>
+<span class="n">save_file</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">rand_save_file</span> <span class="c1"># type: (AnyStr) -&gt; int</span>
+<span class="n">rand_bytes</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">rand_bytes</span> <span class="c1"># type: (int) -&gt; bytes</span>
+<span class="n">rand_status</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">rand_status</span> <span class="c1"># type: () -&gt; int</span>
+
+
+<div class="viewcode-block" id="rand_pseudo_bytes"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Rand.rand_pseudo_bytes">[docs]</a><span class="k">def</span> <span class="nf">rand_pseudo_bytes</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; Tuple[bytes, int]</span>
+ <span class="kn">import</span> <span class="nn">warnings</span>
+ <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s1">&#39;The underlying OpenSSL method has been &#39;</span> <span class="o">+</span>
+ <span class="s1">&#39;deprecated. Use Rand.rand_bytes instead.&#39;</span><span class="p">,</span> <span class="ne">DeprecationWarning</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">rand_pseudo_bytes</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="rand_file_name"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.Rand.rand_file_name">[docs]</a><span class="k">def</span> <span class="nf">rand_file_name</span><span class="p">():</span>
+ <span class="c1"># type: () -&gt; str</span>
+ <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">rand_file_name</span><span class="p">())</span></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/SMIME.html b/doc/html/_modules/M2Crypto/SMIME.html
new file mode 100644
index 0000000..18a768d
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/SMIME.html
@@ -0,0 +1,416 @@
+
+
+<!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>M2Crypto.SMIME &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../index.html" />
+ <link rel="up" title="Module code" href="../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.SMIME</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+
+<span class="sd">&quot;&quot;&quot;M2Crypto wrapper for OpenSSL S/MIME API.</span>
+
+<span class="sd">Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">EVP</span><span class="p">,</span> <span class="n">Err</span><span class="p">,</span> <span class="n">X509</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Callable</span><span class="p">,</span> <span class="n">Optional</span> <span class="c1"># noqa</span>
+
+<span class="n">PKCS7_TEXT</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">PKCS7_TEXT</span> <span class="c1"># type: int</span>
+<span class="n">PKCS7_NOCERTS</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">PKCS7_NOCERTS</span> <span class="c1"># type: int</span>
+<span class="n">PKCS7_NOSIGS</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">PKCS7_NOSIGS</span> <span class="c1"># type: int</span>
+<span class="n">PKCS7_NOCHAIN</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">PKCS7_NOCHAIN</span> <span class="c1"># type: int</span>
+<span class="n">PKCS7_NOINTERN</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">PKCS7_NOINTERN</span> <span class="c1"># type: int</span>
+<span class="n">PKCS7_NOVERIFY</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">PKCS7_NOVERIFY</span> <span class="c1"># type: int</span>
+<span class="n">PKCS7_DETACHED</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">PKCS7_DETACHED</span> <span class="c1"># type: int</span>
+<span class="n">PKCS7_BINARY</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">PKCS7_BINARY</span> <span class="c1"># type: int</span>
+<span class="n">PKCS7_NOATTR</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">PKCS7_NOATTR</span> <span class="c1"># type: int</span>
+
+<span class="n">PKCS7_SIGNED</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">PKCS7_SIGNED</span> <span class="c1"># type: int</span>
+<span class="n">PKCS7_ENVELOPED</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">PKCS7_ENVELOPED</span> <span class="c1"># type: int</span>
+<span class="n">PKCS7_SIGNED_ENVELOPED</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">PKCS7_SIGNED_ENVELOPED</span> <span class="c1"># Deprecated</span>
+<span class="n">PKCS7_DATA</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">PKCS7_DATA</span> <span class="c1"># type: int</span>
+
+
+<div class="viewcode-block" id="PKCS7_Error"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.PKCS7_Error">[docs]</a><span class="k">class</span> <span class="nc">PKCS7_Error</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span> <span class="c1"># noqa</span>
+ <span class="k">pass</span>
+</div>
+<span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_init</span><span class="p">(</span><span class="n">PKCS7_Error</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="PKCS7"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.PKCS7">[docs]</a><span class="k">class</span> <span class="nc">PKCS7</span><span class="p">:</span>
+
+ <span class="n">m2_pkcs7_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pkcs7</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[bytes], int) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> :param pkcs7: binary representation of</span>
+<span class="sd"> the OpenSSL type PKCS7</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">pkcs7</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">pkcs7</span> <span class="o">=</span> <span class="n">pkcs7</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="n">_pyfree</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">pkcs7</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_new</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="mi">1</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_pyfree&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_pkcs7_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pkcs7</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">_ptr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">pkcs7</span>
+
+<div class="viewcode-block" id="PKCS7.type"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.PKCS7.type">[docs]</a> <span class="k">def</span> <span class="nf">type</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text_name</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; int</span>
+ <span class="k">if</span> <span class="n">text_name</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_type_sn</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pkcs7</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_type_nid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pkcs7</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="PKCS7.write"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.PKCS7.write">[docs]</a> <span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bio</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO) -&gt; int</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_write_bio</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pkcs7</span><span class="p">,</span> <span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+</div>
+<div class="viewcode-block" id="PKCS7.write_der"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.PKCS7.write_der">[docs]</a> <span class="k">def</span> <span class="nf">write_der</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bio</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO) -&gt; int</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_write_bio_der</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pkcs7</span><span class="p">,</span> <span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+</div>
+<div class="viewcode-block" id="PKCS7.get0_signers"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.PKCS7.get0_signers">[docs]</a> <span class="k">def</span> <span class="nf">get0_signers</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">certs</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (X509.X509_Stack, int) -&gt; X509.X509_Stack</span>
+ <span class="k">return</span> <span class="n">X509</span><span class="o">.</span><span class="n">X509_Stack</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_get0_signers</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pkcs7</span><span class="p">,</span>
+ <span class="n">certs</span><span class="o">.</span><span class="n">stack</span><span class="p">,</span> <span class="n">flags</span><span class="p">),</span> <span class="mi">1</span><span class="p">)</span>
+
+</div></div>
+<div class="viewcode-block" id="load_pkcs7"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.load_pkcs7">[docs]</a><span class="k">def</span> <span class="nf">load_pkcs7</span><span class="p">(</span><span class="n">p7file</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr) -&gt; PKCS7</span>
+ <span class="n">bio</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_new_file</span><span class="p">(</span><span class="n">p7file</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">bio</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">BIO</span><span class="o">.</span><span class="n">BIOError</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">p7_ptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_read_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">)</span>
+ <span class="k">finally</span><span class="p">:</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">bio_free</span><span class="p">(</span><span class="n">bio</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">p7_ptr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">PKCS7_Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">PKCS7</span><span class="p">(</span><span class="n">p7_ptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_pkcs7_der"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.load_pkcs7_der">[docs]</a><span class="k">def</span> <span class="nf">load_pkcs7_der</span><span class="p">(</span><span class="n">p7file</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr) -&gt; PKCS7</span>
+ <span class="n">bio</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_new_file</span><span class="p">(</span><span class="n">p7file</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">bio</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">BIO</span><span class="o">.</span><span class="n">BIOError</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">p7_ptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_read_bio_der</span><span class="p">(</span><span class="n">bio</span><span class="p">)</span>
+ <span class="k">finally</span><span class="p">:</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">bio_free</span><span class="p">(</span><span class="n">bio</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">p7_ptr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">PKCS7_Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">PKCS7</span><span class="p">(</span><span class="n">p7_ptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_pkcs7_bio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.load_pkcs7_bio">[docs]</a><span class="k">def</span> <span class="nf">load_pkcs7_bio</span><span class="p">(</span><span class="n">p7_bio</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO) -&gt; PKCS7</span>
+ <span class="n">p7_ptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_read_bio</span><span class="p">(</span><span class="n">p7_bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+ <span class="k">if</span> <span class="n">p7_ptr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">PKCS7_Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">PKCS7</span><span class="p">(</span><span class="n">p7_ptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_pkcs7_bio_der"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.load_pkcs7_bio_der">[docs]</a><span class="k">def</span> <span class="nf">load_pkcs7_bio_der</span><span class="p">(</span><span class="n">p7_bio</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO) -&gt; PKCS7</span>
+ <span class="n">p7_ptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_read_bio_der</span><span class="p">(</span><span class="n">p7_bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+ <span class="k">if</span> <span class="n">p7_ptr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">PKCS7_Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">PKCS7</span><span class="p">(</span><span class="n">p7_ptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="smime_load_pkcs7"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.smime_load_pkcs7">[docs]</a><span class="k">def</span> <span class="nf">smime_load_pkcs7</span><span class="p">(</span><span class="n">p7file</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr) -&gt; PKCS7</span>
+ <span class="n">bio</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_new_file</span><span class="p">(</span><span class="n">p7file</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">bio</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">BIO</span><span class="o">.</span><span class="n">BIOError</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">p7_ptr</span><span class="p">,</span> <span class="n">bio_ptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">smime_read_pkcs7</span><span class="p">(</span><span class="n">bio</span><span class="p">)</span>
+ <span class="k">finally</span><span class="p">:</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">bio_free</span><span class="p">(</span><span class="n">bio</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">p7_ptr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">SMIME_Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+ <span class="k">if</span> <span class="n">bio_ptr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">PKCS7</span><span class="p">(</span><span class="n">p7_ptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="bp">None</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">PKCS7</span><span class="p">(</span><span class="n">p7_ptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="n">BIO</span><span class="o">.</span><span class="n">BIO</span><span class="p">(</span><span class="n">bio_ptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="smime_load_pkcs7_bio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.smime_load_pkcs7_bio">[docs]</a><span class="k">def</span> <span class="nf">smime_load_pkcs7_bio</span><span class="p">(</span><span class="n">p7_bio</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO) -&gt; PKCS7</span>
+ <span class="n">p7_ptr</span><span class="p">,</span> <span class="n">bio_ptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">smime_read_pkcs7</span><span class="p">(</span><span class="n">p7_bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+ <span class="k">if</span> <span class="n">p7_ptr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">SMIME_Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+ <span class="k">if</span> <span class="n">bio_ptr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">PKCS7</span><span class="p">(</span><span class="n">p7_ptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="bp">None</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">PKCS7</span><span class="p">(</span><span class="n">p7_ptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="n">BIO</span><span class="o">.</span><span class="n">BIO</span><span class="p">(</span><span class="n">bio_ptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="Cipher"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.Cipher">[docs]</a><span class="k">class</span> <span class="nc">Cipher</span><span class="p">:</span>
+
+ <span class="sd">&quot;&quot;&quot;Object interface to EVP_CIPHER without all the frills of</span>
+<span class="sd"> M2Crypto.EVP.Cipher.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">algo</span><span class="p">):</span>
+ <span class="c1"># type: (str) -&gt; None</span>
+ <span class="n">cipher</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">m2</span><span class="p">,</span> <span class="n">algo</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">cipher</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown cipher&#39;</span><span class="p">,</span> <span class="n">algo</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">cipher</span> <span class="o">=</span> <span class="n">cipher</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">_ptr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">cipher</span>
+
+</div>
+<div class="viewcode-block" id="SMIME_Error"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.SMIME_Error">[docs]</a><span class="k">class</span> <span class="nc">SMIME_Error</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span> <span class="c1"># noqa</span>
+ <span class="k">pass</span>
+</div>
+<span class="n">m2</span><span class="o">.</span><span class="n">smime_init</span><span class="p">(</span><span class="n">SMIME_Error</span><span class="p">)</span>
+
+<span class="c1"># FIXME class has no __init__ method</span>
+<div class="viewcode-block" id="SMIME"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.SMIME">[docs]</a><span class="k">class</span> <span class="nc">SMIME</span><span class="p">:</span>
+<div class="viewcode-block" id="SMIME.load_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.SMIME.load_key">[docs]</a> <span class="k">def</span> <span class="nf">load_key</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">keyfile</span><span class="p">,</span> <span class="n">certfile</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
+ <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, Optional[AnyStr], Callable) -&gt; None</span>
+ <span class="k">if</span> <span class="n">certfile</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">certfile</span> <span class="o">=</span> <span class="n">keyfile</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">pkey</span> <span class="o">=</span> <span class="n">EVP</span><span class="o">.</span><span class="n">load_key</span><span class="p">(</span><span class="n">keyfile</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">x509</span> <span class="o">=</span> <span class="n">X509</span><span class="o">.</span><span class="n">load_cert</span><span class="p">(</span><span class="n">certfile</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="SMIME.load_key_bio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.SMIME.load_key_bio">[docs]</a> <span class="k">def</span> <span class="nf">load_key_bio</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">keybio</span><span class="p">,</span> <span class="n">certbio</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
+ <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO, Optional[BIO.BIO], Callable) -&gt; None</span>
+ <span class="k">if</span> <span class="n">certbio</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">certbio</span> <span class="o">=</span> <span class="n">keybio</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">pkey</span> <span class="o">=</span> <span class="n">EVP</span><span class="o">.</span><span class="n">load_key_bio</span><span class="p">(</span><span class="n">keybio</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">x509</span> <span class="o">=</span> <span class="n">X509</span><span class="o">.</span><span class="n">load_cert_bio</span><span class="p">(</span><span class="n">certbio</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="SMIME.set_x509_stack"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.SMIME.set_x509_stack">[docs]</a> <span class="k">def</span> <span class="nf">set_x509_stack</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stack</span><span class="p">):</span>
+ <span class="c1"># type: (X509.X509_Stack) -&gt; None</span>
+ <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">stack</span><span class="p">,</span> <span class="n">X509</span><span class="o">.</span><span class="n">X509_Stack</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">x509_stack</span> <span class="o">=</span> <span class="n">stack</span>
+</div>
+<div class="viewcode-block" id="SMIME.set_x509_store"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.SMIME.set_x509_store">[docs]</a> <span class="k">def</span> <span class="nf">set_x509_store</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">store</span><span class="p">):</span>
+ <span class="c1"># type: (X509.X509_Store) -&gt; None</span>
+ <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">store</span><span class="p">,</span> <span class="n">X509</span><span class="o">.</span><span class="n">X509_Store</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">x509_store</span> <span class="o">=</span> <span class="n">store</span>
+</div>
+<div class="viewcode-block" id="SMIME.set_cipher"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.SMIME.set_cipher">[docs]</a> <span class="k">def</span> <span class="nf">set_cipher</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cipher</span><span class="p">):</span>
+ <span class="c1"># type: (Cipher) -&gt; None</span>
+ <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">cipher</span><span class="p">,</span> <span class="n">Cipher</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">cipher</span> <span class="o">=</span> <span class="n">cipher</span>
+</div>
+<div class="viewcode-block" id="SMIME.unset_key"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.SMIME.unset_key">[docs]</a> <span class="k">def</span> <span class="nf">unset_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">pkey</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">x509</span>
+</div>
+<div class="viewcode-block" id="SMIME.unset_x509_stack"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.SMIME.unset_x509_stack">[docs]</a> <span class="k">def</span> <span class="nf">unset_x509_stack</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">x509_stack</span>
+</div>
+<div class="viewcode-block" id="SMIME.unset_x509_store"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.SMIME.unset_x509_store">[docs]</a> <span class="k">def</span> <span class="nf">unset_x509_store</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">x509_store</span>
+</div>
+<div class="viewcode-block" id="SMIME.unset_cipher"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.SMIME.unset_cipher">[docs]</a> <span class="k">def</span> <span class="nf">unset_cipher</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">cipher</span>
+</div>
+<div class="viewcode-block" id="SMIME.encrypt"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.SMIME.encrypt">[docs]</a> <span class="k">def</span> <span class="nf">encrypt</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data_bio</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO, int) -&gt; PKCS7</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;cipher&#39;</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">SMIME_Error</span><span class="p">(</span><span class="s1">&#39;no cipher: use set_cipher()&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;x509_stack&#39;</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">SMIME_Error</span><span class="p">(</span><span class="s1">&#39;no recipient certs: use set_x509_stack()&#39;</span><span class="p">)</span>
+ <span class="n">pkcs7</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_encrypt</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_stack</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">data_bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">cipher</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">flags</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">pkcs7</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">SMIME_Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">PKCS7</span><span class="p">(</span><span class="n">pkcs7</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="SMIME.decrypt"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.SMIME.decrypt">[docs]</a> <span class="k">def</span> <span class="nf">decrypt</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pkcs7</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (PKCS7, int) -&gt; Optional[bytes]</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;pkey&#39;</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">SMIME_Error</span><span class="p">(</span><span class="s1">&#39;no private key: use load_key()&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;x509&#39;</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">SMIME_Error</span><span class="p">(</span><span class="s1">&#39;no certificate: load_key() used incorrectly?&#39;</span><span class="p">)</span>
+ <span class="n">blob</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_decrypt</span><span class="p">(</span><span class="n">pkcs7</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">pkey</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">flags</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">blob</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">SMIME_Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">blob</span>
+</div>
+<div class="viewcode-block" id="SMIME.sign"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.SMIME.sign">[docs]</a> <span class="k">def</span> <span class="nf">sign</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data_bio</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">algo</span><span class="o">=</span><span class="s1">&#39;sha1&#39;</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO, int, Optional[str]) -&gt; PKCS7</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;pkey&#39;</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">SMIME_Error</span><span class="p">(</span><span class="s1">&#39;no private key: use load_key()&#39;</span><span class="p">)</span>
+
+ <span class="nb">hash</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">m2</span><span class="p">,</span> <span class="n">algo</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="nb">hash</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">SMIME_Error</span><span class="p">(</span><span class="s1">&#39;no such hash algorithm </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">algo</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;x509_stack&#39;</span><span class="p">):</span>
+ <span class="n">pkcs7</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_sign1</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">pkey</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">x509_stack</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span>
+ <span class="n">data_bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="nb">hash</span><span class="p">(),</span> <span class="n">flags</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">pkcs7</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">SMIME_Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">PKCS7</span><span class="p">(</span><span class="n">pkcs7</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">pkcs7</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_sign0</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">pkey</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span>
+ <span class="n">data_bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="nb">hash</span><span class="p">(),</span> <span class="n">flags</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">pkcs7</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">SMIME_Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">PKCS7</span><span class="p">(</span><span class="n">pkcs7</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="SMIME.verify"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.SMIME.verify">[docs]</a> <span class="k">def</span> <span class="nf">verify</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pkcs7</span><span class="p">,</span> <span class="n">data_bio</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (PKCS7, BIO.BIO, int) -&gt; Optional[bytes]</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;x509_stack&#39;</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">SMIME_Error</span><span class="p">(</span><span class="s1">&#39;no signer certs: use set_x509_stack()&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;x509_store&#39;</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">SMIME_Error</span><span class="p">(</span><span class="s1">&#39;no x509 cert store: use set_x509_store()&#39;</span><span class="p">)</span>
+ <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">pkcs7</span><span class="p">,</span> <span class="n">PKCS7</span><span class="p">),</span> <span class="s1">&#39;pkcs7 not an instance of PKCS7&#39;</span>
+ <span class="n">p7</span> <span class="o">=</span> <span class="n">pkcs7</span><span class="o">.</span><span class="n">_ptr</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">data_bio</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">blob</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_verify0</span><span class="p">(</span><span class="n">p7</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">x509_stack</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">x509_store</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">flags</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">blob</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">pkcs7_verify1</span><span class="p">(</span><span class="n">p7</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">x509_stack</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">x509_store</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span>
+ <span class="n">data_bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">flags</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">blob</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">SMIME_Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">blob</span>
+</div>
+<div class="viewcode-block" id="SMIME.write"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.SMIME.write">[docs]</a> <span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">out_bio</span><span class="p">,</span> <span class="n">pkcs7</span><span class="p">,</span> <span class="n">data_bio</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO, PKCS7, Optional[BIO.BIO], int) -&gt; int</span>
+ <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">pkcs7</span><span class="p">,</span> <span class="n">PKCS7</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">data_bio</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">smime_write_pkcs7</span><span class="p">(</span><span class="n">out_bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">pkcs7</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">flags</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">smime_write_pkcs7_multi</span><span class="p">(</span><span class="n">out_bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">pkcs7</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span>
+ <span class="n">data_bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">flags</span><span class="p">)</span>
+
+</div></div>
+<div class="viewcode-block" id="text_crlf"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.text_crlf">[docs]</a><span class="k">def</span> <span class="nf">text_crlf</span><span class="p">(</span><span class="n">text</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; bytes</span>
+ <span class="n">bio_in</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
+ <span class="n">bio_out</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">m2</span><span class="o">.</span><span class="n">smime_crlf_copy</span><span class="p">(</span><span class="n">bio_in</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">bio_out</span><span class="o">.</span><span class="n">_ptr</span><span class="p">()):</span>
+ <span class="k">return</span> <span class="n">bio_out</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">SMIME_Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+
+</div>
+<div class="viewcode-block" id="text_crlf_bio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.SMIME.text_crlf_bio">[docs]</a><span class="k">def</span> <span class="nf">text_crlf_bio</span><span class="p">(</span><span class="n">bio_in</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO) -&gt; BIO.BIO</span>
+ <span class="n">bio_out</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">m2</span><span class="o">.</span><span class="n">smime_crlf_copy</span><span class="p">(</span><span class="n">bio_in</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">bio_out</span><span class="o">.</span><span class="n">_ptr</span><span class="p">()):</span>
+ <span class="k">return</span> <span class="n">bio_out</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">SMIME_Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/SSL.html b/doc/html/_modules/M2Crypto/SSL.html
new file mode 100644
index 0000000..6659f09
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/SSL.html
@@ -0,0 +1,134 @@
+
+
+<!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>M2Crypto.SSL &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../index.html" />
+ <link rel="up" title="Module code" href="../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.SSL</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+
+<span class="sd">&quot;&quot;&quot;M2Crypto SSL services.</span>
+
+<span class="sd">Copyright (c) 1999-2004 Ng Pheng Siong. All rights reserved.&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">socket</span>
+
+<span class="c1"># M2Crypto</span>
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">m2</span>
+
+
+<div class="viewcode-block" id="SSLError"><a class="viewcode-back" href="../../M2Crypto.SSL.html#M2Crypto.SSL.SSLError">[docs]</a><span class="k">class</span> <span class="nc">SSLError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
+ <span class="k">pass</span>
+
+</div>
+<div class="viewcode-block" id="SSLTimeoutError"><a class="viewcode-back" href="../../M2Crypto.SSL.html#M2Crypto.SSL.SSLTimeoutError">[docs]</a><span class="k">class</span> <span class="nc">SSLTimeoutError</span><span class="p">(</span><span class="n">SSLError</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">timeout</span><span class="p">):</span>
+ <span class="k">pass</span>
+</div>
+<span class="n">m2</span><span class="o">.</span><span class="n">ssl_init</span><span class="p">(</span><span class="n">SSLError</span><span class="p">,</span> <span class="n">SSLTimeoutError</span><span class="p">)</span>
+
+<span class="c1"># M2Crypto.SSL</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.SSL.Cipher</span> <span class="kn">import</span> <span class="n">Cipher</span><span class="p">,</span> <span class="n">Cipher_Stack</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.SSL.Connection</span> <span class="kn">import</span> <span class="n">Connection</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.SSL.Context</span> <span class="kn">import</span> <span class="n">Context</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.SSL.SSLServer</span> <span class="kn">import</span> <span class="p">(</span><span class="n">ForkingSSLServer</span><span class="p">,</span> <span class="n">SSLServer</span><span class="p">,</span>
+ <span class="n">ThreadingSSLServer</span><span class="p">)</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.SSL.ssl_dispatcher</span> <span class="kn">import</span> <span class="n">ssl_dispatcher</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.SSL.timeout</span> <span class="kn">import</span> <span class="n">timeout</span>
+
+<span class="n">verify_none</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">SSL_VERIFY_NONE</span> <span class="c1"># type: int</span>
+<span class="n">verify_peer</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">SSL_VERIFY_PEER</span> <span class="c1"># type: int</span>
+<span class="n">verify_fail_if_no_peer_cert</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">SSL_VERIFY_FAIL_IF_NO_PEER_CERT</span> <span class="c1"># type: int</span>
+<span class="n">verify_client_once</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">SSL_VERIFY_CLIENT_ONCE</span> <span class="c1"># type: int</span>
+
+<span class="n">SSL_SENT_SHUTDOWN</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">SSL_SENT_SHUTDOWN</span> <span class="c1"># type: int</span>
+<span class="n">SSL_RECEIVED_SHUTDOWN</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">SSL_RECEIVED_SHUTDOWN</span> <span class="c1"># type: int</span>
+
+<span class="n">op_all</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">SSL_OP_ALL</span> <span class="c1"># type: int</span>
+<span class="n">op_no_sslv2</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">SSL_OP_NO_SSLv2</span> <span class="c1"># type: int</span>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/SSL/Checker.html b/doc/html/_modules/M2Crypto/SSL/Checker.html
new file mode 100644
index 0000000..98338bb
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/SSL/Checker.html
@@ -0,0 +1,393 @@
+
+
+<!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>M2Crypto.SSL.Checker &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../../index.html" />
+ <link rel="up" title="M2Crypto.SSL" href="../SSL.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" >Module code</a> &raquo;</li>
+ <li><a href="../SSL.html" accesskey="U">M2Crypto.SSL</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.SSL.Checker</h1><div class="highlight"><pre>
+<span></span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">SSL peer certificate checking routines</span>
+
+<span class="sd">Copyright (c) 2004-2007 Open Source Applications Foundation.</span>
+<span class="sd">All rights reserved.</span>
+
+<span class="sd">Copyright 2008 Heikki Toivonen. All rights reserved.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;SSLVerificationError&#39;</span><span class="p">,</span> <span class="s1">&#39;NoCertificate&#39;</span><span class="p">,</span> <span class="s1">&#39;WrongCertificate&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;WrongHost&#39;</span><span class="p">,</span> <span class="s1">&#39;Checker&#39;</span><span class="p">]</span>
+
+<span class="kn">import</span> <span class="nn">re</span>
+<span class="kn">import</span> <span class="nn">socket</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">X509</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span> <span class="c1"># noqa</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Optional</span> <span class="c1"># noqa</span>
+
+
+<div class="viewcode-block" id="SSLVerificationError"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Checker.SSLVerificationError">[docs]</a><span class="k">class</span> <span class="nc">SSLVerificationError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
+ <span class="k">pass</span>
+
+</div>
+<div class="viewcode-block" id="NoCertificate"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Checker.NoCertificate">[docs]</a><span class="k">class</span> <span class="nc">NoCertificate</span><span class="p">(</span><span class="n">SSLVerificationError</span><span class="p">):</span>
+ <span class="k">pass</span>
+
+</div>
+<div class="viewcode-block" id="WrongCertificate"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Checker.WrongCertificate">[docs]</a><span class="k">class</span> <span class="nc">WrongCertificate</span><span class="p">(</span><span class="n">SSLVerificationError</span><span class="p">):</span>
+ <span class="k">pass</span>
+
+</div>
+<div class="viewcode-block" id="WrongHost"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Checker.WrongHost">[docs]</a><span class="k">class</span> <span class="nc">WrongHost</span><span class="p">(</span><span class="n">SSLVerificationError</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">expectedHost</span><span class="p">,</span> <span class="n">actualHost</span><span class="p">,</span> <span class="n">fieldName</span><span class="o">=</span><span class="s1">&#39;commonName&#39;</span><span class="p">):</span>
+ <span class="c1"># type: (str, AnyStr, str) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> This exception will be raised if the certificate returned by the</span>
+<span class="sd"> peer was issued for a different host than we tried to connect to.</span>
+<span class="sd"> This could be due to a server misconfiguration or an active attack.</span>
+
+<span class="sd"> :param expectedHost: The name of the host we expected to find in the</span>
+<span class="sd"> certificate.</span>
+<span class="sd"> :param actualHost: The name of the host we actually found in the</span>
+<span class="sd"> certificate.</span>
+<span class="sd"> :param fieldName: The field name where we noticed the error. This</span>
+<span class="sd"> should be either &#39;commonName&#39; or &#39;subjectAltName&#39;.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">fieldName</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;commonName&#39;</span><span class="p">,</span> <span class="s1">&#39;subjectAltName&#39;</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
+ <span class="s1">&#39;Unknown fieldName, should be either commonName &#39;</span> <span class="o">+</span>
+ <span class="s1">&#39;or subjectAltName&#39;</span><span class="p">)</span>
+
+ <span class="n">SSLVerificationError</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">expectedHost</span> <span class="o">=</span> <span class="n">expectedHost</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">actualHost</span> <span class="o">=</span> <span class="n">actualHost</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">fieldName</span> <span class="o">=</span> <span class="n">fieldName</span>
+
+ <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; str</span>
+ <span class="n">s</span> <span class="o">=</span> <span class="s1">&#39;Peer certificate </span><span class="si">%s</span><span class="s1"> does not match host, expected </span><span class="si">%s</span><span class="s1">, got </span><span class="si">%s</span><span class="s1">&#39;</span> \
+ <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fieldName</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">expectedHost</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">actualHost</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="Checker"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Checker.Checker">[docs]</a><span class="k">class</span> <span class="nc">Checker</span><span class="p">:</span>
+
+ <span class="n">numericIpMatch</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">&#39;^[0-9]+(\.[0-9]+)*$&#39;</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">peerCertHash</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">peerCertDigest</span><span class="o">=</span><span class="s1">&#39;sha1&#39;</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[str], Optional[bytes], str) -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">host</span> <span class="o">=</span> <span class="n">host</span>
+ <span class="k">if</span> <span class="n">peerCertHash</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">peerCertHash</span> <span class="o">=</span> <span class="n">util</span><span class="o">.</span><span class="n">py3bytes</span><span class="p">(</span><span class="n">peerCertHash</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">fingerprint</span> <span class="o">=</span> <span class="n">peerCertHash</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">digest</span> <span class="o">=</span> <span class="n">peerCertDigest</span> <span class="c1"># type: str</span>
+
+ <span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">peerCert</span><span class="p">,</span> <span class="n">host</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (X509.X509, Optional[str]) -&gt; bool</span>
+ <span class="k">if</span> <span class="n">peerCert</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">NoCertificate</span><span class="p">(</span><span class="s1">&#39;peer did not return certificate&#39;</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">host</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">host</span> <span class="o">=</span> <span class="n">host</span> <span class="c1"># type: str</span>
+
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">fingerprint</span><span class="p">:</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">digest</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;sha1&#39;</span><span class="p">,</span> <span class="s1">&#39;md5&#39;</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unsupported digest &quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">digest</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">digest</span> <span class="o">==</span> <span class="s1">&#39;sha1&#39;</span><span class="p">:</span>
+ <span class="n">expected_len</span> <span class="o">=</span> <span class="mi">40</span>
+ <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">digest</span> <span class="o">==</span> <span class="s1">&#39;md5&#39;</span><span class="p">:</span>
+ <span class="n">expected_len</span> <span class="o">=</span> <span class="mi">32</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Unexpected digest {0}&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">digest</span><span class="p">))</span>
+
+ <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fingerprint</span><span class="p">)</span> <span class="o">!=</span> <span class="n">expected_len</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">WrongCertificate</span><span class="p">(</span>
+ <span class="p">(</span><span class="s1">&#39;peer certificate fingerprint length does not match</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
+ <span class="s1">&#39;fingerprint: {0}</span><span class="se">\n</span><span class="s1">expected = {1}</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
+ <span class="s1">&#39;observed = {2}&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fingerprint</span><span class="p">,</span>
+ <span class="n">expected_len</span><span class="p">,</span>
+ <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fingerprint</span><span class="p">)))</span>
+
+ <span class="n">expected_fingerprint</span> <span class="o">=</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fingerprint</span><span class="p">)</span>
+ <span class="n">observed_fingerprint</span> <span class="o">=</span> <span class="n">peerCert</span><span class="o">.</span><span class="n">get_fingerprint</span><span class="p">(</span><span class="n">md</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">digest</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">observed_fingerprint</span> <span class="o">!=</span> <span class="n">expected_fingerprint</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">WrongCertificate</span><span class="p">(</span>
+ <span class="p">(</span><span class="s1">&#39;peer certificate fingerprint does not match</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
+ <span class="s1">&#39;expected = {0},</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">+</span>
+ <span class="s1">&#39;observed = {1}&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">expected_fingerprint</span><span class="p">,</span>
+ <span class="n">observed_fingerprint</span><span class="p">))</span>
+
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">host</span><span class="p">:</span>
+ <span class="n">hostValidationPassed</span> <span class="o">=</span> <span class="bp">False</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">useSubjectAltNameOnly</span> <span class="o">=</span> <span class="bp">False</span>
+
+ <span class="c1"># subjectAltName=DNS:somehost[, ...]*</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">subjectAltName</span> <span class="o">=</span> <span class="n">peerCert</span><span class="o">.</span><span class="n">get_ext</span><span class="p">(</span><span class="s1">&#39;subjectAltName&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">get_value</span><span class="p">()</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_splitSubjectAltName</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">host</span><span class="p">,</span> <span class="n">subjectAltName</span><span class="p">):</span>
+ <span class="n">hostValidationPassed</span> <span class="o">=</span> <span class="bp">True</span>
+ <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">useSubjectAltNameOnly</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">WrongHost</span><span class="p">(</span><span class="n">expectedHost</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">host</span><span class="p">,</span>
+ <span class="n">actualHost</span><span class="o">=</span><span class="n">subjectAltName</span><span class="p">,</span>
+ <span class="n">fieldName</span><span class="o">=</span><span class="s1">&#39;subjectAltName&#39;</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">LookupError</span><span class="p">:</span>
+ <span class="k">pass</span>
+
+ <span class="c1"># commonName=somehost[, ...]*</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">hostValidationPassed</span><span class="p">:</span>
+ <span class="n">hasCommonName</span> <span class="o">=</span> <span class="bp">False</span>
+ <span class="n">commonNames</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+ <span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">peerCert</span><span class="o">.</span><span class="n">get_subject</span><span class="p">()</span><span class="o">.</span><span class="n">get_entries_by_nid</span><span class="p">(</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">NID_commonName</span><span class="p">):</span>
+ <span class="n">hasCommonName</span> <span class="o">=</span> <span class="bp">True</span>
+ <span class="n">commonName</span> <span class="o">=</span> <span class="n">entry</span><span class="o">.</span><span class="n">get_data</span><span class="p">()</span><span class="o">.</span><span class="n">as_text</span><span class="p">()</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">commonNames</span><span class="p">:</span>
+ <span class="n">commonNames</span> <span class="o">=</span> <span class="n">commonName</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">commonNames</span> <span class="o">+=</span> <span class="s1">&#39;,&#39;</span> <span class="o">+</span> <span class="n">commonName</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">host</span><span class="p">,</span> <span class="n">commonName</span><span class="p">):</span>
+ <span class="n">hostValidationPassed</span> <span class="o">=</span> <span class="bp">True</span>
+ <span class="k">break</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">hasCommonName</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">WrongCertificate</span><span class="p">(</span><span class="s1">&#39;no commonName in peer certificate&#39;</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">hostValidationPassed</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">WrongHost</span><span class="p">(</span><span class="n">expectedHost</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">host</span><span class="p">,</span>
+ <span class="n">actualHost</span><span class="o">=</span><span class="n">commonNames</span><span class="p">,</span>
+ <span class="n">fieldName</span><span class="o">=</span><span class="s1">&#39;commonName&#39;</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="bp">True</span>
+
+ <span class="k">def</span> <span class="nf">_splitSubjectAltName</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">subjectAltName</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, AnyStr) -&gt; bool</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> &gt;&gt;&gt; check = Checker()</span>
+<span class="sd"> &gt;&gt;&gt; check._splitSubjectAltName(host=&#39;my.example.com&#39;,</span>
+<span class="sd"> ... subjectAltName=&#39;DNS:my.example.com&#39;)</span>
+<span class="sd"> True</span>
+<span class="sd"> &gt;&gt;&gt; check._splitSubjectAltName(host=&#39;my.example.com&#39;,</span>
+<span class="sd"> ... subjectAltName=&#39;DNS:*.example.com&#39;)</span>
+<span class="sd"> True</span>
+<span class="sd"> &gt;&gt;&gt; check._splitSubjectAltName(host=&#39;my.example.com&#39;,</span>
+<span class="sd"> ... subjectAltName=&#39;DNS:m*.example.com&#39;)</span>
+<span class="sd"> True</span>
+<span class="sd"> &gt;&gt;&gt; check._splitSubjectAltName(host=&#39;my.example.com&#39;,</span>
+<span class="sd"> ... subjectAltName=&#39;DNS:m*ample.com&#39;)</span>
+<span class="sd"> False</span>
+<span class="sd"> &gt;&gt;&gt; check.useSubjectAltNameOnly</span>
+<span class="sd"> True</span>
+<span class="sd"> &gt;&gt;&gt; check._splitSubjectAltName(host=&#39;my.example.com&#39;,</span>
+<span class="sd"> ... subjectAltName=&#39;DNS:m*ample.com, othername:&lt;unsupported&gt;&#39;)</span>
+<span class="sd"> False</span>
+<span class="sd"> &gt;&gt;&gt; check._splitSubjectAltName(host=&#39;my.example.com&#39;,</span>
+<span class="sd"> ... subjectAltName=&#39;DNS:m*ample.com, DNS:my.example.org&#39;)</span>
+<span class="sd"> False</span>
+<span class="sd"> &gt;&gt;&gt; check._splitSubjectAltName(host=&#39;my.example.com&#39;,</span>
+<span class="sd"> ... subjectAltName=&#39;DNS:m*ample.com, DNS:my.example.com&#39;)</span>
+<span class="sd"> True</span>
+<span class="sd"> &gt;&gt;&gt; check._splitSubjectAltName(host=&#39;my.example.com&#39;,</span>
+<span class="sd"> ... subjectAltName=&#39;DNS:my.example.com, DNS:my.example.org&#39;)</span>
+<span class="sd"> True</span>
+<span class="sd"> &gt;&gt;&gt; check.useSubjectAltNameOnly</span>
+<span class="sd"> True</span>
+<span class="sd"> &gt;&gt;&gt; check._splitSubjectAltName(host=&#39;my.example.com&#39;,</span>
+<span class="sd"> ... subjectAltName=&#39;&#39;)</span>
+<span class="sd"> False</span>
+<span class="sd"> &gt;&gt;&gt; check._splitSubjectAltName(host=&#39;my.example.com&#39;,</span>
+<span class="sd"> ... subjectAltName=&#39;othername:&lt;unsupported&gt;&#39;)</span>
+<span class="sd"> False</span>
+<span class="sd"> &gt;&gt;&gt; check.useSubjectAltNameOnly</span>
+<span class="sd"> False</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">useSubjectAltNameOnly</span> <span class="o">=</span> <span class="bp">False</span>
+ <span class="k">for</span> <span class="n">certHost</span> <span class="ow">in</span> <span class="n">subjectAltName</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;,&#39;</span><span class="p">):</span>
+ <span class="n">certHost</span> <span class="o">=</span> <span class="n">certHost</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">certHost</span><span class="p">[:</span><span class="mi">4</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;dns:&#39;</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">useSubjectAltNameOnly</span> <span class="o">=</span> <span class="bp">True</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">certHost</span><span class="p">[</span><span class="mi">4</span><span class="p">:]):</span>
+ <span class="k">return</span> <span class="bp">True</span>
+ <span class="k">elif</span> <span class="n">certHost</span><span class="p">[:</span><span class="mi">11</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;ip address:&#39;</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">useSubjectAltNameOnly</span> <span class="o">=</span> <span class="bp">True</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_matchIPAddress</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">certHost</span><span class="p">[</span><span class="mi">11</span><span class="p">:]):</span>
+ <span class="k">return</span> <span class="bp">True</span>
+ <span class="k">return</span> <span class="bp">False</span>
+
+ <span class="k">def</span> <span class="nf">_match</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">certHost</span><span class="p">):</span>
+ <span class="c1"># type: (str, str) -&gt; bool</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> &gt;&gt;&gt; check = Checker()</span>
+<span class="sd"> &gt;&gt;&gt; check._match(host=&#39;my.example.com&#39;, certHost=&#39;my.example.com&#39;)</span>
+<span class="sd"> True</span>
+<span class="sd"> &gt;&gt;&gt; check._match(host=&#39;my.example.com&#39;, certHost=&#39;*.example.com&#39;)</span>
+<span class="sd"> True</span>
+<span class="sd"> &gt;&gt;&gt; check._match(host=&#39;my.example.com&#39;, certHost=&#39;m*.example.com&#39;)</span>
+<span class="sd"> True</span>
+<span class="sd"> &gt;&gt;&gt; check._match(host=&#39;my.example.com&#39;, certHost=&#39;m*.EXAMPLE.com&#39;)</span>
+<span class="sd"> True</span>
+<span class="sd"> &gt;&gt;&gt; check._match(host=&#39;my.example.com&#39;, certHost=&#39;m*ample.com&#39;)</span>
+<span class="sd"> False</span>
+<span class="sd"> &gt;&gt;&gt; check._match(host=&#39;my.example.com&#39;, certHost=&#39;*.*.com&#39;)</span>
+<span class="sd"> False</span>
+<span class="sd"> &gt;&gt;&gt; check._match(host=&#39;1.2.3.4&#39;, certHost=&#39;1.2.3.4&#39;)</span>
+<span class="sd"> True</span>
+<span class="sd"> &gt;&gt;&gt; check._match(host=&#39;1.2.3.4&#39;, certHost=&#39;*.2.3.4&#39;)</span>
+<span class="sd"> False</span>
+<span class="sd"> &gt;&gt;&gt; check._match(host=&#39;1234&#39;, certHost=&#39;1234&#39;)</span>
+<span class="sd"> True</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="c1"># XXX See RFC 2818 and 3280 for matching rules, this is may not</span>
+ <span class="c1"># XXX yet be complete.</span>
+
+ <span class="n">host</span> <span class="o">=</span> <span class="n">host</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
+ <span class="n">certHost</span> <span class="o">=</span> <span class="n">certHost</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
+
+ <span class="k">if</span> <span class="n">host</span> <span class="o">==</span> <span class="n">certHost</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">True</span>
+
+ <span class="k">if</span> <span class="n">certHost</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="s1">&#39;*&#39;</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="c1"># Not sure about this, but being conservative</span>
+ <span class="k">return</span> <span class="bp">False</span>
+
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">numericIpMatch</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">host</span><span class="p">)</span> <span class="ow">or</span> \
+ <span class="bp">self</span><span class="o">.</span><span class="n">numericIpMatch</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">certHost</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)):</span>
+ <span class="c1"># Not sure if * allowed in numeric IP, but think not.</span>
+ <span class="k">return</span> <span class="bp">False</span>
+
+ <span class="k">if</span> <span class="n">certHost</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span> <span class="o">&gt;</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
+ <span class="c1"># Not sure about this, maybe some encoding might have these.</span>
+ <span class="c1"># But being conservative for now, because regex below relies</span>
+ <span class="c1"># on this.</span>
+ <span class="k">return</span> <span class="bp">False</span>
+
+ <span class="c1"># Massage certHost so that it can be used in regex</span>
+ <span class="n">certHost</span> <span class="o">=</span> <span class="n">certHost</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">,</span> <span class="s1">&#39;\.&#39;</span><span class="p">)</span>
+ <span class="n">certHost</span> <span class="o">=</span> <span class="n">certHost</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;[^\.]*&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">&#39;^</span><span class="si">%s</span><span class="s1">$&#39;</span> <span class="o">%</span> <span class="n">certHost</span><span class="p">)</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">host</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">True</span>
+
+ <span class="k">return</span> <span class="bp">False</span>
+
+ <span class="k">def</span> <span class="nf">_matchIPAddress</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">certHost</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, AnyStr) -&gt; bool</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> &gt;&gt;&gt; check = Checker()</span>
+<span class="sd"> &gt;&gt;&gt; check._matchIPAddress(host=&#39;my.example.com&#39;,</span>
+<span class="sd"> ... certHost=&#39;my.example.com&#39;)</span>
+<span class="sd"> False</span>
+<span class="sd"> &gt;&gt;&gt; check._matchIPAddress(host=&#39;1.2.3.4&#39;, certHost=&#39;1.2.3.4&#39;)</span>
+<span class="sd"> True</span>
+<span class="sd"> &gt;&gt;&gt; check._matchIPAddress(host=&#39;1.2.3.4&#39;, certHost=&#39;*.2.3.4&#39;)</span>
+<span class="sd"> False</span>
+<span class="sd"> &gt;&gt;&gt; check._matchIPAddress(host=&#39;1.2.3.4&#39;, certHost=&#39;1.2.3.40&#39;)</span>
+<span class="sd"> False</span>
+<span class="sd"> &gt;&gt;&gt; check._matchIPAddress(host=&#39;::1&#39;, certHost=&#39;::1&#39;)</span>
+<span class="sd"> True</span>
+<span class="sd"> &gt;&gt;&gt; check._matchIPAddress(host=&#39;::1&#39;, certHost=&#39;0:0:0:0:0:0:0:1&#39;)</span>
+<span class="sd"> True</span>
+<span class="sd"> &gt;&gt;&gt; check._matchIPAddress(host=&#39;::1&#39;, certHost=&#39;::2&#39;)</span>
+<span class="sd"> False</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">canonical</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">getaddrinfo</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span>
+ <span class="n">socket</span><span class="o">.</span><span class="n">AI_NUMERICHOST</span><span class="p">)</span>
+ <span class="n">certCanonical</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">getaddrinfo</span><span class="p">(</span><span class="n">certHost</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span>
+ <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span>
+ <span class="n">socket</span><span class="o">.</span><span class="n">AI_NUMERICHOST</span><span class="p">)</span>
+ <span class="k">except</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">False</span>
+ <span class="k">return</span> <span class="n">canonical</span> <span class="o">==</span> <span class="n">certCanonical</span>
+
+</div>
+<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s1">&#39;__main__&#39;</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">doctest</span>
+ <span class="n">doctest</span><span class="o">.</span><span class="n">testmod</span><span class="p">()</span>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" >Module code</a> &raquo;</li>
+ <li><a href="../SSL.html" >M2Crypto.SSL</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/SSL/Cipher.html b/doc/html/_modules/M2Crypto/SSL/Cipher.html
new file mode 100644
index 0000000..754babf
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/SSL/Cipher.html
@@ -0,0 +1,156 @@
+
+
+<!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>M2Crypto.SSL.Cipher &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../../index.html" />
+ <link rel="up" title="M2Crypto.SSL" href="../SSL.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" >Module code</a> &raquo;</li>
+ <li><a href="../SSL.html" accesskey="U">M2Crypto.SSL</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.SSL.Cipher</h1><div class="highlight"><pre>
+<span></span><span class="sd">&quot;&quot;&quot;SSL Ciphers</span>
+
+<span class="sd">Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.&quot;&quot;&quot;</span>
+
+<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;Cipher&#39;</span><span class="p">,</span> <span class="s1">&#39;Cipher_Stack&#39;</span><span class="p">]</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Iterable</span> <span class="c1"># noqa</span>
+
+
+<div class="viewcode-block" id="Cipher"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Cipher.Cipher">[docs]</a><span class="k">class</span> <span class="nc">Cipher</span><span class="p">:</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cipher</span><span class="p">):</span>
+ <span class="c1"># type: (str) -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">cipher</span> <span class="o">=</span> <span class="n">cipher</span>
+
+ <span class="k">def</span> <span class="nf">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_cipher_get_bits</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cipher</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; str</span>
+ <span class="k">return</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">-</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">(),</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
+
+ <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; str</span>
+ <span class="k">return</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">-</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">(),</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
+
+<div class="viewcode-block" id="Cipher.version"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Cipher.Cipher.version">[docs]</a> <span class="k">def</span> <span class="nf">version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_cipher_get_version</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cipher</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Cipher.name"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Cipher.Cipher.name">[docs]</a> <span class="k">def</span> <span class="nf">name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; str</span>
+ <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">ssl_cipher_get_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cipher</span><span class="p">))</span>
+
+</div></div>
+<div class="viewcode-block" id="Cipher_Stack"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Cipher.Cipher_Stack">[docs]</a><span class="k">class</span> <span class="nc">Cipher_Stack</span><span class="p">:</span> <span class="c1"># noqa</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stack</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> :param stack: binary of the C-type STACK_OF(SSL_CIPHER)</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">stack</span> <span class="o">=</span> <span class="n">stack</span>
+
+ <span class="k">def</span> <span class="nf">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">sk_ssl_cipher_num</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">idx</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; Cipher</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="mi">0</span> <span class="o">&lt;=</span> <span class="n">idx</span> <span class="o">&lt;</span> <span class="n">m2</span><span class="o">.</span><span class="n">sk_ssl_cipher_num</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">IndexError</span><span class="p">(</span><span class="s1">&#39;index out of range&#39;</span><span class="p">)</span>
+ <span class="n">v</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">sk_ssl_cipher_value</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="p">,</span> <span class="n">idx</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">Cipher</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; Iterable</span>
+ <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">sk_ssl_cipher_num</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="p">)):</span>
+ <span class="k">yield</span> <span class="bp">self</span><span class="p">[</span><span class="n">i</span><span class="p">]</span></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" >Module code</a> &raquo;</li>
+ <li><a href="../SSL.html" >M2Crypto.SSL</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/SSL/Connection.html b/doc/html/_modules/M2Crypto/SSL/Connection.html
new file mode 100644
index 0000000..a1fb4c8
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/SSL/Connection.html
@@ -0,0 +1,719 @@
+
+
+<!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>M2Crypto.SSL.Connection &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../../index.html" />
+ <link rel="up" title="M2Crypto.SSL" href="../SSL.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" >Module code</a> &raquo;</li>
+ <li><a href="../SSL.html" accesskey="U">M2Crypto.SSL</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.SSL.Connection</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+
+<span class="sd">&quot;&quot;&quot;SSL Connection aka socket</span>
+
+<span class="sd">Copyright (c) 1999-2004 Ng Pheng Siong. All rights reserved.</span>
+
+<span class="sd">Portions created by Open Source Applications Foundation (OSAF) are</span>
+<span class="sd">Copyright (C) 2004-2007 OSAF. All Rights Reserved.</span>
+
+<span class="sd">Copyright 2008 Heikki Toivonen. All rights reserved.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">logging</span>
+<span class="kn">import</span> <span class="nn">socket</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">X509</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span> <span class="c1"># noqa</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.SSL</span> <span class="kn">import</span> <span class="n">Checker</span><span class="p">,</span> <span class="n">Context</span><span class="p">,</span> <span class="n">timeout</span> <span class="c1"># noqa</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.SSL</span> <span class="kn">import</span> <span class="n">SSLError</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.SSL.Cipher</span> <span class="kn">import</span> <span class="n">Cipher</span><span class="p">,</span> <span class="n">Cipher_Stack</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.SSL.Session</span> <span class="kn">import</span> <span class="n">Session</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Any</span><span class="p">,</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Callable</span><span class="p">,</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Tuple</span><span class="p">,</span> <span class="n">Union</span> <span class="c1"># noqa</span>
+
+<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;Connection&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;timeout&#39;</span><span class="p">,</span> <span class="c1"># XXX Not really, but for documentation purposes</span>
+ <span class="p">]</span>
+
+<span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
+
+
+<span class="k">def</span> <span class="nf">_serverPostConnectionCheck</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
+ <span class="c1"># type: (*List[Any], **Dict[Any, Any]) -&gt; int</span>
+ <span class="k">return</span> <span class="mi">1</span>
+
+
+<div class="viewcode-block" id="Connection"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection">[docs]</a><span class="k">class</span> <span class="nc">Connection</span><span class="p">:</span>
+
+ <span class="sd">&quot;&quot;&quot;An SSL connection.&quot;&quot;&quot;</span>
+
+ <span class="n">clientPostConnectionCheck</span> <span class="o">=</span> <span class="n">Checker</span><span class="o">.</span><span class="n">Checker</span><span class="p">()</span>
+ <span class="n">serverPostConnectionCheck</span> <span class="o">=</span> <span class="n">_serverPostConnectionCheck</span>
+
+ <span class="n">m2_bio_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_free</span>
+ <span class="n">m2_ssl_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctx</span><span class="p">,</span> <span class="n">sock</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">family</span><span class="o">=</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">):</span>
+ <span class="c1"># type: (Context, socket.socket, int) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+
+<span class="sd"> :param ctx: SSL.Context</span>
+<span class="sd"> :param sock: socket to be used</span>
+<span class="sd"> :param family: socket family</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ctx</span> <span class="o">=</span> <span class="n">ctx</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ssl</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_new</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">ctx</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">sock</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">socket</span> <span class="o">=</span> <span class="n">sock</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">socket</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">family</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">setsockopt</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">SOL_SOCKET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SO_REUSEADDR</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_fileno</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">fileno</span><span class="p">()</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">_timeout</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">gettimeout</span><span class="p">()</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_timeout</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_timeout</span> <span class="o">=</span> <span class="o">-</span><span class="mf">1.0</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">ssl_close_flag</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_noclose</span>
+
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">post_connection_check</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">set_post_connection_check_callback</span><span class="p">(</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">post_connection_check</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;sslbio&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_bio_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sslbio</span><span class="p">)</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;sockbio&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_bio_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sockbio</span><span class="p">)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ssl_close_flag</span> <span class="o">==</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_noclose</span> <span class="ow">and</span> \
+ <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;ssl&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_ssl_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+
+<div class="viewcode-block" id="Connection.close"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.close">[docs]</a> <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_shutdown</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.clear"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.clear">[docs]</a> <span class="k">def</span> <span class="nf">clear</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> If there were errors in this connection, call clear() rather</span>
+<span class="sd"> than close() to end it, so that bad sessions will be cleared</span>
+<span class="sd"> from cache.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_clear</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.set_shutdown"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_shutdown">[docs]</a> <span class="k">def</span> <span class="nf">set_shutdown</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mode</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;Sets the shutdown state of the Connection to mode.</span>
+
+<span class="sd"> The shutdown state of an ssl connection is a bitmask of (use</span>
+<span class="sd"> m2.SSL_* constants):</span>
+
+<span class="sd"> 0 No shutdown setting, yet.</span>
+
+<span class="sd"> SSL_SENT_SHUTDOWN</span>
+<span class="sd"> A &quot;close notify&quot; shutdown alert was sent to the peer, the</span>
+<span class="sd"> connection is being considered closed and the session is</span>
+<span class="sd"> closed and correct.</span>
+
+<span class="sd"> SSL_RECEIVED_SHUTDOWN</span>
+<span class="sd"> A shutdown alert was received form the peer, either a normal</span>
+<span class="sd"> &quot;close notify&quot; or a fatal error.</span>
+
+<span class="sd"> SSL_SENT_SHUTDOWN and SSL_RECEIVED_SHUTDOWN can be set at the</span>
+<span class="sd"> same time.</span>
+
+<span class="sd"> :param mode: set the mode bitmask.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_set_shutdown1</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">,</span> <span class="n">mode</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.get_shutdown"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_shutdown">[docs]</a> <span class="k">def</span> <span class="nf">get_shutdown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;Get the current shutdown mode of the Connection.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_shutdown</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.bind"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.bind">[docs]</a> <span class="k">def</span> <span class="nf">bind</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">addr</span><span class="p">):</span>
+ <span class="c1"># type: (util.AddrType) -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">addr</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.listen"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.listen">[docs]</a> <span class="k">def</span> <span class="nf">listen</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">qlen</span><span class="o">=</span><span class="mi">5</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">listen</span><span class="p">(</span><span class="n">qlen</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.ssl_get_error"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.ssl_get_error">[docs]</a> <span class="k">def</span> <span class="nf">ssl_get_error</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ret</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; int</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_error</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">,</span> <span class="n">ret</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.set_bio"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_bio">[docs]</a> <span class="k">def</span> <span class="nf">set_bio</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">readbio</span><span class="p">,</span> <span class="n">writebio</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO, BIO.BIO) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;Explicitly set read and write bios</span>
+
+<span class="sd"> Connects the BIOs for the read and write operations of the</span>
+<span class="sd"> TLS/SSL (encrypted) side of ssl.</span>
+
+<span class="sd"> The SSL engine inherits the behaviour of both BIO objects,</span>
+<span class="sd"> respectively. If a BIO is non-blocking, the Connection will also</span>
+<span class="sd"> have non-blocking behaviour.</span>
+
+<span class="sd"> If there was already a BIO connected to Connection, BIO_free()</span>
+<span class="sd"> will be called (for both the reading and writing side, if</span>
+<span class="sd"> different).</span>
+
+<span class="sd"> :param readbio: BIO for reading</span>
+<span class="sd"> :param writebio: BIO for writing.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_set_bio</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">,</span> <span class="n">readbio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">writebio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+</div>
+<div class="viewcode-block" id="Connection.set_client_CA_list_from_file"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_client_CA_list_from_file">[docs]</a> <span class="k">def</span> <span class="nf">set_client_CA_list_from_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cafile</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;Set the acceptable client CA list.</span>
+
+<span class="sd"> If the client returns a certificate, it must have been issued by</span>
+<span class="sd"> one of the CAs listed in cafile.</span>
+
+<span class="sd"> Makes sense only for servers.</span>
+
+<span class="sd"> :param cafile: Filename from which to load the CA list.</span>
+
+<span class="sd"> :return: 0 A failure while manipulating the STACK_OF(X509_NAME)</span>
+<span class="sd"> object occurred or the X509_NAME could not be</span>
+<span class="sd"> extracted from cacert. Check the error stack to find</span>
+<span class="sd"> out the reason.</span>
+
+<span class="sd"> 1 The operation succeeded.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_set_client_CA_list_from_file</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">,</span> <span class="n">cafile</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.set_client_CA_list_from_context"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_client_CA_list_from_context">[docs]</a> <span class="k">def</span> <span class="nf">set_client_CA_list_from_context</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Set the acceptable client CA list. If the client</span>
+<span class="sd"> returns a certificate, it must have been issued by</span>
+<span class="sd"> one of the CAs listed in context.</span>
+
+<span class="sd"> Makes sense only for servers.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_set_client_CA_list_from_context</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">ctx</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.setup_addr"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.setup_addr">[docs]</a> <span class="k">def</span> <span class="nf">setup_addr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">addr</span><span class="p">):</span>
+ <span class="c1"># type: (util.AddrType) -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">addr</span> <span class="o">=</span> <span class="n">addr</span>
+</div>
+<div class="viewcode-block" id="Connection.set_ssl_close_flag"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_ssl_close_flag">[docs]</a> <span class="k">def</span> <span class="nf">set_ssl_close_flag</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">flag</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> By default, SSL struct will be freed in __del__. Call with</span>
+<span class="sd"> m2.bio_close to override this default.</span>
+
+<span class="sd"> :param flag: either m2.bio_close or m2.bio_noclose</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">flag</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">bio_close</span><span class="p">,</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_noclose</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;flag must be m2.bio_close or m2.bio_noclose&quot;</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ssl_close_flag</span> <span class="o">=</span> <span class="n">flag</span>
+</div>
+<div class="viewcode-block" id="Connection.setup_ssl"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.setup_ssl">[docs]</a> <span class="k">def</span> <span class="nf">setup_ssl</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="c1"># Make a BIO_s_socket.</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">sockbio</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_new_socket</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">fileno</span><span class="p">(),</span> <span class="mi">0</span><span class="p">)</span>
+ <span class="c1"># Link SSL struct with the BIO_socket.</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_set_bio</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sockbio</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sockbio</span><span class="p">)</span>
+ <span class="c1"># Make a BIO_f_ssl.</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">sslbio</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_new</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">bio_f_ssl</span><span class="p">())</span>
+ <span class="c1"># Link BIO_f_ssl with the SSL struct.</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">bio_set_ssl</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sslbio</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">,</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_noclose</span><span class="p">)</span>
+</div>
+ <span class="k">def</span> <span class="nf">_setup_ssl</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">addr</span><span class="p">):</span>
+ <span class="c1"># type: (util.AddrType) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;Deprecated&quot;&quot;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">setup_addr</span><span class="p">(</span><span class="n">addr</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">setup_ssl</span><span class="p">()</span>
+
+<div class="viewcode-block" id="Connection.set_accept_state"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_accept_state">[docs]</a> <span class="k">def</span> <span class="nf">set_accept_state</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;Sets Connection to work in the server mode.&quot;&quot;&quot;</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_set_accept_state</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.accept_ssl"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.accept_ssl">[docs]</a> <span class="k">def</span> <span class="nf">accept_ssl</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; Optional[int]</span>
+ <span class="sd">&quot;&quot;&quot;Waits for a TLS/SSL client to initiate the TLS/SSL handshake.</span>
+
+<span class="sd"> The communication channel must already have been set and</span>
+<span class="sd"> assigned to the ssl by setting an underlying BIO.</span>
+
+<span class="sd"> :return: 0 The TLS/SSL handshake was not successful but was shut</span>
+<span class="sd"> down controlled and by the specifications of the</span>
+<span class="sd"> TLS/SSL protocol. Call get_error() with the return</span>
+<span class="sd"> value ret to find out the reason.</span>
+
+<span class="sd"> 1 The TLS/SSL handshake was successfully completed,</span>
+<span class="sd"> a TLS/SSL connection has been established.</span>
+
+<span class="sd"> &lt;0 The TLS/SSL handshake was not successful because</span>
+<span class="sd"> a fatal error occurred either at the protocol level</span>
+<span class="sd"> or a connection failure occurred. The shutdown was</span>
+<span class="sd"> not clean. It can also occur of action is need to</span>
+<span class="sd"> continue the operation for non-blocking BIOs. Call</span>
+<span class="sd"> get_error() with the return value ret to find</span>
+<span class="sd"> out the reason.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_accept</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_timeout</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.accept"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.accept">[docs]</a> <span class="k">def</span> <span class="nf">accept</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; Tuple[Connection, util.AddrType]</span>
+ <span class="sd">&quot;&quot;&quot;Accept an SSL connection.</span>
+
+<span class="sd"> The return value is a pair (ssl, addr) where ssl is a new SSL</span>
+<span class="sd"> connection object and addr is the address bound to the other end</span>
+<span class="sd"> of the SSL connection.</span>
+
+<span class="sd"> :return: tuple of Connection and addr. Address can take very</span>
+<span class="sd"> various forms (see socket documentation), for IPv4 it</span>
+<span class="sd"> is tuple(str, int), for IPv6 a tuple of four (host,</span>
+<span class="sd"> port, flowinfo, scopeid), where the last two are</span>
+<span class="sd"> optional ints.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">sock</span><span class="p">,</span> <span class="n">addr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">accept</span><span class="p">()</span>
+ <span class="n">ssl</span> <span class="o">=</span> <span class="n">Connection</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">sock</span><span class="p">)</span>
+ <span class="n">ssl</span><span class="o">.</span><span class="n">addr</span> <span class="o">=</span> <span class="n">addr</span>
+ <span class="n">ssl</span><span class="o">.</span><span class="n">setup_ssl</span><span class="p">()</span>
+ <span class="n">ssl</span><span class="o">.</span><span class="n">set_accept_state</span><span class="p">()</span>
+ <span class="n">ssl</span><span class="o">.</span><span class="n">accept_ssl</span><span class="p">()</span>
+ <span class="n">check</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;postConnectionCheck&#39;</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">serverPostConnectionCheck</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">check</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">check</span><span class="p">(</span><span class="n">ssl</span><span class="o">.</span><span class="n">get_peer_cert</span><span class="p">(),</span> <span class="n">ssl</span><span class="o">.</span><span class="n">addr</span><span class="p">[</span><span class="mi">0</span><span class="p">]):</span>
+ <span class="k">raise</span> <span class="n">Checker</span><span class="o">.</span><span class="n">SSLVerificationError</span><span class="p">(</span>
+ <span class="s1">&#39;post connection check failed&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">ssl</span><span class="p">,</span> <span class="n">addr</span>
+</div>
+<div class="viewcode-block" id="Connection.set_connect_state"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_connect_state">[docs]</a> <span class="k">def</span> <span class="nf">set_connect_state</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;Sets Connection to work in the client mode.&quot;&quot;&quot;</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_set_connect_state</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.connect_ssl"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.connect_ssl">[docs]</a> <span class="k">def</span> <span class="nf">connect_ssl</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; Optional[int]</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_connect</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_timeout</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.connect"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.connect">[docs]</a> <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">addr</span><span class="p">):</span>
+ <span class="c1"># type: (util.AddrType) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;Overloading socket.connect()</span>
+
+<span class="sd"> :param addr: addresses have various depending on their type</span>
+
+<span class="sd"> :return:status of ssl_connect()</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">addr</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">addr</span> <span class="o">=</span> <span class="n">addr</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">setup_ssl</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">set_connect_state</span><span class="p">()</span>
+ <span class="n">ret</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">connect_ssl</span><span class="p">()</span>
+ <span class="n">check</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;postConnectionCheck&#39;</span><span class="p">,</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">clientPostConnectionCheck</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">check</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get_peer_cert</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">addr</span><span class="p">[</span><span class="mi">0</span><span class="p">]):</span>
+ <span class="k">raise</span> <span class="n">Checker</span><span class="o">.</span><span class="n">SSLVerificationError</span><span class="p">(</span>
+ <span class="s1">&#39;post connection check failed&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">ret</span>
+</div>
+<div class="viewcode-block" id="Connection.shutdown"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.shutdown">[docs]</a> <span class="k">def</span> <span class="nf">shutdown</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">how</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; None</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_set_shutdown</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">,</span> <span class="n">how</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.renegotiate"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.renegotiate">[docs]</a> <span class="k">def</span> <span class="nf">renegotiate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;Renegotiate this connection&#39;s SSL parameters.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_renegotiate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.pending"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.pending">[docs]</a> <span class="k">def</span> <span class="nf">pending</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;Return the numbers of octets that can be read from the connection.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_pending</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">)</span>
+</div>
+ <span class="k">def</span> <span class="nf">_write_bio</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; int</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_write</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_timeout</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">_write_nbio</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; int</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_write_nbio</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">_read_bio</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="mi">1024</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; bytes</span>
+ <span class="k">if</span> <span class="n">size</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;size &lt;= 0&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_read</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_timeout</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">_read_nbio</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="mi">1024</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; bytes</span>
+ <span class="k">if</span> <span class="n">size</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;size &lt;= 0&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_read_nbio</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
+
+<div class="viewcode-block" id="Connection.write"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.write">[docs]</a> <span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; int</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_timeout</span> <span class="o">!=</span> <span class="mf">0.0</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_write_bio</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_write_nbio</span><span class="p">(</span><span class="n">data</span><span class="p">)</span></div>
+ <span class="n">sendall</span> <span class="o">=</span> <span class="n">send</span> <span class="o">=</span> <span class="n">write</span>
+
+<div class="viewcode-block" id="Connection.read"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.read">[docs]</a> <span class="k">def</span> <span class="nf">read</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="o">=</span><span class="mi">1024</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; bytes</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_timeout</span> <span class="o">!=</span> <span class="mf">0.0</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_read_bio</span><span class="p">(</span><span class="n">size</span><span class="p">)</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_read_nbio</span><span class="p">(</span><span class="n">size</span><span class="p">)</span></div>
+ <span class="n">recv</span> <span class="o">=</span> <span class="n">read</span>
+
+<div class="viewcode-block" id="Connection.setblocking"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.setblocking">[docs]</a> <span class="k">def</span> <span class="nf">setblocking</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mode</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;Set this connection&#39;s underlying socket to _mode_.</span>
+
+<span class="sd"> Set blocking or non-blocking mode of the socket: if flag is 0,</span>
+<span class="sd"> the socket is set to non-blocking, else to blocking mode.</span>
+<span class="sd"> Initially all sockets are in blocking mode. In non-blocking mode,</span>
+<span class="sd"> if a recv() call doesn&#39;t find any data, or if a send() call can&#39;t</span>
+<span class="sd"> immediately dispose of the data, a error exception is raised;</span>
+<span class="sd"> in blocking mode, the calls block until they can proceed.</span>
+<span class="sd"> s.setblocking(0) is equivalent to s.settimeout(0.0);</span>
+<span class="sd"> s.setblocking(1) is equivalent to s.settimeout(None).</span>
+
+<span class="sd"> :param mode: new mode to be set</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">setblocking</span><span class="p">(</span><span class="n">mode</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">mode</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_timeout</span> <span class="o">=</span> <span class="o">-</span><span class="mf">1.0</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_timeout</span> <span class="o">=</span> <span class="mf">0.0</span>
+</div>
+<div class="viewcode-block" id="Connection.settimeout"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.settimeout">[docs]</a> <span class="k">def</span> <span class="nf">settimeout</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout</span><span class="p">):</span>
+ <span class="c1"># type: (float) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;Set this connection&#39;s underlying socket&#39;s timeout to _timeout_.&quot;&quot;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">settimeout</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_timeout</span> <span class="o">=</span> <span class="n">timeout</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_timeout</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_timeout</span> <span class="o">=</span> <span class="o">-</span><span class="mf">1.0</span>
+</div>
+<div class="viewcode-block" id="Connection.fileno"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.fileno">[docs]</a> <span class="k">def</span> <span class="nf">fileno</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">fileno</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="Connection.getsockopt"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.getsockopt">[docs]</a> <span class="k">def</span> <span class="nf">getsockopt</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">level</span><span class="p">,</span> <span class="n">optname</span><span class="p">,</span> <span class="n">buflen</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (int, int, Optional[int]) -&gt; Union[int, bytes]</span>
+ <span class="sd">&quot;&quot;&quot;Get the value of the given socket option.</span>
+
+<span class="sd"> :param level: level at which the option resides.</span>
+<span class="sd"> To manipulate options at the sockets API level, level is</span>
+<span class="sd"> specified as socket.SOL_SOCKET. To manipulate options at</span>
+<span class="sd"> any other level the protocol number of the appropriate</span>
+<span class="sd"> protocol controlling the option is supplied. For example,</span>
+<span class="sd"> to indicate that an option is to be interpreted by the</span>
+<span class="sd"> TCP protocol, level should be set to the protocol number</span>
+<span class="sd"> of socket.SOL_TCP; see getprotoent(3).</span>
+
+<span class="sd"> :param optname: The value of the given socket option is</span>
+<span class="sd"> described in the Unix man page getsockopt(2)). The needed</span>
+<span class="sd"> symbolic constants (SO_* etc.) are defined in the socket</span>
+<span class="sd"> module.</span>
+<span class="sd"> </span>
+<span class="sd"> :param buflen: If it is absent, an integer option is assumed</span>
+<span class="sd"> and its integer value is returned by the function. If</span>
+<span class="sd"> buflen is present, it specifies the maximum length of the</span>
+<span class="sd"> buffer used to receive the option in, and this buffer is</span>
+<span class="sd"> returned as a bytes object.</span>
+<span class="sd"> </span>
+<span class="sd"> :return: Either integer or bytes value of the option. It is up</span>
+<span class="sd"> to the caller to decode the contents of the buffer (see</span>
+<span class="sd"> the optional built-in module struct for a way to decode</span>
+<span class="sd"> C structures encoded as byte strings).</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">getsockopt</span><span class="p">(</span><span class="n">level</span><span class="p">,</span> <span class="n">optname</span><span class="p">,</span> <span class="n">buflen</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.setsockopt"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.setsockopt">[docs]</a> <span class="k">def</span> <span class="nf">setsockopt</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">level</span><span class="p">,</span> <span class="n">optname</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (int, int, Union[int, bytes, None]) -&gt; Optional[bytes]</span>
+ <span class="sd">&quot;&quot;&quot;Set the value of the given socket option.</span>
+
+<span class="sd"> :param level: same as with getsockopt() above</span>
+<span class="sd"> </span>
+<span class="sd"> :param optname: same as with getsockopt() above</span>
+<span class="sd"> </span>
+<span class="sd"> :param value: an integer or a string representing a buffer. In</span>
+<span class="sd"> the latter case it is up to the caller to ensure</span>
+<span class="sd"> that the string contains the proper bits (see the</span>
+<span class="sd"> optional built-in module struct for a way to</span>
+<span class="sd"> encode C structures as strings).</span>
+<span class="sd"> </span>
+<span class="sd"> :return: None for success or the error handler for failure.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">setsockopt</span><span class="p">(</span><span class="n">level</span><span class="p">,</span> <span class="n">optname</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.get_context"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_context">[docs]</a> <span class="k">def</span> <span class="nf">get_context</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; SSL.Context</span>
+ <span class="sd">&quot;&quot;&quot;Return the SSL.Context object associated with this connection.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_ssl_ctx</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.get_state"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_state">[docs]</a> <span class="k">def</span> <span class="nf">get_state</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="sd">&quot;&quot;&quot;Return the SSL state of this connection.</span>
+
+<span class="sd"> During its use, an SSL objects passes several states. The state</span>
+<span class="sd"> is internally maintained. Querying the state information is not</span>
+<span class="sd"> very informative before or when a connection has been</span>
+<span class="sd"> established. It however can be of significant interest during</span>
+<span class="sd"> the handshake.</span>
+
+<span class="sd"> :return: 6 letter string indicating the current state of the SSL</span>
+<span class="sd"> object ssl.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_state</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.verify_ok"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.verify_ok">[docs]</a> <span class="k">def</span> <span class="nf">verify_ok</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bool</span>
+ <span class="k">return</span> <span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_verify_result</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">)</span> <span class="o">==</span> <span class="n">m2</span><span class="o">.</span><span class="n">X509_V_OK</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.get_verify_mode"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_verify_mode">[docs]</a> <span class="k">def</span> <span class="nf">get_verify_mode</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;Return the peer certificate verification mode.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_verify_mode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.get_verify_depth"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_verify_depth">[docs]</a> <span class="k">def</span> <span class="nf">get_verify_depth</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;Return the peer certificate verification depth.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_verify_depth</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.get_verify_result"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_verify_result">[docs]</a> <span class="k">def</span> <span class="nf">get_verify_result</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;Return the peer certificate verification result.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_verify_result</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.get_peer_cert"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_peer_cert">[docs]</a> <span class="k">def</span> <span class="nf">get_peer_cert</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; X509.X509</span>
+ <span class="sd">&quot;&quot;&quot;Return the peer certificate.</span>
+
+<span class="sd"> If the peer did not provide a certificate, return None.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">c</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_peer_cert</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">c</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">None</span>
+ <span class="c1"># Need to free the pointer coz OpenSSL doesn&#39;t.</span>
+ <span class="k">return</span> <span class="n">X509</span><span class="o">.</span><span class="n">X509</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.get_peer_cert_chain"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_peer_cert_chain">[docs]</a> <span class="k">def</span> <span class="nf">get_peer_cert_chain</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; Optional[X509.X509_Stack]</span>
+ <span class="sd">&quot;&quot;&quot;Return the peer certificate chain; if the peer did not provide</span>
+<span class="sd"> a certificate chain, return None.</span>
+
+<span class="sd"> :warning: The returned chain will be valid only for as long as the</span>
+<span class="sd"> connection object is alive. Once the connection object</span>
+<span class="sd"> gets freed, the chain will be freed as well.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">c</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_peer_cert_chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">c</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">None</span>
+ <span class="c1"># No need to free the pointer coz OpenSSL does.</span>
+ <span class="k">return</span> <span class="n">X509</span><span class="o">.</span><span class="n">X509_Stack</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.get_cipher"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_cipher">[docs]</a> <span class="k">def</span> <span class="nf">get_cipher</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; Optional[SSL.Cipher]</span>
+ <span class="sd">&quot;&quot;&quot;Return an M2Crypto.SSL.Cipher object for this connection; if the</span>
+<span class="sd"> connection has not been initialised with a cipher suite, return None.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">c</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_current_cipher</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">c</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">None</span>
+ <span class="k">return</span> <span class="n">Cipher</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.get_ciphers"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_ciphers">[docs]</a> <span class="k">def</span> <span class="nf">get_ciphers</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; Optional[SSL:Cipher_Stack]</span>
+ <span class="sd">&quot;&quot;&quot;Return an M2Crypto.SSL.Cipher_Stack object for this</span>
+<span class="sd"> connection; if the connection has not been initialised with</span>
+<span class="sd"> cipher suites, return None.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">c</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_ciphers</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">c</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">None</span>
+ <span class="k">return</span> <span class="n">Cipher_Stack</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.get_cipher_list"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_cipher_list">[docs]</a> <span class="k">def</span> <span class="nf">get_cipher_list</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">idx</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; str</span>
+ <span class="sd">&quot;&quot;&quot;Return the cipher suites for this connection as a string object.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_cipher_list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">,</span> <span class="n">idx</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.set_cipher_list"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_cipher_list">[docs]</a> <span class="k">def</span> <span class="nf">set_cipher_list</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cipher_list</span><span class="p">):</span>
+ <span class="c1"># type: (str) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;Set the cipher suites for this connection.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_set_cipher_list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">,</span> <span class="n">cipher_list</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.makefile"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.makefile">[docs]</a> <span class="k">def</span> <span class="nf">makefile</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s1">&#39;rb&#39;</span><span class="p">,</span> <span class="n">bufsize</span><span class="o">=-</span><span class="mi">1</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, int) -&gt; socket._fileobject</span>
+ <span class="k">return</span> <span class="n">socket</span><span class="o">.</span><span class="n">_fileobject</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mode</span><span class="p">,</span> <span class="n">bufsize</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.getsockname"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.getsockname">[docs]</a> <span class="k">def</span> <span class="nf">getsockname</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; util.AddrType</span>
+ <span class="sd">&quot;&quot;&quot;Return the socket&#39;s own address.</span>
+
+<span class="sd"> This is useful to find out the port number of an IPv4/v6 socket,</span>
+<span class="sd"> for instance. (The format of the address returned depends</span>
+<span class="sd"> on the address family -- see above.)</span>
+
+<span class="sd"> :return:socket&#39;s address as addr type</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">getsockname</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="Connection.getpeername"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.getpeername">[docs]</a> <span class="k">def</span> <span class="nf">getpeername</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; util.AddrType</span>
+ <span class="sd">&quot;&quot;&quot;Return the remote address to which the socket is connected.</span>
+
+<span class="sd"> This is useful to find out the port number of a remote IPv4/v6 socket,</span>
+<span class="sd"> for instance.</span>
+<span class="sd"> On some systems this function is not supported.</span>
+
+<span class="sd"> :return:</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">getpeername</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="Connection.set_session_id_ctx"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_session_id_ctx">[docs]</a> <span class="k">def</span> <span class="nf">set_session_id_ctx</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; int</span>
+ <span class="n">ret</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_set_session_id_context</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">,</span> <span class="nb">id</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">ret</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">SSLError</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">err_reason_error_string</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">err_get_error</span><span class="p">()))</span>
+</div>
+<div class="viewcode-block" id="Connection.get_session"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_session">[docs]</a> <span class="k">def</span> <span class="nf">get_session</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; SSL.Session</span>
+ <span class="n">sess</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_session</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">Session</span><span class="p">(</span><span class="n">sess</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.set_session"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_session">[docs]</a> <span class="k">def</span> <span class="nf">set_session</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">session</span><span class="p">):</span>
+ <span class="c1"># type: (SSL.Session) -&gt; None</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_set_session</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">,</span> <span class="n">session</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+</div>
+<div class="viewcode-block" id="Connection.get_default_session_timeout"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_default_session_timeout">[docs]</a> <span class="k">def</span> <span class="nf">get_default_session_timeout</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_default_session_timeout</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.get_socket_read_timeout"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_socket_read_timeout">[docs]</a> <span class="k">def</span> <span class="nf">get_socket_read_timeout</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; SSL.timeout</span>
+ <span class="k">return</span> <span class="n">timeout</span><span class="o">.</span><span class="n">struct_to_timeout</span><span class="p">(</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">getsockopt</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">SOL_SOCKET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SO_RCVTIMEO</span><span class="p">,</span>
+ <span class="n">timeout</span><span class="o">.</span><span class="n">struct_size</span><span class="p">()))</span>
+</div>
+<div class="viewcode-block" id="Connection.get_socket_write_timeout"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_socket_write_timeout">[docs]</a> <span class="k">def</span> <span class="nf">get_socket_write_timeout</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; SSL.timeout</span>
+ <span class="k">return</span> <span class="n">timeout</span><span class="o">.</span><span class="n">struct_to_timeout</span><span class="p">(</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">getsockopt</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">SOL_SOCKET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SO_SNDTIMEO</span><span class="p">,</span>
+ <span class="n">timeout</span><span class="o">.</span><span class="n">struct_size</span><span class="p">()))</span>
+</div>
+<div class="viewcode-block" id="Connection.set_socket_read_timeout"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_socket_read_timeout">[docs]</a> <span class="k">def</span> <span class="nf">set_socket_read_timeout</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeo</span><span class="p">):</span>
+ <span class="c1"># type: (SSL.timeout) -&gt; None</span>
+ <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">timeo</span><span class="p">,</span> <span class="n">timeout</span><span class="o">.</span><span class="n">timeout</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">setsockopt</span><span class="p">(</span>
+ <span class="n">socket</span><span class="o">.</span><span class="n">SOL_SOCKET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SO_RCVTIMEO</span><span class="p">,</span> <span class="n">timeo</span><span class="o">.</span><span class="n">pack</span><span class="p">())</span>
+</div>
+<div class="viewcode-block" id="Connection.set_socket_write_timeout"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_socket_write_timeout">[docs]</a> <span class="k">def</span> <span class="nf">set_socket_write_timeout</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeo</span><span class="p">):</span>
+ <span class="c1"># type: (SSL.timeout) -&gt; None</span>
+ <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">timeo</span><span class="p">,</span> <span class="n">timeout</span><span class="o">.</span><span class="n">timeout</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">setsockopt</span><span class="p">(</span>
+ <span class="n">socket</span><span class="o">.</span><span class="n">SOL_SOCKET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SO_SNDTIMEO</span><span class="p">,</span> <span class="n">timeo</span><span class="o">.</span><span class="n">pack</span><span class="p">())</span>
+</div>
+<div class="viewcode-block" id="Connection.get_version"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_version">[docs]</a> <span class="k">def</span> <span class="nf">get_version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; str</span>
+ <span class="sd">&quot;&quot;&quot;Return the TLS/SSL protocol version for this connection.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_version</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Connection.set_post_connection_check_callback"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_post_connection_check_callback">[docs]</a> <span class="k">def</span> <span class="nf">set_post_connection_check_callback</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">postConnectionCheck</span><span class="p">):</span> <span class="c1"># noqa</span>
+ <span class="c1"># type: (Callable) -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">postConnectionCheck</span> <span class="o">=</span> <span class="n">postConnectionCheck</span>
+</div>
+<div class="viewcode-block" id="Connection.set_tlsext_host_name"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_tlsext_host_name">[docs]</a> <span class="k">def</span> <span class="nf">set_tlsext_host_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;Set the requested hostname for the SNI (Server Name Indication)</span>
+<span class="sd"> extension.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_set_tlsext_host_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span></div></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" >Module code</a> &raquo;</li>
+ <li><a href="../SSL.html" >M2Crypto.SSL</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/SSL/Context.html b/doc/html/_modules/M2Crypto/SSL/Context.html
new file mode 100644
index 0000000..1a377ba
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/SSL/Context.html
@@ -0,0 +1,542 @@
+
+
+<!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>M2Crypto.SSL.Context &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../../index.html" />
+ <link rel="up" title="M2Crypto.SSL" href="../SSL.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" >Module code</a> &raquo;</li>
+ <li><a href="../SSL.html" accesskey="U">M2Crypto.SSL</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.SSL.Context</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+
+<span class="sd">&quot;&quot;&quot;SSL Context</span>
+
+<span class="sd">Copyright (c) 1999-2004 Ng Pheng Siong. All rights reserved.&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">Err</span><span class="p">,</span> <span class="n">RSA</span><span class="p">,</span> <span class="n">X509</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span> <span class="c1"># noqa</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.SSL</span> <span class="kn">import</span> <span class="n">cb</span> <span class="c1"># noqa</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.SSL.Session</span> <span class="kn">import</span> <span class="n">Session</span> <span class="c1"># noqa</span>
+<span class="kn">from</span> <span class="nn">weakref</span> <span class="kn">import</span> <span class="n">WeakValueDictionary</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Any</span><span class="p">,</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Callable</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Union</span> <span class="c1"># noqa</span>
+
+<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;ctxmap&#39;</span><span class="p">,</span> <span class="s1">&#39;Context&#39;</span><span class="p">,</span> <span class="s1">&#39;map&#39;</span><span class="p">]</span>
+
+
+<span class="k">class</span> <span class="nc">_ctxmap</span><span class="p">:</span> <span class="c1"># noqa</span>
+ <span class="n">singleton</span> <span class="o">=</span> <span class="bp">None</span> <span class="c1"># type: Optional[_ctxmap]</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;Simple WeakReffed list.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_ctxmap</span> <span class="o">=</span> <span class="n">WeakValueDictionary</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; Any</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_ctxmap</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+
+ <span class="k">def</span> <span class="nf">__setitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="c1"># type: (int, Any) -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_ctxmap</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+
+ <span class="k">def</span> <span class="nf">__delitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; None</span>
+ <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_ctxmap</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+
+
+<div class="viewcode-block" id="ctxmap"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.ctxmap">[docs]</a><span class="k">def</span> <span class="nf">ctxmap</span><span class="p">():</span>
+ <span class="c1"># type: () -&gt; _ctxmap</span>
+ <span class="k">if</span> <span class="n">_ctxmap</span><span class="o">.</span><span class="n">singleton</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">_ctxmap</span><span class="o">.</span><span class="n">singleton</span> <span class="o">=</span> <span class="n">_ctxmap</span><span class="p">()</span>
+ <span class="k">return</span> <span class="n">_ctxmap</span><span class="o">.</span><span class="n">singleton</span>
+<span class="c1"># deprecated!!!</span></div>
+<span class="nb">map</span> <span class="o">=</span> <span class="n">ctxmap</span>
+
+
+<div class="viewcode-block" id="Context"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context">[docs]</a><span class="k">class</span> <span class="nc">Context</span><span class="p">:</span>
+
+ <span class="sd">&quot;&quot;&quot;&#39;Context&#39; for SSL connections.&quot;&quot;&quot;</span>
+
+ <span class="n">m2_ssl_ctx_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">protocol</span><span class="o">=</span><span class="s1">&#39;tls&#39;</span><span class="p">,</span> <span class="n">weak_crypto</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
+ <span class="n">post_connection_check</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (str, Optional[int], Optional[Callable]) -&gt; None</span>
+ <span class="n">proto</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">m2</span><span class="p">,</span> <span class="n">protocol</span> <span class="o">+</span> <span class="s1">&#39;_method&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">proto</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="c1"># default is &#39;sslv23&#39; for older versions of OpenSSL</span>
+ <span class="k">if</span> <span class="n">protocol</span> <span class="o">==</span> <span class="s1">&#39;tls&#39;</span><span class="p">:</span>
+ <span class="n">proto</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">m2</span><span class="p">,</span> <span class="s1">&#39;sslv23_method&#39;</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;no such protocol &#39;</span><span class="si">%s</span><span class="s2">&#39;&quot;</span> <span class="o">%</span> <span class="n">protocol</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ctx</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_new</span><span class="p">(</span><span class="n">proto</span><span class="p">())</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">allow_unknown_ca</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># type: Union[int, bool]</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">post_connection_check</span> <span class="o">=</span> <span class="n">post_connection_check</span>
+ <span class="n">ctxmap</span><span class="p">()[</span><span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">)]</span> <span class="o">=</span> <span class="bp">self</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_set_cache_size</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="mi">128</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">weak_crypto</span> <span class="ow">is</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">protocol</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;sslv23&#39;</span><span class="p">,</span> <span class="s1">&#39;tls&#39;</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">set_options</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">SSL_OP_ALL</span> <span class="o">|</span> <span class="n">m2</span><span class="o">.</span><span class="n">SSL_OP_NO_SSLv2</span> <span class="o">|</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">SSL_OP_NO_SSLv3</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;ctx&#39;</span><span class="p">,</span> <span class="bp">None</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_ssl_ctx_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">)</span>
+
+<div class="viewcode-block" id="Context.close"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.close">[docs]</a> <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">del</span> <span class="n">ctxmap</span><span class="p">()[</span><span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">)]</span>
+</div>
+<div class="viewcode-block" id="Context.load_cert"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.load_cert">[docs]</a> <span class="k">def</span> <span class="nf">load_cert</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">certfile</span><span class="p">,</span> <span class="n">keyfile</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
+ <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, Optional[AnyStr], Callable) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;Load certificate and private key into the context.</span>
+
+<span class="sd"> :param certfile: File that contains the PEM-encoded certificate.</span>
+<span class="sd"> :param keyfile: File that contains the PEM-encoded private key.</span>
+<span class="sd"> Default value of None indicates that the private key</span>
+<span class="sd"> is to be found in &#39;certfile&#39;.</span>
+<span class="sd"> :param callback: Callable object to be invoked if the private key is</span>
+<span class="sd"> passphrase-protected. Default callback provides a</span>
+<span class="sd"> simple terminal-style input for the passphrase.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_passphrase_callback</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_use_cert</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">certfile</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">keyfile</span><span class="p">:</span>
+ <span class="n">keyfile</span> <span class="o">=</span> <span class="n">certfile</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_use_privkey</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">keyfile</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_check_privkey</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;public/private key mismatch&#39;</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Context.load_cert_chain"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.load_cert_chain">[docs]</a> <span class="k">def</span> <span class="nf">load_cert_chain</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">certchainfile</span><span class="p">,</span> <span class="n">keyfile</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
+ <span class="n">callback</span><span class="o">=</span><span class="n">util</span><span class="o">.</span><span class="n">passphrase_callback</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, Optional[AnyStr], Callable) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;Load certificate chain and private key into the context.</span>
+
+<span class="sd"> :param certchainfile: File object containing the PEM-encoded</span>
+<span class="sd"> certificate chain.</span>
+<span class="sd"> :param keyfile: File object containing the PEM-encoded private</span>
+<span class="sd"> key. Default value of None indicates that the</span>
+<span class="sd"> private key is to be found in &#39;certchainfile&#39;.</span>
+<span class="sd"> :param callback: Callable object to be invoked if the private key</span>
+<span class="sd"> is passphrase-protected. Default callback</span>
+<span class="sd"> provides a simple terminal-style input for the</span>
+<span class="sd"> passphrase.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_passphrase_callback</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_use_cert_chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">certchainfile</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">keyfile</span><span class="p">:</span>
+ <span class="n">keyfile</span> <span class="o">=</span> <span class="n">certchainfile</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_use_privkey</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">keyfile</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_check_privkey</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;public/private key mismatch&#39;</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Context.set_client_CA_list_from_file"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_client_CA_list_from_file">[docs]</a> <span class="k">def</span> <span class="nf">set_client_CA_list_from_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cafile</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;Load CA certs into the context. These CA certs are sent to the</span>
+<span class="sd"> peer during *SSLv3 certificate request*.</span>
+
+<span class="sd"> :param cafile: File object containing one or more PEM-encoded CA</span>
+<span class="sd"> certificates concatenated together.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_set_client_CA_list_from_file</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">cafile</span><span class="p">)</span>
+
+ <span class="c1"># Deprecated.</span></div>
+ <span class="n">load_client_CA</span> <span class="o">=</span> <span class="n">load_client_ca</span> <span class="o">=</span> <span class="n">set_client_CA_list_from_file</span>
+
+<div class="viewcode-block" id="Context.load_verify_locations"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.load_verify_locations">[docs]</a> <span class="k">def</span> <span class="nf">load_verify_locations</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cafile</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">capath</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[AnyStr], Optional[AnyStr]) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;Load CA certs into the context.</span>
+
+<span class="sd"> These CA certs are used during verification of the peer&#39;s</span>
+<span class="sd"> certificate.</span>
+
+<span class="sd"> :param cafile: File containing one or more PEM-encoded CA</span>
+<span class="sd"> certificates concatenated together.</span>
+
+<span class="sd"> :param capath: Directory containing PEM-encoded CA certificates</span>
+<span class="sd"> (one certificate per file).</span>
+
+<span class="sd"> :return: 0 if the operation failed because CAfile and CApath are NULL</span>
+<span class="sd"> or the processing at one of the locations specified failed.</span>
+<span class="sd"> Check the error stack to find out the reason.</span>
+
+<span class="sd"> 1 The operation succeeded.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">cafile</span> <span class="ow">is</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">capath</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;cafile and capath can not both be None.&quot;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_load_verify_locations</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">cafile</span><span class="p">,</span> <span class="n">capath</span><span class="p">)</span>
+
+ <span class="c1"># Deprecated.</span></div>
+ <span class="n">load_verify_info</span> <span class="o">=</span> <span class="n">load_verify_locations</span>
+
+<div class="viewcode-block" id="Context.set_session_id_ctx"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_session_id_ctx">[docs]</a> <span class="k">def</span> <span class="nf">set_session_id_ctx</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;Sets the session id for the SSL.Context w/in a session can be reused.</span>
+
+<span class="sd"> :param id: Sessions are generated within a certain context. When</span>
+<span class="sd"> exporting/importing sessions with</span>
+<span class="sd"> i2d_SSL_SESSION/d2i_SSL_SESSION it would be possible,</span>
+<span class="sd"> to re-import a session generated from another context</span>
+<span class="sd"> (e.g. another application), which might lead to</span>
+<span class="sd"> malfunctions. Therefore each application must set its</span>
+<span class="sd"> own session id context sid_ctx which is used to</span>
+<span class="sd"> distinguish the contexts and is stored in exported</span>
+<span class="sd"> sessions. The sid_ctx can be any kind of binary data</span>
+<span class="sd"> with a given length, it is therefore possible to use</span>
+<span class="sd"> e.g. the name of the application and/or the hostname</span>
+<span class="sd"> and/or service name.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">ret</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_set_session_id_context</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="nb">id</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">ret</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">Err</span><span class="o">.</span><span class="n">SSLError</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error_code</span><span class="p">(),</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Context.set_default_verify_paths"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_default_verify_paths">[docs]</a> <span class="k">def</span> <span class="nf">set_default_verify_paths</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Specifies that the default locations from which CA certs are</span>
+<span class="sd"> loaded should be used.</span>
+
+<span class="sd"> There is one default directory and one default file. The default</span>
+<span class="sd"> CA certificates directory is called &quot;certs&quot; in the default</span>
+<span class="sd"> OpenSSL directory. Alternatively the SSL_CERT_DIR environment</span>
+<span class="sd"> variable can be defined to override this location. The default</span>
+<span class="sd"> CA certificates file is called &quot;cert.pem&quot; in the default OpenSSL</span>
+<span class="sd"> directory. Alternatively the SSL_CERT_FILE environment variable</span>
+<span class="sd"> can be defined to override this location.</span>
+
+<span class="sd"> @return 0 if the operation failed. A missing default location is</span>
+<span class="sd"> still treated as a success. No error code is set.</span>
+
+<span class="sd"> 1 The operation succeeded.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">ret</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_set_default_verify_paths</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">ret</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Cannot use default SSL certificate store!&#39;</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Context.set_allow_unknown_ca"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_allow_unknown_ca">[docs]</a> <span class="k">def</span> <span class="nf">set_allow_unknown_ca</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ok</span><span class="p">):</span>
+ <span class="c1"># type: (Union[int, bool]) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;Set the context to accept/reject a peer certificate if the</span>
+<span class="sd"> certificate&#39;s CA is unknown.</span>
+
+<span class="sd"> :param ok: True to accept, False to reject.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">allow_unknown_ca</span> <span class="o">=</span> <span class="n">ok</span>
+</div>
+<div class="viewcode-block" id="Context.get_allow_unknown_ca"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.get_allow_unknown_ca">[docs]</a> <span class="k">def</span> <span class="nf">get_allow_unknown_ca</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; Union[int, bool]</span>
+ <span class="sd">&quot;&quot;&quot;Get the context&#39;s setting that accepts/rejects a peer</span>
+<span class="sd"> certificate if the certificate&#39;s CA is unknown.</span>
+
+<span class="sd"> FIXME 2Bconverted to bool</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">allow_unknown_ca</span>
+</div>
+<div class="viewcode-block" id="Context.set_verify"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_verify">[docs]</a> <span class="k">def</span> <span class="nf">set_verify</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mode</span><span class="p">,</span> <span class="n">depth</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (int, int, Optional[Callable]) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Set verify options. Most applications will need to call this</span>
+<span class="sd"> method with the right options to make a secure SSL connection.</span>
+
+<span class="sd"> :param mode: The verification mode to use. Typically at least</span>
+<span class="sd"> SSL.verify_peer is used. Clients would also typically</span>
+<span class="sd"> add SSL.verify_fail_if_no_peer_cert.</span>
+<span class="sd"> :param depth: The maximum allowed depth of the certificate chain</span>
+<span class="sd"> returned by the peer.</span>
+<span class="sd"> :param callback: Callable that can be used to specify custom</span>
+<span class="sd"> verification checks.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">callback</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_set_verify_default</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">mode</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_set_verify</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">mode</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_set_verify_depth</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">depth</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Context.get_verify_mode"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.get_verify_mode">[docs]</a> <span class="k">def</span> <span class="nf">get_verify_mode</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_get_verify_mode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Context.get_verify_depth"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.get_verify_depth">[docs]</a> <span class="k">def</span> <span class="nf">get_verify_depth</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;Returns the verification mode currently set in the SSL Context.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_get_verify_depth</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Context.set_tmp_dh"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_tmp_dh">[docs]</a> <span class="k">def</span> <span class="nf">set_tmp_dh</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dhpfile</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;Load ephemeral DH parameters into the context.</span>
+
+<span class="sd"> :param dhpfile: Filename of the file containing the PEM-encoded</span>
+<span class="sd"> DH parameters.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">f</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="n">dhpfile</span><span class="p">)</span>
+ <span class="n">dhp</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">dh_read_parameters</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_set_tmp_dh</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">dhp</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Context.set_tmp_dh_callback"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_tmp_dh_callback">[docs]</a> <span class="k">def</span> <span class="nf">set_tmp_dh_callback</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[Callable]) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;Sets the callback function for SSL.Context.</span>
+
+<span class="sd"> :param callback: Callable to be used when a DH parameters are required.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">callback</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_set_tmp_dh_callback</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Context.set_tmp_rsa"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_tmp_rsa">[docs]</a> <span class="k">def</span> <span class="nf">set_tmp_rsa</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">rsa</span><span class="p">):</span>
+ <span class="c1"># type: (RSA.RSA) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;Load ephemeral RSA key into the context.</span>
+
+<span class="sd"> :param rsa: RSA.RSA instance.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">rsa</span><span class="p">,</span> <span class="n">RSA</span><span class="o">.</span><span class="n">RSA</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_set_tmp_rsa</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">rsa</span><span class="o">.</span><span class="n">rsa</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;Expected an instance of RSA.RSA, got </span><span class="si">%s</span><span class="s2">.&quot;</span> <span class="o">%</span> <span class="n">rsa</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Context.set_tmp_rsa_callback"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_tmp_rsa_callback">[docs]</a> <span class="k">def</span> <span class="nf">set_tmp_rsa_callback</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[Callable]) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;Sets the callback function to be used when</span>
+<span class="sd"> a temporary/ephemeral RSA key is required.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">callback</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_set_tmp_rsa_callback</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Context.set_info_callback"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_info_callback">[docs]</a> <span class="k">def</span> <span class="nf">set_info_callback</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="n">cb</span><span class="o">.</span><span class="n">ssl_info_callback</span><span class="p">):</span>
+ <span class="c1"># type: (Callable) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;Set a callback function to get state information.</span>
+
+<span class="sd"> It can be used to get state information about the SSL</span>
+<span class="sd"> connections that are created from this context.</span>
+
+<span class="sd"> :param callback: Callback function. The default prints</span>
+<span class="sd"> information to stderr.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_set_info_callback</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Context.set_cipher_list"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_cipher_list">[docs]</a> <span class="k">def</span> <span class="nf">set_cipher_list</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cipher_list</span><span class="p">):</span>
+ <span class="c1"># type: (str) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;Sets the list of available ciphers.</span>
+
+<span class="sd"> :param cipher_list: The format of the string is described in</span>
+<span class="sd"> ciphers(1).</span>
+<span class="sd"> :return: 1 if any cipher could be selected and 0 on complete</span>
+<span class="sd"> failure.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_set_cipher_list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">cipher_list</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Context.add_session"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.add_session">[docs]</a> <span class="k">def</span> <span class="nf">add_session</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">session</span><span class="p">):</span>
+ <span class="c1"># type: (Session) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;Add the session to the context.</span>
+
+<span class="sd"> :param session: the session to be added.</span>
+
+<span class="sd"> :return: 0 The operation failed. It was tried to add the same</span>
+<span class="sd"> (identical) session twice.</span>
+
+<span class="sd"> 1 The operation succeeded.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_add_session</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">session</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+</div>
+<div class="viewcode-block" id="Context.remove_session"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.remove_session">[docs]</a> <span class="k">def</span> <span class="nf">remove_session</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">session</span><span class="p">):</span>
+ <span class="c1"># type: (Session) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;Remove the session from the context.</span>
+
+<span class="sd"> :param session: the session to be removed.</span>
+
+<span class="sd"> :return: 0 The operation failed. The session was not found in</span>
+<span class="sd"> the cache.</span>
+
+<span class="sd"> 1 The operation succeeded.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_remove_session</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">session</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+</div>
+<div class="viewcode-block" id="Context.get_session_timeout"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.get_session_timeout">[docs]</a> <span class="k">def</span> <span class="nf">get_session_timeout</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;Get current session timeout.</span>
+
+<span class="sd"> Whenever a new session is created, it is assigned a maximum</span>
+<span class="sd"> lifetime. This lifetime is specified by storing the creation</span>
+<span class="sd"> time of the session and the timeout value valid at this time. If</span>
+<span class="sd"> the actual time is later than creation time plus timeout, the</span>
+<span class="sd"> session is not reused.</span>
+
+<span class="sd"> Due to this realization, all sessions behave according to the</span>
+<span class="sd"> timeout value valid at the time of the session negotiation.</span>
+<span class="sd"> Changes of the timeout value do not affect already established</span>
+<span class="sd"> sessions.</span>
+
+<span class="sd"> Expired sessions are removed from the internal session cache,</span>
+<span class="sd"> whenever SSL_CTX_flush_sessions(3) is called, either directly by</span>
+<span class="sd"> the application or automatically (see</span>
+<span class="sd"> SSL_CTX_set_session_cache_mode(3))</span>
+
+<span class="sd"> The default value for session timeout is decided on a per</span>
+<span class="sd"> protocol basis, see SSL_get_default_timeout(3). All currently</span>
+<span class="sd"> supported protocols have the same default timeout value of 300</span>
+<span class="sd"> seconds.</span>
+
+<span class="sd"> SSL_CTX_set_timeout() returns the previously set timeout value.</span>
+
+<span class="sd"> :return: the currently set timeout value.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_get_session_timeout</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Context.set_session_timeout"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_session_timeout">[docs]</a> <span class="k">def</span> <span class="nf">set_session_timeout</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;Set new session timeout.</span>
+
+<span class="sd"> See self.get_session_timeout() for explanation of the session</span>
+<span class="sd"> timeouts.</span>
+
+<span class="sd"> :param timeout: new timeout value.</span>
+
+<span class="sd"> :return: the previously set timeout value.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_set_session_timeout</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Context.set_session_cache_mode"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_session_cache_mode">[docs]</a> <span class="k">def</span> <span class="nf">set_session_cache_mode</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mode</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;Enables/disables session caching.</span>
+
+<span class="sd"> The mode is set by using m2.SSL_SESS_CACHE_* constants.</span>
+
+<span class="sd"> :param mode: new mode value.</span>
+
+<span class="sd"> :return: the previously set cache mode value.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_set_session_cache_mode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">mode</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Context.get_session_cache_mode"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.get_session_cache_mode">[docs]</a> <span class="k">def</span> <span class="nf">get_session_cache_mode</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;Gets the current session caching.</span>
+
+<span class="sd"> The mode is set to m2.SSL_SESS_CACHE_* constants.</span>
+
+<span class="sd"> :return: the previously set cache mode value.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_get_session_cache_mode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Context.set_options"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_options">[docs]</a> <span class="k">def</span> <span class="nf">set_options</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">op</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;Adds the options set via bitmask in options to the Context.</span>
+
+<span class="sd"> !!! Options already set before are not cleared!</span>
+
+<span class="sd"> The behaviour of the SSL library can be changed by setting</span>
+<span class="sd"> several options. The options are coded as bitmasks and can be</span>
+<span class="sd"> combined by a logical or operation (|).</span>
+
+<span class="sd"> SSL.Context.set_options() and SSL.set_options() affect the</span>
+<span class="sd"> (external) protocol behaviour of the SSL library. The (internal)</span>
+<span class="sd"> behaviour of the API can be changed by using the similar</span>
+<span class="sd"> SSL.Context.set_mode() and SSL.set_mode() functions.</span>
+
+<span class="sd"> During a handshake, the option settings of the SSL object are</span>
+<span class="sd"> used. When a new SSL object is created from a context using</span>
+<span class="sd"> SSL(), the current option setting is copied. Changes to ctx</span>
+<span class="sd"> do not affect already created SSL objects. SSL.clear() does not</span>
+<span class="sd"> affect the settings.</span>
+
+<span class="sd"> :param op: bitmask of additional options specified in</span>
+<span class="sd"> SSL_CTX_set_options(3) manpage.</span>
+
+<span class="sd"> :return: the new options bitmask after adding options.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_set_options</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">,</span> <span class="n">op</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Context.get_cert_store"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.get_cert_store">[docs]</a> <span class="k">def</span> <span class="nf">get_cert_store</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; X509.X509</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Get the certificate store associated with this context.</span>
+
+<span class="sd"> :warning: The store is NOT refcounted, and as such can not be relied</span>
+<span class="sd"> to be valid once the context goes away or is changed.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">X509</span><span class="o">.</span><span class="n">X509_Store</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">ssl_ctx_get_cert_store</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">))</span></div></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" >Module code</a> &raquo;</li>
+ <li><a href="../SSL.html" >M2Crypto.SSL</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/SSL/SSLServer.html b/doc/html/_modules/M2Crypto/SSL/SSLServer.html
new file mode 100644
index 0000000..898c32a
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/SSL/SSLServer.html
@@ -0,0 +1,157 @@
+
+
+<!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>M2Crypto.SSL.SSLServer &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../../index.html" />
+ <link rel="up" title="M2Crypto.SSL" href="../SSL.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" >Module code</a> &raquo;</li>
+ <li><a href="../SSL.html" accesskey="U">M2Crypto.SSL</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.SSL.SSLServer</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span><span class="p">,</span> <span class="n">print_function</span>
+
+<span class="sd">&quot;&quot;&quot;SSLServer</span>
+
+<span class="sd">Copyright (c) 1999-2002 Ng Pheng Siong. All rights reserved.&quot;&quot;&quot;</span>
+
+<span class="c1"># M2Crypto</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.SSL</span> <span class="kn">import</span> <span class="n">SSLError</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.SSL.Connection</span> <span class="kn">import</span> <span class="n">Connection</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.SSL.Context</span> <span class="kn">import</span> <span class="n">Context</span> <span class="c1"># noqa</span>
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">six</span> <span class="c1"># noqa</span>
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">util</span> <span class="c1"># noqa</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.six.moves.socketserver</span> <span class="kn">import</span> <span class="p">(</span><span class="n">BaseServer</span><span class="p">,</span> <span class="n">ForkingMixIn</span><span class="p">,</span>
+ <span class="n">TCPServer</span><span class="p">,</span> <span class="n">ThreadingMixIn</span><span class="p">)</span>
+<span class="kn">from</span> <span class="nn">socket</span> <span class="kn">import</span> <span class="n">socket</span> <span class="c1"># noqa</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Union</span> <span class="c1"># noqa</span>
+
+<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;SSLServer&#39;</span><span class="p">,</span> <span class="s1">&#39;ForkingSSLServer&#39;</span><span class="p">,</span> <span class="s1">&#39;ThreadingSSLServer&#39;</span><span class="p">]</span>
+
+
+<div class="viewcode-block" id="SSLServer"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.SSLServer.SSLServer">[docs]</a><span class="k">class</span> <span class="nc">SSLServer</span><span class="p">(</span><span class="n">TCPServer</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">server_address</span><span class="p">,</span> <span class="n">RequestHandlerClass</span><span class="p">,</span> <span class="n">ssl_context</span><span class="p">,</span> <span class="c1"># noqa</span>
+ <span class="n">bind_and_activate</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span>
+ <span class="c1"># type: (util.AddrType, socketserver.BaseRequestHandler, Context, bool) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Superclass says: Constructor. May be extended, do not override.</span>
+<span class="sd"> This class says: Ho-hum.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">BaseServer</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">server_address</span><span class="p">,</span> <span class="n">RequestHandlerClass</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ssl_ctx</span> <span class="o">=</span> <span class="n">ssl_context</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">socket</span> <span class="o">=</span> <span class="n">Connection</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl_ctx</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">bind_and_activate</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">server_bind</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">server_activate</span><span class="p">()</span>
+
+<div class="viewcode-block" id="SSLServer.handle_request"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.SSLServer.SSLServer.handle_request">[docs]</a> <span class="k">def</span> <span class="nf">handle_request</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="n">request</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="n">client_address</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">request</span><span class="p">,</span> <span class="n">client_address</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_request</span><span class="p">()</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">verify_request</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">client_address</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">process_request</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">client_address</span><span class="p">)</span>
+ <span class="k">except</span> <span class="n">SSLError</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">handle_error</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">client_address</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="SSLServer.handle_error"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.SSLServer.SSLServer.handle_error">[docs]</a> <span class="k">def</span> <span class="nf">handle_error</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="n">client_address</span><span class="p">):</span>
+ <span class="c1"># type: (Union[socket, Connection], util.AddrType) -&gt; None</span>
+ <span class="k">print</span><span class="p">(</span><span class="s1">&#39;-&#39;</span> <span class="o">*</span> <span class="mi">40</span><span class="p">)</span>
+ <span class="kn">import</span> <span class="nn">traceback</span>
+ <span class="n">traceback</span><span class="o">.</span><span class="n">print_exc</span><span class="p">()</span>
+ <span class="k">print</span><span class="p">(</span><span class="s1">&#39;-&#39;</span> <span class="o">*</span> <span class="mi">40</span><span class="p">)</span>
+
+</div></div>
+<div class="viewcode-block" id="ForkingSSLServer"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.SSLServer.ForkingSSLServer">[docs]</a><span class="k">class</span> <span class="nc">ForkingSSLServer</span><span class="p">(</span><span class="n">ForkingMixIn</span><span class="p">,</span> <span class="n">SSLServer</span><span class="p">):</span>
+ <span class="k">pass</span>
+
+</div>
+<div class="viewcode-block" id="ThreadingSSLServer"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.SSLServer.ThreadingSSLServer">[docs]</a><span class="k">class</span> <span class="nc">ThreadingSSLServer</span><span class="p">(</span><span class="n">ThreadingMixIn</span><span class="p">,</span> <span class="n">SSLServer</span><span class="p">):</span>
+ <span class="k">pass</span></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" >Module code</a> &raquo;</li>
+ <li><a href="../SSL.html" >M2Crypto.SSL</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/SSL/Session.html b/doc/html/_modules/M2Crypto/SSL/Session.html
new file mode 100644
index 0000000..cd54906
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/SSL/Session.html
@@ -0,0 +1,167 @@
+
+
+<!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>M2Crypto.SSL.Session &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../../index.html" />
+ <link rel="up" title="M2Crypto.SSL" href="../SSL.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" >Module code</a> &raquo;</li>
+ <li><a href="../SSL.html" accesskey="U">M2Crypto.SSL</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.SSL.Session</h1><div class="highlight"><pre>
+<span></span><span class="sd">&quot;&quot;&quot;SSL Session</span>
+
+<span class="sd">Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.&quot;&quot;&quot;</span>
+
+<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;Session&#39;</span><span class="p">,</span> <span class="s1">&#39;load_session&#39;</span><span class="p">]</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">Err</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.SSL</span> <span class="kn">import</span> <span class="n">SSLError</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">AnyStr</span> <span class="c1"># noqa</span>
+
+
+<div class="viewcode-block" id="Session"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Session.Session">[docs]</a><span class="k">class</span> <span class="nc">Session</span><span class="p">:</span>
+
+ <span class="n">m2_ssl_session_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_session_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">session</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, int) -&gt; None</span>
+ <span class="k">assert</span> <span class="n">session</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="o">=</span> <span class="n">session</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="n">_pyfree</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_pyfree&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_ssl_session_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">_ptr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span>
+
+<div class="viewcode-block" id="Session.as_text"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Session.Session.as_text">[docs]</a> <span class="k">def</span> <span class="nf">as_text</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="n">buf</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_session_print</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="Session.as_der"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Session.Session.as_der">[docs]</a> <span class="k">def</span> <span class="nf">as_der</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="n">buf</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">i2d_ssl_session</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="Session.write_bio"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Session.Session.write_bio">[docs]</a> <span class="k">def</span> <span class="nf">write_bio</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bio</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO) -&gt; int</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_session_write_bio</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Session.get_time"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Session.Session.get_time">[docs]</a> <span class="k">def</span> <span class="nf">get_time</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_session_get_time</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Session.set_time"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Session.Session.set_time">[docs]</a> <span class="k">def</span> <span class="nf">set_time</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">t</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; int</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_session_set_time</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">,</span> <span class="n">t</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Session.get_timeout"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Session.Session.get_timeout">[docs]</a> <span class="k">def</span> <span class="nf">get_timeout</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_session_get_timeout</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Session.set_timeout"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Session.Session.set_timeout">[docs]</a> <span class="k">def</span> <span class="nf">set_timeout</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">t</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; int</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_session_set_timeout</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">,</span> <span class="n">t</span><span class="p">)</span>
+
+</div></div>
+<div class="viewcode-block" id="load_session"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.Session.load_session">[docs]</a><span class="k">def</span> <span class="nf">load_session</span><span class="p">(</span><span class="n">pemfile</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr) -&gt; Session</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="n">pemfile</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+ <span class="n">cptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_session_read_pem</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">())</span>
+ <span class="k">if</span> <span class="n">cptr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">SSLError</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">Session</span><span class="p">(</span><span class="n">cptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" >Module code</a> &raquo;</li>
+ <li><a href="../SSL.html" >M2Crypto.SSL</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/SSL/TwistedProtocolWrapper.html b/doc/html/_modules/M2Crypto/SSL/TwistedProtocolWrapper.html
new file mode 100644
index 0000000..c0b7245
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/SSL/TwistedProtocolWrapper.html
@@ -0,0 +1,518 @@
+
+
+<!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>M2Crypto.SSL.TwistedProtocolWrapper &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../../index.html" />
+ <link rel="up" title="M2Crypto.SSL" href="../SSL.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" >Module code</a> &raquo;</li>
+ <li><a href="../SSL.html" accesskey="U">M2Crypto.SSL</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.SSL.TwistedProtocolWrapper</h1><div class="highlight"><pre>
+<span></span><span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">Make Twisted use M2Crypto for SSL</span>
+
+<span class="sd">Copyright (c) 2004-2007 Open Source Applications Foundation.</span>
+<span class="sd">All rights reserved.</span>
+
+<span class="sd">FIXME THIS HAS NOT BEEN FINISHED. NEITHER PEP484 NOR PORT PYTHON3 HAS</span>
+<span class="sd">BEEN FINISHED. THE FURTHER WORK WILL BE DONE WHEN THE STATUS OF TWISTED</span>
+<span class="sd">IN THE PYTHON 3 (AND ASYNCIO) WORLD WILL BE CLEAR.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;connectSSL&#39;</span><span class="p">,</span> <span class="s1">&#39;connectTCP&#39;</span><span class="p">,</span> <span class="s1">&#39;listenSSL&#39;</span><span class="p">,</span> <span class="s1">&#39;listenTCP&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;TLSProtocolWrapper&#39;</span><span class="p">]</span>
+
+<span class="kn">import</span> <span class="nn">logging</span>
+
+<span class="kn">import</span> <span class="nn">twisted.internet.reactor</span>
+<span class="kn">import</span> <span class="nn">twisted.protocols.policies</span> <span class="kn">as</span> <span class="nn">policies</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">X509</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.SSL.Checker</span> <span class="kn">import</span> <span class="n">Checker</span><span class="p">,</span> <span class="n">SSLVerificationError</span>
+
+<span class="kn">from</span> <span class="nn">twisted.internet.interfaces</span> <span class="kn">import</span> <span class="n">ITLSTransport</span>
+<span class="kn">from</span> <span class="nn">twisted.protocols.policies</span> <span class="kn">import</span> <span class="n">ProtocolWrapper</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Callable</span><span class="p">,</span> <span class="n">Optional</span> <span class="c1"># noqa</span>
+ <span class="kn">from</span> <span class="nn">zope.interface</span> <span class="kn">import</span> <span class="n">implementer</span>
+
+<span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
+
+
+<span class="k">def</span> <span class="nf">_alwaysSucceedsPostConnectionCheck</span><span class="p">(</span><span class="n">peerX509</span><span class="p">,</span> <span class="n">expectedHost</span><span class="p">):</span>
+ <span class="k">return</span> <span class="mi">1</span>
+
+
+<div class="viewcode-block" id="connectSSL"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.TwistedProtocolWrapper.connectSSL">[docs]</a><span class="k">def</span> <span class="nf">connectSSL</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">factory</span><span class="p">,</span> <span class="n">contextFactory</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span>
+ <span class="n">bindAddress</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
+ <span class="n">reactor</span><span class="o">=</span><span class="n">twisted</span><span class="o">.</span><span class="n">internet</span><span class="o">.</span><span class="n">reactor</span><span class="p">,</span>
+ <span class="n">postConnectionCheck</span><span class="o">=</span><span class="n">Checker</span><span class="p">()):</span>
+ <span class="c1"># type: (str, int, object, object, int, Optional[str], twisted.internet.reactor, Checker) -&gt; reactor.connectTCP</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> A convenience function to start an SSL/TLS connection using Twisted.</span>
+
+<span class="sd"> See IReactorSSL interface in Twisted.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">wrappingFactory</span> <span class="o">=</span> <span class="n">policies</span><span class="o">.</span><span class="n">WrappingFactory</span><span class="p">(</span><span class="n">factory</span><span class="p">)</span>
+ <span class="n">wrappingFactory</span><span class="o">.</span><span class="n">protocol</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">factory</span><span class="p">,</span> <span class="n">wrappedProtocol</span><span class="p">:</span> \
+ <span class="n">TLSProtocolWrapper</span><span class="p">(</span><span class="n">factory</span><span class="p">,</span>
+ <span class="n">wrappedProtocol</span><span class="p">,</span>
+ <span class="n">startPassThrough</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
+ <span class="n">client</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
+ <span class="n">contextFactory</span><span class="o">=</span><span class="n">contextFactory</span><span class="p">,</span>
+ <span class="n">postConnectionCheck</span><span class="o">=</span><span class="n">postConnectionCheck</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">reactor</span><span class="o">.</span><span class="n">connectTCP</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">wrappingFactory</span><span class="p">,</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">bindAddress</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="connectTCP"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.TwistedProtocolWrapper.connectTCP">[docs]</a><span class="k">def</span> <span class="nf">connectTCP</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">factory</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span> <span class="n">bindAddress</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
+ <span class="n">reactor</span><span class="o">=</span><span class="n">twisted</span><span class="o">.</span><span class="n">internet</span><span class="o">.</span><span class="n">reactor</span><span class="p">,</span>
+ <span class="n">postConnectionCheck</span><span class="o">=</span><span class="n">Checker</span><span class="p">()):</span>
+ <span class="c1"># type: (str, int, object, int, Optional[util.AddrType], object, Callable) -&gt; object</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> A convenience function to start a TCP connection using Twisted.</span>
+
+<span class="sd"> NOTE: You must call startTLS(ctx) to go into SSL/TLS mode.</span>
+
+<span class="sd"> See IReactorTCP interface in Twisted.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">wrappingFactory</span> <span class="o">=</span> <span class="n">policies</span><span class="o">.</span><span class="n">WrappingFactory</span><span class="p">(</span><span class="n">factory</span><span class="p">)</span>
+ <span class="n">wrappingFactory</span><span class="o">.</span><span class="n">protocol</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">factory</span><span class="p">,</span> <span class="n">wrappedProtocol</span><span class="p">:</span> \
+ <span class="n">TLSProtocolWrapper</span><span class="p">(</span><span class="n">factory</span><span class="p">,</span>
+ <span class="n">wrappedProtocol</span><span class="p">,</span>
+ <span class="n">startPassThrough</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
+ <span class="n">client</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
+ <span class="n">contextFactory</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
+ <span class="n">postConnectionCheck</span><span class="o">=</span><span class="n">postConnectionCheck</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">reactor</span><span class="o">.</span><span class="n">connectTCP</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">wrappingFactory</span><span class="p">,</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">bindAddress</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="listenSSL"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.TwistedProtocolWrapper.listenSSL">[docs]</a><span class="k">def</span> <span class="nf">listenSSL</span><span class="p">(</span><span class="n">port</span><span class="p">,</span> <span class="n">factory</span><span class="p">,</span> <span class="n">contextFactory</span><span class="p">,</span> <span class="n">backlog</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span> <span class="n">interface</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">,</span>
+ <span class="n">reactor</span><span class="o">=</span><span class="n">twisted</span><span class="o">.</span><span class="n">internet</span><span class="o">.</span><span class="n">reactor</span><span class="p">,</span>
+ <span class="n">postConnectionCheck</span><span class="o">=</span><span class="n">_alwaysSucceedsPostConnectionCheck</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> A convenience function to listen for SSL/TLS connections using Twisted.</span>
+
+<span class="sd"> See IReactorSSL interface in Twisted.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">wrappingFactory</span> <span class="o">=</span> <span class="n">policies</span><span class="o">.</span><span class="n">WrappingFactory</span><span class="p">(</span><span class="n">factory</span><span class="p">)</span>
+ <span class="n">wrappingFactory</span><span class="o">.</span><span class="n">protocol</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">factory</span><span class="p">,</span> <span class="n">wrappedProtocol</span><span class="p">:</span> \
+ <span class="n">TLSProtocolWrapper</span><span class="p">(</span><span class="n">factory</span><span class="p">,</span>
+ <span class="n">wrappedProtocol</span><span class="p">,</span>
+ <span class="n">startPassThrough</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
+ <span class="n">client</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
+ <span class="n">contextFactory</span><span class="o">=</span><span class="n">contextFactory</span><span class="p">,</span>
+ <span class="n">postConnectionCheck</span><span class="o">=</span><span class="n">postConnectionCheck</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">reactor</span><span class="o">.</span><span class="n">listenTCP</span><span class="p">(</span><span class="n">port</span><span class="p">,</span> <span class="n">wrappingFactory</span><span class="p">,</span> <span class="n">backlog</span><span class="p">,</span> <span class="n">interface</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="listenTCP"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.TwistedProtocolWrapper.listenTCP">[docs]</a><span class="k">def</span> <span class="nf">listenTCP</span><span class="p">(</span><span class="n">port</span><span class="p">,</span> <span class="n">factory</span><span class="p">,</span> <span class="n">backlog</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span> <span class="n">interface</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">,</span>
+ <span class="n">reactor</span><span class="o">=</span><span class="n">twisted</span><span class="o">.</span><span class="n">internet</span><span class="o">.</span><span class="n">reactor</span><span class="p">,</span>
+ <span class="n">postConnectionCheck</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> A convenience function to listen for TCP connections using Twisted.</span>
+
+<span class="sd"> NOTE: You must call startTLS(ctx) to go into SSL/TLS mode.</span>
+
+<span class="sd"> See IReactorTCP interface in Twisted.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">wrappingFactory</span> <span class="o">=</span> <span class="n">policies</span><span class="o">.</span><span class="n">WrappingFactory</span><span class="p">(</span><span class="n">factory</span><span class="p">)</span>
+ <span class="n">wrappingFactory</span><span class="o">.</span><span class="n">protocol</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">factory</span><span class="p">,</span> <span class="n">wrappedProtocol</span><span class="p">:</span> \
+ <span class="n">TLSProtocolWrapper</span><span class="p">(</span><span class="n">factory</span><span class="p">,</span>
+ <span class="n">wrappedProtocol</span><span class="p">,</span>
+ <span class="n">startPassThrough</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
+ <span class="n">client</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
+ <span class="n">contextFactory</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
+ <span class="n">postConnectionCheck</span><span class="o">=</span><span class="n">postConnectionCheck</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">reactor</span><span class="o">.</span><span class="n">listenTCP</span><span class="p">(</span><span class="n">port</span><span class="p">,</span> <span class="n">wrappingFactory</span><span class="p">,</span> <span class="n">backlog</span><span class="p">,</span> <span class="n">interface</span><span class="p">)</span>
+
+</div>
+<span class="k">class</span> <span class="nc">_BioProxy</span><span class="p">:</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> The purpose of this class is to eliminate the __del__ method from</span>
+<span class="sd"> TLSProtocolWrapper, and thus letting it be garbage collected.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">m2_bio_free_all</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_free_all</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">bio</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">bio</span> <span class="o">=</span> <span class="n">bio</span>
+
+ <span class="k">def</span> <span class="nf">_ptr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">bio</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">bio</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_bio_free_all</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bio</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">_SSLProxy</span><span class="p">:</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> The purpose of this class is to eliminate the __del__ method from</span>
+<span class="sd"> TLSProtocolWrapper, and thus letting it be garbage collected.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">m2_ssl_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ssl</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ssl</span> <span class="o">=</span> <span class="n">ssl</span>
+
+ <span class="k">def</span> <span class="nf">_ptr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">ssl</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">ssl</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_ssl_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="p">)</span>
+
+
+<span class="nd">@implementer</span><span class="p">(</span><span class="n">ITLSTransport</span><span class="p">)</span>
+<div class="viewcode-block" id="TLSProtocolWrapper"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper">[docs]</a><span class="k">class</span> <span class="nc">TLSProtocolWrapper</span><span class="p">(</span><span class="n">ProtocolWrapper</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> A SSL/TLS protocol wrapper to be used with Twisted. Typically</span>
+<span class="sd"> you would not use this class directly. Use connectTCP,</span>
+<span class="sd"> connectSSL, listenTCP, listenSSL functions defined above,</span>
+<span class="sd"> which will hook in this class.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">factory</span><span class="p">,</span> <span class="n">wrappedProtocol</span><span class="p">,</span> <span class="n">startPassThrough</span><span class="p">,</span> <span class="n">client</span><span class="p">,</span>
+ <span class="n">contextFactory</span><span class="p">,</span> <span class="n">postConnectionCheck</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> :param factory:</span>
+<span class="sd"> :param wrappedProtocol:</span>
+<span class="sd"> :param startPassThrough: If true we won&#39;t encrypt at all. Need to</span>
+<span class="sd"> call startTLS() later to switch to SSL/TLS.</span>
+<span class="sd"> :param client: True if this should be a client protocol.</span>
+<span class="sd"> :param contextFactory: Factory that creates SSL.Context objects.</span>
+<span class="sd"> The called function is getContext().</span>
+<span class="sd"> :param postConnectionCheck: The post connection check callback that</span>
+<span class="sd"> will be called just after connection has</span>
+<span class="sd"> been established but before any real data</span>
+<span class="sd"> has been exchanged. The first argument to</span>
+<span class="sd"> this function is an X509 object, the second</span>
+<span class="sd"> is the expected host name string.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="c1"># ProtocolWrapper.__init__(self, factory, wrappedProtocol)</span>
+ <span class="c1"># XXX: Twisted 2.0 has a new addition where the wrappingFactory is</span>
+ <span class="c1"># set as the factory of the wrappedProtocol. This is an issue</span>
+ <span class="c1"># as the wrap should be transparent. What we want is</span>
+ <span class="c1"># the factory of the wrappedProtocol to be the wrappedFactory and</span>
+ <span class="c1"># not the outer wrappingFactory. This is how it was implemented in</span>
+ <span class="c1"># Twisted 1.3</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">factory</span> <span class="o">=</span> <span class="n">factory</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">wrappedProtocol</span> <span class="o">=</span> <span class="n">wrappedProtocol</span>
+
+ <span class="c1"># wrappedProtocol == client/server instance</span>
+ <span class="c1"># factory.wrappedFactory == client/server factory</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">b</span><span class="s1">&#39;&#39;</span> <span class="c1"># Clear text to encrypt and send</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">encrypted</span> <span class="o">=</span> <span class="n">b</span><span class="s1">&#39;&#39;</span> <span class="c1"># Encrypted data we need to decrypt and pass on</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">tlsStarted</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># SSL/TLS mode or pass through</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">checked</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># Post connection check done or not</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">isClient</span> <span class="o">=</span> <span class="n">client</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">helloDone</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># True when hello has been sent</span>
+ <span class="k">if</span> <span class="n">postConnectionCheck</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">postConnectionCheck</span> <span class="o">=</span> <span class="n">_alwaysSucceedsPostConnectionCheck</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">postConnectionCheck</span> <span class="o">=</span> <span class="n">postConnectionCheck</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">startPassThrough</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">startTLS</span><span class="p">(</span><span class="n">contextFactory</span><span class="o">.</span><span class="n">getContext</span><span class="p">())</span>
+
+<div class="viewcode-block" id="TLSProtocolWrapper.clear"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.clear">[docs]</a> <span class="k">def</span> <span class="nf">clear</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Clear this instance, after which it is ready for reuse.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;tlsStarted&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">sslBio</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ssl</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">internalBio</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">networkBio</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">encrypted</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">tlsStarted</span> <span class="o">=</span> <span class="mi">0</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">checked</span> <span class="o">=</span> <span class="mi">0</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">isClient</span> <span class="o">=</span> <span class="mi">1</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">helloDone</span> <span class="o">=</span> <span class="mi">0</span>
+ <span class="c1"># We can reuse self.ctx and it will be deleted automatically</span>
+ <span class="c1"># when this instance dies</span>
+</div>
+<div class="viewcode-block" id="TLSProtocolWrapper.startTLS"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.startTLS">[docs]</a> <span class="k">def</span> <span class="nf">startTLS</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ctx</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Start SSL/TLS. If this is not called, this instance just passes data</span>
+<span class="sd"> through untouched.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="c1"># NOTE: This method signature must match the startTLS() method Twisted</span>
+ <span class="c1"># expects transports to have. This will be called automatically</span>
+ <span class="c1"># by Twisted in STARTTLS situations, for example with SMTP.</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">tlsStarted</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;TLS already started&#39;</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">ctx</span> <span class="o">=</span> <span class="n">ctx</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">internalBio</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_new</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">bio_s_bio</span><span class="p">())</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">bio_set_write_buf_size</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">internalBio</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">networkBio</span> <span class="o">=</span> <span class="n">_BioProxy</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">bio_new</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">bio_s_bio</span><span class="p">()))</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">bio_set_write_buf_size</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">networkBio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="mi">0</span><span class="p">)</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">bio_make_bio_pair</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">internalBio</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">networkBio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">sslBio</span> <span class="o">=</span> <span class="n">_BioProxy</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">bio_new</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">bio_f_ssl</span><span class="p">()))</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">ssl</span> <span class="o">=</span> <span class="n">_SSLProxy</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">ssl_new</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="o">.</span><span class="n">ctx</span><span class="p">))</span>
+
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">isClient</span><span class="p">:</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_set_connect_state</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_set_accept_state</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_set_bio</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">internalBio</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">internalBio</span><span class="p">)</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">bio_set_ssl</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sslBio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_noclose</span><span class="p">)</span>
+
+ <span class="c1"># Need this for writes that are larger than BIO pair buffers</span>
+ <span class="n">mode</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_mode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_set_mode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span>
+ <span class="n">mode</span> <span class="o">|</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">SSL_MODE_ENABLE_PARTIAL_WRITE</span> <span class="o">|</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">tlsStarted</span> <span class="o">=</span> <span class="mi">1</span>
+</div>
+<div class="viewcode-block" id="TLSProtocolWrapper.write"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.write">[docs]</a> <span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">tlsStarted</span><span class="p">:</span>
+ <span class="n">ProtocolWrapper</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+ <span class="k">return</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">encryptedData</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_encrypt</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+ <span class="n">ProtocolWrapper</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">encryptedData</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">helloDone</span> <span class="o">=</span> <span class="mi">1</span>
+ <span class="k">except</span> <span class="n">BIO</span><span class="o">.</span><span class="n">BIOError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="c1"># See http://www.openssl.org/docs/apps/verify.html#DIAGNOSTICS</span>
+ <span class="c1"># for the error codes returned by SSL_get_verify_result.</span>
+ <span class="n">e</span><span class="o">.</span><span class="n">args</span> <span class="o">=</span> <span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_verify_result</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="o">.</span><span class="n">_ptr</span><span class="p">()),</span> <span class="n">e</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
+ <span class="k">raise</span> <span class="n">e</span>
+</div>
+<div class="viewcode-block" id="TLSProtocolWrapper.writeSequence"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.writeSequence">[docs]</a> <span class="k">def</span> <span class="nf">writeSequence</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">tlsStarted</span><span class="p">:</span>
+ <span class="n">ProtocolWrapper</span><span class="o">.</span><span class="n">writeSequence</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">data</span><span class="p">))</span>
+ <span class="k">return</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">data</span><span class="p">))</span>
+</div>
+<div class="viewcode-block" id="TLSProtocolWrapper.loseConnection"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.loseConnection">[docs]</a> <span class="k">def</span> <span class="nf">loseConnection</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># XXX Do we need to do m2.ssl_shutdown(self.ssl._ptr())?</span>
+ <span class="n">ProtocolWrapper</span><span class="o">.</span><span class="n">loseConnection</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="TLSProtocolWrapper.connectionMade"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.connectionMade">[docs]</a> <span class="k">def</span> <span class="nf">connectionMade</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">ProtocolWrapper</span><span class="o">.</span><span class="n">connectionMade</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">tlsStarted</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">isClient</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">helloDone</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_clientHello</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="TLSProtocolWrapper.dataReceived"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.dataReceived">[docs]</a> <span class="k">def</span> <span class="nf">dataReceived</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">tlsStarted</span><span class="p">:</span>
+ <span class="n">ProtocolWrapper</span><span class="o">.</span><span class="n">dataReceived</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+ <span class="k">return</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">encrypted</span> <span class="o">+=</span> <span class="n">data</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="k">while</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="n">decryptedData</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_decrypt</span><span class="p">()</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">_check</span><span class="p">()</span>
+
+ <span class="n">encryptedData</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_encrypt</span><span class="p">()</span>
+ <span class="n">ProtocolWrapper</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">encryptedData</span><span class="p">)</span>
+
+ <span class="n">ProtocolWrapper</span><span class="o">.</span><span class="n">dataReceived</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">decryptedData</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">decryptedData</span> <span class="o">==</span> <span class="s1">&#39;&#39;</span> <span class="ow">and</span> <span class="n">encryptedData</span> <span class="o">==</span> <span class="s1">&#39;&#39;</span><span class="p">:</span>
+ <span class="k">break</span>
+ <span class="k">except</span> <span class="n">BIO</span><span class="o">.</span><span class="n">BIOError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="c1"># See http://www.openssl.org/docs/apps/verify.html#DIAGNOSTICS</span>
+ <span class="c1"># for the error codes returned by SSL_get_verify_result.</span>
+ <span class="n">e</span><span class="o">.</span><span class="n">args</span> <span class="o">=</span> <span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_verify_result</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="o">.</span><span class="n">_ptr</span><span class="p">()),</span> <span class="n">e</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
+ <span class="k">raise</span> <span class="n">e</span>
+</div>
+<div class="viewcode-block" id="TLSProtocolWrapper.connectionLost"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.connectionLost">[docs]</a> <span class="k">def</span> <span class="nf">connectionLost</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reason</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr) -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
+ <span class="n">ProtocolWrapper</span><span class="o">.</span><span class="n">connectionLost</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reason</span><span class="p">)</span>
+</div>
+ <span class="k">def</span> <span class="nf">_check</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">checked</span> <span class="ow">and</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_is_init_finished</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="o">.</span><span class="n">_ptr</span><span class="p">()):</span>
+ <span class="n">x509</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_peer_cert</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+ <span class="k">if</span> <span class="n">x509</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">x509</span> <span class="o">=</span> <span class="n">X509</span><span class="o">.</span><span class="n">X509</span><span class="p">(</span><span class="n">x509</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">isClient</span><span class="p">:</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">addr</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">getPeer</span><span class="p">()</span><span class="o">.</span><span class="n">host</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">postConnectionCheck</span><span class="p">(</span><span class="n">x509</span><span class="p">,</span> <span class="n">host</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">SSLVerificationError</span><span class="p">(</span><span class="s1">&#39;post connection check&#39;</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">checked</span> <span class="o">=</span> <span class="mi">1</span>
+
+ <span class="k">def</span> <span class="nf">_clientHello</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="c1"># We rely on OpenSSL implicitly starting with client hello</span>
+ <span class="c1"># when we haven&#39;t yet established an SSL connection</span>
+ <span class="n">encryptedData</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_encrypt</span><span class="p">(</span><span class="n">clientHello</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
+ <span class="n">ProtocolWrapper</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">encryptedData</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">helloDone</span> <span class="o">=</span> <span class="mi">1</span>
+ <span class="k">except</span> <span class="n">BIO</span><span class="o">.</span><span class="n">BIOError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="c1"># See http://www.openssl.org/docs/apps/verify.html#DIAGNOSTICS</span>
+ <span class="c1"># for the error codes returned by SSL_get_verify_result.</span>
+ <span class="n">e</span><span class="o">.</span><span class="n">args</span> <span class="o">=</span> <span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_verify_result</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl</span><span class="o">.</span><span class="n">_ptr</span><span class="p">()),</span> <span class="n">e</span><span class="o">.</span><span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
+ <span class="k">raise</span> <span class="n">e</span>
+
+ <span class="k">def</span> <span class="nf">_encrypt</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">clientHello</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># XXX near mirror image of _decrypt - refactor</span>
+ <span class="n">encryptedData</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">+=</span> <span class="n">data</span>
+ <span class="c1"># Optimizations to reduce attribute accesses</span>
+ <span class="n">sslBioPtr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sslBio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">()</span>
+ <span class="n">networkBio</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">networkBio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">()</span>
+ <span class="n">m2bio_ctrl_get_write_guarantee</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_ctrl_get_write_guarantee</span>
+ <span class="n">m2bio_write</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_write</span>
+ <span class="n">m2bio_should_retry</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_should_retry</span>
+ <span class="n">m2bio_ctrl_pending</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_ctrl_pending</span>
+ <span class="n">m2bio_read</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_read</span>
+
+ <span class="k">while</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="n">g</span> <span class="o">=</span> <span class="n">m2bio_ctrl_get_write_guarantee</span><span class="p">(</span><span class="n">sslBioPtr</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">g</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">!=</span> <span class="s1">&#39;&#39;</span> <span class="ow">or</span> <span class="n">clientHello</span><span class="p">:</span>
+ <span class="n">r</span> <span class="o">=</span> <span class="n">m2bio_write</span><span class="p">(</span><span class="n">sslBioPtr</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">r</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="k">assert</span><span class="p">(</span><span class="n">m2bio_should_retry</span><span class="p">(</span><span class="n">sslBioPtr</span><span class="p">))</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">checked</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="n">r</span><span class="p">:]</span>
+
+ <span class="n">pending</span> <span class="o">=</span> <span class="n">m2bio_ctrl_pending</span><span class="p">(</span><span class="n">networkBio</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">pending</span><span class="p">:</span>
+ <span class="n">d</span> <span class="o">=</span> <span class="n">m2bio_read</span><span class="p">(</span><span class="n">networkBio</span><span class="p">,</span> <span class="n">pending</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">d</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span> <span class="c1"># This is strange, but d can be None</span>
+ <span class="n">encryptedData</span> <span class="o">+=</span> <span class="n">d</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">assert</span><span class="p">(</span><span class="n">m2bio_should_retry</span><span class="p">(</span><span class="n">networkBio</span><span class="p">))</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">break</span>
+ <span class="k">return</span> <span class="n">encryptedData</span>
+
+ <span class="k">def</span> <span class="nf">_decrypt</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">):</span>
+ <span class="c1"># XXX near mirror image of _encrypt - refactor</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">encrypted</span> <span class="o">+=</span> <span class="n">data</span>
+ <span class="n">decryptedData</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+ <span class="c1"># Optimizations to reduce attribute accesses</span>
+ <span class="n">sslBioPtr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sslBio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">()</span>
+ <span class="n">networkBio</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">networkBio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">()</span>
+ <span class="n">m2bio_ctrl_get_write_guarantee</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_ctrl_get_write_guarantee</span>
+ <span class="n">m2bio_write</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_write</span>
+ <span class="n">m2bio_should_retry</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_should_retry</span>
+ <span class="n">m2bio_ctrl_pending</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_ctrl_pending</span>
+ <span class="n">m2bio_read</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">bio_read</span>
+
+ <span class="k">while</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="n">g</span> <span class="o">=</span> <span class="n">m2bio_ctrl_get_write_guarantee</span><span class="p">(</span><span class="n">networkBio</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">g</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">encrypted</span> <span class="o">!=</span> <span class="s1">&#39;&#39;</span><span class="p">:</span>
+ <span class="n">r</span> <span class="o">=</span> <span class="n">m2bio_write</span><span class="p">(</span><span class="n">networkBio</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">encrypted</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">r</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
+ <span class="k">assert</span><span class="p">(</span><span class="n">m2bio_should_retry</span><span class="p">(</span><span class="n">networkBio</span><span class="p">))</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">encrypted</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">encrypted</span><span class="p">[</span><span class="n">r</span><span class="p">:]</span>
+
+ <span class="n">pending</span> <span class="o">=</span> <span class="n">m2bio_ctrl_pending</span><span class="p">(</span><span class="n">sslBioPtr</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">pending</span><span class="p">:</span>
+ <span class="n">d</span> <span class="o">=</span> <span class="n">m2bio_read</span><span class="p">(</span><span class="n">sslBioPtr</span><span class="p">,</span> <span class="n">pending</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">d</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span> <span class="c1"># This is strange, but d can be None</span>
+ <span class="n">decryptedData</span> <span class="o">+=</span> <span class="n">d</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">assert</span><span class="p">(</span><span class="n">m2bio_should_retry</span><span class="p">(</span><span class="n">sslBioPtr</span><span class="p">))</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">break</span>
+
+ <span class="k">return</span> <span class="n">decryptedData</span></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" >Module code</a> &raquo;</li>
+ <li><a href="../SSL.html" >M2Crypto.SSL</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/SSL/cb.html b/doc/html/_modules/M2Crypto/SSL/cb.html
new file mode 100644
index 0000000..73d515a
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/SSL/cb.html
@@ -0,0 +1,192 @@
+
+
+<!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>M2Crypto.SSL.cb &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../../index.html" />
+ <link rel="up" title="M2Crypto.SSL" href="../SSL.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" >Module code</a> &raquo;</li>
+ <li><a href="../SSL.html" accesskey="U">M2Crypto.SSL</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.SSL.cb</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+
+<span class="sd">&quot;&quot;&quot;SSL callbacks</span>
+
+<span class="sd">Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">sys</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Any</span><span class="p">,</span> <span class="n">List</span> <span class="c1"># noqa</span>
+
+<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;unknown_issuer&#39;</span><span class="p">,</span> <span class="s1">&#39;ssl_verify_callback_stub&#39;</span><span class="p">,</span> <span class="s1">&#39;ssl_verify_callback&#39;</span><span class="p">,</span>
+ <span class="s1">&#39;ssl_verify_callback_allow_unknown_ca&#39;</span><span class="p">,</span> <span class="s1">&#39;ssl_info_callback&#39;</span><span class="p">]</span>
+
+
+<div class="viewcode-block" id="ssl_verify_callback_stub"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.cb.ssl_verify_callback_stub">[docs]</a><span class="k">def</span> <span class="nf">ssl_verify_callback_stub</span><span class="p">(</span><span class="n">ssl_ctx_ptr</span><span class="p">,</span> <span class="n">x509_ptr</span><span class="p">,</span> <span class="n">errnum</span><span class="p">,</span> <span class="n">errdepth</span><span class="p">,</span> <span class="n">ok</span><span class="p">):</span>
+ <span class="c1"># Deprecated</span>
+ <span class="k">return</span> <span class="n">ok</span>
+</div>
+<span class="n">unknown_issuer</span> <span class="o">=</span> <span class="p">[</span> <span class="c1"># type: List[int]</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT</span><span class="p">,</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY</span><span class="p">,</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE</span><span class="p">,</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">X509_V_ERR_CERT_UNTRUSTED</span><span class="p">,</span>
+<span class="p">]</span>
+
+
+<div class="viewcode-block" id="ssl_verify_callback"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.cb.ssl_verify_callback">[docs]</a><span class="k">def</span> <span class="nf">ssl_verify_callback</span><span class="p">(</span><span class="n">ssl_ctx_ptr</span><span class="p">,</span> <span class="n">x509_ptr</span><span class="p">,</span> <span class="n">errnum</span><span class="p">,</span> <span class="n">errdepth</span><span class="p">,</span> <span class="n">ok</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, bytes, int, int, int) -&gt; int</span>
+ <span class="c1"># Deprecated</span>
+
+ <span class="kn">from</span> <span class="nn">M2Crypto.SSL.Context</span> <span class="kn">import</span> <span class="n">Context</span>
+ <span class="n">ssl_ctx</span> <span class="o">=</span> <span class="n">Context</span><span class="o">.</span><span class="n">ctxmap</span><span class="p">()[</span><span class="nb">int</span><span class="p">(</span><span class="n">ssl_ctx_ptr</span><span class="p">)]</span>
+ <span class="k">if</span> <span class="n">errnum</span> <span class="ow">in</span> <span class="n">unknown_issuer</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">ssl_ctx</span><span class="o">.</span><span class="n">get_allow_unknown_ca</span><span class="p">():</span>
+ <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;policy: </span><span class="si">%s</span><span class="s2">: permitted...</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span>
+ <span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">x509_get_verify_error</span><span class="p">(</span><span class="n">errnum</span><span class="p">)))</span>
+ <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
+ <span class="n">ok</span> <span class="o">=</span> <span class="mi">1</span>
+ <span class="c1"># CRL checking goes here...</span>
+ <span class="k">if</span> <span class="n">ok</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">ssl_ctx</span><span class="o">.</span><span class="n">get_verify_depth</span><span class="p">()</span> <span class="o">&gt;=</span> <span class="n">errdepth</span><span class="p">:</span>
+ <span class="n">ok</span> <span class="o">=</span> <span class="mi">1</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">ok</span> <span class="o">=</span> <span class="mi">0</span>
+ <span class="k">return</span> <span class="n">ok</span>
+
+</div>
+<div class="viewcode-block" id="ssl_verify_callback_allow_unknown_ca"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.cb.ssl_verify_callback_allow_unknown_ca">[docs]</a><span class="k">def</span> <span class="nf">ssl_verify_callback_allow_unknown_ca</span><span class="p">(</span><span class="n">ok</span><span class="p">,</span> <span class="n">store</span><span class="p">):</span>
+ <span class="c1"># type: (int, Any) -&gt; int</span>
+ <span class="n">errnum</span> <span class="o">=</span> <span class="n">store</span><span class="o">.</span><span class="n">get_error</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">errnum</span> <span class="ow">in</span> <span class="n">unknown_issuer</span><span class="p">:</span>
+ <span class="n">ok</span> <span class="o">=</span> <span class="mi">1</span>
+ <span class="k">return</span> <span class="n">ok</span>
+
+
+<span class="c1"># Cribbed from OpenSSL&#39;s apps/s_cb.c.</span></div>
+<div class="viewcode-block" id="ssl_info_callback"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.cb.ssl_info_callback">[docs]</a><span class="k">def</span> <span class="nf">ssl_info_callback</span><span class="p">(</span><span class="n">where</span><span class="p">,</span> <span class="n">ret</span><span class="p">,</span> <span class="n">ssl_ptr</span><span class="p">):</span>
+ <span class="c1"># type: (int, int, bytes) -&gt; None</span>
+
+ <span class="n">w</span> <span class="o">=</span> <span class="n">where</span> <span class="o">&amp;</span> <span class="o">~</span><span class="n">m2</span><span class="o">.</span><span class="n">SSL_ST_MASK</span>
+ <span class="k">if</span> <span class="n">w</span> <span class="o">&amp;</span> <span class="n">m2</span><span class="o">.</span><span class="n">SSL_ST_CONNECT</span><span class="p">:</span>
+ <span class="n">state</span> <span class="o">=</span> <span class="s2">&quot;SSL connect&quot;</span>
+ <span class="k">elif</span> <span class="n">w</span> <span class="o">&amp;</span> <span class="n">m2</span><span class="o">.</span><span class="n">SSL_ST_ACCEPT</span><span class="p">:</span>
+ <span class="n">state</span> <span class="o">=</span> <span class="s2">&quot;SSL accept&quot;</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">state</span> <span class="o">=</span> <span class="s2">&quot;SSL state unknown&quot;</span>
+
+ <span class="k">if</span> <span class="n">where</span> <span class="o">&amp;</span> <span class="n">m2</span><span class="o">.</span><span class="n">SSL_CB_LOOP</span><span class="p">:</span>
+ <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;LOOP: </span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span>
+ <span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_state_v</span><span class="p">(</span><span class="n">ssl_ptr</span><span class="p">)))</span>
+ <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
+ <span class="k">return</span>
+
+ <span class="k">if</span> <span class="n">where</span> <span class="o">&amp;</span> <span class="n">m2</span><span class="o">.</span><span class="n">SSL_CB_EXIT</span><span class="p">:</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">ret</span><span class="p">:</span>
+ <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;FAILED: </span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span>
+ <span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_state_v</span><span class="p">(</span><span class="n">ssl_ptr</span><span class="p">)))</span>
+ <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;INFO: </span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span>
+ <span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_state_v</span><span class="p">(</span><span class="n">ssl_ptr</span><span class="p">)))</span>
+ <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
+ <span class="k">return</span>
+
+ <span class="k">if</span> <span class="n">where</span> <span class="o">&amp;</span> <span class="n">m2</span><span class="o">.</span><span class="n">SSL_CB_ALERT</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">where</span> <span class="o">&amp;</span> <span class="n">m2</span><span class="o">.</span><span class="n">SSL_CB_READ</span><span class="p">:</span>
+ <span class="n">w</span> <span class="o">=</span> <span class="s1">&#39;read&#39;</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">w</span> <span class="o">=</span> <span class="s1">&#39;write&#39;</span>
+ <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s2">&quot;ALERT: </span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="se">\n</span><span class="s2">&quot;</span> <span class="o">%</span>
+ <span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_alert_type_v</span><span class="p">(</span><span class="n">ret</span><span class="p">),</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">ssl_get_alert_desc_v</span><span class="p">(</span><span class="n">ret</span><span class="p">)))</span>
+ <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
+ <span class="k">return</span></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" >Module code</a> &raquo;</li>
+ <li><a href="../SSL.html" >M2Crypto.SSL</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/SSL/ssl_dispatcher.html b/doc/html/_modules/M2Crypto/SSL/ssl_dispatcher.html
new file mode 100644
index 0000000..73709e3
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/SSL/ssl_dispatcher.html
@@ -0,0 +1,139 @@
+
+
+<!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>M2Crypto.SSL.ssl_dispatcher &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../../index.html" />
+ <link rel="up" title="M2Crypto.SSL" href="../SSL.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" >Module code</a> &raquo;</li>
+ <li><a href="../SSL.html" accesskey="U">M2Crypto.SSL</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.SSL.ssl_dispatcher</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+
+<span class="sd">&quot;&quot;&quot;SSL dispatcher</span>
+
+<span class="sd">Copyright (c) 1999-2002 Ng Pheng Siong. All rights reserved.&quot;&quot;&quot;</span>
+
+<span class="c1"># Python</span>
+<span class="kn">import</span> <span class="nn">asyncore</span>
+<span class="kn">import</span> <span class="nn">socket</span>
+
+<span class="c1"># M2Crypto</span>
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">util</span> <span class="c1"># noqa</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.SSL.Connection</span> <span class="kn">import</span> <span class="n">Connection</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.SSL.Context</span> <span class="kn">import</span> <span class="n">Context</span> <span class="c1"># noqa</span>
+
+<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;ssl_dispatcher&#39;</span><span class="p">]</span>
+
+
+<div class="viewcode-block" id="ssl_dispatcher"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher">[docs]</a><span class="k">class</span> <span class="nc">ssl_dispatcher</span><span class="p">(</span><span class="n">asyncore</span><span class="o">.</span><span class="n">dispatcher</span><span class="p">):</span> <span class="c1"># noqa</span>
+
+<div class="viewcode-block" id="ssl_dispatcher.create_socket"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher.create_socket">[docs]</a> <span class="k">def</span> <span class="nf">create_socket</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ssl_context</span><span class="p">):</span>
+ <span class="c1"># type: (Context) -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">family_and_type</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ssl_ctx</span> <span class="o">=</span> <span class="n">ssl_context</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">socket</span> <span class="o">=</span> <span class="n">Connection</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl_ctx</span><span class="p">)</span>
+ <span class="c1"># self.socket.setblocking(0)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">add_channel</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="ssl_dispatcher.connect"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher.connect">[docs]</a> <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">addr</span><span class="p">):</span>
+ <span class="c1"># type: (util.AddrType) -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">setblocking</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">addr</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">setblocking</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="ssl_dispatcher.recv"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher.recv">[docs]</a> <span class="k">def</span> <span class="nf">recv</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">buffer_size</span><span class="o">=</span><span class="mi">4096</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; bytes</span>
+ <span class="sd">&quot;&quot;&quot;Receive data over SSL.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="n">buffer_size</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="ssl_dispatcher.send"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher.send">[docs]</a> <span class="k">def</span> <span class="nf">send</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">buffer</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;Send data over SSL.&quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">socket</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="nb">buffer</span><span class="p">)</span></div></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" >Module code</a> &raquo;</li>
+ <li><a href="../SSL.html" >M2Crypto.SSL</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/SSL/timeout.html b/doc/html/_modules/M2Crypto/SSL/timeout.html
new file mode 100644
index 0000000..849ae6d
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/SSL/timeout.html
@@ -0,0 +1,130 @@
+
+
+<!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>M2Crypto.SSL.timeout &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../../index.html" />
+ <link rel="up" title="M2Crypto.SSL" href="../SSL.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" >Module code</a> &raquo;</li>
+ <li><a href="../SSL.html" accesskey="U">M2Crypto.SSL</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.SSL.timeout</h1><div class="highlight"><pre>
+<span></span><span class="sd">&quot;&quot;&quot;Support for SSL socket timeouts.</span>
+
+<span class="sd">Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.</span>
+
+<span class="sd">Copyright 2008 Heikki Toivonen. All rights reserved.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;DEFAULT_TIMEOUT&#39;</span><span class="p">,</span> <span class="s1">&#39;timeout&#39;</span><span class="p">,</span> <span class="s1">&#39;struct_to_timeout&#39;</span><span class="p">,</span> <span class="s1">&#39;struct_size&#39;</span><span class="p">]</span>
+
+<span class="kn">import</span> <span class="nn">struct</span>
+
+<span class="n">DEFAULT_TIMEOUT</span> <span class="o">=</span> <span class="mi">600</span> <span class="c1"># type: int</span>
+
+
+<div class="viewcode-block" id="timeout"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.timeout.timeout">[docs]</a><span class="k">class</span> <span class="nc">timeout</span><span class="p">:</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sec</span><span class="o">=</span><span class="n">DEFAULT_TIMEOUT</span><span class="p">,</span> <span class="n">microsec</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (int, int) -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">sec</span> <span class="o">=</span> <span class="n">sec</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">microsec</span> <span class="o">=</span> <span class="n">microsec</span>
+
+<div class="viewcode-block" id="timeout.pack"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.timeout.timeout.pack">[docs]</a> <span class="k">def</span> <span class="nf">pack</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;ll&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sec</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">microsec</span><span class="p">)</span>
+
+</div></div>
+<div class="viewcode-block" id="struct_to_timeout"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.timeout.struct_to_timeout">[docs]</a><span class="k">def</span> <span class="nf">struct_to_timeout</span><span class="p">(</span><span class="n">binstr</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; timeout</span>
+ <span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">ms</span><span class="p">)</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;ll&#39;</span><span class="p">,</span> <span class="n">binstr</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">timeout</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">ms</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="struct_size"><a class="viewcode-back" href="../../../M2Crypto.SSL.html#M2Crypto.SSL.timeout.struct_size">[docs]</a><span class="k">def</span> <span class="nf">struct_size</span><span class="p">():</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">return</span> <span class="n">struct</span><span class="o">.</span><span class="n">calcsize</span><span class="p">(</span><span class="s1">&#39;ll&#39;</span><span class="p">)</span></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../../index.html" >Module code</a> &raquo;</li>
+ <li><a href="../SSL.html" >M2Crypto.SSL</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/X509.html b/doc/html/_modules/M2Crypto/X509.html
new file mode 100644
index 0000000..4682200
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/X509.html
@@ -0,0 +1,1504 @@
+
+
+<!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>M2Crypto.X509 &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../index.html" />
+ <link rel="up" title="Module code" href="../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.X509</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+
+<span class="sd">&quot;&quot;&quot;M2Crypto wrapper for OpenSSL X509 API.</span>
+
+<span class="sd">Copyright (c) 1999-2004 Ng Pheng Siong. All rights reserved.</span>
+
+<span class="sd">Portions created by Open Source Applications Foundation (OSAF) are</span>
+<span class="sd">Copyright (C) 2004-2007 OSAF. All Rights Reserved.</span>
+<span class="sd">Author: Heikki Toivonen</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">binascii</span>
+<span class="kn">import</span> <span class="nn">logging</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">ASN1</span><span class="p">,</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">EVP</span><span class="p">,</span> <span class="n">Err</span><span class="p">,</span> <span class="n">m2</span><span class="p">,</span> <span class="n">util</span> <span class="c1"># noqa</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Optional</span> <span class="c1"># noqa</span>
+
+<span class="n">FORMAT_DER</span> <span class="o">=</span> <span class="mi">0</span>
+<span class="n">FORMAT_PEM</span> <span class="o">=</span> <span class="mi">1</span>
+
+<span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="n">__name__</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="X509Error"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509Error">[docs]</a><span class="k">class</span> <span class="nc">X509Error</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
+ <span class="k">pass</span>
+</div>
+<span class="n">m2</span><span class="o">.</span><span class="n">x509_init</span><span class="p">(</span><span class="n">X509Error</span><span class="p">)</span>
+
+<span class="n">V_OK</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">X509_V_OK</span> <span class="c1"># type: int</span>
+
+
+<div class="viewcode-block" id="x509_store_default_cb"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.x509_store_default_cb">[docs]</a><span class="k">def</span> <span class="nf">x509_store_default_cb</span><span class="p">(</span><span class="n">ok</span><span class="p">,</span> <span class="n">ctx</span><span class="p">):</span>
+ <span class="c1"># type: (int, X509_Store_Context) -&gt; int</span>
+ <span class="k">return</span> <span class="n">ok</span>
+
+</div>
+<div class="viewcode-block" id="new_extension"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.new_extension">[docs]</a><span class="k">def</span> <span class="nf">new_extension</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">critical</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
+ <span class="c1"># type: (str, bytes, int, int) -&gt; X509_Extension</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Create new X509_Extension instance.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">name</span> <span class="o">==</span> <span class="s1">&#39;subjectKeyIdentifier&#39;</span> <span class="ow">and</span> \
+ <span class="n">value</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;0123456789abcdefABCDEF:&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="s1">&#39;&#39;</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;value must be precomputed hash&#39;</span><span class="p">)</span>
+ <span class="n">ctx</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509v3_set_nconf</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">ctx</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">MemoryError</span><span class="p">(</span>
+ <span class="s1">&#39;Not enough memory when creating a new X509 extension&#39;</span><span class="p">)</span>
+ <span class="n">x509_ext_ptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509v3_ext_conf</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="n">ctx</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">x509_ext_ptr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">X509Error</span><span class="p">(</span>
+ <span class="s2">&quot;Cannot create X509_Extension with name &#39;</span><span class="si">%s</span><span class="s2">&#39; and value &#39;</span><span class="si">%s</span><span class="s2">&#39;&quot;</span> <span class="o">%</span>
+ <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span>
+ <span class="n">x509_ext</span> <span class="o">=</span> <span class="n">X509_Extension</span><span class="p">(</span><span class="n">x509_ext_ptr</span><span class="p">,</span> <span class="n">_pyfree</span><span class="p">)</span>
+ <span class="n">x509_ext</span><span class="o">.</span><span class="n">set_critical</span><span class="p">(</span><span class="n">critical</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">x509_ext</span>
+
+</div>
+<div class="viewcode-block" id="X509_Extension"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Extension">[docs]</a><span class="k">class</span> <span class="nc">X509_Extension</span><span class="p">:</span> <span class="c1"># noqa</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> X509 Extension</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">m2_x509_extension_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_extension_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x509_ext_ptr</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[bytes], int) -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">x509_ext</span> <span class="o">=</span> <span class="n">x509_ext_ptr</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="n">_pyfree</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_pyfree&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">x509_ext</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_x509_extension_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_ext</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">_ptr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">x509_ext</span>
+
+<div class="viewcode-block" id="X509_Extension.set_critical"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Extension.set_critical">[docs]</a> <span class="k">def</span> <span class="nf">set_critical</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">critical</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Mark this extension critical or noncritical. By default an</span>
+<span class="sd"> extension is not critical.</span>
+
+<span class="sd"> :param critical: Nonzero sets this extension as critical.</span>
+<span class="sd"> Calling this method without arguments will</span>
+<span class="sd"> set this extension to critical.</span>
+<span class="sd"> :return: 1 for success, 0 for failure</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_extension_set_critical</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_ext</span><span class="p">,</span> <span class="n">critical</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="X509_Extension.get_critical"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Extension.get_critical">[docs]</a> <span class="k">def</span> <span class="nf">get_critical</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Return whether or not this is a critical extension.</span>
+
+<span class="sd"> :return: Nonzero if this is a critical extension.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_extension_get_critical</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_ext</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="X509_Extension.get_name"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Extension.get_name">[docs]</a> <span class="k">def</span> <span class="nf">get_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; str</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Get the extension name, for example &#39;subjectAltName&#39;.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">x509_extension_get_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_ext</span><span class="p">))</span>
+</div>
+<div class="viewcode-block" id="X509_Extension.get_value"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Extension.get_value">[docs]</a> <span class="k">def</span> <span class="nf">get_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">flag</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (int, int) -&gt; str</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Get the extension value, for example &#39;DNS:www.example.com&#39;.</span>
+
+<span class="sd"> :param flag: Flag to control what and how to print.</span>
+<span class="sd"> :param indent: How many spaces to print before actual value.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">buf</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">x509_ext_print</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">x509_ext</span><span class="p">,</span> <span class="n">flag</span><span class="p">,</span> <span class="n">indent</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">())</span>
+
+</div></div>
+<div class="viewcode-block" id="X509_Extension_Stack"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Extension_Stack">[docs]</a><span class="k">class</span> <span class="nc">X509_Extension_Stack</span><span class="p">:</span> <span class="c1"># noqa</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> X509 Extension Stack</span>
+
+<span class="sd"> :warning: Do not modify the underlying OpenSSL stack</span>
+<span class="sd"> except through this interface, or use any OpenSSL</span>
+<span class="sd"> functions that do so indirectly. Doing so will get the</span>
+<span class="sd"> OpenSSL stack and the internal pystack of this class out</span>
+<span class="sd"> of sync, leading to python memory leaks, exceptions or</span>
+<span class="sd"> even python crashes!</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">m2_sk_x509_extension_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">sk_x509_extension_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stack</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[bytes], int) -&gt; None</span>
+ <span class="k">if</span> <span class="n">stack</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">stack</span> <span class="o">=</span> <span class="n">stack</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="n">_pyfree</span>
+ <span class="n">num</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">sk_x509_extension_num</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">num</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">pystack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">X509_Extension</span><span class="p">(</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">sk_x509_extension_value</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="p">,</span> <span class="n">i</span><span class="p">),</span>
+ <span class="n">_pyfree</span><span class="o">=</span><span class="n">_pyfree</span><span class="p">))</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">stack</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">sk_x509_extension_new_null</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="mi">1</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">pystack</span> <span class="o">=</span> <span class="p">[]</span> <span class="c1"># This must be kept in sync with self.stack</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="c1"># see BIO.py - unbalanced __init__ / __del__</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_pyfree&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_sk_x509_extension_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">sk_x509_extension_num</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="p">)</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pystack</span><span class="p">)</span>
+ <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pystack</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">idx</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; X509_Extension</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">pystack</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span>
+
+ <span class="k">def</span> <span class="nf">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pystack</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">_ptr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">stack</span>
+
+<div class="viewcode-block" id="X509_Extension_Stack.push"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Extension_Stack.push">[docs]</a> <span class="k">def</span> <span class="nf">push</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x509_ext</span><span class="p">):</span>
+ <span class="c1"># type: (X509_Extension) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Push X509_Extension object onto the stack.</span>
+
+<span class="sd"> :param x509_ext: X509_Extension object to be pushed onto the stack.</span>
+<span class="sd"> :return: The number of extensions on the stack.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">pystack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">x509_ext</span><span class="p">)</span>
+ <span class="n">ret</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">sk_x509_extension_push</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="p">,</span> <span class="n">x509_ext</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+ <span class="k">assert</span> <span class="n">ret</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pystack</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">ret</span>
+</div>
+<div class="viewcode-block" id="X509_Extension_Stack.pop"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Extension_Stack.pop">[docs]</a> <span class="k">def</span> <span class="nf">pop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; X509_Extension</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Pop X509_Extension object from the stack.</span>
+
+<span class="sd"> :return: X509_Extension popped</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">x509_ext_ptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">sk_x509_extension_pop</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">x509_ext_ptr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pystack</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span>
+ <span class="k">return</span> <span class="bp">None</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">pystack</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
+
+</div></div>
+<div class="viewcode-block" id="X509_Name_Entry"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Name_Entry">[docs]</a><span class="k">class</span> <span class="nc">X509_Name_Entry</span><span class="p">:</span> <span class="c1"># noqa</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> X509 Name Entry</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">m2_x509_name_entry_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_entry_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x509_name_entry</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, int) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> :param x509_name_entry: this should be OpenSSL X509_NAME_ENTRY binary</span>
+<span class="sd"> :param _pyfree:</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">x509_name_entry</span> <span class="o">=</span> <span class="n">x509_name_entry</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="n">_pyfree</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_pyfree&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_x509_name_entry_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name_entry</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">_ptr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">x509_name_entry</span>
+
+<div class="viewcode-block" id="X509_Name_Entry.set_object"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Name_Entry.set_object">[docs]</a> <span class="k">def</span> <span class="nf">set_object</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">asn1obj</span><span class="p">):</span>
+ <span class="c1"># type: (ASN1.ASN1_Object) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Sets the field name to asn1obj</span>
+
+<span class="sd"> :param asn1obj:</span>
+<span class="sd"> :return: 0 on failure, 1 on success</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_entry_set_object</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name_entry</span><span class="p">,</span>
+ <span class="n">asn1obj</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+</div>
+<div class="viewcode-block" id="X509_Name_Entry.set_data"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Name_Entry.set_data">[docs]</a> <span class="k">def</span> <span class="nf">set_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="n">ASN1</span><span class="o">.</span><span class="n">MBSTRING_ASC</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, int) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Sets the field name to asn1obj</span>
+
+<span class="sd"> :param data: data in a binary form to be set</span>
+<span class="sd"> :return: 0 on failure, 1 on success</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_entry_set_data</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name_entry</span><span class="p">,</span>
+ <span class="nb">type</span><span class="p">,</span> <span class="n">util</span><span class="o">.</span><span class="n">py3bytes</span><span class="p">(</span><span class="n">data</span><span class="p">))</span>
+</div>
+<div class="viewcode-block" id="X509_Name_Entry.get_object"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Name_Entry.get_object">[docs]</a> <span class="k">def</span> <span class="nf">get_object</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; ASN1.ASN1_Object</span>
+ <span class="k">return</span> <span class="n">ASN1</span><span class="o">.</span><span class="n">ASN1_Object</span><span class="p">(</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_entry_get_object</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name_entry</span><span class="p">))</span>
+</div>
+<div class="viewcode-block" id="X509_Name_Entry.get_data"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Name_Entry.get_data">[docs]</a> <span class="k">def</span> <span class="nf">get_data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; ASN1.ASN1_String</span>
+ <span class="k">return</span> <span class="n">ASN1</span><span class="o">.</span><span class="n">ASN1_String</span><span class="p">(</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_entry_get_data</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name_entry</span><span class="p">))</span>
+</div>
+<div class="viewcode-block" id="X509_Name_Entry.create_by_txt"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Name_Entry.create_by_txt">[docs]</a> <span class="k">def</span> <span class="nf">create_by_txt</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="nb">type</span><span class="p">,</span> <span class="n">entry</span><span class="p">,</span> <span class="nb">len</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_entry_create_by_txt</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name_entry</span><span class="o">.</span><span class="n">_ptr</span><span class="p">(),</span>
+ <span class="n">field</span><span class="p">,</span> <span class="nb">type</span><span class="p">,</span> <span class="n">entry</span><span class="p">,</span> <span class="nb">len</span><span class="p">)</span>
+
+</div></div>
+<div class="viewcode-block" id="X509_Name"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Name">[docs]</a><span class="k">class</span> <span class="nc">X509_Name</span><span class="p">:</span> <span class="c1"># noqa</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> X509 Name</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">nid</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;C&#39;</span><span class="p">:</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_countryName</span><span class="p">,</span>
+ <span class="s1">&#39;SP&#39;</span><span class="p">:</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_stateOrProvinceName</span><span class="p">,</span>
+ <span class="s1">&#39;ST&#39;</span><span class="p">:</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_stateOrProvinceName</span><span class="p">,</span>
+ <span class="s1">&#39;stateOrProvinceName&#39;</span><span class="p">:</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_stateOrProvinceName</span><span class="p">,</span>
+ <span class="s1">&#39;L&#39;</span><span class="p">:</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_localityName</span><span class="p">,</span>
+ <span class="s1">&#39;localityName&#39;</span><span class="p">:</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_localityName</span><span class="p">,</span>
+ <span class="s1">&#39;O&#39;</span><span class="p">:</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_organizationName</span><span class="p">,</span>
+ <span class="s1">&#39;organizationName&#39;</span><span class="p">:</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_organizationName</span><span class="p">,</span>
+ <span class="s1">&#39;OU&#39;</span><span class="p">:</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_organizationalUnitName</span><span class="p">,</span>
+ <span class="s1">&#39;organizationUnitName&#39;</span><span class="p">:</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_organizationalUnitName</span><span class="p">,</span>
+ <span class="s1">&#39;CN&#39;</span><span class="p">:</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_commonName</span><span class="p">,</span>
+ <span class="s1">&#39;commonName&#39;</span><span class="p">:</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_commonName</span><span class="p">,</span>
+ <span class="s1">&#39;Email&#39;</span><span class="p">:</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_pkcs9_emailAddress</span><span class="p">,</span>
+ <span class="s1">&#39;emailAddress&#39;</span><span class="p">:</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_pkcs9_emailAddress</span><span class="p">,</span>
+ <span class="s1">&#39;serialNumber&#39;</span><span class="p">:</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_serialNumber</span><span class="p">,</span>
+ <span class="s1">&#39;SN&#39;</span><span class="p">:</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_surname</span><span class="p">,</span>
+ <span class="s1">&#39;surname&#39;</span><span class="p">:</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_surname</span><span class="p">,</span>
+ <span class="s1">&#39;GN&#39;</span><span class="p">:</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_givenName</span><span class="p">,</span>
+ <span class="s1">&#39;givenName&#39;</span><span class="p">:</span> <span class="n">m2</span><span class="o">.</span><span class="n">NID_givenName</span>
+ <span class="p">}</span>
+
+ <span class="n">m2_x509_name_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x509_name</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, int) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> :param x509_name: this should be OpenSSL X509_NAME binary</span>
+<span class="sd"> :param _pyfree:</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">x509_name</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_type_check</span><span class="p">(</span><span class="n">x509_name</span><span class="p">),</span> <span class="s2">&quot;&#39;x509_name&#39; type error&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span> <span class="o">=</span> <span class="n">x509_name</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="n">_pyfree</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_new</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="mi">1</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_pyfree&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_x509_name_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">),</span> \
+ <span class="s2">&quot;&#39;x509_name&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_oneline</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attr</span><span class="p">):</span>
+ <span class="c1"># type: (str) -&gt; str</span>
+ <span class="k">if</span> <span class="n">attr</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">nid</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">),</span> \
+ <span class="s2">&quot;&#39;x509_name&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">x509_name_by_nid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">nid</span><span class="p">[</span><span class="n">attr</span><span class="p">]))</span>
+
+ <span class="k">if</span> <span class="n">attr</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__dict__</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__dict__</span><span class="p">[</span><span class="n">attr</span><span class="p">]</span>
+
+ <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attr</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__setattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attr</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="c1"># type: (str, AnyStr) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> :return: 1 for success of 0 if an error occurred.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">attr</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">nid</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">),</span> \
+ <span class="s2">&quot;&#39;x509_name&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_set_by_nid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">nid</span><span class="p">[</span><span class="n">attr</span><span class="p">],</span>
+ <span class="n">util</span><span class="o">.</span><span class="n">py3bytes</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">__dict__</span><span class="p">[</span><span class="n">attr</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+
+ <span class="k">def</span> <span class="nf">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_entry_count</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">idx</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; X509_Name_Entry</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="mi">0</span> <span class="o">&lt;=</span> <span class="n">idx</span> <span class="o">&lt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">entry_count</span><span class="p">():</span>
+ <span class="k">raise</span> <span class="ne">IndexError</span><span class="p">(</span><span class="s2">&quot;index out of range&quot;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">X509_Name_Entry</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">x509_name_get_entry</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">,</span> <span class="n">idx</span><span class="p">))</span>
+
+ <span class="k">def</span> <span class="nf">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">entry_count</span><span class="p">()):</span>
+ <span class="k">yield</span> <span class="bp">self</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
+
+ <span class="k">def</span> <span class="nf">_ptr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">),</span> \
+ <span class="s2">&quot;&#39;x509_name&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span>
+
+<div class="viewcode-block" id="X509_Name.add_entry_by_txt"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Name.add_entry_by_txt">[docs]</a> <span class="k">def</span> <span class="nf">add_entry_by_txt</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">field</span><span class="p">,</span> <span class="nb">type</span><span class="p">,</span> <span class="n">entry</span><span class="p">,</span> <span class="nb">len</span><span class="p">,</span> <span class="n">loc</span><span class="p">,</span> <span class="nb">set</span><span class="p">):</span>
+ <span class="c1"># entry_type: (str, int, bytes, int, int, int) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Add X509_Name field whose name is identified by its name.</span>
+
+<span class="sd"> :param field: name of the entry</span>
+<span class="sd"> :param type: use MBSTRING_ASC or MBSTRING_UTF8</span>
+<span class="sd"> (or standard ASN1 type like V_ASN1_IA5STRING)</span>
+<span class="sd"> :param entry: value</span>
+<span class="sd"> :param len: buf_len of the entry</span>
+<span class="sd"> (-1 and the length is computed automagically)</span>
+
+<span class="sd"> The ``loc`` and ``set`` parameters determine where a new entry</span>
+<span class="sd"> should be added.</span>
+<span class="sd"> For almost all applications loc can be set to -1 and set to 0.</span>
+<span class="sd"> This adds a new entry to the end of name as a single valued</span>
+<span class="sd"> RelativeDistinguishedName (RDN).</span>
+
+<span class="sd"> :param loc: determines the index where the new entry is</span>
+<span class="sd"> inserted: if it is -1 it is appended.</span>
+<span class="sd"> :param set: determines how the new type is added. If it is zero</span>
+<span class="sd"> a new RDN is created.</span>
+<span class="sd"> If set is -1 or 1 it is added to the previous or next RDN</span>
+<span class="sd"> structure respectively. This will then be a multivalued</span>
+<span class="sd"> RDN: since multivalues RDNs are very seldom used set is</span>
+<span class="sd"> almost always set to zero.</span>
+
+<span class="sd"> :return: 1 for success of 0 if an error occurred.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_add_entry_by_txt</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">,</span>
+ <span class="n">util</span><span class="o">.</span><span class="n">py3bytes</span><span class="p">(</span><span class="n">field</span><span class="p">),</span> <span class="nb">type</span><span class="p">,</span>
+ <span class="n">entry</span><span class="p">,</span> <span class="nb">len</span><span class="p">,</span> <span class="n">loc</span><span class="p">,</span> <span class="nb">set</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="X509_Name.entry_count"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Name.entry_count">[docs]</a> <span class="k">def</span> <span class="nf">entry_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_entry_count</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="X509_Name.get_entries_by_nid"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Name.get_entries_by_nid">[docs]</a> <span class="k">def</span> <span class="nf">get_entries_by_nid</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">nid</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; List[X509_Name_Entry]</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Retrieve the next index matching nid.</span>
+
+<span class="sd"> :param nid: name of the entry (as m2.NID* constants)</span>
+
+<span class="sd"> :return: list of X509_Name_Entry items</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">ret</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">lastpos</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>
+
+ <span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
+ <span class="n">lastpos</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_get_index_by_nid</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">,</span> <span class="n">nid</span><span class="p">,</span>
+ <span class="n">lastpos</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">lastpos</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
+ <span class="k">break</span>
+
+ <span class="n">ret</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="p">[</span><span class="n">lastpos</span><span class="p">])</span>
+
+ <span class="k">return</span> <span class="n">ret</span>
+</div>
+<div class="viewcode-block" id="X509_Name.as_text"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Name.as_text">[docs]</a> <span class="k">def</span> <span class="nf">as_text</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">m2</span><span class="o">.</span><span class="n">XN_FLAG_COMPAT</span><span class="p">):</span>
+ <span class="c1"># type: (int, int) -&gt; str</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> as_text returns the name as a string.</span>
+
+<span class="sd"> :param indent: Each line in multiline format is indented</span>
+<span class="sd"> by this many spaces.</span>
+<span class="sd"> :param flags: Flags that control how the output should be formatted.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">),</span> \
+ <span class="s2">&quot;&#39;x509_name&#39; type error&quot;</span>
+ <span class="n">buf</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_print_ex</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">,</span> <span class="n">indent</span><span class="p">,</span> <span class="n">flags</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">())</span>
+</div>
+<div class="viewcode-block" id="X509_Name.as_der"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Name.as_der">[docs]</a> <span class="k">def</span> <span class="nf">as_der</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">),</span> \
+ <span class="s2">&quot;&#39;x509_name&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_get_der</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="X509_Name.as_hash"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Name.as_hash">[docs]</a> <span class="k">def</span> <span class="nf">as_hash</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">),</span> \
+ <span class="s2">&quot;&#39;x509_name&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_name_hash</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509_name</span><span class="p">)</span>
+
+</div></div>
+<div class="viewcode-block" id="X509"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509">[docs]</a><span class="k">class</span> <span class="nc">X509</span><span class="p">:</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> X.509 Certificate</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">m2_x509_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x509</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[bytes], int) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> :param x509: binary representation of</span>
+<span class="sd"> the underlying OpenSSL X509 object.</span>
+<span class="sd"> :param _pyfree:</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">x509</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_type_check</span><span class="p">(</span><span class="n">x509</span><span class="p">),</span> <span class="s2">&quot;&#39;x509&#39; type error&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">x509</span> <span class="o">=</span> <span class="n">x509</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="n">_pyfree</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">x509</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_new</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="mi">1</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_pyfree&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_x509_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">_ptr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">),</span> <span class="s2">&quot;&#39;x509&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">x509</span>
+
+<div class="viewcode-block" id="X509.as_text"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.as_text">[docs]</a> <span class="k">def</span> <span class="nf">as_text</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; str</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">),</span> <span class="s2">&quot;&#39;x509&#39; type error&quot;</span>
+ <span class="n">buf</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">x509_print</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">())</span>
+</div>
+<div class="viewcode-block" id="X509.as_der"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.as_der">[docs]</a> <span class="k">def</span> <span class="nf">as_der</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">),</span> <span class="s2">&quot;&#39;x509&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">i2d_x509</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="X509.as_pem"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.as_pem">[docs]</a> <span class="k">def</span> <span class="nf">as_pem</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="n">buf</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">x509_write_pem</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="X509.save_pem"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.save_pem">[docs]</a> <span class="k">def</span> <span class="nf">save_pem</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> :param filename: name of the file to be loaded</span>
+<span class="sd"> :return: 1 for success or 0 for failure</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_write_pem</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="X509.save"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.save">[docs]</a> <span class="k">def</span> <span class="nf">save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="n">FORMAT_PEM</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, int) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Saves X.509 certificate to a file. Default output</span>
+<span class="sd"> format is PEM.</span>
+
+<span class="sd"> :param filename: Name of the file the cert will be saved to.</span>
+
+<span class="sd"> :param format: Controls what output format is used to save the cert.</span>
+<span class="sd"> Either FORMAT_PEM or FORMAT_DER to save in PEM or</span>
+<span class="sd"> DER format. Raises a ValueError if an unknow</span>
+<span class="sd"> format is used.</span>
+<span class="sd"> </span>
+<span class="sd"> :return: 1 for success or 0 for failure</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">format</span> <span class="o">==</span> <span class="n">FORMAT_PEM</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_write_pem</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="n">format</span> <span class="o">==</span> <span class="n">FORMAT_DER</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">i2d_x509_bio</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
+ <span class="s2">&quot;Unknown filetype. Must be either FORMAT_PEM or FORMAT_DER&quot;</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="X509.set_version"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.set_version">[docs]</a> <span class="k">def</span> <span class="nf">set_version</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">version</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Set version of the certificate.</span>
+
+<span class="sd"> :param version: Version number.</span>
+<span class="sd"> :return: Returns 0 on failure.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">),</span> <span class="s2">&quot;&#39;x509&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_set_version</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">,</span> <span class="n">version</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="X509.set_not_before"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.set_not_before">[docs]</a> <span class="k">def</span> <span class="nf">set_not_before</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">asn1_time</span><span class="p">):</span>
+ <span class="c1"># type: (ASN1.ASN1_TIME) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> :return: 1 on success, 0 on failure</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">),</span> <span class="s2">&quot;&#39;x509&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_set_not_before</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">,</span> <span class="n">asn1_time</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+</div>
+<div class="viewcode-block" id="X509.set_not_after"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.set_not_after">[docs]</a> <span class="k">def</span> <span class="nf">set_not_after</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">asn1_time</span><span class="p">):</span>
+ <span class="c1"># type: (ASN1.ASN1_TIME) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> :return: 1 on success, 0 on failure</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">),</span> <span class="s2">&quot;&#39;x509&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_set_not_after</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">,</span> <span class="n">asn1_time</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+</div>
+<div class="viewcode-block" id="X509.set_subject_name"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.set_subject_name">[docs]</a> <span class="k">def</span> <span class="nf">set_subject_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="c1"># type: (X509_Name) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> :return: 1 on success, 0 on failure</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">),</span> <span class="s2">&quot;&#39;x509&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_set_subject_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">,</span> <span class="n">name</span><span class="o">.</span><span class="n">x509_name</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="X509.set_issuer_name"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.set_issuer_name">[docs]</a> <span class="k">def</span> <span class="nf">set_issuer_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="c1"># type: (X509_Name) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> :return: 1 on success, 0 on failure</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">),</span> <span class="s2">&quot;&#39;x509&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_set_issuer_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">,</span> <span class="n">name</span><span class="o">.</span><span class="n">x509_name</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="X509.get_version"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.get_version">[docs]</a> <span class="k">def</span> <span class="nf">get_version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">),</span> <span class="s2">&quot;&#39;x509&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_get_version</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="X509.get_serial_number"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.get_serial_number">[docs]</a> <span class="k">def</span> <span class="nf">get_serial_number</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; ASN1.ASN1_Integer</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">),</span> <span class="s2">&quot;&#39;x509&#39; type error&quot;</span>
+ <span class="n">asn1_integer</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_get_serial_number</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">asn1_integer_get</span><span class="p">(</span><span class="n">asn1_integer</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="X509.set_serial_number"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.set_serial_number">[docs]</a> <span class="k">def</span> <span class="nf">set_serial_number</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">serial</span><span class="p">):</span>
+ <span class="c1"># type: (ASN1.ASN1_Integer) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Set serial number.</span>
+
+<span class="sd"> :param serial: Serial number.</span>
+
+<span class="sd"> :return 1 for success and 0 for failure.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">),</span> <span class="s2">&quot;&#39;x509&#39; type error&quot;</span>
+ <span class="c1"># This &quot;magically&quot; changes serial since asn1_integer</span>
+ <span class="c1"># is C pointer to x509&#39;s internal serial number.</span>
+ <span class="n">asn1_integer</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_get_serial_number</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">asn1_integer_set</span><span class="p">(</span><span class="n">asn1_integer</span><span class="p">,</span> <span class="n">serial</span><span class="p">)</span>
+ <span class="c1"># XXX Or should I do this?</span>
+ <span class="c1"># asn1_integer = m2.asn1_integer_new()</span>
+ <span class="c1"># m2.asn1_integer_set(asn1_integer, serial)</span>
+ <span class="c1"># return m2.x509_set_serial_number(self.x509, asn1_integer)</span>
+</div>
+<div class="viewcode-block" id="X509.get_not_before"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.get_not_before">[docs]</a> <span class="k">def</span> <span class="nf">get_not_before</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; ASN1.ASN1_TIME</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">),</span> <span class="s2">&quot;&#39;x509&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">ASN1</span><span class="o">.</span><span class="n">ASN1_TIME</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">x509_get_not_before</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">))</span>
+</div>
+<div class="viewcode-block" id="X509.get_not_after"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.get_not_after">[docs]</a> <span class="k">def</span> <span class="nf">get_not_after</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; ASN1.ASN1_TIME</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">),</span> <span class="s2">&quot;&#39;x509&#39; type error&quot;</span>
+ <span class="n">out</span> <span class="o">=</span> <span class="n">ASN1</span><span class="o">.</span><span class="n">ASN1_TIME</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">x509_get_not_after</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">))</span>
+ <span class="k">if</span> <span class="s1">&#39;Bad time value&#39;</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">out</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">X509Error</span><span class="p">(</span>
+ <span class="sd">&#39;&#39;&#39;M2Crypto cannot handle dates after year 2050.</span>
+<span class="sd"> See RFC 5280 4.1.2.5 for more information.</span>
+<span class="sd"> &#39;&#39;&#39;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">out</span>
+</div>
+<div class="viewcode-block" id="X509.get_pubkey"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.get_pubkey">[docs]</a> <span class="k">def</span> <span class="nf">get_pubkey</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; EVP.PKey</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">),</span> <span class="s2">&quot;&#39;x509&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">EVP</span><span class="o">.</span><span class="n">PKey</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">x509_get_pubkey</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">),</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="X509.set_pubkey"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.set_pubkey">[docs]</a> <span class="k">def</span> <span class="nf">set_pubkey</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pkey</span><span class="p">):</span>
+ <span class="c1"># type: (EVP.PKey) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Set the public key for the certificate</span>
+
+<span class="sd"> :param pkey: Public key</span>
+<span class="sd"> </span>
+<span class="sd"> :return 1 for success and 0 for failure</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">),</span> <span class="s2">&quot;&#39;x509&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_set_pubkey</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">,</span> <span class="n">pkey</span><span class="o">.</span><span class="n">pkey</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="X509.get_issuer"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.get_issuer">[docs]</a> <span class="k">def</span> <span class="nf">get_issuer</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; X509_Name</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">),</span> <span class="s2">&quot;&#39;x509&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">X509_Name</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">x509_get_issuer_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">))</span>
+</div>
+<div class="viewcode-block" id="X509.set_issuer"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.set_issuer">[docs]</a> <span class="k">def</span> <span class="nf">set_issuer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="c1"># type: (X509_Name) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Set issuer name.</span>
+
+<span class="sd"> :param name: subjectName field.</span>
+
+<span class="sd"> :return 1 for success and 0 for failure</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">),</span> <span class="s2">&quot;&#39;x509&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_set_issuer_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">,</span> <span class="n">name</span><span class="o">.</span><span class="n">x509_name</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="X509.get_subject"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.get_subject">[docs]</a> <span class="k">def</span> <span class="nf">get_subject</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; X509_Name</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">),</span> <span class="s2">&quot;&#39;x509&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">X509_Name</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">x509_get_subject_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">))</span>
+</div>
+<div class="viewcode-block" id="X509.set_subject"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.set_subject">[docs]</a> <span class="k">def</span> <span class="nf">set_subject</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="c1"># type: (X509_Name) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Set subject name.</span>
+
+<span class="sd"> :param name: subjectName field.</span>
+<span class="sd"> </span>
+<span class="sd"> :return 1 for success and 0 for failure</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">),</span> <span class="s2">&quot;&#39;x509&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_set_subject_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">,</span> <span class="n">name</span><span class="o">.</span><span class="n">x509_name</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="X509.add_ext"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.add_ext">[docs]</a> <span class="k">def</span> <span class="nf">add_ext</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ext</span><span class="p">):</span>
+ <span class="c1"># type: (X509_Extension) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Add X509 extension to this certificate.</span>
+
+<span class="sd"> :param ext: Extension</span>
+
+<span class="sd"> :return 1 for success and 0 for failure</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">),</span> <span class="s2">&quot;&#39;x509&#39; type error&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_add_ext</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">,</span> <span class="n">ext</span><span class="o">.</span><span class="n">x509_ext</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="X509.get_ext"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.get_ext">[docs]</a> <span class="k">def</span> <span class="nf">get_ext</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="c1"># type: (str) -&gt; X509_Extension</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Get X509 extension by name.</span>
+
+<span class="sd"> :param name: Name of the extension</span>
+
+<span class="sd"> :return: X509_Extension</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="c1"># Optimizations to reduce attribute accesses</span>
+ <span class="n">m2x509_get_ext</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_get_ext</span>
+ <span class="n">m2x509_extension_get_name</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_extension_get_name</span>
+ <span class="n">x509</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">x509</span>
+
+ <span class="n">name</span> <span class="o">=</span> <span class="n">util</span><span class="o">.</span><span class="n">py3bytes</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">x509_get_ext_count</span><span class="p">(</span><span class="n">x509</span><span class="p">)):</span>
+ <span class="n">ext_ptr</span> <span class="o">=</span> <span class="n">m2x509_get_ext</span><span class="p">(</span><span class="n">x509</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">m2x509_extension_get_name</span><span class="p">(</span><span class="n">ext_ptr</span><span class="p">)</span> <span class="o">==</span> <span class="n">name</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">X509_Extension</span><span class="p">(</span><span class="n">ext_ptr</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
+
+ <span class="k">raise</span> <span class="ne">LookupError</span>
+</div>
+<div class="viewcode-block" id="X509.get_ext_at"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.get_ext_at">[docs]</a> <span class="k">def</span> <span class="nf">get_ext_at</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; X509_Extension</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Get X509 extension by index.</span>
+
+<span class="sd"> :param index: Name of the extension</span>
+
+<span class="sd"> :return: X509_Extension</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">index</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">index</span> <span class="o">&gt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_ext_count</span><span class="p">():</span>
+ <span class="k">raise</span> <span class="ne">IndexError</span>
+
+ <span class="k">return</span> <span class="n">X509_Extension</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">x509_get_ext</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">,</span> <span class="n">index</span><span class="p">),</span>
+ <span class="n">_pyfree</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="X509.get_ext_count"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.get_ext_count">[docs]</a> <span class="k">def</span> <span class="nf">get_ext_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Get X509 extension count.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_get_ext_count</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="X509.sign"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.sign">[docs]</a> <span class="k">def</span> <span class="nf">sign</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pkey</span><span class="p">,</span> <span class="n">md</span><span class="p">):</span>
+ <span class="c1"># type: (EVP.PKey, str) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Sign the certificate.</span>
+
+<span class="sd"> :param pkey: Public key</span>
+<span class="sd"> </span>
+<span class="sd"> :param md: Message digest algorithm to use for signing,</span>
+<span class="sd"> for example &#39;sha1&#39;.</span>
+<span class="sd"> </span>
+<span class="sd"> :return int</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">),</span> <span class="s2">&quot;&#39;x509&#39; type error&quot;</span>
+ <span class="n">mda</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">m2</span><span class="p">,</span> <span class="n">md</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">mda</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown message digest&#39;</span><span class="p">,</span> <span class="n">md</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_sign</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">,</span> <span class="n">pkey</span><span class="o">.</span><span class="n">pkey</span><span class="p">,</span> <span class="n">mda</span><span class="p">())</span>
+</div>
+<div class="viewcode-block" id="X509.verify"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.verify">[docs]</a> <span class="k">def</span> <span class="nf">verify</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pkey</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[EVP.PKey]) -&gt; int</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_type_check</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">),</span> <span class="s2">&quot;&#39;x509&#39; type error&quot;</span>
+ <span class="k">if</span> <span class="n">pkey</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_verify</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">,</span> <span class="n">pkey</span><span class="o">.</span><span class="n">pkey</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_verify</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_pubkey</span><span class="p">()</span><span class="o">.</span><span class="n">pkey</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="X509.check_ca"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.check_ca">[docs]</a> <span class="k">def</span> <span class="nf">check_ca</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Check if the certificate is a Certificate Authority (CA) certificate.</span>
+
+<span class="sd"> :return: 0 if the certificate is not CA, nonzero otherwise.</span>
+
+<span class="sd"> :requires: OpenSSL 0.9.8 or newer</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_check_ca</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="X509.check_purpose"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.check_purpose">[docs]</a> <span class="k">def</span> <span class="nf">check_purpose</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">id</span><span class="p">,</span> <span class="n">ca</span><span class="p">):</span>
+ <span class="c1"># type: (int, int) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Check if the certificate&#39;s purpose matches the asked purpose.</span>
+
+<span class="sd"> :param id: Purpose id. See X509_PURPOSE_* constants.</span>
+<span class="sd"> </span>
+<span class="sd"> :param ca: 1 if the certificate should be CA, 0 otherwise.</span>
+<span class="sd"> </span>
+<span class="sd"> :return: 0 if the certificate purpose does not match, nonzero</span>
+<span class="sd"> otherwise.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_check_purpose</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">x509</span><span class="p">,</span> <span class="nb">id</span><span class="p">,</span> <span class="n">ca</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="X509.get_fingerprint"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509.get_fingerprint">[docs]</a> <span class="k">def</span> <span class="nf">get_fingerprint</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">md</span><span class="o">=</span><span class="s1">&#39;md5&#39;</span><span class="p">):</span>
+ <span class="c1"># type: (str) -&gt; str</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Get the fingerprint of the certificate.</span>
+
+<span class="sd"> :param md: Message digest algorithm to use.</span>
+<span class="sd"> </span>
+<span class="sd"> :return: String containing the fingerprint in hex format.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">der</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">as_der</span><span class="p">()</span>
+ <span class="n">md</span> <span class="o">=</span> <span class="n">EVP</span><span class="o">.</span><span class="n">MessageDigest</span><span class="p">(</span><span class="n">md</span><span class="p">)</span>
+ <span class="n">md</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">der</span><span class="p">)</span>
+ <span class="n">digest</span> <span class="o">=</span> <span class="n">md</span><span class="o">.</span><span class="n">final</span><span class="p">()</span>
+ <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">digest</span><span class="p">)</span><span class="o">.</span><span class="n">upper</span><span class="p">())</span>
+
+</div></div>
+<div class="viewcode-block" id="load_cert"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.load_cert">[docs]</a><span class="k">def</span> <span class="nf">load_cert</span><span class="p">(</span><span class="nb">file</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="n">FORMAT_PEM</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, int) -&gt; X509</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Load certificate from file.</span>
+
+<span class="sd"> :param file: Name of file containing certificate in either DER or</span>
+<span class="sd"> PEM format.</span>
+<span class="sd"> </span>
+<span class="sd"> :param format: Describes the format of the file to be loaded,</span>
+<span class="sd"> either PEM or DER.</span>
+
+<span class="sd"> :return: M2Crypto.X509.X509 object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="nb">file</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">format</span> <span class="o">==</span> <span class="n">FORMAT_PEM</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">load_cert_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="n">format</span> <span class="o">==</span> <span class="n">FORMAT_DER</span><span class="p">:</span>
+ <span class="n">cptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">d2i_x509</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+ <span class="k">if</span> <span class="n">cptr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">X509Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">X509</span><span class="p">(</span><span class="n">cptr</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
+ <span class="s2">&quot;Unknown format. Must be either FORMAT_DER or FORMAT_PEM&quot;</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_cert_bio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.load_cert_bio">[docs]</a><span class="k">def</span> <span class="nf">load_cert_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="n">FORMAT_PEM</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO, int) -&gt; X509</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Load certificate from a bio.</span>
+
+<span class="sd"> :param bio: BIO pointing at a certificate in either DER or PEM format.</span>
+<span class="sd"> </span>
+<span class="sd"> :param format: Describes the format of the cert to be loaded,</span>
+<span class="sd"> either PEM or DER (via constants FORMAT_PEM</span>
+<span class="sd"> and FORMAT_FORMAT_DER)</span>
+
+<span class="sd"> :return: M2Crypto.X509.X509 object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">format</span> <span class="o">==</span> <span class="n">FORMAT_PEM</span><span class="p">:</span>
+ <span class="n">cptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_read_pem</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+ <span class="k">elif</span> <span class="n">format</span> <span class="o">==</span> <span class="n">FORMAT_DER</span><span class="p">:</span>
+ <span class="n">cptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">d2i_x509</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
+ <span class="s2">&quot;Unknown format. Must be either FORMAT_DER or FORMAT_PEM&quot;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">cptr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">X509Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">X509</span><span class="p">(</span><span class="n">cptr</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_cert_string"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.load_cert_string">[docs]</a><span class="k">def</span> <span class="nf">load_cert_string</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="n">FORMAT_PEM</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, int) -&gt; X509</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Load certificate from a string.</span>
+
+<span class="sd"> :param string: String containing a certificate in either DER or PEM format.</span>
+
+<span class="sd"> :param format: Describes the format of the cert to be loaded,</span>
+<span class="sd"> either PEM or DER (via constants FORMAT_PEM</span>
+<span class="sd"> and FORMAT_FORMAT_DER)</span>
+<span class="sd"> </span>
+<span class="sd"> :return: M2Crypto.X509.X509 object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">string</span> <span class="o">=</span> <span class="n">util</span><span class="o">.</span><span class="n">py3bytes</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
+ <span class="n">bio</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">load_cert_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">format</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_cert_der_string"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.load_cert_der_string">[docs]</a><span class="k">def</span> <span class="nf">load_cert_der_string</span><span class="p">(</span><span class="n">string</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr) -&gt; X509</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Load certificate from a string.</span>
+
+<span class="sd"> :param string: String containing a certificate in DER format.</span>
+<span class="sd"> </span>
+<span class="sd"> :return: M2Crypto.X509.X509 object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">string</span> <span class="o">=</span> <span class="n">util</span><span class="o">.</span><span class="n">py3bytes</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
+ <span class="n">bio</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
+ <span class="n">cptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">d2i_x509</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+ <span class="k">if</span> <span class="n">cptr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">X509Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">X509</span><span class="p">(</span><span class="n">cptr</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="X509_Store_Context"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Store_Context">[docs]</a><span class="k">class</span> <span class="nc">X509_Store_Context</span><span class="p">:</span> <span class="c1"># noqa</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> X509 Store Context</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">m2_x509_store_ctx_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_store_ctx_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x509_store_ctx</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, int) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+
+<span class="sd"> :param x509_store_ctx: binary data for</span>
+<span class="sd"> OpenSSL X509_STORE_CTX type</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ctx</span> <span class="o">=</span> <span class="n">x509_store_ctx</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="n">_pyfree</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="c1"># see BIO.py - unbalanced __init__ / __del__</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_pyfree&#39;</span><span class="p">):</span>
+ <span class="k">pass</span> <span class="c1"># print(&quot;OOPS&quot;)</span>
+ <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_x509_store_ctx_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">_ptr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">ctx</span>
+
+<div class="viewcode-block" id="X509_Store_Context.get_current_cert"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Store_Context.get_current_cert">[docs]</a> <span class="k">def</span> <span class="nf">get_current_cert</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; X509</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Get current X.509 certificate.</span>
+
+<span class="sd"> :warning: The returned certificate is NOT refcounted, so you can not</span>
+<span class="sd"> rely on it being valid once the store context goes</span>
+<span class="sd"> away or is modified.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">X509</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">x509_store_ctx_get_current_cert</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">),</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="X509_Store_Context.get_error"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Store_Context.get_error">[docs]</a> <span class="k">def</span> <span class="nf">get_error</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Get error code.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_store_ctx_get_error</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="X509_Store_Context.get_error_depth"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Store_Context.get_error_depth">[docs]</a> <span class="k">def</span> <span class="nf">get_error_depth</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Get error depth.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_store_ctx_get_error_depth</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="X509_Store_Context.get1_chain"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Store_Context.get1_chain">[docs]</a> <span class="k">def</span> <span class="nf">get1_chain</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; X509_Stack</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Get certificate chain.</span>
+
+<span class="sd"> :return: Reference counted (i.e. safe to use even after the store</span>
+<span class="sd"> context goes away) stack of certificates in the chain.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">X509_Stack</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">x509_store_ctx_get1_chain</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">),</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+</div></div>
+<div class="viewcode-block" id="X509_Store"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Store">[docs]</a><span class="k">class</span> <span class="nc">X509_Store</span><span class="p">:</span> <span class="c1"># noqa</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> X509 Store</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">m2_x509_store_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_store_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">store</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[bytes], int) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> :param store: binary data for OpenSSL X509_STORE_CTX type.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">store</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">store</span> <span class="o">=</span> <span class="n">store</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="n">_pyfree</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">store</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_store_new</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="mi">1</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_pyfree&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_x509_store_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">store</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">_ptr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">store</span>
+
+<div class="viewcode-block" id="X509_Store.load_info"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Store.load_info">[docs]</a> <span class="k">def</span> <span class="nf">load_info</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">file</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> :param file: filename</span>
+<span class="sd"> </span>
+<span class="sd"> :return: 1 on success, 0 on failure</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">ret</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_store_load_locations</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">store</span><span class="p">,</span> <span class="nb">file</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">ret</span> <span class="o">&lt;</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">X509Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">ret</span>
+</div>
+ <span class="n">load_locations</span> <span class="o">=</span> <span class="n">load_info</span>
+
+<div class="viewcode-block" id="X509_Store.add_x509"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Store.add_x509">[docs]</a> <span class="k">def</span> <span class="nf">add_x509</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x509</span><span class="p">):</span>
+ <span class="c1"># type: (X509) -&gt; int</span>
+ <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x509</span><span class="p">,</span> <span class="n">X509</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_store_add_cert</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">store</span><span class="p">,</span> <span class="n">x509</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+</div>
+<div class="viewcode-block" id="X509_Store.set_verify_cb"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Store.set_verify_cb">[docs]</a> <span class="k">def</span> <span class="nf">set_verify_cb</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">callback</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[callable]) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Set callback which will be called when the store is verified.</span>
+<span class="sd"> Wrapper over OpenSSL X509_STORE_set_verify_cb().</span>
+
+<span class="sd"> :param callback: Callable to specify verification options.</span>
+<span class="sd"> Type of the callable must be:</span>
+<span class="sd"> (int, X509_Store_Context) -&gt; int.</span>
+<span class="sd"> If None: set the standard options.</span>
+<span class="sd"> </span>
+<span class="sd"> :note: compile-time or run-time errors in the callback would result</span>
+<span class="sd"> in mysterious errors during verification, which could be hard</span>
+<span class="sd"> to trace.</span>
+
+<span class="sd"> :note: Python exceptions raised in callbacks do not propagate to</span>
+<span class="sd"> verify() call.</span>
+<span class="sd"> </span>
+<span class="sd"> :return: None</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">callback</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">set_verify_cb</span><span class="p">(</span><span class="n">x509_store_default_cb</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="ow">not</span> <span class="nb">callable</span><span class="p">(</span><span class="n">callback</span><span class="p">):</span>
+ <span class="k">raise</span> <span class="n">X509Error</span><span class="p">(</span><span class="s2">&quot;set_verify(): callback is not callable&quot;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_store_set_verify_cb</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">store</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+</div>
+ <span class="n">add_cert</span> <span class="o">=</span> <span class="n">add_x509</span>
+
+</div>
+<div class="viewcode-block" id="X509_Stack"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Stack">[docs]</a><span class="k">class</span> <span class="nc">X509_Stack</span><span class="p">:</span> <span class="c1"># noqa</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> X509 Stack</span>
+
+<span class="sd"> :warning: Do not modify the underlying OpenSSL stack</span>
+<span class="sd"> except through this interface, or use any OpenSSL</span>
+<span class="sd"> functions that do so indirectly. Doing so will get the</span>
+<span class="sd"> OpenSSL stack and the internal pystack of this class out</span>
+<span class="sd"> of sync, leading to python memory leaks, exceptions or</span>
+<span class="sd"> even python crashes!</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">m2_sk_x509_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">sk_x509_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stack</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">_pyfree_x509</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (bytes, int, int) -&gt; None</span>
+ <span class="k">if</span> <span class="n">stack</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">stack</span> <span class="o">=</span> <span class="n">stack</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="n">_pyfree</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">pystack</span> <span class="o">=</span> <span class="p">[]</span> <span class="c1"># This must be kept in sync with self.stack</span>
+ <span class="n">num</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">sk_x509_num</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">num</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">pystack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">X509</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">sk_x509_value</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="p">,</span> <span class="n">i</span><span class="p">),</span>
+ <span class="n">_pyfree</span><span class="o">=</span><span class="n">_pyfree_x509</span><span class="p">))</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">stack</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">sk_x509_new_null</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="mi">1</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">pystack</span> <span class="o">=</span> <span class="p">[]</span> <span class="c1"># This must be kept in sync with self.stack</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_pyfree&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_sk_x509_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="k">assert</span> <span class="n">m2</span><span class="o">.</span><span class="n">sk_x509_num</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="p">)</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pystack</span><span class="p">)</span>
+ <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pystack</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">idx</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; X509</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">pystack</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span>
+
+ <span class="k">def</span> <span class="nf">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pystack</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">_ptr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">stack</span>
+
+<div class="viewcode-block" id="X509_Stack.push"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Stack.push">[docs]</a> <span class="k">def</span> <span class="nf">push</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x509</span><span class="p">):</span>
+ <span class="c1"># type: (X509) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> push an X509 certificate onto the stack.</span>
+
+<span class="sd"> :param x509: X509 object.</span>
+<span class="sd"> </span>
+<span class="sd"> :return: The number of X509 objects currently on the stack.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x509</span><span class="p">,</span> <span class="n">X509</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">pystack</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">x509</span><span class="p">)</span>
+ <span class="n">ret</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">sk_x509_push</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="p">,</span> <span class="n">x509</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+ <span class="k">assert</span> <span class="n">ret</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pystack</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">ret</span>
+</div>
+<div class="viewcode-block" id="X509_Stack.pop"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Stack.pop">[docs]</a> <span class="k">def</span> <span class="nf">pop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; X509</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> pop a certificate from the stack.</span>
+
+<span class="sd"> :return: X509 object that was popped, or None if there is</span>
+<span class="sd"> nothing to pop.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">x509_ptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">sk_x509_pop</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">x509_ptr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">pystack</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span>
+ <span class="k">return</span> <span class="bp">None</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">pystack</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="X509_Stack.as_der"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.X509_Stack.as_der">[docs]</a> <span class="k">def</span> <span class="nf">as_der</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Return the stack as a DER encoded string</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">get_der_encoding_stack</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="p">)</span>
+
+</div></div>
+<div class="viewcode-block" id="new_stack_from_der"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.new_stack_from_der">[docs]</a><span class="k">def</span> <span class="nf">new_stack_from_der</span><span class="p">(</span><span class="n">der_string</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; X509_Stack</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Create a new X509_Stack from DER string.</span>
+
+<span class="sd"> :return: X509_Stack</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">der_string</span> <span class="o">=</span> <span class="n">util</span><span class="o">.</span><span class="n">py3bytes</span><span class="p">(</span><span class="n">der_string</span><span class="p">)</span>
+ <span class="n">stack_ptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">make_stack_from_der_sequence</span><span class="p">(</span><span class="n">der_string</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">stack_ptr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">X509Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">X509_Stack</span><span class="p">(</span><span class="n">stack_ptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="Request"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.Request">[docs]</a><span class="k">class</span> <span class="nc">Request</span><span class="p">:</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> X509 Certificate Request.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">m2_x509_req_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_req_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[int], int) -&gt; None</span>
+ <span class="k">if</span> <span class="n">req</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">req</span> <span class="o">=</span> <span class="n">req</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="n">_pyfree</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">req</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_req_new</span><span class="p">()</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">x509_req_set_version</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">req</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="mi">1</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_pyfree&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_x509_req_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">req</span><span class="p">)</span>
+
+<div class="viewcode-block" id="Request.as_text"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.Request.as_text">[docs]</a> <span class="k">def</span> <span class="nf">as_text</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; str</span>
+ <span class="n">buf</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">x509_req_print</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">req</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">())</span>
+</div>
+<div class="viewcode-block" id="Request.as_pem"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.Request.as_pem">[docs]</a> <span class="k">def</span> <span class="nf">as_pem</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="n">buf</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">x509_req_write_pem</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">req</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="Request.as_der"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.Request.as_der">[docs]</a> <span class="k">def</span> <span class="nf">as_der</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="n">buf</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">i2d_x509_req_bio</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">req</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="Request.save_pem"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.Request.save_pem">[docs]</a> <span class="k">def</span> <span class="nf">save_pem</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr) -&gt; int</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_req_write_pem</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">req</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Request.save"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.Request.save">[docs]</a> <span class="k">def</span> <span class="nf">save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="n">FORMAT_PEM</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, int) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Saves X.509 certificate request to a file. Default output</span>
+<span class="sd"> format is PEM.</span>
+
+<span class="sd"> :param filename: Name of the file the request will be saved to.</span>
+
+<span class="sd"> :param format: Controls what output format is used to save the</span>
+<span class="sd"> request. Either FORMAT_PEM or FORMAT_DER to save</span>
+<span class="sd"> in PEM or DER format. Raises ValueError if an</span>
+<span class="sd"> unknown format is used.</span>
+
+<span class="sd"> :return: 1 for success, 0 for failure.</span>
+<span class="sd"> The error code can be obtained by ERR_get_error.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">bio</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">format</span> <span class="o">==</span> <span class="n">FORMAT_PEM</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_req_write_pem</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">req</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="n">format</span> <span class="o">==</span> <span class="n">FORMAT_DER</span><span class="p">:</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">i2d_x509_req_bio</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">req</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
+ <span class="s2">&quot;Unknown filetype. Must be either FORMAT_DER or FORMAT_PEM&quot;</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Request.get_pubkey"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.Request.get_pubkey">[docs]</a> <span class="k">def</span> <span class="nf">get_pubkey</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; EVP.PKey</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Get the public key for the request.</span>
+
+<span class="sd"> :return: Public key from the request.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">EVP</span><span class="o">.</span><span class="n">PKey</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">x509_req_get_pubkey</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">req</span><span class="p">),</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Request.set_pubkey"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.Request.set_pubkey">[docs]</a> <span class="k">def</span> <span class="nf">set_pubkey</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pkey</span><span class="p">):</span>
+ <span class="c1"># type: (EVP.PKey) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Set the public key for the request.</span>
+
+<span class="sd"> :param pkey: Public key</span>
+
+<span class="sd"> :return: Return 1 for success and 0 for failure.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_req_set_pubkey</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">req</span><span class="p">,</span> <span class="n">pkey</span><span class="o">.</span><span class="n">pkey</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Request.get_version"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.Request.get_version">[docs]</a> <span class="k">def</span> <span class="nf">get_version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Get version.</span>
+
+<span class="sd"> :return: Returns version.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_req_get_version</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">req</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Request.set_version"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.Request.set_version">[docs]</a> <span class="k">def</span> <span class="nf">set_version</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">version</span><span class="p">):</span>
+ <span class="c1"># type: (int) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Set version.</span>
+
+<span class="sd"> :param version: Version number.</span>
+<span class="sd"> :return: Returns 0 on failure.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_req_set_version</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">req</span><span class="p">,</span> <span class="n">version</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Request.get_subject"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.Request.get_subject">[docs]</a> <span class="k">def</span> <span class="nf">get_subject</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; X509_Name</span>
+ <span class="k">return</span> <span class="n">X509_Name</span><span class="p">(</span><span class="n">m2</span><span class="o">.</span><span class="n">x509_req_get_subject_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">req</span><span class="p">))</span>
+</div>
+<div class="viewcode-block" id="Request.set_subject_name"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.Request.set_subject_name">[docs]</a> <span class="k">def</span> <span class="nf">set_subject_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+ <span class="c1"># type: (X509_Name) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Set subject name.</span>
+
+<span class="sd"> :param name: subjectName field.</span>
+<span class="sd"> :return: 1 for success and 0 for failure</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_req_set_subject_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">req</span><span class="p">,</span> <span class="n">name</span><span class="o">.</span><span class="n">x509_name</span><span class="p">)</span>
+</div>
+ <span class="n">set_subject</span> <span class="o">=</span> <span class="n">set_subject_name</span>
+
+<div class="viewcode-block" id="Request.add_extensions"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.Request.add_extensions">[docs]</a> <span class="k">def</span> <span class="nf">add_extensions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ext_stack</span><span class="p">):</span>
+ <span class="c1"># type: (X509_Extension_Stack) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Add X509 extensions to this request.</span>
+
+<span class="sd"> :param ext_stack: Stack of extensions to add.</span>
+<span class="sd"> :return: 1 for success and 0 for failure</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_req_add_extensions</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">req</span><span class="p">,</span> <span class="n">ext_stack</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+</div>
+<div class="viewcode-block" id="Request.verify"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.Request.verify">[docs]</a> <span class="k">def</span> <span class="nf">verify</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pkey</span><span class="p">):</span>
+ <span class="c1"># type: (EVP.PKey) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+
+<span class="sd"> :param pkey: PKey to be verified</span>
+<span class="sd"> :return: 1 for success and 0 for failure</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_req_verify</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">req</span><span class="p">,</span> <span class="n">pkey</span><span class="o">.</span><span class="n">pkey</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="Request.sign"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.Request.sign">[docs]</a> <span class="k">def</span> <span class="nf">sign</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pkey</span><span class="p">,</span> <span class="n">md</span><span class="p">):</span>
+ <span class="c1"># type: (EVP.PKey, str) -&gt; int</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+
+<span class="sd"> :param pkey: PKey to be signed</span>
+<span class="sd"> :param md: used algorigthm</span>
+<span class="sd"> :return: 1 for success and 0 for failure</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">mda</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">m2</span><span class="p">,</span> <span class="n">md</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">mda</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown message digest&#39;</span><span class="p">,</span> <span class="n">md</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_req_sign</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">req</span><span class="p">,</span> <span class="n">pkey</span><span class="o">.</span><span class="n">pkey</span><span class="p">,</span> <span class="n">mda</span><span class="p">())</span>
+
+</div></div>
+<div class="viewcode-block" id="load_request"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.load_request">[docs]</a><span class="k">def</span> <span class="nf">load_request</span><span class="p">(</span><span class="nb">file</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="n">FORMAT_PEM</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, int) -&gt; Request</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Load certificate request from file.</span>
+
+<span class="sd"> :param file: Name of file containing certificate request in</span>
+<span class="sd"> either PEM or DER format.</span>
+<span class="sd"> :param format: Describes the format of the file to be loaded,</span>
+<span class="sd"> either PEM or DER. (using constants FORMAT_PEM</span>
+<span class="sd"> and FORMAT_DER)</span>
+<span class="sd"> :return: Request object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="nb">file</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">format</span> <span class="o">==</span> <span class="n">FORMAT_PEM</span><span class="p">:</span>
+ <span class="n">cptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_req_read_pem</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">())</span>
+ <span class="k">elif</span> <span class="n">format</span> <span class="o">==</span> <span class="n">FORMAT_DER</span><span class="p">:</span>
+ <span class="n">cptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">d2i_x509_req</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">())</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
+ <span class="s2">&quot;Unknown filetype. Must be either FORMAT_PEM or FORMAT_DER&quot;</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">cptr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">X509Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">Request</span><span class="p">(</span><span class="n">cptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_request_bio"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.load_request_bio">[docs]</a><span class="k">def</span> <span class="nf">load_request_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="n">FORMAT_PEM</span><span class="p">):</span>
+ <span class="c1"># type: (BIO.BIO, int) -&gt; Request</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Load certificate request from a bio.</span>
+
+<span class="sd"> :param bio: BIO pointing at a certificate request in</span>
+<span class="sd"> either DER or PEM format.</span>
+<span class="sd"> :param format: Describes the format of the request to be loaded,</span>
+<span class="sd"> either PEM or DER. (using constants FORMAT_PEM</span>
+<span class="sd"> and FORMAT_DER)</span>
+<span class="sd"> :return: M2Crypto.X509.Request object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">format</span> <span class="o">==</span> <span class="n">FORMAT_PEM</span><span class="p">:</span>
+ <span class="n">cptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_req_read_pem</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+ <span class="k">elif</span> <span class="n">format</span> <span class="o">==</span> <span class="n">FORMAT_DER</span><span class="p">:</span>
+ <span class="n">cptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">d2i_x509_req</span><span class="p">(</span><span class="n">bio</span><span class="o">.</span><span class="n">_ptr</span><span class="p">())</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
+ <span class="s2">&quot;Unknown format. Must be either FORMAT_DER or FORMAT_PEM&quot;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">cptr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">X509Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">Request</span><span class="p">(</span><span class="n">cptr</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_request_string"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.load_request_string">[docs]</a><span class="k">def</span> <span class="nf">load_request_string</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="n">FORMAT_PEM</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, int) -&gt; Request</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Load certificate request from a string.</span>
+
+<span class="sd"> :param string: String containing a certificate request in</span>
+<span class="sd"> either DER or PEM format.</span>
+<span class="sd"> :param format: Describes the format of the request to be loaded,</span>
+<span class="sd"> either PEM or DER. (using constants FORMAT_PEM</span>
+<span class="sd"> and FORMAT_DER)</span>
+
+<span class="sd"> :return: M2Crypto.X509.Request object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">string</span> <span class="o">=</span> <span class="n">util</span><span class="o">.</span><span class="n">py3bytes</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
+ <span class="n">bio</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">load_request_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">format</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="load_request_der_string"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.load_request_der_string">[docs]</a><span class="k">def</span> <span class="nf">load_request_der_string</span><span class="p">(</span><span class="n">string</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr) -&gt; Request</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Load certificate request from a string.</span>
+
+<span class="sd"> :param string: String containing a certificate request in DER format.</span>
+<span class="sd"> :return: M2Crypto.X509.Request object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">string</span> <span class="o">=</span> <span class="n">util</span><span class="o">.</span><span class="n">py3bytes</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
+ <span class="n">bio</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">(</span><span class="n">string</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">load_request_bio</span><span class="p">(</span><span class="n">bio</span><span class="p">,</span> <span class="n">FORMAT_DER</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="CRL"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.CRL">[docs]</a><span class="k">class</span> <span class="nc">CRL</span><span class="p">:</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> X509 Certificate Revocation List</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">m2_x509_crl_free</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_crl_free</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">crl</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">_pyfree</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[bytes], int) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+
+<span class="sd"> :param crl: binary representation of</span>
+<span class="sd"> the underlying OpenSSL X509_CRL object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">crl</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">crl</span> <span class="o">=</span> <span class="n">crl</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="n">_pyfree</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">crl</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_crl_new</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_pyfree</span> <span class="o">=</span> <span class="mi">1</span>
+
+ <span class="k">def</span> <span class="nf">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="k">if</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_pyfree&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">m2_x509_crl_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">crl</span><span class="p">)</span>
+
+<div class="viewcode-block" id="CRL.as_text"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.CRL.as_text">[docs]</a> <span class="k">def</span> <span class="nf">as_text</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; str</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Return CRL in PEM format in a string.</span>
+
+<span class="sd"> :return: String containing the CRL in PEM format.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">buf</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">x509_crl_print</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">(),</span> <span class="bp">self</span><span class="o">.</span><span class="n">crl</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3str</span><span class="p">(</span><span class="n">buf</span><span class="o">.</span><span class="n">read_all</span><span class="p">())</span>
+
+</div></div>
+<div class="viewcode-block" id="load_crl"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.X509.load_crl">[docs]</a><span class="k">def</span> <span class="nf">load_crl</span><span class="p">(</span><span class="nb">file</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr) -&gt; CRL</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Load CRL from file.</span>
+
+<span class="sd"> :param file: Name of file containing CRL in PEM format.</span>
+
+<span class="sd"> :return: M2Crypto.X509.CRL object.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">with</span> <span class="n">BIO</span><span class="o">.</span><span class="n">openfile</span><span class="p">(</span><span class="nb">file</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
+ <span class="n">cptr</span> <span class="o">=</span> <span class="n">m2</span><span class="o">.</span><span class="n">x509_crl_read_pem</span><span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="n">bio_ptr</span><span class="p">())</span>
+
+ <span class="k">if</span> <span class="n">cptr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">X509Error</span><span class="p">(</span><span class="n">Err</span><span class="o">.</span><span class="n">get_error</span><span class="p">())</span>
+ <span class="k">return</span> <span class="n">CRL</span><span class="p">(</span><span class="n">cptr</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/ftpslib.html b/doc/html/_modules/M2Crypto/ftpslib.html
new file mode 100644
index 0000000..d1877a1
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/ftpslib.html
@@ -0,0 +1,185 @@
+
+
+<!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>M2Crypto.ftpslib &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../index.html" />
+ <link rel="up" title="Module code" href="../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.ftpslib</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+
+<span class="sd">&quot;&quot;&quot;M2Crypto client-side FTP/TLS.</span>
+
+<span class="sd">This implementation complies with draft-murray-auth-ftp-ssl-07.txt.</span>
+
+<span class="sd">Example:</span>
+
+<span class="sd">&gt;&gt;&gt; from M2Crypto import ftpslib</span>
+<span class="sd">&gt;&gt;&gt; f = ftpslib.FTP_TLS()</span>
+<span class="sd">&gt;&gt;&gt; f.connect(&#39;&#39;, 9021)</span>
+<span class="sd">&#39;220 spinnaker.dyndns.org M2Crypto (Medusa) FTP/TLS server v0.07 ready.&#39;</span>
+<span class="sd">&gt;&gt;&gt; f.auth_tls()</span>
+<span class="sd">&gt;&gt;&gt; f.set_pasv(0)</span>
+<span class="sd">&gt;&gt;&gt; f.login(&#39;ftp&#39;, &#39;ngps@&#39;)</span>
+<span class="sd">&#39;230 Ok.&#39;</span>
+<span class="sd">&gt;&gt;&gt; f.retrlines(&#39;LIST&#39;)</span>
+<span class="sd">-rw-rw-r-- 1 0 198 2326 Jul 3 1996 apache_pb.gif</span>
+<span class="sd">drwxrwxr-x 7 0 198 1536 Oct 10 2000 manual</span>
+<span class="sd">drwxrwxr-x 2 0 198 512 Oct 31 2000 modpy</span>
+<span class="sd">drwxrwxr-x 2 0 198 512 Oct 31 2000 bobo</span>
+<span class="sd">drwxr-xr-x 2 0 198 14336 May 28 15:54 postgresql</span>
+<span class="sd">drwxr-xr-x 4 100 198 512 May 16 17:19 home</span>
+<span class="sd">drwxr-xr-x 7 100 100 3584 Sep 23 2000 openacs</span>
+<span class="sd">drwxr-xr-x 10 0 0 512 Aug 5 2000 python1.5</span>
+<span class="sd">-rw-r--r-- 1 100 198 326 Jul 29 03:29 index.html</span>
+<span class="sd">drwxr-xr-x 12 0 0 512 May 31 17:08 python2.1</span>
+<span class="sd">&#39;226 Transfer complete&#39;</span>
+<span class="sd">&gt;&gt;&gt; f.quit()</span>
+<span class="sd">&#39;221 Goodbye.&#39;</span>
+<span class="sd">&gt;&gt;&gt;</span>
+
+
+<span class="sd">Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.&quot;&quot;&quot;</span>
+
+<span class="c1"># We want to import whole stdlib ftplib objects, because our users want</span>
+<span class="c1"># to use them.</span>
+<span class="kn">from</span> <span class="nn">ftplib</span> <span class="kn">import</span> <span class="o">*</span> <span class="c1"># noqa</span>
+
+<span class="c1"># M2Crypto</span>
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">SSL</span>
+
+
+<div class="viewcode-block" id="FTP_TLS"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ftpslib.FTP_TLS">[docs]</a><span class="k">class</span> <span class="nc">FTP_TLS</span><span class="p">(</span><span class="n">FTP</span><span class="p">):</span> <span class="c1"># noqa</span>
+
+ <span class="sd">&quot;&quot;&quot;Python OO interface to client-side FTP/TLS.&quot;&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">ssl_ctx</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Initialise the client. If &#39;host&#39; is supplied, connect to it.&quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">ssl_ctx</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ssl_ctx</span> <span class="o">=</span> <span class="n">ssl_ctx</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ssl_ctx</span> <span class="o">=</span> <span class="n">SSL</span><span class="o">.</span><span class="n">Context</span><span class="p">()</span>
+ <span class="n">FTP</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">prot</span> <span class="o">=</span> <span class="mi">0</span>
+
+<div class="viewcode-block" id="FTP_TLS.auth_tls"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ftpslib.FTP_TLS.auth_tls">[docs]</a> <span class="k">def</span> <span class="nf">auth_tls</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Secure the control connection per AUTH TLS, aka AUTH TLS-C.&quot;&quot;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">voidcmd</span><span class="p">(</span><span class="s1">&#39;AUTH TLS&#39;</span><span class="p">)</span>
+ <span class="n">s</span> <span class="o">=</span> <span class="n">SSL</span><span class="o">.</span><span class="n">Connection</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl_ctx</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">)</span>
+ <span class="n">s</span><span class="o">.</span><span class="n">setup_ssl</span><span class="p">()</span>
+ <span class="n">s</span><span class="o">.</span><span class="n">set_connect_state</span><span class="p">()</span>
+ <span class="n">s</span><span class="o">.</span><span class="n">connect_ssl</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">sock</span> <span class="o">=</span> <span class="n">s</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">file</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">makefile</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="FTP_TLS.auth_ssl"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ftpslib.FTP_TLS.auth_ssl">[docs]</a> <span class="k">def</span> <span class="nf">auth_ssl</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Secure the control connection per AUTH SSL, aka AUTH TLS-P.&quot;&quot;&quot;</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span>
+</div>
+<div class="viewcode-block" id="FTP_TLS.prot_p"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ftpslib.FTP_TLS.prot_p">[docs]</a> <span class="k">def</span> <span class="nf">prot_p</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Set up secure data connection.&quot;&quot;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">voidcmd</span><span class="p">(</span><span class="s1">&#39;PBSZ 0&#39;</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">voidcmd</span><span class="p">(</span><span class="s1">&#39;PROT P&#39;</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">prot</span> <span class="o">=</span> <span class="mi">1</span>
+</div>
+<div class="viewcode-block" id="FTP_TLS.prot_c"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ftpslib.FTP_TLS.prot_c">[docs]</a> <span class="k">def</span> <span class="nf">prot_c</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Set up data connection in the clear.&quot;&quot;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">voidcmd</span><span class="p">(</span><span class="s1">&#39;PROT C&#39;</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">prot</span> <span class="o">=</span> <span class="mi">0</span>
+</div>
+<div class="viewcode-block" id="FTP_TLS.ntransfercmd"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.ftpslib.FTP_TLS.ntransfercmd">[docs]</a> <span class="k">def</span> <span class="nf">ntransfercmd</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cmd</span><span class="p">,</span> <span class="n">rest</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;Initiate a data transfer.&quot;&quot;&quot;</span>
+ <span class="n">conn</span><span class="p">,</span> <span class="n">size</span> <span class="o">=</span> <span class="n">FTP</span><span class="o">.</span><span class="n">ntransfercmd</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cmd</span><span class="p">,</span> <span class="n">rest</span><span class="p">)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">prot</span><span class="p">:</span>
+ <span class="n">conn</span> <span class="o">=</span> <span class="n">SSL</span><span class="o">.</span><span class="n">Connection</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl_ctx</span><span class="p">,</span> <span class="n">conn</span><span class="p">)</span>
+ <span class="n">conn</span><span class="o">.</span><span class="n">setup_ssl</span><span class="p">()</span>
+ <span class="n">conn</span><span class="o">.</span><span class="n">set_connect_state</span><span class="p">()</span>
+ <span class="n">conn</span><span class="o">.</span><span class="n">set_session</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">get_session</span><span class="p">())</span>
+ <span class="n">conn</span><span class="o">.</span><span class="n">connect_ssl</span><span class="p">()</span>
+ <span class="k">return</span> <span class="n">conn</span><span class="p">,</span> <span class="n">size</span></div></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/httpslib.html b/doc/html/_modules/M2Crypto/httpslib.html
new file mode 100644
index 0000000..e8ab639
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/httpslib.html
@@ -0,0 +1,355 @@
+
+
+<!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>M2Crypto.httpslib &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../index.html" />
+ <link rel="up" title="Module code" href="../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.httpslib</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+
+<span class="sd">&quot;&quot;&quot;M2Crypto support for Python&#39;s httplib.</span>
+
+<span class="sd">Copyright (c) 1999-2004 Ng Pheng Siong. All rights reserved.&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">base64</span>
+<span class="kn">import</span> <span class="nn">socket</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">SSL</span><span class="p">,</span> <span class="n">six</span><span class="p">,</span> <span class="n">util</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.six.moves.urllib_parse</span> <span class="kn">import</span> <span class="n">urlsplit</span><span class="p">,</span> <span class="n">urlunsplit</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.six.moves.http_client</span> <span class="kn">import</span> <span class="o">*</span> <span class="c1"># noqa</span>
+<span class="c1"># This is not imported with just &#39;*&#39;</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.six.moves.http_client</span> <span class="kn">import</span> <span class="n">HTTPS_PORT</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Any</span><span class="p">,</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Callable</span><span class="p">,</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Optional</span> <span class="c1"># noqa</span>
+
+
+<div class="viewcode-block" id="HTTPSConnection"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.httpslib.HTTPSConnection">[docs]</a><span class="k">class</span> <span class="nc">HTTPSConnection</span><span class="p">(</span><span class="n">HTTPConnection</span><span class="p">):</span>
+
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> This class allows communication via SSL using M2Crypto.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">default_port</span> <span class="o">=</span> <span class="n">HTTPS_PORT</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">strict</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="o">**</span><span class="n">ssl</span><span class="p">):</span>
+ <span class="c1"># type: (str, Optional[int], Optional[bool], **Dict[Any, Any]) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Represents one transaction with an HTTP server over the SSL</span>
+<span class="sd"> connection.</span>
+
+<span class="sd"> :param host: host name</span>
+<span class="sd"> :param port: port number</span>
+<span class="sd"> :param strict: if switched on, it raises BadStatusLine to be</span>
+<span class="sd"> raised if the status line can&#39;t be parsed as</span>
+<span class="sd"> a valid HTTP/1.0 or 1.1 status line.</span>
+<span class="sd"> :param ssl: dict with all remaining named real parameters of the</span>
+<span class="sd"> function. Specifically, ``ssl_context`` is expected</span>
+<span class="sd"> to be included with SSL.Context; if it is not</span>
+<span class="sd"> default ``&#39;sslv23&#39;`` is substituted).</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="o">=</span> <span class="bp">None</span> <span class="c1"># type: bytes</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">host</span> <span class="o">=</span> <span class="n">host</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">port</span> <span class="o">=</span> <span class="n">port</span>
+ <span class="n">keys</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">ssl</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span> <span class="o">-</span> <span class="nb">set</span><span class="p">((</span><span class="s1">&#39;key_file&#39;</span><span class="p">,</span> <span class="s1">&#39;cert_file&#39;</span><span class="p">,</span> <span class="s1">&#39;ssl_context&#39;</span><span class="p">))</span>
+ <span class="k">if</span> <span class="n">keys</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown keyword argument: </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">keys</span><span class="p">)</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ssl_ctx</span> <span class="o">=</span> <span class="n">ssl</span><span class="p">[</span><span class="s1">&#39;ssl_context&#39;</span><span class="p">]</span>
+ <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl_ctx</span><span class="p">,</span> <span class="n">SSL</span><span class="o">.</span><span class="n">Context</span><span class="p">),</span> <span class="bp">self</span><span class="o">.</span><span class="n">ssl_ctx</span>
+ <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ssl_ctx</span> <span class="o">=</span> <span class="n">SSL</span><span class="o">.</span><span class="n">Context</span><span class="p">()</span>
+ <span class="n">HTTPConnection</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">strict</span><span class="p">)</span>
+
+<div class="viewcode-block" id="HTTPSConnection.connect"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.httpslib.HTTPSConnection.connect">[docs]</a> <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="n">error</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="c1"># We ignore the returned sockaddr because SSL.Connection.connect needs</span>
+ <span class="c1"># a host name.</span>
+ <span class="k">for</span> <span class="p">(</span><span class="n">family</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span><span class="p">)</span> <span class="ow">in</span> \
+ <span class="n">socket</span><span class="o">.</span><span class="n">getaddrinfo</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">host</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">port</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span>
+ <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">):</span>
+ <span class="n">sock</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">sock</span> <span class="o">=</span> <span class="n">SSL</span><span class="o">.</span><span class="n">Connection</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl_ctx</span><span class="p">,</span> <span class="n">family</span><span class="o">=</span><span class="n">family</span><span class="p">)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">sock</span><span class="o">.</span><span class="n">set_session</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">session</span><span class="p">)</span>
+ <span class="n">sock</span><span class="o">.</span><span class="n">connect</span><span class="p">((</span><span class="bp">self</span><span class="o">.</span><span class="n">host</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">port</span><span class="p">))</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">sock</span> <span class="o">=</span> <span class="n">sock</span>
+ <span class="n">sock</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="k">return</span>
+ <span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="c1"># Other exception are probably SSL-related, in that case we</span>
+ <span class="c1"># abort and the exception is forwarded to the caller.</span>
+ <span class="n">error</span> <span class="o">=</span> <span class="n">e</span>
+ <span class="k">finally</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">sock</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">sock</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+
+ <span class="k">if</span> <span class="n">error</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">AssertionError</span><span class="p">(</span><span class="s2">&quot;Empty list returned by getaddrinfo&quot;</span><span class="p">)</span>
+ <span class="k">raise</span> <span class="n">error</span>
+</div>
+<div class="viewcode-block" id="HTTPSConnection.close"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.httpslib.HTTPSConnection.close">[docs]</a> <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="c1"># This kludges around line 545 of httplib.py,</span>
+ <span class="c1"># which closes the connection in this object;</span>
+ <span class="c1"># the connection remains open in the response</span>
+ <span class="c1"># object.</span>
+ <span class="c1">#</span>
+ <span class="c1"># M2Crypto doesn&#39;t close-here-keep-open-there,</span>
+ <span class="c1"># so, in effect, we don&#39;t close until the whole</span>
+ <span class="c1"># business is over and gc kicks in.</span>
+ <span class="c1">#</span>
+ <span class="c1"># XXX Long-running callers beware leakage.</span>
+ <span class="c1">#</span>
+ <span class="c1"># XXX 05-Jan-2002: This module works with Python 2.2,</span>
+ <span class="c1"># XXX but I&#39;ve not investigated if the above conditions</span>
+ <span class="c1"># XXX remain.</span>
+ <span class="k">pass</span>
+</div>
+<div class="viewcode-block" id="HTTPSConnection.get_session"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.httpslib.HTTPSConnection.get_session">[docs]</a> <span class="k">def</span> <span class="nf">get_session</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; SSL.Session.Session</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">get_session</span><span class="p">()</span>
+</div>
+<div class="viewcode-block" id="HTTPSConnection.set_session"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.httpslib.HTTPSConnection.set_session">[docs]</a> <span class="k">def</span> <span class="nf">set_session</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">session</span><span class="p">):</span>
+ <span class="c1"># type: (SSL.Session.Session) -&gt; None</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">session</span> <span class="o">=</span> <span class="n">session</span>
+
+</div></div>
+<div class="viewcode-block" id="ProxyHTTPSConnection"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.httpslib.ProxyHTTPSConnection">[docs]</a><span class="k">class</span> <span class="nc">ProxyHTTPSConnection</span><span class="p">(</span><span class="n">HTTPSConnection</span><span class="p">):</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> An HTTPS Connection that uses a proxy and the CONNECT request.</span>
+
+<span class="sd"> When the connection is initiated, CONNECT is first sent to the proxy (along</span>
+<span class="sd"> with authorization headers, if supplied). If successful, an SSL connection</span>
+<span class="sd"> will be established over the socket through the proxy and to the target</span>
+<span class="sd"> host.</span>
+
+<span class="sd"> Finally, the actual request is sent over the SSL connection tunneling</span>
+<span class="sd"> through the proxy.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="n">_ports</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;http&#39;</span><span class="p">:</span> <span class="mi">80</span><span class="p">,</span> <span class="s1">&#39;https&#39;</span><span class="p">:</span> <span class="mi">443</span><span class="p">}</span>
+ <span class="n">_AUTH_HEADER</span> <span class="o">=</span> <span class="s2">&quot;Proxy-Authorization&quot;</span>
+ <span class="n">_UA_HEADER</span> <span class="o">=</span> <span class="s2">&quot;User-Agent&quot;</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">strict</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">username</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
+ <span class="n">password</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="o">**</span><span class="n">ssl</span><span class="p">):</span>
+ <span class="c1"># type: (str, Optional[int], Optional[bool], Optional[AnyStr], Optional[AnyStr], **Dict[Any, Any]) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Create the ProxyHTTPSConnection object.</span>
+
+<span class="sd"> :param host: host name of the proxy server</span>
+<span class="sd"> :param port: port number of the proxy server</span>
+<span class="sd"> :param strict: if switched on, it raises BadStatusLine to be</span>
+<span class="sd"> raised if the status line can&#39;t be parsed as</span>
+<span class="sd"> a valid HTTP/1.0 or 1.1 status line.</span>
+<span class="sd"> :param username: username on the proxy server, when required</span>
+<span class="sd"> Username can be ``str``, but preferred type</span>
+<span class="sd"> is ``bytes``. M2Crypto does some conversion to</span>
+<span class="sd"> ``bytes`` when necessary, but it&#39;s better when</span>
+<span class="sd"> the user of the library does it on its own.</span>
+<span class="sd"> :param password: password on the proxy server, when required</span>
+<span class="sd"> The same as with ``username``, ``str`` is accepted,</span>
+<span class="sd"> but ``bytes`` are preferred.</span>
+<span class="sd"> :param ssl: dict with all remaining named real parameters of the</span>
+<span class="sd"> function. Specifically, ``ssl_context`` is expected</span>
+<span class="sd"> to be included with SSL.Context; if it is not</span>
+<span class="sd"> default ``&#39;sslv23&#39;`` is substituted).</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">HTTPSConnection</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">,</span> <span class="n">strict</span><span class="p">,</span> <span class="o">**</span><span class="n">ssl</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">_username</span> <span class="o">=</span> <span class="n">username</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;utf8&#39;</span><span class="p">)</span> \
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">username</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">string_types</span><span class="p">)</span> <span class="k">else</span> <span class="n">username</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_password</span> <span class="o">=</span> <span class="n">password</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;utf8&#39;</span><span class="p">)</span> \
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">password</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">string_types</span><span class="p">)</span> <span class="k">else</span> <span class="n">password</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_proxy_auth</span> <span class="o">=</span> <span class="bp">None</span> <span class="c1"># type: str</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_proxy_UA</span> <span class="o">=</span> <span class="bp">None</span> <span class="c1"># type: str</span>
+
+<div class="viewcode-block" id="ProxyHTTPSConnection.putrequest"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.httpslib.ProxyHTTPSConnection.putrequest">[docs]</a> <span class="k">def</span> <span class="nf">putrequest</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">skip_host</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">skip_accept_encoding</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, AnyStr, int, int) -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> putrequest is called before connect, so can interpret url and get</span>
+<span class="sd"> real host/port to be used to make CONNECT request to proxy</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">proto</span><span class="p">,</span> <span class="n">netloc</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">query</span><span class="p">,</span> <span class="n">fragment</span> <span class="o">=</span> <span class="n">urlsplit</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">proto</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;unknown URL type: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">url</span><span class="p">)</span>
+
+ <span class="c1"># get host &amp; port</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">username_password</span><span class="p">,</span> <span class="n">host_port</span> <span class="o">=</span> <span class="n">netloc</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;@&#39;</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
+ <span class="n">host_port</span> <span class="o">=</span> <span class="n">netloc</span>
+
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">host</span><span class="p">,</span> <span class="n">port_s</span> <span class="o">=</span> <span class="n">host_port</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;:&#39;</span><span class="p">)</span>
+ <span class="n">port</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">port_s</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="n">host_port</span>
+ <span class="c1"># try to get port from proto</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">port</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_ports</span><span class="p">[</span><span class="n">proto</span><span class="p">]</span>
+ <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;unknown protocol for: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">url</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">_real_host</span> <span class="o">=</span> <span class="n">host</span> <span class="c1"># type: str</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_real_port</span> <span class="o">=</span> <span class="n">port</span> <span class="c1"># type: int</span>
+ <span class="n">rest</span> <span class="o">=</span> <span class="n">urlunsplit</span><span class="p">((</span><span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">query</span><span class="p">,</span> <span class="n">fragment</span><span class="p">))</span>
+ <span class="n">HTTPSConnection</span><span class="o">.</span><span class="n">putrequest</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">method</span><span class="p">,</span> <span class="n">rest</span><span class="p">,</span> <span class="n">skip_host</span><span class="p">,</span>
+ <span class="n">skip_accept_encoding</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="ProxyHTTPSConnection.putheader"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.httpslib.ProxyHTTPSConnection.putheader">[docs]</a> <span class="k">def</span> <span class="nf">putheader</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">header</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, AnyStr) -&gt; None</span>
+ <span class="c1"># Store the auth header if passed in.</span>
+ <span class="k">if</span> <span class="n">header</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">_UA_HEADER</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_proxy_UA</span> <span class="o">=</span> <span class="n">value</span>
+ <span class="k">if</span> <span class="n">header</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">_AUTH_HEADER</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_proxy_auth</span> <span class="o">=</span> <span class="n">value</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">HTTPSConnection</span><span class="o">.</span><span class="n">putheader</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">header</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="ProxyHTTPSConnection.endheaders"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.httpslib.ProxyHTTPSConnection.endheaders">[docs]</a> <span class="k">def</span> <span class="nf">endheaders</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
+ <span class="c1"># type: (*List[Any], **Dict[Any, Any]) -&gt; None</span>
+ <span class="c1"># We&#39;ve recieved all of hte headers. Use the supplied username</span>
+ <span class="c1"># and password for authorization, possibly overriding the authstring</span>
+ <span class="c1"># supplied in the headers.</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_proxy_auth</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">_proxy_auth</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_encode_auth</span><span class="p">()</span>
+
+ <span class="n">HTTPSConnection</span><span class="o">.</span><span class="n">endheaders</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="ProxyHTTPSConnection.connect"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.httpslib.ProxyHTTPSConnection.connect">[docs]</a> <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="n">HTTPConnection</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+
+ <span class="c1"># send proxy CONNECT request</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">sendall</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_connect_msg</span><span class="p">())</span>
+ <span class="n">response</span> <span class="o">=</span> <span class="n">HTTPResponse</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">)</span>
+ <span class="n">response</span><span class="o">.</span><span class="n">begin</span><span class="p">()</span>
+
+ <span class="n">code</span> <span class="o">=</span> <span class="n">response</span><span class="o">.</span><span class="n">status</span>
+ <span class="k">if</span> <span class="n">code</span> <span class="o">!=</span> <span class="mi">200</span><span class="p">:</span>
+ <span class="c1"># proxy returned and error, abort connection, and raise exception</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+ <span class="k">raise</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&quot;Proxy connection failed: </span><span class="si">%d</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">code</span><span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">_start_ssl</span><span class="p">()</span>
+</div>
+ <span class="k">def</span> <span class="nf">_get_connect_msg</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; bytes</span>
+ <span class="sd">&quot;&quot;&quot; Return an HTTP CONNECT request to send to the proxy. &quot;&quot;&quot;</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="s2">&quot;CONNECT </span><span class="si">%s</span><span class="s2">:</span><span class="si">%d</span><span class="s2"> HTTP/1.1</span><span class="se">\r\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_real_host</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_real_port</span><span class="p">)</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="n">msg</span> <span class="o">+</span> <span class="s2">&quot;Host: </span><span class="si">%s</span><span class="s2">:</span><span class="si">%d</span><span class="se">\r\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_real_host</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_real_port</span><span class="p">)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_proxy_UA</span><span class="p">:</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="n">msg</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="se">\r\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_UA_HEADER</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_proxy_UA</span><span class="p">)</span>
+ <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_proxy_auth</span><span class="p">:</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="n">msg</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">: </span><span class="si">%s</span><span class="se">\r\n</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_AUTH_HEADER</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_proxy_auth</span><span class="p">)</span>
+ <span class="n">msg</span> <span class="o">=</span> <span class="n">msg</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\r\n</span><span class="s2">&quot;</span>
+ <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3bytes</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">_start_ssl</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot; Make this connection&#39;s socket SSL-aware. &quot;&quot;&quot;</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">sock</span> <span class="o">=</span> <span class="n">SSL</span><span class="o">.</span><span class="n">Connection</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl_ctx</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">setup_ssl</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">set_connect_state</span><span class="p">()</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">connect_ssl</span><span class="p">()</span>
+
+ <span class="k">def</span> <span class="nf">_encode_auth</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="c1"># type: () -&gt; Optional[bytes]</span>
+ <span class="sd">&quot;&quot;&quot; Encode the username and password for use in the auth header. &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_username</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_password</span><span class="p">):</span>
+ <span class="k">return</span> <span class="bp">None</span>
+ <span class="c1"># Authenticated proxy</span>
+ <span class="n">userpass</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">:</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_username</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_password</span><span class="p">)</span>
+ <span class="n">enc_userpass</span> <span class="o">=</span> <span class="n">base64</span><span class="o">.</span><span class="n">encodestring</span><span class="p">(</span><span class="n">userpass</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">util</span><span class="o">.</span><span class="n">py3bytes</span><span class="p">(</span><span class="s2">&quot;Basic </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">enc_userpass</span><span class="p">)</span></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/m2crypto.html b/doc/html/_modules/M2Crypto/m2crypto.html
new file mode 100644
index 0000000..00852dc
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/m2crypto.html
@@ -0,0 +1,172 @@
+
+
+<!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>M2Crypto.m2crypto &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../index.html" />
+ <link rel="up" title="Module code" href="../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.m2crypto</h1><div class="highlight"><pre>
+<span></span><span class="c1"># This file was automatically generated by SWIG (http://www.swig.org).</span>
+<span class="c1"># Version 2.0.10</span>
+<span class="c1">#</span>
+<span class="c1"># Do not make changes to this file unless you know what you are doing--modify</span>
+<span class="c1"># the SWIG interface file instead.</span>
+
+
+
+<span class="kn">from</span> <span class="nn">sys</span> <span class="kn">import</span> <span class="n">version_info</span>
+<span class="k">if</span> <span class="n">version_info</span> <span class="o">&gt;=</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">6</span><span class="p">,</span><span class="mi">0</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">swig_import_helper</span><span class="p">():</span>
+ <span class="kn">from</span> <span class="nn">os.path</span> <span class="kn">import</span> <span class="n">dirname</span>
+ <span class="kn">import</span> <span class="nn">imp</span>
+ <span class="n">fp</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">fp</span><span class="p">,</span> <span class="n">pathname</span><span class="p">,</span> <span class="n">description</span> <span class="o">=</span> <span class="n">imp</span><span class="o">.</span><span class="n">find_module</span><span class="p">(</span><span class="s1">&#39;_m2crypto&#39;</span><span class="p">,</span> <span class="p">[</span><span class="n">dirname</span><span class="p">(</span><span class="n">__file__</span><span class="p">)])</span>
+ <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">_m2crypto</span>
+ <span class="k">return</span> <span class="n">_m2crypto</span>
+ <span class="k">if</span> <span class="n">fp</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">_mod</span> <span class="o">=</span> <span class="n">imp</span><span class="o">.</span><span class="n">load_module</span><span class="p">(</span><span class="s1">&#39;_m2crypto&#39;</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">pathname</span><span class="p">,</span> <span class="n">description</span><span class="p">)</span>
+ <span class="k">finally</span><span class="p">:</span>
+ <span class="n">fp</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+ <span class="k">return</span> <span class="n">_mod</span>
+ <span class="n">_m2crypto</span> <span class="o">=</span> <span class="n">swig_import_helper</span><span class="p">()</span>
+ <span class="k">del</span> <span class="n">swig_import_helper</span>
+<span class="k">else</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">_m2crypto</span>
+<span class="k">del</span> <span class="n">version_info</span>
+<span class="kn">from</span> <span class="nn">_m2crypto</span> <span class="kn">import</span> <span class="o">*</span>
+<span class="k">try</span><span class="p">:</span>
+ <span class="n">_swig_property</span> <span class="o">=</span> <span class="nb">property</span>
+<span class="k">except</span> <span class="ne">NameError</span><span class="p">:</span>
+ <span class="k">pass</span> <span class="c1"># Python &lt; 2.2 doesn&#39;t have &#39;property&#39;.</span>
+<span class="k">def</span> <span class="nf">_swig_setattr_nondynamic</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">class_type</span><span class="p">,</span><span class="n">name</span><span class="p">,</span><span class="n">value</span><span class="p">,</span><span class="n">static</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
+ <span class="k">if</span> <span class="p">(</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;thisown&quot;</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">own</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="p">(</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;this&quot;</span><span class="p">):</span>
+ <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">value</span><span class="p">)</span><span class="o">.</span><span class="n">__name__</span> <span class="o">==</span> <span class="s1">&#39;SwigPyObject&#39;</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__dict__</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+ <span class="k">return</span>
+ <span class="n">method</span> <span class="o">=</span> <span class="n">class_type</span><span class="o">.</span><span class="n">__swig_setmethods__</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">,</span><span class="bp">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">method</span><span class="p">:</span> <span class="k">return</span> <span class="n">method</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="p">(</span><span class="ow">not</span> <span class="n">static</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">__dict__</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s2">&quot;You cannot add attributes to </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="p">)</span>
+
+<span class="k">def</span> <span class="nf">_swig_setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">class_type</span><span class="p">,</span><span class="n">name</span><span class="p">,</span><span class="n">value</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">_swig_setattr_nondynamic</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">class_type</span><span class="p">,</span><span class="n">name</span><span class="p">,</span><span class="n">value</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
+
+<span class="k">def</span> <span class="nf">_swig_getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">class_type</span><span class="p">,</span><span class="n">name</span><span class="p">):</span>
+ <span class="k">if</span> <span class="p">(</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;thisown&quot;</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">own</span><span class="p">()</span>
+ <span class="n">method</span> <span class="o">=</span> <span class="n">class_type</span><span class="o">.</span><span class="n">__swig_getmethods__</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">,</span><span class="bp">None</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">method</span><span class="p">:</span> <span class="k">return</span> <span class="n">method</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+ <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
+
+<span class="k">def</span> <span class="nf">_swig_repr</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="k">try</span><span class="p">:</span> <span class="n">strthis</span> <span class="o">=</span> <span class="s2">&quot;proxy of &quot;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">__repr__</span><span class="p">()</span>
+ <span class="k">except</span><span class="p">:</span> <span class="n">strthis</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span>
+ <span class="k">return</span> <span class="s2">&quot;&lt;</span><span class="si">%s</span><span class="s2">.</span><span class="si">%s</span><span class="s2">; </span><span class="si">%s</span><span class="s2"> &gt;&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__module__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span> <span class="n">strthis</span><span class="p">,)</span>
+
+<span class="k">try</span><span class="p">:</span>
+ <span class="n">_object</span> <span class="o">=</span> <span class="nb">object</span>
+ <span class="n">_newclass</span> <span class="o">=</span> <span class="mi">1</span>
+<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
+ <span class="k">class</span> <span class="nc">_object</span> <span class="p">:</span> <span class="k">pass</span>
+ <span class="n">_newclass</span> <span class="o">=</span> <span class="mi">0</span>
+
+
+<span class="k">def</span> <span class="nf">_swig_setattr_nondynamic_method</span><span class="p">(</span><span class="nb">set</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">set_attr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">name</span><span class="p">,</span><span class="n">value</span><span class="p">):</span>
+ <span class="k">if</span> <span class="p">(</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;thisown&quot;</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">this</span><span class="o">.</span><span class="n">own</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">name</span><span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="n">name</span> <span class="o">==</span> <span class="s2">&quot;this&quot;</span><span class="p">):</span>
+ <span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">name</span><span class="p">,</span><span class="n">value</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s2">&quot;You cannot add attributes to </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="bp">self</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">set_attr</span>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/m2urllib.html b/doc/html/_modules/M2Crypto/m2urllib.html
new file mode 100644
index 0000000..44d3ac7
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/m2urllib.html
@@ -0,0 +1,207 @@
+
+
+<!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>M2Crypto.m2urllib &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../index.html" />
+ <link rel="up" title="Module code" href="../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.m2urllib</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span><span class="p">,</span> <span class="n">print_function</span>
+
+<span class="sd">&quot;&quot;&quot;M2Crypto enhancement to Python&#39;s urllib for handling</span>
+<span class="sd">&#39;https&#39; url&#39;s.</span>
+
+<span class="sd">FIXME: it is questionable whether we need this old-style module at all. urllib</span>
+<span class="sd">(not urllib2) is in Python 3 support just as a legacy API.</span>
+
+<span class="sd">Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.&quot;&quot;&quot;</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">SSL</span><span class="p">,</span> <span class="n">httpslib</span><span class="p">,</span> <span class="n">six</span><span class="p">,</span> <span class="n">util</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto.six.moves.urllib_response</span> <span class="kn">import</span> <span class="n">addinfourl</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Optional</span> <span class="c1"># noqa</span>
+
+<span class="c1"># six.moves doesn&#39;t support star imports</span>
+<span class="k">if</span> <span class="n">six</span><span class="o">.</span><span class="n">PY3</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">urllib.request</span> <span class="kn">import</span> <span class="o">*</span> <span class="c1"># noqa for other modules to import</span>
+ <span class="kn">from</span> <span class="nn">urllib.parse</span> <span class="kn">import</span> <span class="o">*</span> <span class="c1"># noqa for other modules to import</span>
+ <span class="kn">from</span> <span class="nn">urllib.error</span> <span class="kn">import</span> <span class="o">*</span> <span class="c1"># noqa for other modules to import</span>
+<span class="k">else</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">urllib</span> <span class="kn">import</span> <span class="o">*</span> <span class="c1"># noqa</span>
+
+
+<div class="viewcode-block" id="open_https"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.m2urllib.open_https">[docs]</a><span class="k">def</span> <span class="nf">open_https</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">url</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">ssl_context</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, Optional[bytes], Optional[SSL.Context]) -&gt; addinfourl</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Open URL over the SSL connection.</span>
+
+<span class="sd"> :param url: URL to be opened</span>
+<span class="sd"> :param data: data for the POST request</span>
+<span class="sd"> :param ssl_context: SSL.Context to be used</span>
+<span class="sd"> :return:</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="k">if</span> <span class="n">ssl_context</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">ssl_context</span><span class="p">,</span> <span class="n">SSL</span><span class="o">.</span><span class="n">Context</span><span class="p">):</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ctx</span> <span class="o">=</span> <span class="n">ssl_context</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ctx</span> <span class="o">=</span> <span class="n">SSL</span><span class="o">.</span><span class="n">Context</span><span class="p">()</span>
+ <span class="n">user_passwd</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">six</span><span class="o">.</span><span class="n">string_types</span><span class="p">):</span>
+ <span class="k">try</span><span class="p">:</span> <span class="c1"># python 2</span>
+ <span class="c1"># http://pydoc.org/2.5.1/urllib.html</span>
+ <span class="n">host</span><span class="p">,</span> <span class="n">selector</span> <span class="o">=</span> <span class="n">splithost</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">host</span><span class="p">:</span>
+ <span class="n">user_passwd</span><span class="p">,</span> <span class="n">host</span> <span class="o">=</span> <span class="n">splituser</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="n">unquote</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
+ <span class="n">realhost</span> <span class="o">=</span> <span class="n">host</span>
+ <span class="k">except</span> <span class="ne">NameError</span><span class="p">:</span> <span class="c1"># python 3 has no splithost</span>
+ <span class="c1"># https://docs.python.org/3/library/urllib.parse.html</span>
+ <span class="n">parsed</span> <span class="o">=</span> <span class="n">urlparse</span><span class="p">(</span><span class="n">url</span><span class="p">)</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="n">parsed</span><span class="o">.</span><span class="n">hostname</span>
+ <span class="k">if</span> <span class="n">parsed</span><span class="o">.</span><span class="n">port</span><span class="p">:</span>
+ <span class="n">host</span> <span class="o">+=</span> <span class="s2">&quot;:{0}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">parsed</span><span class="o">.</span><span class="n">port</span><span class="p">)</span>
+ <span class="n">user_passwd</span> <span class="o">=</span> <span class="n">parsed</span><span class="o">.</span><span class="n">username</span>
+ <span class="k">if</span> <span class="n">parsed</span><span class="o">.</span><span class="n">password</span><span class="p">:</span>
+ <span class="n">user_passwd</span> <span class="o">+=</span> <span class="s2">&quot;:{0}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">parsed</span><span class="o">.</span><span class="n">password</span><span class="p">)</span>
+ <span class="n">selector</span> <span class="o">=</span> <span class="n">parsed</span><span class="o">.</span><span class="n">path</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">host</span><span class="p">,</span> <span class="n">selector</span> <span class="o">=</span> <span class="n">url</span>
+ <span class="n">urltype</span><span class="p">,</span> <span class="n">rest</span> <span class="o">=</span> <span class="n">splittype</span><span class="p">(</span><span class="n">selector</span><span class="p">)</span>
+ <span class="n">url</span> <span class="o">=</span> <span class="n">rest</span>
+ <span class="n">user_passwd</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="k">if</span> <span class="n">urltype</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">!=</span> <span class="s1">&#39;http&#39;</span><span class="p">:</span>
+ <span class="n">realhost</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span> <span class="c1"># python 2</span>
+ <span class="n">realhost</span><span class="p">,</span> <span class="n">rest</span> <span class="o">=</span> <span class="n">splithost</span><span class="p">(</span><span class="n">rest</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">realhost</span><span class="p">:</span>
+ <span class="n">user_passwd</span><span class="p">,</span> <span class="n">realhost</span> <span class="o">=</span> <span class="n">splituser</span><span class="p">(</span><span class="n">realhost</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">user_passwd</span><span class="p">:</span>
+ <span class="n">selector</span> <span class="o">=</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">://</span><span class="si">%s%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">urltype</span><span class="p">,</span> <span class="n">realhost</span><span class="p">,</span> <span class="n">rest</span><span class="p">)</span>
+ <span class="k">except</span> <span class="ne">NameError</span><span class="p">:</span> <span class="c1"># python 3 has no splithost</span>
+ <span class="n">parsed</span> <span class="o">=</span> <span class="n">urlparse</span><span class="p">(</span><span class="n">rest</span><span class="p">)</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="n">parsed</span><span class="o">.</span><span class="n">hostname</span>
+ <span class="k">if</span> <span class="n">parsed</span><span class="o">.</span><span class="n">port</span><span class="p">:</span>
+ <span class="n">host</span> <span class="o">+=</span> <span class="s2">&quot;:{0}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">parsed</span><span class="o">.</span><span class="n">port</span><span class="p">)</span>
+ <span class="n">user_passwd</span> <span class="o">=</span> <span class="n">parsed</span><span class="o">.</span><span class="n">username</span>
+ <span class="k">if</span> <span class="n">parsed</span><span class="o">.</span><span class="n">password</span><span class="p">:</span>
+ <span class="n">user_passwd</span> <span class="o">+=</span> <span class="s2">&quot;:{0}&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">parsed</span><span class="o">.</span><span class="n">password</span><span class="p">)</span>
+ <span class="c1"># print(&quot;proxy via http:&quot;, host, selector)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">host</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">IOError</span><span class="p">(</span><span class="s1">&#39;http error&#39;</span><span class="p">,</span> <span class="s1">&#39;no host given&#39;</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">user_passwd</span><span class="p">:</span>
+ <span class="kn">import</span> <span class="nn">base64</span>
+ <span class="n">auth</span> <span class="o">=</span> <span class="n">base64</span><span class="o">.</span><span class="n">encodestring</span><span class="p">(</span><span class="n">user_passwd</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">auth</span> <span class="o">=</span> <span class="bp">None</span>
+ <span class="c1"># Start here!</span>
+ <span class="n">h</span> <span class="o">=</span> <span class="n">httpslib</span><span class="o">.</span><span class="n">HTTPSConnection</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="n">host</span><span class="p">,</span> <span class="n">ssl_context</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">)</span>
+ <span class="c1"># h.set_debuglevel(1)</span>
+ <span class="c1"># Stop here!</span>
+ <span class="k">if</span> <span class="n">data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">h</span><span class="o">.</span><span class="n">putrequest</span><span class="p">(</span><span class="s1">&#39;POST&#39;</span><span class="p">,</span> <span class="n">selector</span><span class="p">)</span>
+ <span class="n">h</span><span class="o">.</span><span class="n">putheader</span><span class="p">(</span><span class="s1">&#39;Content-type&#39;</span><span class="p">,</span> <span class="s1">&#39;application/x-www-form-urlencoded&#39;</span><span class="p">)</span>
+ <span class="n">h</span><span class="o">.</span><span class="n">putheader</span><span class="p">(</span><span class="s1">&#39;Content-length&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="si">%d</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">))</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">h</span><span class="o">.</span><span class="n">putrequest</span><span class="p">(</span><span class="s1">&#39;GET&#39;</span><span class="p">,</span> <span class="n">selector</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">auth</span><span class="p">:</span>
+ <span class="n">h</span><span class="o">.</span><span class="n">putheader</span><span class="p">(</span><span class="s1">&#39;Authorization&#39;</span><span class="p">,</span> <span class="s1">&#39;Basic </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">auth</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">args</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">addheaders</span><span class="p">:</span>
+ <span class="n">h</span><span class="o">.</span><span class="n">putheader</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span> <span class="c1"># for python3 - used to use apply</span>
+ <span class="n">h</span><span class="o">.</span><span class="n">endheaders</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">h</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">data</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\r\n</span><span class="s1">&#39;</span><span class="p">)</span>
+ <span class="c1"># Here again!</span>
+ <span class="n">resp</span> <span class="o">=</span> <span class="n">h</span><span class="o">.</span><span class="n">getresponse</span><span class="p">()</span>
+ <span class="n">fp</span> <span class="o">=</span> <span class="n">resp</span><span class="o">.</span><span class="n">fp</span>
+ <span class="k">return</span> <span class="n">addinfourl</span><span class="p">(</span><span class="n">fp</span><span class="p">,</span> <span class="n">resp</span><span class="o">.</span><span class="n">msg</span><span class="p">,</span> <span class="s2">&quot;https:&quot;</span> <span class="o">+</span> <span class="n">url</span><span class="p">)</span>
+ <span class="c1"># Stop again.</span>
+
+<span class="c1"># Minor brain surgery.</span></div>
+<span class="n">URLopener</span><span class="o">.</span><span class="n">open_https</span> <span class="o">=</span> <span class="n">open_https</span>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/m2urllib2.html b/doc/html/_modules/M2Crypto/m2urllib2.html
new file mode 100644
index 0000000..2b18152
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/m2urllib2.html
@@ -0,0 +1,274 @@
+
+
+<!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>M2Crypto.m2urllib2 &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../index.html" />
+ <link rel="up" title="Module code" href="../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.m2urllib2</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">M2Crypto enhancement to Python&#39;s urllib2 for handling</span>
+<span class="sd">&#39;https&#39; url&#39;s.</span>
+
+<span class="sd">Code from urllib2 is Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007</span>
+<span class="sd">Python Software Foundation; All Rights Reserved</span>
+
+<span class="sd">Summary of changes:</span>
+<span class="sd"> - Use an HTTPSProxyConnection if the request is going through a proxy.</span>
+<span class="sd"> - Add the SSL context to the https connection when performing https_open.</span>
+<span class="sd"> - Add the M2Crypto HTTPSHandler when building a default opener.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">socket</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">SSL</span><span class="p">,</span> <span class="n">httpslib</span><span class="p">,</span> <span class="n">six</span><span class="p">,</span> <span class="n">util</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto.six.moves.urllib_parse</span> <span class="kn">import</span> <span class="n">urldefrag</span><span class="p">,</span> <span class="n">urlparse</span> <span class="k">as</span> <span class="n">url_parse</span>
+<span class="kn">from</span> <span class="nn">M2Crypto.six.moves.urllib_response</span> <span class="kn">import</span> <span class="n">addinfourl</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">List</span><span class="p">,</span> <span class="n">Optional</span> <span class="c1"># noqa</span>
+
+<span class="c1"># six.moves doesn&#39;t support star imports</span>
+<span class="k">if</span> <span class="n">six</span><span class="o">.</span><span class="n">PY3</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">urllib.request</span> <span class="kn">import</span> <span class="o">*</span> <span class="c1"># noqa other modules want to import</span>
+ <span class="kn">from</span> <span class="nn">urllib.error</span> <span class="kn">import</span> <span class="o">*</span> <span class="c1"># noqa other modules want to import</span>
+<span class="k">else</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">urllib2</span> <span class="kn">import</span> <span class="o">*</span> <span class="c1"># noqa</span>
+
+
+<span class="k">try</span><span class="p">:</span>
+ <span class="n">mother_class</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">_fileobject</span>
+<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
+ <span class="n">mother_class</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">SocketIO</span>
+
+
+<span class="k">class</span> <span class="nc">_closing_fileobject</span><span class="p">(</span><span class="n">mother_class</span><span class="p">):</span> <span class="c1"># noqa</span>
+ <span class="sd">&quot;&quot;&quot;socket._fileobject that propagates self.close() to the socket.</span>
+
+<span class="sd"> Python 2.5 provides this as socket._fileobject(sock, close=True).</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+<span class="c1"># for python 3</span>
+<span class="k">try</span><span class="p">:</span>
+ <span class="n">AbstractHTTPHandler</span>
+<span class="k">except</span> <span class="ne">NameError</span><span class="p">:</span>
+ <span class="c1"># somehow this won&#39;t get imported by the import * above</span>
+ <span class="kn">import</span> <span class="nn">urllib.request</span>
+ <span class="n">AbstractHTTPHandler</span> <span class="o">=</span> <span class="n">urllib</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">AbstractHTTPHandler</span>
+
+
+<div class="viewcode-block" id="HTTPSHandler"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.m2urllib2.HTTPSHandler">[docs]</a><span class="k">class</span> <span class="nc">HTTPSHandler</span><span class="p">(</span><span class="n">AbstractHTTPHandler</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ssl_context</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+ <span class="c1"># type: (SSL.Context) -&gt; None</span>
+ <span class="n">AbstractHTTPHandler</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+
+ <span class="k">if</span> <span class="n">ssl_context</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">ssl_context</span><span class="p">,</span> <span class="n">SSL</span><span class="o">.</span><span class="n">Context</span><span class="p">),</span> <span class="n">ssl_context</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ctx</span> <span class="o">=</span> <span class="n">ssl_context</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ctx</span> <span class="o">=</span> <span class="n">SSL</span><span class="o">.</span><span class="n">Context</span><span class="p">()</span>
+
+ <span class="c1"># Copied from urllib2, so we can set the ssl context.</span>
+<div class="viewcode-block" id="HTTPSHandler.https_open"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.m2urllib2.HTTPSHandler.https_open">[docs]</a> <span class="k">def</span> <span class="nf">https_open</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">req</span><span class="p">):</span>
+ <span class="c1"># type: (Request) -&gt; addinfourl</span>
+ <span class="sd">&quot;&quot;&quot;Return an addinfourl object for the request, using http_class.</span>
+
+<span class="sd"> http_class must implement the HTTPConnection API from httplib.</span>
+<span class="sd"> The addinfourl return value is a file-like object. It also</span>
+<span class="sd"> has methods and attributes including:</span>
+
+<span class="sd"> - info(): return a mimetools.Message object for the headers</span>
+
+<span class="sd"> - geturl(): return the original request URL</span>
+
+<span class="sd"> - code: HTTP status code</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="c1"># https://docs.python.org/3.3/library/urllib.request.html#urllib.request.Request.get_host</span>
+ <span class="k">try</span><span class="p">:</span> <span class="c1"># up to python-3.2</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">get_host</span><span class="p">()</span>
+ <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="c1"># from python-3.3</span>
+ <span class="n">host</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">host</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">host</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="s1">&#39;no host given&#39;</span><span class="p">)</span>
+
+ <span class="c1"># Our change: Check to see if we&#39;re using a proxy.</span>
+ <span class="c1"># Then create an appropriate ssl-aware connection.</span>
+ <span class="n">full_url</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">get_full_url</span><span class="p">()</span>
+ <span class="n">target_host</span> <span class="o">=</span> <span class="n">url_parse</span><span class="p">(</span><span class="n">full_url</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span>
+
+ <span class="k">if</span> <span class="n">target_host</span> <span class="o">!=</span> <span class="n">host</span><span class="p">:</span>
+ <span class="n">request_uri</span> <span class="o">=</span> <span class="n">urldefrag</span><span class="p">(</span><span class="n">full_url</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
+ <span class="n">h</span> <span class="o">=</span> <span class="n">httpslib</span><span class="o">.</span><span class="n">ProxyHTTPSConnection</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="n">host</span><span class="p">,</span> <span class="n">ssl_context</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span> <span class="c1"># up to python-3.2</span>
+ <span class="n">request_uri</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">get_selector</span><span class="p">()</span>
+ <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="c1"># from python-3.3</span>
+ <span class="n">request_uri</span> <span class="o">=</span> <span class="n">req</span><span class="o">.</span><span class="n">selector</span>
+ <span class="n">h</span> <span class="o">=</span> <span class="n">httpslib</span><span class="o">.</span><span class="n">HTTPSConnection</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="n">host</span><span class="p">,</span> <span class="n">ssl_context</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">ctx</span><span class="p">)</span>
+ <span class="c1"># End our change</span>
+ <span class="n">h</span><span class="o">.</span><span class="n">set_debuglevel</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_debuglevel</span><span class="p">)</span>
+
+ <span class="n">headers</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">headers</span><span class="p">)</span>
+ <span class="n">headers</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">unredirected_hdrs</span><span class="p">)</span>
+ <span class="c1"># We want to make an HTTP/1.1 request, but the addinfourl</span>
+ <span class="c1"># class isn&#39;t prepared to deal with a persistent connection.</span>
+ <span class="c1"># It will try to read all remaining data from the socket,</span>
+ <span class="c1"># which will block while the server waits for the next request.</span>
+ <span class="c1"># So make sure the connection gets closed after the (only)</span>
+ <span class="c1"># request.</span>
+ <span class="n">headers</span><span class="p">[</span><span class="s2">&quot;Connection&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="s2">&quot;close&quot;</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">h</span><span class="o">.</span><span class="n">request</span><span class="p">(</span><span class="n">req</span><span class="o">.</span><span class="n">get_method</span><span class="p">(),</span> <span class="n">request_uri</span><span class="p">,</span> <span class="n">req</span><span class="o">.</span><span class="n">data</span><span class="p">,</span> <span class="n">headers</span><span class="p">)</span>
+ <span class="n">r</span> <span class="o">=</span> <span class="n">h</span><span class="o">.</span><span class="n">getresponse</span><span class="p">()</span>
+ <span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span> <span class="c1"># XXX what error?</span>
+ <span class="k">raise</span> <span class="n">URLError</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
+
+ <span class="c1"># Pick apart the HTTPResponse object to get the addinfourl</span>
+ <span class="c1"># object initialized properly.</span>
+
+ <span class="c1"># Wrap the HTTPResponse object in socket&#39;s file object adapter</span>
+ <span class="c1"># for Windows. That adapter calls recv(), so delegate recv()</span>
+ <span class="c1"># to read(). This weird wrapping allows the returned object to</span>
+ <span class="c1"># have readline() and readlines() methods.</span>
+
+ <span class="n">r</span><span class="o">.</span><span class="n">recv</span> <span class="o">=</span> <span class="n">r</span><span class="o">.</span><span class="n">read</span>
+ <span class="n">fp</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">_fileobject</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">close</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
+
+ <span class="n">resp</span> <span class="o">=</span> <span class="n">addinfourl</span><span class="p">(</span><span class="n">fp</span><span class="p">,</span> <span class="n">r</span><span class="o">.</span><span class="n">msg</span><span class="p">,</span> <span class="n">req</span><span class="o">.</span><span class="n">get_full_url</span><span class="p">())</span>
+ <span class="n">resp</span><span class="o">.</span><span class="n">code</span> <span class="o">=</span> <span class="n">r</span><span class="o">.</span><span class="n">status</span>
+ <span class="n">resp</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">r</span><span class="o">.</span><span class="n">reason</span>
+ <span class="k">return</span> <span class="n">resp</span>
+</div>
+ <span class="n">https_request</span> <span class="o">=</span> <span class="n">AbstractHTTPHandler</span><span class="o">.</span><span class="n">do_request_</span>
+
+
+<span class="c1"># Copied from urllib2 with modifications for ssl</span></div>
+<div class="viewcode-block" id="build_opener"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.m2urllib2.build_opener">[docs]</a><span class="k">def</span> <span class="nf">build_opener</span><span class="p">(</span><span class="n">ssl_context</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="o">*</span><span class="n">handlers</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[SSL.Context], *List[object]) -&gt; OpenerDirector</span>
+ <span class="sd">&quot;&quot;&quot;Create an opener object from a list of handlers.</span>
+
+<span class="sd"> The opener will use several default handlers, including support</span>
+<span class="sd"> for HTTP and FTP.</span>
+
+<span class="sd"> If any of the handlers passed as arguments are subclasses of the</span>
+<span class="sd"> default handlers, the default handlers will not be used.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+
+ <span class="k">def</span> <span class="nf">isclass</span><span class="p">(</span><span class="n">obj</span><span class="p">):</span>
+ <span class="k">return</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="nb">type</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="s2">&quot;__bases__&quot;</span><span class="p">)</span>
+
+ <span class="n">opener</span> <span class="o">=</span> <span class="n">OpenerDirector</span><span class="p">()</span>
+ <span class="n">default_classes</span> <span class="o">=</span> <span class="p">[</span><span class="n">ProxyHandler</span><span class="p">,</span> <span class="n">UnknownHandler</span><span class="p">,</span> <span class="n">HTTPHandler</span><span class="p">,</span>
+ <span class="n">HTTPDefaultErrorHandler</span><span class="p">,</span> <span class="n">HTTPRedirectHandler</span><span class="p">,</span>
+ <span class="n">FTPHandler</span><span class="p">,</span> <span class="n">FileHandler</span><span class="p">,</span> <span class="n">HTTPErrorProcessor</span><span class="p">]</span>
+ <span class="n">skip</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="k">for</span> <span class="n">klass</span> <span class="ow">in</span> <span class="n">default_classes</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">check</span> <span class="ow">in</span> <span class="n">handlers</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">isclass</span><span class="p">(</span><span class="n">check</span><span class="p">):</span>
+ <span class="k">if</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">check</span><span class="p">,</span> <span class="n">klass</span><span class="p">):</span>
+ <span class="n">skip</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">klass</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">check</span><span class="p">,</span> <span class="n">klass</span><span class="p">):</span>
+ <span class="n">skip</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">klass</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">klass</span> <span class="ow">in</span> <span class="n">skip</span><span class="p">:</span>
+ <span class="n">default_classes</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">klass</span><span class="p">)</span>
+
+ <span class="k">for</span> <span class="n">klass</span> <span class="ow">in</span> <span class="n">default_classes</span><span class="p">:</span>
+ <span class="n">opener</span><span class="o">.</span><span class="n">add_handler</span><span class="p">(</span><span class="n">klass</span><span class="p">())</span>
+
+ <span class="c1"># Add the HTTPS handler with ssl_context</span>
+ <span class="k">if</span> <span class="n">HTTPSHandler</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">skip</span><span class="p">:</span>
+ <span class="n">opener</span><span class="o">.</span><span class="n">add_handler</span><span class="p">(</span><span class="n">HTTPSHandler</span><span class="p">(</span><span class="n">ssl_context</span><span class="p">))</span>
+
+ <span class="k">for</span> <span class="n">h</span> <span class="ow">in</span> <span class="n">handlers</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">isclass</span><span class="p">(</span><span class="n">h</span><span class="p">):</span>
+ <span class="n">h</span> <span class="o">=</span> <span class="n">h</span><span class="p">()</span>
+ <span class="n">opener</span><span class="o">.</span><span class="n">add_handler</span><span class="p">(</span><span class="n">h</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">opener</span></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/m2xmlrpclib.html b/doc/html/_modules/M2Crypto/m2xmlrpclib.html
new file mode 100644
index 0000000..7869083
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/m2xmlrpclib.html
@@ -0,0 +1,173 @@
+
+
+<!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>M2Crypto.m2xmlrpclib &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../index.html" />
+ <link rel="up" title="Module code" href="../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.m2xmlrpclib</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+
+<span class="sd">&quot;&quot;&quot;M2Crypto enhancement to xmlrpclib.</span>
+
+<span class="sd">Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">base64</span>
+
+<span class="kn">import</span> <span class="nn">M2Crypto</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">SSL</span><span class="p">,</span> <span class="n">httpslib</span><span class="p">,</span> <span class="n">m2urllib</span><span class="p">,</span> <span class="n">six</span><span class="p">,</span> <span class="n">util</span>
+<span class="k">if</span> <span class="n">util</span><span class="o">.</span><span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Any</span><span class="p">,</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Callable</span><span class="p">,</span> <span class="n">Optional</span> <span class="c1"># noqa</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto.six.moves.xmlrpc_client</span> <span class="kn">import</span> <span class="n">ProtocolError</span><span class="p">,</span> <span class="n">Transport</span>
+<span class="c1"># six.moves doesn&#39;t support star imports</span>
+<span class="k">if</span> <span class="n">six</span><span class="o">.</span><span class="n">PY3</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">xmlrpc.client</span> <span class="kn">import</span> <span class="o">*</span> <span class="c1"># noqa</span>
+<span class="k">else</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">xmlrpclib</span> <span class="kn">import</span> <span class="o">*</span> <span class="c1"># noqa</span>
+
+<span class="n">__version__</span> <span class="o">=</span> <span class="n">M2Crypto</span><span class="o">.</span><span class="n">__version__</span>
+
+
+<div class="viewcode-block" id="SSL_Transport"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.m2xmlrpclib.SSL_Transport">[docs]</a><span class="k">class</span> <span class="nc">SSL_Transport</span><span class="p">(</span><span class="n">Transport</span><span class="p">):</span> <span class="c1"># noqa</span>
+
+ <span class="n">user_agent</span> <span class="o">=</span> <span class="s2">&quot;M2Crypto_XMLRPC/</span><span class="si">%s</span><span class="s2"> - </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">__version__</span><span class="p">,</span>
+ <span class="n">Transport</span><span class="o">.</span><span class="n">user_agent</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ssl_context</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[SSL.Context], *List[Any], **Dict[Any, Any]) -&gt; None</span>
+ <span class="n">Transport</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">ssl_context</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ssl_ctx</span> <span class="o">=</span> <span class="n">SSL</span><span class="o">.</span><span class="n">Context</span><span class="p">()</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">ssl_ctx</span> <span class="o">=</span> <span class="n">ssl_context</span>
+
+<div class="viewcode-block" id="SSL_Transport.request"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.m2xmlrpclib.SSL_Transport.request">[docs]</a> <span class="k">def</span> <span class="nf">request</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">handler</span><span class="p">,</span> <span class="n">request_body</span><span class="p">,</span> <span class="n">verbose</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr, Callable, bytes, int) -&gt; object</span>
+ <span class="c1"># Handle username and password.</span>
+ <span class="n">user_passwd</span><span class="p">,</span> <span class="n">host_port</span> <span class="o">=</span> <span class="n">m2urllib</span><span class="o">.</span><span class="n">splituser</span><span class="p">(</span><span class="n">host</span><span class="p">)</span>
+ <span class="n">_host</span><span class="p">,</span> <span class="n">_port</span> <span class="o">=</span> <span class="n">m2urllib</span><span class="o">.</span><span class="n">splitport</span><span class="p">(</span><span class="n">host_port</span><span class="p">)</span>
+ <span class="n">h</span> <span class="o">=</span> <span class="n">httpslib</span><span class="o">.</span><span class="n">HTTPSConnection</span><span class="p">(</span><span class="n">_host</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">_port</span><span class="p">),</span>
+ <span class="n">ssl_context</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">ssl_ctx</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">verbose</span><span class="p">:</span>
+ <span class="n">h</span><span class="o">.</span><span class="n">set_debuglevel</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+
+ <span class="c1"># What follows is as in xmlrpclib.Transport. (Except the authz bit.)</span>
+ <span class="n">h</span><span class="o">.</span><span class="n">putrequest</span><span class="p">(</span><span class="s2">&quot;POST&quot;</span><span class="p">,</span> <span class="n">handler</span><span class="p">)</span>
+
+ <span class="c1"># required by HTTP/1.1</span>
+ <span class="n">h</span><span class="o">.</span><span class="n">putheader</span><span class="p">(</span><span class="s2">&quot;Host&quot;</span><span class="p">,</span> <span class="n">_host</span><span class="p">)</span>
+
+ <span class="c1"># required by XML-RPC</span>
+ <span class="n">h</span><span class="o">.</span><span class="n">putheader</span><span class="p">(</span><span class="s2">&quot;User-Agent&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">user_agent</span><span class="p">)</span>
+ <span class="n">h</span><span class="o">.</span><span class="n">putheader</span><span class="p">(</span><span class="s2">&quot;Content-Type&quot;</span><span class="p">,</span> <span class="s2">&quot;text/xml&quot;</span><span class="p">)</span>
+ <span class="n">h</span><span class="o">.</span><span class="n">putheader</span><span class="p">(</span><span class="s2">&quot;Content-Length&quot;</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">request_body</span><span class="p">)))</span>
+
+ <span class="c1"># Authorisation.</span>
+ <span class="k">if</span> <span class="n">user_passwd</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
+ <span class="n">auth</span> <span class="o">=</span> <span class="n">base64</span><span class="o">.</span><span class="n">encodestring</span><span class="p">(</span><span class="n">user_passwd</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
+ <span class="n">h</span><span class="o">.</span><span class="n">putheader</span><span class="p">(</span><span class="s1">&#39;Authorization&#39;</span><span class="p">,</span> <span class="s1">&#39;Basic </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">auth</span><span class="p">)</span>
+
+ <span class="n">h</span><span class="o">.</span><span class="n">endheaders</span><span class="p">()</span>
+
+ <span class="k">if</span> <span class="n">request_body</span><span class="p">:</span>
+ <span class="n">h</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">request_body</span><span class="p">)</span>
+
+ <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span> <span class="n">headers</span> <span class="o">=</span> <span class="n">h</span><span class="o">.</span><span class="n">getreply</span><span class="p">()</span>
+
+ <span class="k">if</span> <span class="n">errcode</span> <span class="o">!=</span> <span class="mi">200</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span>
+ <span class="n">host</span> <span class="o">+</span> <span class="n">handler</span><span class="p">,</span>
+ <span class="n">errcode</span><span class="p">,</span> <span class="n">errmsg</span><span class="p">,</span>
+ <span class="n">headers</span>
+ <span class="p">)</span>
+
+ <span class="bp">self</span><span class="o">.</span><span class="n">verbose</span> <span class="o">=</span> <span class="n">verbose</span>
+ <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">parse_response</span><span class="p">(</span><span class="n">h</span><span class="o">.</span><span class="n">getfile</span><span class="p">())</span></div></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/threading.html b/doc/html/_modules/M2Crypto/threading.html
new file mode 100644
index 0000000..41edb54
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/threading.html
@@ -0,0 +1,119 @@
+
+
+<!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>M2Crypto.threading &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../index.html" />
+ <link rel="up" title="Module code" href="../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.threading</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">M2Crypto threading support, required for multithreaded applications.</span>
+
+<span class="sd">Copyright (c) 1999-2003 Ng Pheng Siong. All rights reserved.&quot;&quot;&quot;</span>
+
+<span class="c1"># M2Crypto</span>
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">m2</span>
+
+
+<div class="viewcode-block" id="init"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.threading.init">[docs]</a><span class="k">def</span> <span class="nf">init</span><span class="p">():</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> Initialize threading support.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">threading_init</span><span class="p">()</span>
+
+</div>
+<div class="viewcode-block" id="cleanup"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.threading.cleanup">[docs]</a><span class="k">def</span> <span class="nf">cleanup</span><span class="p">():</span>
+ <span class="c1"># type: () -&gt; None</span>
+ <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> End and cleanup threading support.</span>
+<span class="sd"> &quot;&quot;&quot;</span>
+ <span class="n">m2</span><span class="o">.</span><span class="n">threading_cleanup</span><span class="p">()</span></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/M2Crypto/util.html b/doc/html/_modules/M2Crypto/util.html
new file mode 100644
index 0000000..0667b9f
--- /dev/null
+++ b/doc/html/_modules/M2Crypto/util.html
@@ -0,0 +1,223 @@
+
+
+<!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>M2Crypto.util &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../../index.html" />
+ <link rel="up" title="Module code" href="../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>Source code for M2Crypto.util</h1><div class="highlight"><pre>
+<span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="sd"> M2Crypto utility routines.</span>
+
+<span class="sd"> Copyright (c) 1999-2004 Ng Pheng Siong. All rights reserved.</span>
+
+<span class="sd"> Portions created by Open Source Applications Foundation (OSAF) are</span>
+<span class="sd"> Copyright (C) 2004 OSAF. All Rights Reserved.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">binascii</span>
+<span class="kn">import</span> <span class="nn">logging</span>
+<span class="kn">import</span> <span class="nn">sys</span>
+
+<span class="c1"># This means &quot;Python 2.7 or higher&quot; so it is True for py3k as well</span>
+<span class="n">py27plus</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">version_info</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span> <span class="o">&gt;</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span> <span class="c1"># type: bool</span>
+
+<span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">m2</span><span class="p">,</span> <span class="n">six</span>
+<span class="k">if</span> <span class="n">py27plus</span><span class="p">:</span>
+ <span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">AnyStr</span><span class="p">,</span> <span class="n">Tuple</span><span class="p">,</span> <span class="n">Union</span> <span class="c1"># noqa</span>
+ <span class="c1"># see https://github.com/python/typeshed/issues/222</span>
+ <span class="n">AddrType</span> <span class="o">=</span> <span class="n">Union</span><span class="p">[</span><span class="n">Tuple</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">],</span> <span class="nb">str</span><span class="p">]</span>
+
+<span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s1">&#39;util&#39;</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="UtilError"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.util.UtilError">[docs]</a><span class="k">class</span> <span class="nc">UtilError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
+ <span class="k">pass</span>
+</div>
+<span class="n">m2</span><span class="o">.</span><span class="n">util_init</span><span class="p">(</span><span class="n">UtilError</span><span class="p">)</span>
+
+
+<div class="viewcode-block" id="pkcs5_pad"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.util.pkcs5_pad">[docs]</a><span class="k">def</span> <span class="nf">pkcs5_pad</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">blklen</span><span class="o">=</span><span class="mi">8</span><span class="p">):</span>
+ <span class="c1"># type: (str, int) -&gt; str</span>
+ <span class="n">pad</span> <span class="o">=</span> <span class="p">(</span><span class="mi">8</span> <span class="o">-</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">%</span> <span class="mi">8</span><span class="p">))</span>
+ <span class="k">return</span> <span class="n">data</span> <span class="o">+</span> <span class="nb">chr</span><span class="p">(</span><span class="n">pad</span><span class="p">)</span> <span class="o">*</span> <span class="n">pad</span>
+
+</div>
+<div class="viewcode-block" id="pkcs7_pad"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.util.pkcs7_pad">[docs]</a><span class="k">def</span> <span class="nf">pkcs7_pad</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">blklen</span><span class="p">):</span>
+ <span class="c1"># type: (str, int) -&gt; str</span>
+ <span class="k">if</span> <span class="n">blklen</span> <span class="o">&gt;</span> <span class="mi">255</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;illegal block size&#39;</span><span class="p">)</span>
+ <span class="n">pad</span> <span class="o">=</span> <span class="p">(</span><span class="n">blklen</span> <span class="o">-</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">%</span> <span class="n">blklen</span><span class="p">))</span>
+ <span class="k">return</span> <span class="n">data</span> <span class="o">+</span> <span class="nb">chr</span><span class="p">(</span><span class="n">pad</span><span class="p">)</span> <span class="o">*</span> <span class="n">pad</span>
+
+
+<span class="c1"># before the introduction of py3{bytes,str}, python2 code</span>
+<span class="c1"># was just using args as-is</span></div>
+<span class="k">if</span> <span class="n">six</span><span class="o">.</span><span class="n">PY2</span><span class="p">:</span>
+ <span class="k">def</span> <span class="nf">py3bytes</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr) -&gt; Optional[bytes,bytearray]</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="nb">unicode</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">x</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;utf8&#39;</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="p">(</span><span class="nb">bytearray</span><span class="p">,</span> <span class="nb">str</span><span class="p">)):</span>
+ <span class="k">return</span> <span class="n">x</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">&#39;No string argument provided&#39;</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">py3str</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[str,bytearray]) -&gt; str</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="nb">bytearray</span><span class="p">):</span>
+ <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="nb">unicode</span><span class="p">)):</span>
+ <span class="k">return</span> <span class="n">x</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">&#39;No string argument provided&#39;</span><span class="p">)</span>
+<span class="k">else</span><span class="p">:</span>
+<div class="viewcode-block" id="py3bytes"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.util.py3bytes">[docs]</a> <span class="k">def</span> <span class="nf">py3bytes</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
+ <span class="c1"># type: (AnyStr) -&gt; Optional[bytes,bytearray]</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="k">return</span> <span class="nb">bytes</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s1">&#39;utf8&#39;</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="p">(</span><span class="nb">bytes</span><span class="p">,</span> <span class="nb">bytearray</span><span class="p">)):</span>
+ <span class="k">return</span> <span class="n">x</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">&#39;No string argument provided&#39;</span><span class="p">)</span>
+</div>
+<div class="viewcode-block" id="py3str"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.util.py3str">[docs]</a> <span class="k">def</span> <span class="nf">py3str</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
+ <span class="c1"># type: (Optional[AnyStr,bytearray]) -&gt; str</span>
+ <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="p">(</span><span class="nb">bytes</span><span class="p">,</span> <span class="nb">bytearray</span><span class="p">)):</span>
+ <span class="k">return</span> <span class="n">x</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;utf8&#39;</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">x</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">&#39;No string argument provided&#39;</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="bin_to_hex"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.util.bin_to_hex">[docs]</a><span class="k">def</span> <span class="nf">bin_to_hex</span><span class="p">(</span><span class="n">b</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; str</span>
+ <span class="k">return</span> <span class="n">py3str</span><span class="p">(</span><span class="n">binascii</span><span class="o">.</span><span class="n">b2a_base64</span><span class="p">(</span><span class="n">b</span><span class="p">)[:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
+
+</div>
+<div class="viewcode-block" id="octx_to_num"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.util.octx_to_num">[docs]</a><span class="k">def</span> <span class="nf">octx_to_num</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
+ <span class="c1"># type: (bytes) -&gt; int</span>
+ <span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">x</span><span class="p">),</span> <span class="mi">16</span><span class="p">)</span>
+
+</div>
+<div class="viewcode-block" id="genparam_callback"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.util.genparam_callback">[docs]</a><span class="k">def</span> <span class="nf">genparam_callback</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">out</span><span class="o">=</span><span class="n">sys</span><span class="o">.</span><span class="n">stdout</span><span class="p">):</span>
+ <span class="c1"># type: (int, Any, file) -&gt; None</span>
+ <span class="n">ch</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;.&#39;</span><span class="p">,</span> <span class="s1">&#39;+&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">]</span>
+ <span class="n">out</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">ch</span><span class="p">[</span><span class="n">p</span><span class="p">])</span>
+ <span class="n">out</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
+
+</div>
+<div class="viewcode-block" id="quiet_genparam_callback"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.util.quiet_genparam_callback">[docs]</a><span class="k">def</span> <span class="nf">quiet_genparam_callback</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">out</span><span class="p">):</span>
+ <span class="c1"># type: (Any, Any, Any) -&gt; None</span>
+ <span class="k">pass</span>
+
+</div>
+<div class="viewcode-block" id="passphrase_callback"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.util.passphrase_callback">[docs]</a><span class="k">def</span> <span class="nf">passphrase_callback</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">prompt1</span><span class="o">=</span><span class="s1">&#39;Enter passphrase:&#39;</span><span class="p">,</span>
+ <span class="n">prompt2</span><span class="o">=</span><span class="s1">&#39;Verify passphrase:&#39;</span><span class="p">):</span>
+ <span class="c1"># type: (bool, str, str) -&gt; Optional[str]</span>
+ <span class="kn">from</span> <span class="nn">getpass</span> <span class="kn">import</span> <span class="n">getpass</span>
+ <span class="k">while</span> <span class="mi">1</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="n">p1</span> <span class="o">=</span> <span class="n">getpass</span><span class="p">(</span><span class="n">prompt1</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">v</span><span class="p">:</span>
+ <span class="n">p2</span> <span class="o">=</span> <span class="n">getpass</span><span class="p">(</span><span class="n">prompt2</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">p1</span> <span class="o">==</span> <span class="n">p2</span><span class="p">:</span>
+ <span class="k">break</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">break</span>
+ <span class="k">except</span> <span class="ne">KeyboardInterrupt</span><span class="p">:</span>
+ <span class="k">return</span> <span class="bp">None</span>
+ <span class="k">return</span> <span class="n">p1</span>
+
+</div>
+<div class="viewcode-block" id="no_passphrase_callback"><a class="viewcode-back" href="../../M2Crypto.html#M2Crypto.util.no_passphrase_callback">[docs]</a><span class="k">def</span> <span class="nf">no_passphrase_callback</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">):</span>
+ <span class="c1"># type: (List[Any]) -&gt; str</span>
+ <span class="k">return</span> <span class="s1">&#39;&#39;</span></div>
+</pre></div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../../index.html">M2Crypto documentation</a> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_modules/index.html b/doc/html/_modules/index.html
new file mode 100644
index 0000000..872a977
--- /dev/null
+++ b/doc/html/_modules/index.html
@@ -0,0 +1,129 @@
+
+
+<!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>Overview: module code &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="../_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '../',
+ VERSION: '',
+ 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="M2Crypto documentation" href="../index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../index.html">M2Crypto documentation</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1>All modules for which code is available</h1>
+<ul><li><a href="M2Crypto/ASN1.html">M2Crypto.ASN1</a></li>
+<li><a href="M2Crypto/AuthCookie.html">M2Crypto.AuthCookie</a></li>
+<li><a href="M2Crypto/BIO.html">M2Crypto.BIO</a></li>
+<li><a href="M2Crypto/BN.html">M2Crypto.BN</a></li>
+<li><a href="M2Crypto/DH.html">M2Crypto.DH</a></li>
+<li><a href="M2Crypto/DSA.html">M2Crypto.DSA</a></li>
+<li><a href="M2Crypto/EC.html">M2Crypto.EC</a></li>
+<li><a href="M2Crypto/EVP.html">M2Crypto.EVP</a></li>
+<li><a href="M2Crypto/Engine.html">M2Crypto.Engine</a></li>
+<li><a href="M2Crypto/Err.html">M2Crypto.Err</a></li>
+<li><a href="M2Crypto/PGP/PublicKey.html">M2Crypto.PGP.PublicKey</a></li>
+<li><a href="M2Crypto/PGP/PublicKeyRing.html">M2Crypto.PGP.PublicKeyRing</a></li>
+<li><a href="M2Crypto/PGP/RSA.html">M2Crypto.PGP.RSA</a></li>
+<li><a href="M2Crypto/PGP/packet.html">M2Crypto.PGP.packet</a></li>
+<li><a href="M2Crypto/RC4.html">M2Crypto.RC4</a></li>
+<li><a href="M2Crypto/RSA.html">M2Crypto.RSA</a></li>
+<li><a href="M2Crypto/Rand.html">M2Crypto.Rand</a></li>
+<li><a href="M2Crypto/SMIME.html">M2Crypto.SMIME</a></li>
+<li><a href="M2Crypto/SSL.html">M2Crypto.SSL</a></li>
+<ul><li><a href="M2Crypto/SSL/Checker.html">M2Crypto.SSL.Checker</a></li>
+<li><a href="M2Crypto/SSL/Cipher.html">M2Crypto.SSL.Cipher</a></li>
+<li><a href="M2Crypto/SSL/Connection.html">M2Crypto.SSL.Connection</a></li>
+<li><a href="M2Crypto/SSL/Context.html">M2Crypto.SSL.Context</a></li>
+<li><a href="M2Crypto/SSL/SSLServer.html">M2Crypto.SSL.SSLServer</a></li>
+<li><a href="M2Crypto/SSL/Session.html">M2Crypto.SSL.Session</a></li>
+<li><a href="M2Crypto/SSL/TwistedProtocolWrapper.html">M2Crypto.SSL.TwistedProtocolWrapper</a></li>
+<li><a href="M2Crypto/SSL/cb.html">M2Crypto.SSL.cb</a></li>
+<li><a href="M2Crypto/SSL/ssl_dispatcher.html">M2Crypto.SSL.ssl_dispatcher</a></li>
+<li><a href="M2Crypto/SSL/timeout.html">M2Crypto.SSL.timeout</a></li>
+</ul><li><a href="M2Crypto/X509.html">M2Crypto.X509</a></li>
+<li><a href="M2Crypto/ftpslib.html">M2Crypto.ftpslib</a></li>
+<li><a href="M2Crypto/httpslib.html">M2Crypto.httpslib</a></li>
+<li><a href="M2Crypto/m2crypto.html">M2Crypto.m2crypto</a></li>
+<li><a href="M2Crypto/m2urllib.html">M2Crypto.m2urllib</a></li>
+<li><a href="M2Crypto/m2urllib2.html">M2Crypto.m2urllib2</a></li>
+<li><a href="M2Crypto/m2xmlrpclib.html">M2Crypto.m2xmlrpclib</a></li>
+<li><a href="M2Crypto/threading.html">M2Crypto.threading</a></li>
+<li><a href="M2Crypto/util.html">M2Crypto.util</a></li>
+</ul>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="../genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="../py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="../index.html">M2Crypto documentation</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/_sources/M2Crypto.PGP.txt b/doc/html/_sources/M2Crypto.PGP.txt
new file mode 100644
index 0000000..5396b5d
--- /dev/null
+++ b/doc/html/_sources/M2Crypto.PGP.txt
@@ -0,0 +1,51 @@
+PGP Package
+===========
+
+:mod:`PGP` Package
+------------------
+
+.. automodule:: M2Crypto.PGP
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`PublicKey` Module
+-----------------------
+
+.. automodule:: M2Crypto.PGP.PublicKey
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`PublicKeyRing` Module
+---------------------------
+
+.. automodule:: M2Crypto.PGP.PublicKeyRing
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`RSA` Module
+-----------------
+
+.. automodule:: M2Crypto.PGP.RSA
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`constants` Module
+-----------------------
+
+.. automodule:: M2Crypto.PGP.constants
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`packet` Module
+--------------------
+
+.. automodule:: M2Crypto.PGP.packet
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
diff --git a/doc/html/_sources/M2Crypto.SSL.txt b/doc/html/_sources/M2Crypto.SSL.txt
new file mode 100644
index 0000000..233c1eb
--- /dev/null
+++ b/doc/html/_sources/M2Crypto.SSL.txt
@@ -0,0 +1,91 @@
+SSL Package
+===========
+
+:mod:`SSL` Package
+------------------
+
+.. automodule:: M2Crypto.SSL
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`Checker` Module
+---------------------
+
+.. automodule:: M2Crypto.SSL.Checker
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`Cipher` Module
+--------------------
+
+.. automodule:: M2Crypto.SSL.Cipher
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`Connection` Module
+------------------------
+
+.. automodule:: M2Crypto.SSL.Connection
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`Context` Module
+---------------------
+
+.. automodule:: M2Crypto.SSL.Context
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`SSLServer` Module
+-----------------------
+
+.. automodule:: M2Crypto.SSL.SSLServer
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`Session` Module
+---------------------
+
+.. automodule:: M2Crypto.SSL.Session
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`TwistedProtocolWrapper` Module
+------------------------------------
+
+.. automodule:: M2Crypto.SSL.TwistedProtocolWrapper
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`cb` Module
+----------------
+
+.. automodule:: M2Crypto.SSL.cb
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`ssl_dispatcher` Module
+----------------------------
+
+.. automodule:: M2Crypto.SSL.ssl_dispatcher
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`timeout` Module
+---------------------
+
+.. automodule:: M2Crypto.SSL.timeout
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
diff --git a/doc/html/_sources/M2Crypto.txt b/doc/html/_sources/M2Crypto.txt
new file mode 100644
index 0000000..31a03ad
--- /dev/null
+++ b/doc/html/_sources/M2Crypto.txt
@@ -0,0 +1,219 @@
+M2Crypto Package
+================
+
+:mod:`M2Crypto` Package
+-----------------------
+
+.. automodule:: M2Crypto.__init__
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`ASN1` Module
+------------------
+
+.. automodule:: M2Crypto.ASN1
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`AuthCookie` Module
+------------------------
+
+.. automodule:: M2Crypto.AuthCookie
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`BIO` Module
+-----------------
+
+.. automodule:: M2Crypto.BIO
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`BN` Module
+----------------
+
+.. automodule:: M2Crypto.BN
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`DH` Module
+----------------
+
+.. automodule:: M2Crypto.DH
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`DSA` Module
+-----------------
+
+.. automodule:: M2Crypto.DSA
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`EC` Module
+----------------
+
+.. automodule:: M2Crypto.EC
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`EVP` Module
+-----------------
+
+.. automodule:: M2Crypto.EVP
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`Engine` Module
+--------------------
+
+.. automodule:: M2Crypto.Engine
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`Err` Module
+-----------------
+
+.. automodule:: M2Crypto.Err
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`RC4` Module
+-----------------
+
+.. automodule:: M2Crypto.RC4
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`RSA` Module
+-----------------
+
+.. automodule:: M2Crypto.RSA
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`Rand` Module
+------------------
+
+.. automodule:: M2Crypto.Rand
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`SMIME` Module
+-------------------
+
+.. automodule:: M2Crypto.SMIME
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`X509` Module
+------------------
+
+.. automodule:: M2Crypto.X509
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`callback` Module
+----------------------
+
+.. automodule:: M2Crypto.callback
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`ftpslib` Module
+---------------------
+
+.. automodule:: M2Crypto.ftpslib
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`httpslib` Module
+----------------------
+
+.. automodule:: M2Crypto.httpslib
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`m2` Module
+----------------
+
+.. automodule:: M2Crypto.m2
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`m2crypto` Module
+----------------------
+
+.. automodule:: M2Crypto.m2crypto
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`m2urllib` Module
+----------------------
+
+.. automodule:: M2Crypto.m2urllib
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`m2urllib2` Module
+-----------------------
+
+.. automodule:: M2Crypto.m2urllib2
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`m2xmlrpclib` Module
+-------------------------
+
+.. automodule:: M2Crypto.m2xmlrpclib
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`threading` Module
+-----------------------
+
+.. automodule:: M2Crypto.threading
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+:mod:`util` Module
+------------------
+
+.. automodule:: M2Crypto.util
+ :members:
+ :undoc-members:
+ :show-inheritance:
+
+Subpackages
+-----------
+
+.. toctree::
+
+ M2Crypto.PGP
+ M2Crypto.SSL
+
diff --git a/doc/html/_sources/ZServerSSL-HOWTO.txt b/doc/html/_sources/ZServerSSL-HOWTO.txt
new file mode 100644
index 0000000..91ef5af
--- /dev/null
+++ b/doc/html/_sources/ZServerSSL-HOWTO.txt
@@ -0,0 +1,239 @@
+:orphan:
+
+.. _zserverssl-howto:
+
+ZServerSSL-HOWTO
+################
+
+:author: Pheng Siong Ng <ngps@post1.com>
+:copyright: © 2000, 2001 by Ng Pheng Siong.
+:date: 2003-06-22
+
+.. contents::
+ :backlinks: entry
+
+.. sectnum::
+ :suffix: .
+
+Introduction
+============
+
+ZServerSSL adds to Zope's ZServer the following:
+
+- HTTPS server
+- WebDAV-source-over-HTTPS server
+
+With the HTTPS server, ZServerSSL also provides WebDAV-over-HTTPS and
+XMLRPC-over-HTTPS access to Zope.
+
+These instructions apply to both Un\*x and Windows installations of Zope
+2.6.1. To avoid cluttering the presentation, Windows pathnames are shown
+in Un\*x fashion.
+
+Preparation
+===========
+
+#. Download M2Crypto 0.11, contained in the file ``m2crypto-0.11.zip``.
+#. Unpack ``m2crypto-0.11.zip``. This will create a directory
+ ``m2crypto-0.11``. Henceforth, we refer to this directory as ``$M2``.
+#. Install M2Crypto per the instructions in ``$M2/INSTALL``.
+
+The ZServerSSL distribution is in ``$M2/demo/Zope``. We shall refer to
+this directory as ``$ZSSL``.
+
+Installation
+============
+
+Below, we refer to your Zope top-level directory as ``$ZOPE``.
+
+#. Copy ``$ZSSL/z2s.py`` into ``$ZOPE``.
+
+#. Depending on your operating system, modify ``$ZOPE/start`` or
+ ``$ZOPE/start.bat`` to invoke ``$ZOPE/z2s.py``, instead of
+ ``$ZOPE/z2.py``. The files ``$ZSSL/starts`` and ``$ZSSL/starts.bat``
+ serve as examples.
+
+#. Copy ``$ZSSL/dh1024.pem`` into ``$ZOPE``. This file contains
+ Diffie-Hellman parameters for use by the SSL protocol.
+
+#. Copy ``$ZSSL/randpool.dat`` into ``$ZOPE``. This file contains seed
+ material for the OpenSSL PRNG. Alternatively, create
+ ``$ZOPE/randpool.dat`` thusly::
+
+ $ dd if=/dev/urandom of=randpool.dat bs=1024 count=1
+
+#. Copy ``$ZSSL/ca.pem`` to ``$ZOPE``. This file contains an
+ example Certification Authority (CA) certificate. For
+ information on operating your own CA, see :ref:`howto-ca` or
+ one of numerous similar documents available on the web.
+
+#. Copy ``$ZSSL/server.pem`` to ``$ZOPE``. This file contains an RSA key
+ pair and its X.509v3 certificate issued by the above CA. You may also
+ create your own key/certificate bundle.
+
+#. Copy ``$ZSSL/ZServer/HTTPS_Server.py`` to ``$ZOPE/ZServer``.
+
+#. Copy ``$ZSSL/ZServer/__init__.py`` to ``$ZOPE/ZServer``. This
+ overwrites the existing ``$ZOPE/ZServer/__init__.py``. Alternatively,
+ apply the following patch to ``$ZOPE/ZServer/__init__.py``::
+
+ --- __init__.py.org Sat Jun 21 23:20:41 2003
+ +++ __init__.py Tue Jan 7 23:30:53 2003
+ @@ -84,6 +84,7 @@
+ import asyncore
+ from medusa import resolver, logger
+ from HTTPServer import zhttp_server, zhttp_handler
+ +from HTTPS_Server import zhttps_server, zhttps_handler
+ from PCGIServer import PCGIServer
+ from FCGIServer import FCGIServer
+ from FTPServer import FTPServer
+
+#. Copy ``$ZSSL/ZServer/medusa/https_server.py`` to
+ ``$ZOPE/ZServer/medusa``.
+
+#. Stop Zope, if it is running.
+
+#. Start Zope with ZServerSSL thusly::
+
+ ./starts -X -f 9021 -w 9080 -W 9081 -y 9443 -Y 9444
+
+ This starts the following:
+
+ - an FTP server on port 9021
+ - a HTTP server on port 9080
+ - a WebDAV-source server on port 9081
+ - a HTTPS server on port 9443
+ - a WebDAV-source-over-HTTPS server on port 9444
+
+Testing
+=======
+
+Below, we assume your Zope server is running on ``localhost``.
+
+HTTPS
+=====
+
+This testing is done with Mozilla 1.1 on FreeBSD.
+
+#. With a browser, connect to https://localhost:9443/. Browse around.
+ Check out your browser's HTTPS informational screens.
+#. Connect to https://localhost:9443/manage. Verify that you can access
+ Zope's management functionality.
+
+WebDAV-over-HTTPS
+=================
+
+This testing is done with Cadaver 0.21.0 on FreeBSD.::
+
+ $ cadaver https://localhost:9443/
+ WARNING: Untrusted server certificate presented:
+ Issued to: M2Crypto, SG
+ Issued by: M2Crypto, SG
+ Do you wish to accept the certificate? (y/n) y
+ dav:/> ls
+ Listing collection `/': succeeded.
+ Coll: Channels 0 Jun 19 00:04
+ Coll: Control_Panel 0 Jun 6 00:13
+ Coll: Examples 0 Jun 6 00:12
+ Coll: catalog 0 Jun 12 11:53
+ Coll: ngps 0 Jun 16 15:34
+ Coll: portal 0 Jun 21 15:21
+ Coll: skunk 0 Jun 18 21:18
+ Coll: temp_folder 0 Jun 22 17:57
+ Coll: zope 0 Jun 20 15:27
+ acl_users 0 Dec 30 1998
+ browser_id_manager 0 Jun 6 00:12
+ default.css 3037 Jun 21 16:38
+ error_log 0 Jun 6 00:12
+ index_html 313 Jun 12 13:36
+ portal0 0 Jun 21 15:21
+ session_data_manager 0 Jun 6 00:12
+ standard_error_message 1365 Jan 21 2001
+ standard_html_footer 50 Jun 12 12:30
+ standard_html_header 80 Jan 21 2001
+ standard_template.pt 282 Jun 6 00:12
+ zsyncer 0 Jun 17 15:28
+ dav:/> quit
+ Connection to `localhost' closed.
+ $
+
+
+WebDAV-Source-over-HTTPS
+========================
+
+This testing is done with Mozilla 1.1 on FreeBSD.
+
+#. Open the Mozilla Composer window.
+#. Click "File", "Open Web Location". A dialog box appears.
+#. Enter ``https://localhost:9444/index_html`` for the URL.
+#. Select "Open in new Composer window."
+#. Click "Open". A new Composer window will open with ``index_html``
+ loaded.
+
+Python with M2Crypto
+====================
+
+This testing is done with M2Crypto 0.11 and Python 2.2.2 on FreeBSD.
+
+HTTPS
+=====
+
+::
+
+ >>> from M2Crypto import Rand, SSL, m2urllib
+ >>> url = m2urllib.FancyURLopener()
+ >>> url.addheader('Connection', 'close')
+ >>> u = url.open('https://127.0.0.1:9443/')
+ send: 'GET / HTTP/1.1\r\nHost: 127.0.0.1:9443\r\nAccept-Encoding: identity\r\nUser-agent: Python-urllib/1.15\r\nConnection: close\r\n\r\n'
+ reply: 'HTTP/1.1 200 OK\r\n'
+ header: Server: ZServerSSL/0.11
+ header: Date: Sun, 22 Jun 2003 13:42:34 GMT
+ header: Connection: close
+ header: Content-Type: text/html
+ header: Etag:
+ header: Content-Length: 535
+ >>> while 1:
+ ... data = u.read()
+ ... if not data: break
+ ... print(data)
+ ...
+
+::
+
+ <html><head>
+ <base href="https://127.0.0.1:9443/" />
+ <title>Zope</title></head><body bgcolor="#FFFFFF">
+
+ <h1>NgPS Desktop Portal</h1>
+
+ &nbsp;&nbsp;So many hacks.<br>
+ &nbsp;&nbsp;So little time.<br>
+
+ <h2>Link Farm</h2>
+ <ul>
+ <li><a href="http://localhost:8080/portal">Portal</a></li>
+ <li><a href="http://localhost/">Local Apache Home Page</a></li>
+ </ul>
+
+ <hr><a href="http://www.zope.org/Credits" target="_top"><img src="https://127.0.0.1:9443/p_/ZopeButton" width="115" height="50" border="0" alt="Powered by Zope" /></a></body></html>
+
+::
+
+ >>> u.close()
+ >>>
+
+XMLRPC-over-HTTPS
+=================
+
+::
+
+ >>> from M2Crypto.m2xmlrpclib import Server, SSL_Transport
+ >>> zs = Server('https://127.0.0.1:9443/', SSL_Transport())
+ >>> print(zs.propertyMap())
+ [{'type': 'string', 'id': 'title', 'mode': 'w'}]
+ >>>
+
+Conclusion
+==========
+
+Well, it works! ;-)
diff --git a/doc/html/_sources/howto.ca.txt b/doc/html/_sources/howto.ca.txt
new file mode 100644
index 0000000..e950b59
--- /dev/null
+++ b/doc/html/_sources/howto.ca.txt
@@ -0,0 +1,370 @@
+:orphan:
+
+.. _howto-ca:
+
+HOWTO: Creating your own CA with OpenSSL
+########################################
+
+:author: Pheng Siong Ng <ngps@post1.com>
+:copyright: © 2000, 2001 by Ng Pheng Siong.
+
+Introduction
+============
+
+This is a HOWTO on creating your own *certification authority* (*CA*)
+with OpenSSL.
+
+I last created a CA about a year ago, when I began work on
+`M2Crypto <https://gitlab.com/m2crypto/m2crypto/>`__ and needed
+certificates for the SSL bits. I accepted the tools' default
+settings then, e.g., certificate validity of 365 days; this meant
+that my certificates, including my CA's certificate, have now
+expired.
+
+Since I am using these certificates for M2Crypto's demonstration
+programs (and I have forgotten the passphrase to the CA's private
+key), I decided to discard the old CA and start afresh. I also
+decided to document the process, hence this HOWTO.
+
+The Procedure
+=============
+
+I use ``CA.pl``, a Perl program written by Steve Hanson and bundled with
+OpenSSL.
+
+The following are the steps to create a CA:
+
+1. Choose a directory to do your CA work. All commands are executed
+ within this directory. Let's call the directory ``demo``.
+
+2. Copy ``CA.pl`` and ``openssl.cnf`` into ``demo``.
+
+3. Apply the following patch to ``CA.pl``, which allows it to generate a
+ CA certificate with a validity period of 1095 days, i.e.,
+ 3 years::
+
+ --- CA.pl.org Sat Mar 31 12:40:13 2001
+ +++ CA.pl Sat Mar 31 12:41:15 2001
+ @@ -97,7 +97,7 @@
+ } else {
+ print "Making CA certificate ...\n";
+ system ("$REQ -new -x509 -keyout " .
+ - "${CATOP}/private/$CAKEY -out ${CATOP}/$CACERT $DAYS");
+ + "${CATOP}/private/$CAKEY -out ${CATOP}/$CACERT -days 1095");
+ $RET=$?;
+ }
+ }
+
+
+4. Create a new CA like this::
+
+ ./CA.pl -newca
+
+ A certificate filename (or enter to create) <enter>
+
+ Making CA certificate ...
+ Using configuration from openssl.cnf
+ Generating a 1024 bit RSA private key
+ ............++++++
+ ......................++++++
+ writing new private key to './demoCA/private/cakey.pem'
+ Enter PEM pass phrase: <secret passphrase here>
+ Verifying password - Enter PEM pass phrase: <secret passphrase again>
+ -----
+ You are about to be asked to enter information that will be incorporated
+ into your certificate request.
+ What you are about to enter is what is called a Distinguished Name or a DN.
+ There are quite a few fields but you can leave some blank
+ For some fields there will be a default value,
+ If you enter '.', the field will be left blank.
+ -----
+ Country Name (2 letter code) [AU]:SG
+ State or Province Name (full name) [Some-State]:.
+ Locality Name (eg, city) []:..
+ Organization Name (eg, company) [Internet Widgits Pty Ltd]:DemoCA
+ Organizational Unit Name (eg, section) []:.
+ Common Name (eg, YOUR name) []:DemoCA Certificate Master
+ Email Address []:certmaster@democa.dom
+
+ This creates a new CA in the directory ``demoCA``. The CA's
+ self-signed certificate is in ``demoCA/cacert.pem`` and its RSA key
+ pair is in ``demoCA/private/cakey.pem``.
+
+ ``demoCA/private/cakey.pem`` looks like this::
+
+ cat demoCA/private/cakey.pem
+
+ -----BEGIN RSA PRIVATE KEY-----
+ Proc-Type: 4,ENCRYPTED
+ DEK-Info: DES-EDE3-CBC,19973A9DBBB601BA
+
+ eOq9WFScNiI4/UWEUaSnGTKpJv2JYuMD3HwQox2Q3Cd4zGqVjJ6gF3exa5126cKf
+ X/bMVnwbPpuFZPiAIvaLyCjT6pYeXTBbSzs7/GQnvEOv+nYnDUFWi0Qm92qLk0uy
+ pFi/M1aWheN3vir2ZlAw+DW0bOOZhj8tC7Co7lMYb0YE271b6/YRPZCwQ3GXAHUJ
+ +aMYxlUDrK45aCUa/1CZDzTgk7h9cDgx2QJSIvYMYytCfI3zsuZMJS8/4OXLL0bI
+ lKmAc1dwB3DqGJt5XK4WJesiNfdxeCNEgAcYtEAgYZTPIApU+kTgTCIxJl2nMW7j
+ ax+Q1z7g+4MpgG20WD633D4z4dTlDdz+dnLi0rvuvxiwt+dUhrqiML1tyi+Z6EBH
+ jU4/cLBWev3rYfrlp4x8J9mDte0YKOk3t0wQOHqRetTsIfdtjnFp/Hu3qDmTCWjD
+ z/g7PPoO/bg/B877J9WBPbL/1hXXFYo88M+2aGlPOgDcFdiOqbLb2DCscohMbbVr
+ A4mgiy2kwWfIE73qiyV7yyG8FlRvr1iib+jbT3LTGf743utYAAs7HNGuOUObhoyt
+ jYvBD7ACn35P5YX7KTqvqErwdijxYCaNBCnvmRtmYSaNw9Kv1UJTxc5Vx7YLwIPk
+ E9KyBgKI7vPOjWBZ27+zOvNycmv1ciNtpALAw4bWtXnhCDVTHaVDy34OkheMzNCg
+ 2cjcBFzOkMIjcI03KbTQXOFIQGlsTWXGzkNf/zBQ+KksT1MCj+zBXSCvlDASMckg
+ kef21pGgUqPF14gKGfWX3sV4bjc1vbrRwq6zlG3nMuYqR5MtJJY9eQ==
+ -----END RSA PRIVATE KEY-----
+
+
+5. Next, generate a certificate request::
+
+ ./CA.pl -newreq
+
+ Using configuration from openssl.cnf
+ Generating a 1024 bit RSA private key
+ ..........++++++
+ ..............++++++
+ writing new private key to 'newreq.pem'
+ Enter PEM pass phrase: <another secret passphrase here>
+ Verifying password - Enter PEM pass phrase: <another secret passphrase again>
+ -----
+ You are about to be asked to enter information that will be incorporated
+ into your certificate request.
+ What you are about to enter is what is called a Distinguished Name or a DN.
+ There are quite a few fields but you can leave some blank
+ For some fields there will be a default value,
+ If you enter '.', the field will be left blank.
+ -----
+ Country Name (2 letter code) [AU]:SG
+ State or Province Name (full name) [Some-State]:..
+ Locality Name (eg, city) []:.
+ Organization Name (eg, company) [Internet Widgits Pty Ltd]:M2Crypto
+ Organizational Unit Name (eg, section) []:.
+ Common Name (eg, YOUR name) []:localhost
+ Email Address []:admin@server.example.dom
+
+ Please enter the following 'extra' attributes
+ to be sent with your certificate request
+ A challenge password []:<enter>
+ An optional company name []:<enter>
+ Request (and private key) is in newreq.pem
+
+\
+
+ The certificate request and private key in ``newreq.pem`` looks like
+ this::
+
+ cat newreq.pem
+
+ -----BEGIN RSA PRIVATE KEY-----
+ Proc-Type: 4,ENCRYPTED
+ DEK-Info: DES-EDE3-CBC,41B2874DF3D02DD4
+
+ mg611EoVkLEooSTv+qTM0Ddmm/M1jE/Jy5RD/sc3LSMhuGu9xc26OgsTJmkQuIAh
+ J/B4lAw8G59VTG6DykeEtrG0rUBx4bggc7PKbFuiN423YjJODWcHvVgnPOzXMQt+
+ lY4tPl5+217MRHyx2NsWGrpkQNdu3GeSPOVMl3jeQiaXupONbwQ7rj42+X/VtAJP
+ W4D1NNwu8aGCPyShsEXHc/fI1WDpphYWke97pOjIZVQESFZOPty5HjIYZux4U+td
+ W81xODtq2ecJXc8fn2Wpa9y5VD1LT7oJksOuL1+Z04OVaeUe4x0swM17HlBm2kVt
+ fe/C/L6kN27MwZhE331VjtTjSGl4/gknqQDbLOtqT06f3OISsDJETm2itllyhgzv
+ C6Fi3N03rGFmKectijC+tws5k+P+HRG6sai33usk8xPokJqA+HYSWPz1XVlpRmv4
+ kdjQOdST7ovU62mOTgf3ARcduPPwuzTfxOlYONe5NioO1APVHBrInQwcpLkpOTQR
+ vI4roIN+b75/nihUWGUJn/nbbBa2Yl0N5Gs1Tyiy9Z+CcRT2TfWKBBFlEUIFl7Mb
+ J9fTV3DI+k+akbR4il1NkQ8EcSmCr3WpA0I9n0EHI7ZVpVaHxc0sqaPFl8YGdFHq
+ 1Qk53C/w6+qPpDzT3yKFmG2LZytAAM1czvb6RbNRJJP2ZrpBwn/h99sUTo/yPfxY
+ nueYmFJDm0uVNtG0icXGNUfSfnjKNTtHPAgyKGetRIC3kgJz/bo2w7EI6iEjBAzK
+ l5TRm4x6ZJxwuXXMiJCehMMd8TC8ybwWO4AO19B3ebFFeTVsUgxSGA==
+ -----END RSA PRIVATE KEY-----
+ -----BEGIN CERTIFICATE REQUEST-----
+ MIIBnTCCAQYCAQAwXTELMAkGA1UEBhMCU0cxETAPBgNVBAoTCE0yQ3J5cHRvMRIw
+ EAYDVQQDEwlsb2NhbGhvc3QxJzAlBgkqhkiG9w0BCQEWGGFkbWluQHNlcnZlci5l
+ eGFtcGxlLmRvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAr1nYY1Qrll1r
+ uB/FqlCRrr5nvupdIN+3wF7q915tvEQoc74bnu6b8IbbGRMhzdzmvQ4SzFfVEAuM
+ MuTHeybPq5th7YDrTNizKKxOBnqE2KYuX9X22A1Kh49soJJFg6kPb9MUgiZBiMlv
+ tb7K3CHfgw5WagWnLl8Lb+ccvKZZl+8CAwEAAaAAMA0GCSqGSIb3DQEBBAUAA4GB
+ AHpoRp5YS55CZpy+wdigQEwjL/wSluvo+WjtpvP0YoBMJu4VMKeZi405R7o8oEwi
+ PdlrrliKNknFmHKIaCKTLRcU59ScA6ADEIWUzqmUzP5Cs6jrSRo3NKfg1bd09D1K
+ 9rsQkRc9Urv9mRBIsredGnYECNeRaK5R1yzpOowninXC
+ -----END CERTIFICATE REQUEST-----
+
+\
+
+ Decoding the certificate request gives the following::
+
+ openssl req -text -noout < newreq.pem
+
+ Using configuration from /usr/local/pkg/openssl/openssl.cnf
+ Certificate Request:
+ Data:
+ Version: 0 (0x0)
+ Subject: C=SG, O=M2Crypto, CN=localhost/Email=admin@server.example.dom
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ RSA Public Key: (1024 bit)
+ Modulus (1024 bit):
+ 00:af:59:d8:63:54:2b:96:5d:6b:b8:1f:c5:aa:50:
+ 91:ae:be:67:be:ea:5d:20:df:b7:c0:5e:ea:f7:5e:
+ 6d:bc:44:28:73:be:1b:9e:ee:9b:f0:86:db:19:13:
+ 21:cd:dc:e6:bd:0e:12:cc:57:d5:10:0b:8c:32:e4:
+ c7:7b:26:cf:ab:9b:61:ed:80:eb:4c:d8:b3:28:ac:
+ 4e:06:7a:84:d8:a6:2e:5f:d5:f6:d8:0d:4a:87:8f:
+ 6c:a0:92:45:83:a9:0f:6f:d3:14:82:26:41:88:c9:
+ 6f:b5:be:ca:dc:21:df:83:0e:56:6a:05:a7:2e:5f:
+ 0b:6f:e7:1c:bc:a6:59:97:ef
+ Exponent: 65537 (0x10001)
+ Attributes:
+ a0:00
+ Signature Algorithm: md5WithRSAEncryption
+ 7a:68:46:9e:58:4b:9e:42:66:9c:be:c1:d8:a0:40:4c:23:2f:
+ fc:12:96:eb:e8:f9:68:ed:a6:f3:f4:62:80:4c:26:ee:15:30:
+ a7:99:8b:8d:39:47:ba:3c:a0:4c:22:3d:d9:6b:ae:58:8a:36:
+ 49:c5:98:72:88:68:22:93:2d:17:14:e7:d4:9c:03:a0:03:10:
+ 85:94:ce:a9:94:cc:fe:42:b3:a8:eb:49:1a:37:34:a7:e0:d5:
+ b7:74:f4:3d:4a:f6:bb:10:91:17:3d:52:bb:fd:99:10:48:b2:
+ b7:9d:1a:76:04:08:d7:91:68:ae:51:d7:2c:e9:3a:8c:27:8a:
+ 75:c2
+
+6. Now, sign the certificate request::
+
+ ./CA.pl -sign
+
+ Using configuration from openssl.cnf
+ Enter PEM pass phrase: <CA's passphrase>
+ Check that the request matches the signature
+ Signature ok
+ The Subjects Distinguished Name is as follows
+ countryName :PRINTABLE:'SG'
+ organizationName :PRINTABLE:'M2Crypto'
+ commonName :PRINTABLE:'localhost'
+ emailAddress :IA5STRING:'admin@server.example.dom'
+ Certificate is to be certified until Mar 31 02:57:30 2002 GMT (365 days)
+ Sign the certificate? [y/n]:y
+
+
+ 1 out of 1 certificate requests certified, commit? [y/n]y
+ Write out database with 1 new entries
+ Data Base Updated
+ Signed certificate is in newcert.pem
+
+\
+
+ ``newcert.pem`` looks like this::
+
+ cat newcert.pem
+
+ Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 1 (0x1)
+ Signature Algorithm: md5WithRSAEncryption
+ Issuer: C=SG, O=DemoCA, CN=DemoCA Certificate Master/Email=certmaster@democa.dom
+ Validity
+ Not Before: Mar 31 02:57:30 2001 GMT
+ Not After : Mar 31 02:57:30 2002 GMT
+ Subject: C=SG, O=M2Crypto, CN=localhost/Email=admin@server.example.dom
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ RSA Public Key: (1024 bit)
+ Modulus (1024 bit):
+ 00:af:59:d8:63:54:2b:96:5d:6b:b8:1f:c5:aa:50:
+ 91:ae:be:67:be:ea:5d:20:df:b7:c0:5e:ea:f7:5e:
+ 6d:bc:44:28:73:be:1b:9e:ee:9b:f0:86:db:19:13:
+ 21:cd:dc:e6:bd:0e:12:cc:57:d5:10:0b:8c:32:e4:
+ c7:7b:26:cf:ab:9b:61:ed:80:eb:4c:d8:b3:28:ac:
+ 4e:06:7a:84:d8:a6:2e:5f:d5:f6:d8:0d:4a:87:8f:
+ 6c:a0:92:45:83:a9:0f:6f:d3:14:82:26:41:88:c9:
+ 6f:b5:be:ca:dc:21:df:83:0e:56:6a:05:a7:2e:5f:
+ 0b:6f:e7:1c:bc:a6:59:97:ef
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Basic Constraints:
+ Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 1 (0x1)
+ Signature Algorithm: md5WithRSAEncryption
+ Issuer: C=SG, O=DemoCA, CN=DemoCA Certificate Master/Email=certmaster@democa.dom
+ Validity
+ Not Before: Mar 31 02:57:30 2001 GMT
+ Not After : Mar 31 02:57:30 2002 GMT
+ Subject: C=SG, O=M2Crypto, CN=localhost/Email=admin@server.example.dom
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ RSA Public Key: (1024 bit)
+ Modulus (1024 bit):
+ 00:af:59:d8:63:54:2b:96:5d:6b:b8:1f:c5:aa:50:
+ 91:ae:be:67:be:ea:5d:20:df:b7:c0:5e:ea:f7:5e:
+ 6d:bc:44:28:73:be:1b:9e:ee:9b:f0:86:db:19:13:
+ 21:cd:dc:e6:bd:0e:12:cc:57:d5:10:0b:8c:32:e4:
+ c7:7b:26:cf:ab:9b:61:ed:80:eb:4c:d8:b3:28:ac:
+ 4e:06:7a:84:d8:a6:2e:5f:d5:f6:d8:0d:4a:87:8f:
+ 6c:a0:92:45:83:a9:0f:6f:d3:14:82:26:41:88:c9:
+ 6f:b5:be:ca:dc:21:df:83:0e:56:6a:05:a7:2e:5f:
+ 0b:6f:e7:1c:bc:a6:59:97:ef
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Basic Constraints:
+ CA:FALSE
+ Netscape Comment:
+ OpenSSL Generated Certificate
+ X509v3 Subject Key Identifier:
+ B3:D6:89:88:2F:B1:15:40:EC:0A:C0:30:35:3A:B7:DA:72:73:1B:4D
+ X509v3 Authority Key Identifier:
+ keyid:F9:6A:A6:34:97:6B:BC:BB:5A:17:0D:19:FC:62:21:0B:00:B5:0E:29
+ DirName:/C=SG/O=DemoCA/CN=DemoCA Certificate Master/Email=certmaster@democa.dom
+ serial:00
+
+ Signature Algorithm: md5WithRSAEncryption
+
+7. In certain situations, e.g., where your certificate and private key
+ are to be used in an unattended SSL server, you may wish to not
+ encrypt the private key, i.e., leave the key in the clear. This
+ decision should be governed by your site's security policy and threat
+ model, of course::
+
+ openssl rsa < newkey.pem > newkey2.pem
+
+ read RSA key
+ Enter PEM pass phrase:<secret passphrase here>
+ writing RSA key
+
+ ``newkey2.pem`` looks like this::
+
+ cat newkey2.pem
+
+ -----BEGIN RSA PRIVATE KEY-----
+ MIICXgIBAAKBgQCvWdhjVCuWXWu4H8WqUJGuvme+6l0g37fAXur3Xm28RChzvhue
+ 7pvwhtsZEyHN3Oa9DhLMV9UQC4wy5Md7Js+rm2HtgOtM2LMorE4GeoTYpi5f1fbY
+ DUqHj2ygkkWDqQ9v0xSCJkGIyW+1vsrcId+DDlZqBacuXwtv5xy8plmX7wIDAQAB
+ AoGAbAkU8w3W1Qu15Hle1bJSL7GMReoreqeblOBmMAZz4by0l6sXZXJpjWXo86f/
+ +dASMYTMPC4ZTYtv06N07AFbjL+kDfqDMTfzQkYMHp1LAq1Ihbq1rHWSBH5n3ekq
+ KiY8JKpv8DR5Po1iKaXJFuDByGDENJwYbSRSpSK3P+vkWWECQQDkEUE/ZPqqqZkQ
+ 2iWRPAsCbEID8SAraQl3DdCLYs/GgARfmmj4yUHEwkys9Jo1H8k4BdxugmaUwNi5
+ YQ/CVzrXAkEAxNO80ArbGxPUmr11GHG/bGBYj1DUBkHZSc7dgxZdtUCLGNxQnNsg
+ Iwq3n6j1sUzS3UW6abQ8bivYNOUcMKJAqQJBANQxFaLU4b/NQaODQ3aoBZpAfP9L
+ 5eFdvbet+7zjt2r5CpikgkwOfAmDuXEltx/8LevY0CllW+nErx9zJgVrwUsCQQCu
+ 76H5JiznPBDSF2FjgHWqVVdgyW4owY3mU739LHvNBLicN/RN9VPy0Suy8/CqzKT9
+ lWPBXzf2k3FuUdNkRlFBAkEAmpXoybuiFR2S5Bma/ax96lVs0/VihhfC1zZP/X/F
+ Br77+h9dIul+2DnyOl50zu0Sdzst1/7ay4JSDHyiBCMGSQ==
+ -----END RSA PRIVATE KEY-----
+
+
+That's it! The certificate, ``newcert.pem``, and the private key -
+``newkey.pem`` (encrypted) or ``newkey2.pem`` (unencrypted) - are now
+ready to be used. You may wish to rename the files to more intuitive
+names.
+
+You should also keep the CA's certificate ``demo/cacert.pem`` handy
+for use when developing and deploying SSL or S/MIME applications.
+
+Conclusion
+==========
+
+We've walked through the basic steps in the creation of a CA and
+certificates using the tools that come with OpenSSL. We did not cover
+more advanced topics such as constraining a certificate to be SSL-only
+or S/MIME-only.
+
+There exist several HOWTOs similar to this one on the net. This one is
+written specifically to facilitate discussions in my other HOWTOs on
+developing SSL and S/MIME applications in
+`Python <http://www.python.org>`__ using
+`M2Crypto <https://gitlab.com/m2crypto/m2crypto/>`__.
+
diff --git a/doc/html/_sources/howto.smime.txt b/doc/html/_sources/howto.smime.txt
new file mode 100644
index 0000000..715e7c4
--- /dev/null
+++ b/doc/html/_sources/howto.smime.txt
@@ -0,0 +1,778 @@
+:orphan:
+
+.. _howto-smime:
+
+HOWTO: Programming S/MIME in Python with M2Crypto
+=================================================
+
+:author: Pheng Siong Ng <ngps@post1.com>
+:copyright: © 2000, 2001 by Ng Pheng Siong.
+
+Introduction
+============
+
+`M2Crypto <https://gitlab.com/m2crypto/m2crypto/>`__ is a
+`Python <http://www.python.org>`__ interface to
+`OpenSSL <http://www.openssl.org>`__. It makes available to the Python
+programmer SSL functionality to implement clients and servers, S/MIME
+v2, RSA, DSA, DH, symmetric ciphers, message digests and HMACs.
+
+This document demonstrates programming S/MIME with M2Crypto.
+
+S/MIME
+======
+
+S/MIME - Secure Multipurpose Internet Mail Extensions [RFC 2311, RFC
+2312] - provides a consistent way to send and receive secure MIME data.
+Based on the popular Internet MIME standard, S/MIME provides the
+following cryptographic security services for electronic messaging
+applications - *authentication*, *message integrity* and
+*non-repudiation of origin* (using *digital signatures*), and *privacy*
+and *data security* (using *encryption*).
+
+Keys and Certificates
+=====================
+
+To create an S/MIME-signed message, you need an RSA key pair (this
+consists of a public key and a private key) and an X.509 certificate of
+said public key.
+
+To create an S/MIME-encrypted message, you need an X.509 certificate for
+each recipient.
+
+To create an S/MIME-signed *and* -encrypted message, first create a
+signed message, then encrypt the signed message with the recipients'
+certificates.
+
+You may generate key pairs and obtain certificates by using a commercial
+*certification authority* service.
+
+You can also do so using freely-available software. For many purposes,
+e.g., automated S/MIME messaging by system administration processes,
+this approach is cheap and effective.
+
+We now work through using OpenSSL to generate key pairs and
+certificates. This assumes you have OpenSSL installed properly on your
+system.
+
+First, we generate an X.509 certificate to be used for signing::
+
+ openssl req -newkey rsa:1024 -nodes -x509 -days 365 -out signer.pem
+
+ Using configuration from /usr/local/pkg/openssl/openssl.cnf
+ Generating a 1024 bit RSA private key
+ ..++++++
+ ....................++++++
+ writing new private key to 'privkey.pem'
+ -----
+ You are about to be asked to enter information that will be incorporated
+ into your certificate request.
+ What you are about to enter is what is called a Distinguished Name or a DN.
+ There are quite a few fields but you can leave some blank
+ For some fields there will be a default value,
+ If you enter '.', the field will be left blank.
+ -----
+ Country Name (2 letter code) [AU]:SG
+ State or Province Name (full name) [Some-State]:.
+ Locality Name (eg, city) []:.
+ Organization Name (eg, company) [Internet Widgits Pty Ltd]:M2Crypto
+ Organizational Unit Name (eg, section) []:.
+ Common Name (eg, YOUR name) []:S/MIME Sender
+ Email Address []:sender@example.dom
+
+
+This generates a 1024-bit RSA key pair, unencrypted, into
+``privkey.pem``; it also generates a self-signed X.509 certificate for
+the public key into ``signer.pem``. The certificate is valid for 365
+days, i.e., a year.
+
+Let's rename ``privkey.pem`` so that we know it is a companion of
+``signer.pem``'s::
+
+ mv privkey.pem signer_key.pem
+
+To verify the content of ``signer.pem``, execute the following::
+
+ openssl x509 -noout -text -in signer.pem
+
+ Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 0 (0x0)
+ Signature Algorithm: md5WithRSAEncryption
+ Issuer: C=SG, O=M2Crypto, CN=S/MIME Sender/Email=sender@example.dom
+ Validity
+ Not Before: Mar 24 12:56:16 2001 GMT
+ Not After : Mar 24 12:56:16 2002 GMT
+ Subject: C=SG, O=M2Crypto, CN=S/MIME Sender/Email=sender@example.dom
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ RSA Public Key: (1024 bit)
+ Modulus (1024 bit):
+ 00:a9:d6:e2:b5:11:3b:ae:3c:e2:17:31:70:e1:6e:
+ 01:f4:19:6d:bd:2a:42:36:2b:37:34:e2:83:1d:0d:
+ 11:2e:b4:99:44:db:10:67:be:97:5f:5b:1a:26:33:
+ 46:23:2f:95:04:7a:35:da:9d:f9:26:88:39:9e:17:
+ cd:3e:eb:a8:19:8d:a8:2a:f1:43:da:55:a9:2e:2c:
+ 65:ed:04:71:42:ce:73:53:b8:ea:7e:c7:f0:23:c6:
+ 63:c5:5e:68:96:64:a7:b4:2a:94:26:76:eb:79:ea:
+ e3:4e:aa:82:09:4f:44:87:4a:12:62:b5:d7:1f:ca:
+ f2:ce:d5:ba:7e:1f:48:fd:b9
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Subject Key Identifier:
+ 29:FB:38:B6:BF:E2:40:BB:FF:D5:71:D7:D5:C4:F0:83:1A:2B:C7:99
+ X509v3 Authority Key Identifier:
+ keyid:29:FB:38:B6:BF:E2:40:BB:FF:D5:71:D7:D5:C4:F0:83:1A:2B:C7:99
+ DirName:/C=SG/O=M2Crypto/CN=S/MIME Sender/Email=sender@example.dom
+ serial:00
+
+ X509v3 Basic Constraints:
+ CA:TRUE
+ Signature Algorithm: md5WithRSAEncryption
+ 68:c8:6b:1b:fa:7c:9a:39:35:76:18:15:c9:fd:89:97:62:db:
+ 7a:b0:2d:13:dd:97:e8:1b:7a:9f:22:27:83:24:9d:2e:56:ec:
+ 97:89:3c:ef:16:55:80:5a:18:7c:22:d0:f6:bb:e3:a4:e8:59:
+ 30:ff:99:5a:93:3e:ea:bc:ee:7f:8d:d6:7d:37:8c:ac:3d:74:
+ 80:ce:7a:99:ba:27:b9:2a:a3:71:fa:a5:25:ba:47:17:df:07:
+ 56:96:36:fd:60:b9:6c:96:06:e8:e3:7b:9f:4b:6a:95:71:a8:
+ 34:fc:fc:b5:88:8b:c4:3f:1e:24:f6:52:47:b2:7d:44:67:d9:
+ 83:e8
+
+Next, we generate a self-signed X.509 certificate for the recipient.
+Note that ``privkey.pem`` will be recreated::
+
+ openssl req -newkey rsa:1024 -nodes -x509 -days 365 -out recipient.pem
+
+ Using configuration from /usr/local/pkg/openssl/openssl.cnf
+ Generating a 1024 bit RSA private key
+ .....................................++++++
+ .................++++++
+ writing new private key to 'privkey.pem'
+ -----
+ You are about to be asked to enter information that will be incorporated
+ into your certificate request.
+ What you are about to enter is what is called a Distinguished Name or a DN.
+ There are quite a few fields but you can leave some blank
+ For some fields there will be a default value,
+ If you enter '.', the field will be left blank.
+ -----
+ Country Name (2 letter code) [AU]:SG
+ State or Province Name (full name) [Some-State]:.
+ Locality Name (eg, city) []:.
+ Organization Name (eg, company) [Internet Widgits Pty Ltd]:M2Crypto
+ Organizational Unit Name (eg, section) []:.
+ Common Name (eg, YOUR name) []:S/MIME Recipient
+ Email Address []:recipient@example.dom
+
+Again, rename ``privkey.pem``::
+
+ mv privkey.pem recipient_key.pem
+
+
+In the examples to follow, S/MIME Sender, ``<sender@example.dom>``,
+shall be the sender of S/MIME messages, while S/MIME Recipient,
+``<recipient@example.dom>``, shall be the recipient of S/MIME messages.
+
+Armed with the key pairs and certificates, we are now ready to begin
+programming S/MIME in Python.
+
+ **Note:** The private keys generated above are *not
+ passphrase-protected*, i.e., they are *in the clear*. Anyone who has
+ access to such a key can generate S/MIME-signed messages with it,
+ and decrypt S/MIME messages encrypted to it's corresponding public
+ key.
+
+ We may passphrase-protect the keys, if we so choose. M2Crypto will
+ prompt the user for the passphrase when such a key is being loaded.
+
+M2Crypto.SMIME
+==============
+
+The Python programmer accesses M2Crypto's S/MIME functionality through
+class ``SMIME`` in the module ``M2Crypto.SMIME``. Typically, an
+``SMIME`` object is instantiated; the object is then set up for the
+intended operation: sign, encrypt, decrypt or verify; finally, the
+operation is invoked on the object.
+
+``M2Crypto.SMIME`` makes extensive use of ``M2Crypto.BIO``:
+``M2Crypto.BIO`` is a Python abstraction of the ``BIO`` abstraction in
+OpenSSL. A commonly used ``BIO`` abstraction in M2Crypto is
+``M2Crypto.BIO.MemoryBuffer``, which implements a memory-based file-like
+object, similar to Python's own ``StringIO``.
+
+Sign
+====
+
+The following code demonstrates how to generate an S/MIME-signed
+message. ``randpool.dat`` contains random data which is used to seed
+OpenSSL's pseudo-random number generator via M2Crypto::
+
+ from M2Crypto import BIO, Rand, SMIME
+
+ def makebuf(text):
+ return BIO.MemoryBuffer(text)
+
+ # Make a MemoryBuffer of the message.
+ buf = makebuf('a sign of our times')
+
+ # Seed the PRNG.
+ Rand.load_file('randpool.dat', -1)
+
+ # Instantiate an SMIME object; set it up; sign the buffer.
+ s = SMIME.SMIME()
+ s.load_key('signer_key.pem', 'signer.pem')
+ p7 = s.sign(buf, SMIME.PKCS7_DETACHED)
+
+
+``p7`` now contains a *PKCS #7 signature blob* wrapped in an
+``M2Crypto.SMIME.PKCS7`` object. Note that ``buf`` has been consumed by
+``sign()`` and has to be recreated if it is to be used again.
+
+We may now send the signed message via SMTP. In these examples, we shall
+not do so; instead, we'll render the S/MIME output in mail-friendly
+format, and pretend that our messages are sent and received
+correctly::
+
+ # Recreate buf.
+ buf = makebuf('a sign of our times')
+
+ # Output p7 in mail-friendly format.
+ out = BIO.MemoryBuffer()
+ out.write('From: sender@example.dom\n')
+ out.write('To: recipient@example.dom\n')
+ out.write('Subject: M2Crypto S/MIME testing\n')
+ s.write(out, p7, buf)
+
+ print(out.read())
+
+ # Save the PRNG's state.
+ Rand.save_file('randpool.dat')
+
+Here's the output::
+
+ From: sender@example.dom
+ To: recipient@example.dom
+ Subject: M2Crypto S/MIME testing
+ MIME-Version: 1.0
+ Content-Type: multipart/signed ; protocol="application/x-pkcs7-signature" ; micalg=sha1 ; boundary="----3C93156FC7B4EBF49FE9C7DB7F503087"
+
+ This is an S/MIME signed message
+
+ ------3C93156FC7B4EBF49FE9C7DB7F503087
+ a sign of our times
+ ------3C93156FC7B4EBF49FE9C7DB7F503087
+ Content-Type: application/x-pkcs7-signature; name="smime.p7s"
+ Content-Transfer-Encoding: base64
+ Content-Disposition: attachment; filename="smime.p7s"
+
+ MIIE8AYJKoZIhvcNAQcCoIIE4TCCBN0CAQExCzAJBgUrDgMCGgUAMCIGCSqGSIb3
+ DQEHAaAVBBNhIHNpZ24gb2Ygb3VyIHRpbWVzoIIC5zCCAuMwggJMoAMCAQICAQAw
+ DQYJKoZIhvcNAQEEBQAwWzELMAkGA1UEBhMCU0cxETAPBgNVBAoTCE0yQ3J5cHRv
+ MRYwFAYDVQQDEw1TL01JTUUgU2VuZGVyMSEwHwYJKoZIhvcNAQkBFhJzZW5kZXJA
+ ZXhhbXBsZS5kb20wHhcNMDEwMzMxMTE0MDMzWhcNMDIwMzMxMTE0MDMzWjBbMQsw
+ CQYDVQQGEwJTRzERMA8GA1UEChMITTJDcnlwdG8xFjAUBgNVBAMTDVMvTUlNRSBT
+ ZW5kZXIxITAfBgkqhkiG9w0BCQEWEnNlbmRlckBleGFtcGxlLmRvbTCBnzANBgkq
+ hkiG9w0BAQEFAAOBjQAwgYkCgYEA5c5Tj1CHTSOxa1q2q0FYiwMWYHptJpJcvtZm
+ UwrgU5sHrA8OnCM0cDXEj0KPf3cfNjHffB8HWMzI4UEgNmFXQNsxoGZ+iqwxLlNj
+ y9Mh7eFW/Bjq5hNXbouSlQ0rWBRkoxV64y+t6lQehb32WfYXQbKFxFJSXzSxOx3R
+ 8YhSPd0CAwEAAaOBtjCBszAdBgNVHQ4EFgQUXOyolL1t4jaBwZFRM7MS8nBLzUow
+ gYMGA1UdIwR8MHqAFFzsqJS9beI2gcGRUTOzEvJwS81KoV+kXTBbMQswCQYDVQQG
+ EwJTRzERMA8GA1UEChMITTJDcnlwdG8xFjAUBgNVBAMTDVMvTUlNRSBTZW5kZXIx
+ ITAfBgkqhkiG9w0BCQEWEnNlbmRlckBleGFtcGxlLmRvbYIBADAMBgNVHRMEBTAD
+ AQH/MA0GCSqGSIb3DQEBBAUAA4GBAHo3DrCHR86fSTVAvfiXdSswWqKtCEhUHRdC
+ TLFGl4hDk2GyZxaFuqZwiURz/H7nMicymI2wkz8H/wyHFg8G3BIehURpj2v/ZWXY
+ eovbgS7EZALVVkDj4hNl/IIHWd6Gtv1UODf7URbxtl3hQ9/eTWITrefT1heuPnar
+ 8czydsOLMYIBujCCAbYCAQEwYDBbMQswCQYDVQQGEwJTRzERMA8GA1UEChMITTJD
+ cnlwdG8xFjAUBgNVBAMTDVMvTUlNRSBTZW5kZXIxITAfBgkqhkiG9w0BCQEWEnNl
+ bmRlckBleGFtcGxlLmRvbQIBADAJBgUrDgMCGgUAoIGxMBgGCSqGSIb3DQEJAzEL
+ BgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTAxMDMzMTExNDUwMlowIwYJKoZI
+ hvcNAQkEMRYEFOoeRUd8ExIYXfQq8BTFuKWrSP3iMFIGCSqGSIb3DQEJDzFFMEMw
+ CgYIKoZIhvcNAwcwDgYIKoZIhvcNAwICAgCAMA0GCCqGSIb3DQMCAgFAMAcGBSsO
+ AwIHMA0GCCqGSIb3DQMCAgEoMA0GCSqGSIb3DQEBAQUABIGAQpU8hFUtLCF6hO2t
+ ec9EYJ/Imqqiiw+BxWxkUUVT81Vbjwdn9JST6+sztM5JRP2ZW+b4txEjZriYC8f3
+ kv95YMTGbIsuWkJ93GrbvqoJ/CxO23r9WWRnZEm/1EZN9ZmlrYqzBTxnNRmP3Dhj
+ cW8kzZwH+2/2zz2G7x1HxRWH95A=
+
+ ------3C93156FC7B4EBF49FE9C7DB7F503087--
+
+
+Verify
+======
+
+Assume the above output has been saved into ``sign.p7``. Let's now
+verify the signature::
+
+ from M2Crypto import SMIME, X509
+
+ # Instantiate an SMIME object.
+ s = SMIME.SMIME()
+
+ # Load the signer's cert.
+ x509 = X509.load_cert('signer.pem')
+ sk = X509.X509_Stack()
+ sk.push(x509)
+ s.set_x509_stack(sk)
+
+ # Load the signer's CA cert. In this case, because the signer's
+ # cert is self-signed, it is the signer's cert itself.
+ st = X509.X509_Store()
+ st.load_info('signer.pem')
+ s.set_x509_store(st)
+
+ # Load the data, verify it.
+ p7, data = SMIME.smime_load_pkcs7('sign.p7')
+ v = s.verify(p7, data)
+ print(v)
+ print(data)
+ print(data.read())
+
+Here's the output of the above program::
+
+ a sign of our times
+ <M2Crypto.BIO.BIO instance at 0x822012c>
+ a sign of our times
+
+Suppose, instead of loading ``signer.pem`` above, we load
+``recipient.pem``. That is, we do a global substitution of
+``recipient.pem`` for ``signer.pem`` in the above program. Here's the
+modified program's output::
+
+ Traceback (most recent call last):
+ File "./verify.py", line 22, in ?
+ v = s.verify(p7)
+ File "/usr/local/home/ngps/prog/m2/M2Crypto/SMIME.py", line 205, in verify
+ raise SMIME_Error, Err.get_error()
+ M2Crypto.SMIME.SMIME_Error: 312:error:21075075:PKCS7 routines:PKCS7_verify:certificate verify error:pk7_smime.c:213:Verify error:self signed certificate
+
+
+As displayed, the error is generated by line 213 of OpenSSL's
+``pk7_smime.c`` (as of OpenSSL 0.9.6); if you are a C programmer, you
+may wish to look up the C source to explore OpenSSL's S/MIME
+implementation and understand why the error message is worded thus.
+
+Encrypt
+=======
+
+We now demonstrate how to generate an S/MIME-encrypted message::
+
+ from M2Crypto import BIO, Rand, SMIME, X509
+
+ def makebuf(text):
+ return BIO.MemoryBuffer(text)
+
+ # Make a MemoryBuffer of the message.
+ buf = makebuf('a sign of our times')
+
+ # Seed the PRNG.
+ Rand.load_file('randpool.dat', -1)
+
+ # Instantiate an SMIME object.
+ s = SMIME.SMIME()
+
+ # Load target cert to encrypt to.
+ x509 = X509.load_cert('recipient.pem')
+ sk = X509.X509_Stack()
+ sk.push(x509)
+ s.set_x509_stack(sk)
+
+ # Set cipher: 3-key triple-DES in CBC mode.
+ s.set_cipher(SMIME.Cipher('des_ede3_cbc'))
+
+ # Encrypt the buffer.
+ p7 = s.encrypt(buf)
+
+ # Output p7 in mail-friendly format.
+ out = BIO.MemoryBuffer()
+ out.write('From: sender@example.dom\n')
+ out.write('To: recipient@example.dom\n')
+ out.write('Subject: M2Crypto S/MIME testing\n')
+ s.write(out, p7)
+
+ print(out.read())
+
+ # Save the PRNG's state.
+ Rand.save_file('randpool.dat')
+
+Here's the output of the above program::
+
+ From: sender@example.dom
+ To: recipient@example.dom
+ Subject: M2Crypto S/MIME testing
+ MIME-Version: 1.0
+ Content-Disposition: attachment; filename="smime.p7m"
+ Content-Type: application/x-pkcs7-mime; name="smime.p7m"
+ Content-Transfer-Encoding: base64
+
+ MIIBVwYJKoZIhvcNAQcDoIIBSDCCAUQCAQAxggEAMIH9AgEAMGYwYTELMAkGA1UE
+ BhMCU0cxETAPBgNVBAoTCE0yQ3J5cHRvMRkwFwYDVQQDExBTL01JTUUgUmVjaXBp
+ ZW50MSQwIgYJKoZIhvcNAQkBFhVyZWNpcGllbnRAZXhhbXBsZS5kb20CAQAwDQYJ
+ KoZIhvcNAQEBBQAEgYCBaXZ+qjpBEZwdP7gjfzfAtQitESyMwo3i+LBOw6sSDir6
+ FlNDPCnkrTvqDX3Rt6X6vBtTCYOm+qiN7ujPkOU61cN7h8dvHR8YW9+0IPY80/W0
+ lZ/HihSRgwTNd7LnxUUcPx8YV1id0dlmP0Hz+Lg+mHf6rqaR//JcYhX9vW4XvjA7
+ BgkqhkiG9w0BBwEwFAYIKoZIhvcNAwcECMN+qya6ADywgBgHr9Jkhwn5Gsdu7BwX
+ nIQfYTYcdL9I5Sk=
+
+
+Decrypt
+=======
+
+Assume the above output has been saved into ``encrypt.p7``. Decrypt the
+message thusly::
+
+ from M2Crypto import BIO, SMIME, X509
+
+ # Instantiate an SMIME object.
+ s = SMIME.SMIME()
+
+ # Load private key and cert.
+ s.load_key('recipient_key.pem', 'recipient.pem')
+
+ # Load the encrypted data.
+ p7, data = SMIME.smime_load_pkcs7('encrypt.p7')
+
+ # Decrypt p7.
+ out = s.decrypt(p7)
+
+ print(out)
+
+Here's the output::
+
+ a sign of our times
+
+
+Sign and Encrypt
+================
+
+Here's how to generate an S/MIME-signed/encrypted message::
+
+ from M2Crypto import BIO, Rand, SMIME, X509
+
+ def makebuf(text):
+ return BIO.MemoryBuffer(text)
+
+ # Make a MemoryBuffer of the message.
+ buf = makebuf('a sign of our times')
+
+ # Seed the PRNG.
+ Rand.load_file('randpool.dat', -1)
+
+ # Instantiate an SMIME object.
+ s = SMIME.SMIME()
+
+ # Load signer's key and cert. Sign the buffer.
+ s.load_key('signer_key.pem', 'signer.pem')
+ p7 = s.sign(buf)
+
+ # Load target cert to encrypt the signed message to.
+ x509 = X509.load_cert('recipient.pem')
+ sk = X509.X509_Stack()
+ sk.push(x509)
+ s.set_x509_stack(sk)
+
+ # Set cipher: 3-key triple-DES in CBC mode.
+ s.set_cipher(SMIME.Cipher('des_ede3_cbc'))
+
+ # Create a temporary buffer.
+ tmp = BIO.MemoryBuffer()
+
+ # Write the signed message into the temporary buffer.
+ s.write(tmp, p7)
+
+ # Encrypt the temporary buffer.
+ p7 = s.encrypt(tmp)
+
+ # Output p7 in mail-friendly format.
+ out = BIO.MemoryBuffer()
+ out.write('From: sender@example.dom\n')
+ out.write('To: recipient@example.dom\n')
+ out.write('Subject: M2Crypto S/MIME testing\n')
+ s.write(out, p7)
+
+ print(out.read())
+
+ # Save the PRNG's state.
+ Rand.save_file('randpool.dat')
+
+Here's the output of the above program::
+
+ From: sender@example.dom
+ To: recipient@example.dom
+ Subject: M2Crypto S/MIME testing
+ MIME-Version: 1.0
+ Content-Disposition: attachment; filename="smime.p7m"
+ Content-Type: application/x-pkcs7-mime; name="smime.p7m"
+ Content-Transfer-Encoding: base64
+
+ MIIIwwYJKoZIhvcNAQcDoIIItDCCCLACAQAxggEAMIH9AgEAMGYwYTELMAkGA1UE
+ BhMCU0cxETAPBgNVBAoTCE0yQ3J5cHRvMRkwFwYDVQQDExBTL01JTUUgUmVjaXBp
+ ZW50MSQwIgYJKoZIhvcNAQkBFhVyZWNpcGllbnRAZXhhbXBsZS5kb20CAQAwDQYJ
+ KoZIhvcNAQEBBQAEgYBlZlGupFphwhsGtIAPvDExN61qisz3oem88xoXkUW0SzoR
+ B9zJFFAuQTWzdNJgrKKYikhWjDojaAc/PFl1K5dYxRgtZLB36ULJD/v/yWmxnjz8
+ TvtK+Wbal2P/MH2pZ4LVERXa/snTElhCawUlwtiFz/JvY5CiF/dcwd+AwFQq4jCC
+ B6UGCSqGSIb3DQEHATAUBggqhkiG9w0DBwQIRF525UfwszaAggeA85RmX6AXQMxb
+ eBDz/LJeCgc3RqU1UwIsbKMquIs1S46Ebbm5nP75izPnujOkJ2hv+LNzqOWADmOl
+ +CnGEq1qxTyduIgUDA2nBgCL/gVyVy+/XC9dtImUUTxtxLgYtB0ujkBNsOaENOlM
+ fv4SGM3jkR+K/xlYG6HHzZGbfYyNGj2Y7yMZ1rL1m8SnRNmkCysKGTrudeNf6wT9
+ J6wO9DzLTioz3ZnVr3LjsSKIb4tIp4ugqNJaLuW7m3FtZ3MAgxN68hBbJs8TZ8tL
+ V/0jwUqS+grcgZEb9ymfcedxahtDUfHjRkpDpsxZzVVGkSBNcbQu92oByQVnRQ8m
+ wrYLp3/eawM5AvuV7HNpTT5ZR+1t8luishHN9899IMP2Vyg0Ub67FqFypYmM2cm2
+ sjAI4KpfvT00XFNvgLuYwYEKs9syGTO7hiHNQKcF44F5LYv6nTFwmFQB11dAtY9V
+ ull4D2CLDx9OvyNyKwdEZB5dyV0r/uKIdkhST60V2Q9KegpzgFpoZtSKM/HPYSVH
+ 1Bc9f3Q/GqZCvNZZCMx8UvRjQR8dRWDSmPJ0VXG1+wJ+fCmSPP3AuQ1/VsgPRqx2
+ 56VrpGPpGut40hV8xQFbWIZ2whwWLKPFAHj8B79ZtFUzUrU6Z2rNpvv8inHc/+S/
+ b6GR5s8/gucRblvd7n3OFNX5UJmPmcw9zWbu/1Dr9DY8l0nAQh21y5FGSS8B1wdE
+ oD2M3Lp7JbwjQbRtnDhImqul2S4yu+m+wDD1aR2K4k3GAI7KKgOBWT0+BDClcn8A
+ 4Ju6/YUbj33YlMPJgnGijLnolFy0hNW7TmWqR+8tSI3wO5eNKg4qwBnarqc3vgCV
+ quVxINAXyGQCO9lzdw6hudk8/+BlweGdqhONaIWbK5z1L/SfQo6LC9MTsj7FJydq
+ bc+kEbfZS8aSq7uc9axW6Ti0eAPJ8EVHtwhSBgZQRweKFBXs6HbbhMIdc4N0M7Oq
+ UiFXaF6s4n2uihVP6TqXtHEjTpZoC7pC+HCYiuKXUJtaqtXBOh+y3KLvHk09YL6D
+ XmTDg+UTiFsh4jKKm/BhdelbR5JbpJcj5AId76Mfr8+F/1g9ePOvsWHpQr/oIQTo
+ xEkaxCmzEgP0b6caMWfMUQrbVGxBBNcqKc/ir9fGGOPHATzzq/xLcQYvK1tZhd/D
+ ah/gpMPndsyvVCEuFPluWyDiM0VkwHgC2/3pJIYFHaxK64IutmPsy393rHMEB4kN
+ AHau6kWK+yL9qEVH1pP2zvswQ12P7gjt3T/G3bGsmvlXkEfztfjkXo6XnjcBNf5y
+ G+974AKLcjnk1gzIgarz+lAMY57Gkw4oNDMrTqVQ2OJQlvOSbllPXzH+aAiavB8W
+ ZPECLLwHxD4B1AuaiAArgKl935u/TOB+yQOR8JgGsUzROyJqHJ/SC51HkebgCkL1
+ aggtjgPlIBEXLZAlhpWLZ9lAQyrQpvCVJYwaOvfMmvRav4NAFNoZ2/Q7S4Tn1z+U
+ XX+f+GD58P4MPMhU5IKnz4yH4nlHnAiTEvcs85TZUAXze9g/uBOwZITeGtyLi52S
+ aETIr4v7SgXMepX7ThQ1Pv/jddsK/u4j2F34u0XktwCP+UrbfkE2mocdXvdzxbmd
+ tZSznK2qwgVSsPOs9MhUaepbnjmNBFFBrULhrUtSglM/VX/rWNiyh0aw4XYyHhIt
+ 9ZNlfEjKjJ67VEMBxBJ/ieUCouRGCxPYD1j65VT7oB3ZiyPu2F2nlUIcYNqPg1Sd
+ QBCrdaOXdJ0uLwyTAUeVE+wMbgscLvWsfZcCCJHAvw9NHFMUcnrdWxAYMVETNUOn
+ uryVAK7VfOldaz6z3NOSOi6nonNeHpR/sipBa4ik5xCRLT9e0S2QJgRvO9GyfAqz
+ 3DIzHtxIGePFzTiUYUTxS3i2gnMX2PEe3ChTLlYWD3jNeAKz0iOzpDphIF2xHLLQ
+ 1tCAqBmq/vUzALyDFFdFuTIqQZys4z/u4Dmyq9uXs421eN3v2hkVHvDy8uT2Ot29
+ lg4Q5YezR1EjaW//9guL1BXbcKrTEdtxeNqtem7SpZOMTSwD2lhB8z65GrX90Cyt
+ EMmaRSGYEdf5h1afL1SmKOMskbqxe1D2jG/vsXC7XX7xO/ioy0BdiJcYN1JiMOHJ
+ EOzFol5I20YkiV6j+cenfQFwc/NkaSxEkR8AUHJSbvUmRQRl6r0nnsFpZdR1w7pv
+ wkaT+eOpZynO4mY/ZtF6MpXJsixi6L4ZYXEbS6yHf+XGFfB0okILylmwv2bf6+Mq
+ nqXlmGj3Jwq7X9/+2BDqvfpFFX5lSmItKZAobLdssjFR6roJxOqRsGia2aZ+0+U5
+ VhgdITtnElgtHBaeZU5rHDswgdeLVBP+rGWnKxpJ+pLtNNi25sPYRcWFL6Erd25u
+ eXiY8GEIr+u7rqBWpc9HR34sAPRs3ubbCUleT748keCbx247ImBtiDctZxcc1O86
+ +0QjHP6HUT7FSo/FmT7a120S3Gd2jixGh06l/9ij5Z6mJa7Rm7TTbSjup/XISnOT
+ MKWcbI1nfVOhCv3xDq2eLae+s0oVoc041ceRazqFM2TL/Z6UXRME
+
+
+Decrypt and Verify
+==================
+
+Suppose the above output has been saved into ``se.p7``. The following
+demonstrates how to decrypt and verify it::
+
+ from M2Crypto import BIO, SMIME, X509
+
+ # Instantiate an SMIME object.
+ s = SMIME.SMIME()
+
+ # Load private key and cert.
+ s.load_key('recipient_key.pem', 'recipient.pem')
+
+ # Load the signed/encrypted data.
+ p7, data = SMIME.smime_load_pkcs7('se.p7')
+
+ # After the above step, 'data' == None.
+ # Decrypt p7. 'out' now contains a PKCS #7 signed blob.
+ out = s.decrypt(p7)
+
+ # Load the signer's cert.
+ x509 = X509.load_cert('signer.pem')
+ sk = X509.X509_Stack()
+ sk.push(x509)
+ s.set_x509_stack(sk)
+
+ # Load the signer's CA cert. In this case, because the signer's
+ # cert is self-signed, it is the signer's cert itself.
+ st = X509.X509_Store()
+ st.load_info('signer.pem')
+ s.set_x509_store(st)
+
+ # Recall 'out' contains a PKCS #7 blob.
+ # Transform 'out'; verify the resulting PKCS #7 blob.
+ p7_bio = BIO.MemoryBuffer(out)
+ p7, data = SMIME.smime_load_pkcs7_bio(p7_bio)
+ v = s.verify(p7)
+
+ print(v)
+
+
+The output is as follows::
+
+ a sign of our times
+
+
+Sending S/MIME messages via SMTP
+================================
+
+In the above examples, we've assumed that our S/MIME messages are sent
+and received automagically. The following is a Python function that
+generates S/MIME-signed/encrypted messages and sends them via
+SMTP::
+
+ from M2Crypto import BIO, SMIME, X509
+ import smtplib, string, sys
+
+ def sendsmime(from_addr, to_addrs, subject, msg, from_key, from_cert=None, to_certs=None, smtpd='localhost'):
+
+ msg_bio = BIO.MemoryBuffer(msg)
+ sign = from_key
+ encrypt = to_certs
+
+ s = SMIME.SMIME()
+ if sign:
+ s.load_key(from_key, from_cert)
+ if encrypt:
+ p7 = s.sign(msg_bio, flags=SMIME.PKCS7_TEXT)
+ else:
+ p7 = s.sign(msg_bio, flags=SMIME.PKCS7_TEXT|SMIME.PKCS7_DETACHED)
+ msg_bio = BIO.MemoryBuffer(msg) # Recreate coz sign() has consumed it.
+
+ if encrypt:
+ sk = X509.X509_Stack()
+ for x in to_certs:
+ sk.push(X509.load_cert(x))
+ s.set_x509_stack(sk)
+ s.set_cipher(SMIME.Cipher('des_ede3_cbc'))
+ tmp_bio = BIO.MemoryBuffer()
+ if sign:
+ s.write(tmp_bio, p7)
+ else:
+ tmp_bio.write(msg)
+ p7 = s.encrypt(tmp_bio)
+
+ out = BIO.MemoryBuffer()
+ out.write('From: %s\r\n' % from_addr)
+ out.write('To: %s\r\n' % string.join(to_addrs, ", "))
+ out.write('Subject: %s\r\n' % subject)
+ if encrypt:
+ s.write(out, p7)
+ else:
+ if sign:
+ s.write(out, p7, msg_bio, SMIME.PKCS7_TEXT)
+ else:
+ out.write('\r\n')
+ out.write(msg)
+ out.close()
+
+ smtp = smtplib.SMTP()
+ smtp.connect(smtpd)
+ smtp.sendmail(from_addr, to_addrs, out.read())
+ smtp.quit()
+
+
+This function sends plain, S/MIME-signed, S/MIME-encrypted, and
+S/MIME-signed/encrypted messages, depending on the parameters
+``from_key`` and ``to_certs``. The function's output interoperates with
+Netscape Messenger.
+
+Verifying origin of S/MIME messages
+===================================
+
+In our examples above that decrypt or verify messages, we skipped a
+step: verifying that the ``from`` address of the message matches the
+``email address`` attribute in the sender's certificate.
+
+The premise of current X.509 certification practice is that the CA is
+supposed to verify your identity, and to issue a certificate with
+``email address`` that matches your actual mail address. (Verisign's
+March 2001 failure in identity verification resulting in Microsoft
+certificates being issued to spoofers notwithstanding.)
+
+If you run your own CA, your certification practice is up to you, of
+course, and it would probably be part of your security policy.
+
+Whether your S/MIME messaging application needs to verify the ``from``
+addresses of S/MIME messages depends on your security policy and your
+system's threat model, as always.
+
+Interoperating with Netscape Messenger
+======================================
+
+Suppose S/MIME Recipient uses Netscape Messenger. To enable Messenger to
+handle S/MIME messages from S/MIME Sender, S/MIME Recipient needs to
+configure Messenger with his private key and certificate, as well as
+S/MIME Sender's certificate.
+
+ **Note:** Configuring Messenger's POP or IMAP settings so that it
+ retrieves mail correctly is beyond the scope of this HOWTO.
+
+The following steps demonstrate how to import S/MIME Recipient's private
+key and certificate for Messenger:
+
+1. Transform S/MIME Recipient's private key and certificate into *PKCS
+ #12* format::
+
+ openssl pkcs12 -export -in recipient.pem -inkey recipient_key.pem \
+ -name "S/MIME Recipient" -out recipient.p12
+
+ Enter Export Password:<enter>
+ Verifying password - Enter Export Password:<enter>
+
+2. Start Messenger.
+
+3. Click on the (open) "lock" icon at the bottom left corner of
+ Messenger's window. This brings up the "Security Info" dialog box.
+
+4. Click on "Yours" under "Certificates".
+
+5. Select "Import a certificate", then pick ``recipient.p12`` from the
+ ensuing file selection dialog box.
+
+Next, you need to import ``signer.pem`` as a CA certificate, so that
+Messenger will mark messages signed by S/MIME Sender as "trusted":
+
+1. Create a DER encoding of ``signer.pem``::
+
+ openssl x509 -inform pem -outform der -in signer.pem -out signer.der
+
+2. Install ``signer.der`` into Messenger as MIME type
+ ``application/x-x509-ca-cert``. You do this by downloading
+ ``signer.der`` via Navigator from a HTTP or HTTPS server, with the
+ correct MIME type mapping. (You may use ``demo/ssl/https_srv.py``,
+ bundled with M2Crypto, for this purpose.) Follow the series of dialog
+ boxes to accept ``signer.der`` as a CA for certifying email users.
+
+S/MIME Recipient is now able to decrypt and read S/MIME Sender's
+messages with Messenger. Messenger will indicate that S/MIME Sender's
+messages are signed, encrypted, or encrypted *and* signed, as the case
+may be, via the "stamp" icon on the message window's top right corner.
+
+Clicking on the "stamp" icon brings you to the Security Info dialog box.
+Messenger informs you that the message is, say, encrypted with 168-bit
+DES-EDE3-CBC and that it is digitally signed by the private key
+corresponding to the public key contained in the certificate
+``signer.pem``.
+
+Interoperating with Microsoft Outlook
+=====================================
+
+I do not know how to do this, as I do not use Outlook. (Nor do I use
+Netscape Messenger, actually. I use Mutt, top dog of MUAs. ;-)
+Information on how to configure Outlook with keys and certificates so
+that it handles S/MIME mail is gratefully accepted.
+
+ZSmime
+======
+
+ZSmime is a `Zope <http://www.zope.org>`__ *product* that enables Zope
+to generate S/MIME-signed/encrypted messages. ZSmime demonstrates how to
+invoke M2Crypto in a web application server extension.
+
+ZSmime has its own
+`HOWTO <http://sandbox.rulemaker.net/ngps/zope/zsmime/howto.html>`__
+explaining its usage. (That HOWTO has some overlap in content with this
+document.)
+
+Resources
+=========
+
+- IETF S/MIME Working Group - http://www.imc.org/ietf-smime
+
+- S/MIME and OpenPGP - http://www.imc.org/smime-pgpmime.html
+
+- S/MIME Freeware Library -
+ http://www.getronicsgov.com/hot/sfl_home.htm
+
+- Mozilla Network Security Services -
+ http://www.mozilla.org/projects/security/pkg/nss
+
+- S/MIME Cracking Screen Saver - http://www.counterpane.com/smime.html
diff --git a/doc/html/_sources/howto.ssl.txt b/doc/html/_sources/howto.ssl.txt
new file mode 100644
index 0000000..7f3278c
--- /dev/null
+++ b/doc/html/_sources/howto.ssl.txt
@@ -0,0 +1,131 @@
+:orphan:
+
+.. _howto-ssl:
+
+HOWTO: Programming SSL in Python with M2Crypto
+==============================================
+
+:author: Pheng Siong Ng <ngps@netmemetic.com> and Heikki Toivonen (heikki@osafoundation.org)
+:copyright: © 2000, 2001 by Ng Pheng Siong,
+ portions © 2006 by Open Source Applications Foundation
+
+Introduction
+============
+
+`M2Crypto <https://gitlab.com/m2crypto/m2crypto/>`__ is a
+`Python <http://www.python.org>`__ interface to
+`OpenSSL <http://www.openssl.org>`__. It makes available to the Python
+programmer SSL functionality to implement clients and servers, S/MIME
+v2, RSA, DSA, DH, symmetric ciphers, message digests and HMACs.
+
+This document demonstrates programming HTTPS with M2Crypto.
+
+A bit of history
+================
+
+M2Crypto was created during the time of Python 1.5, which features a
+module httplib providing client-side HTTP functionality. M2Crypto sports
+a httpslib based on httplib.
+
+Beginning with version 2.0, Python's socket module provided
+(rudimentary) SSL support. Also in the same version, httplib was
+enhanced with class HTTPConnection, which is more sophisticated than the
+old class HTTP, and HTTPSConnection, which does HTTPS.
+
+Subsequently, M2Crypto.httpslib grew a compatible (but not identical)
+class HTTPSConnection.
+
+The primary interface difference between the two HTTPSConnection classes
+is that M2Crypto's version accepts an M2Crypto.SSL.Context instance as a
+parameter, whereas Python 2.x's SSL support does not permit Pythonic
+control of the SSL context.
+
+Within the implementations, Python's ``HTTPSConnection`` employs a
+``FakeSocket`` object, which collects all input from the SSL connection
+before returning it to the application as a ``StringIO`` buffer, whereas
+M2Crypto's ``HTTPSConnection`` uses a buffering
+``M2Crypto.BIO.IOBuffer`` object that works over the underlying
+M2Crypto.SSL.Connection directly.
+
+Since then M2Crypto has gained a Twisted wrapper that allows securing
+Twisted SSL connections with M2Crypto.
+
+Secure SSL
+==========
+
+It is recommended that you read the book Network Security with OpenSSL
+by John Viega, Matt Messier and Pravir Chandra, ISBN 059600270X.
+
+Using M2Crypto does not automatically make an SSL connection secure.
+There are various steps that need to be made before we can make that
+claim. Let's see how a simple client can establish a secure
+connection::
+
+ ctx = SSL.Context()
+ ctx.set_verify(SSL.verify_peer | SSL.verify_fail_if_no_peer_cert, depth=9)
+ if ctx.load_verify_locations('ca.pem') != 1: raise Exception('No CA certs')
+ s = SSL.Connection(ctx)
+ s.connect(server_address)
+ # Normal protocol (for example HTTP) commands follow
+
+The first line creates an SSL context. The defaults allow any SSL
+version (except SSL version 2 which has known weaknesses) and sets the
+allowed ciphers to secure ones.
+
+The second line tells M2Crypto to perform certificate validation. The
+flags shown above are typical for clients, and requires the server to
+send a certificate. The depth parameter tells how long certificate
+chains are allowed - 9 is pretty common default, although probably too
+long in practice.
+
+The third line loads the allowed root (certificate authority or CA)
+certificates. Most Linux distributions come with CA certificates in
+suitable format. You could also download the
+`certdata.txt <http://mxr.mozilla.org/seamonkey/source//security/nss/lib/ckfw/builtins/certdata.txt?raw=1>`__
+file from the
+`NSS <http://www.mozilla.org/projects/security/pki/nss/>`__ project and
+convert it with the little M2Crypto utility script
+`demo/x509/certdata2pem.py <http://svn.osafoundation.org/m2crypto/trunk/demo/x509/certdata2pem.py>`__.
+
+The fourth line creates an SSL connection object with the secure
+context.
+
+The fifth line connects to the server. During this time we perform the
+last security step: just after connection, but before exchanging any
+data, we compare the commonName (or subjectAltName DNS field) field in
+the certificate the server returned to the server address we tried to
+connect to. This happens automatically with SSL.Connection and the
+Twisted wrapper class, and anything that uses those. In all other cases
+you must do the check manually. It is recommended you call the
+SSL.Checker to do the actual check.
+
+SSL servers are different in that they typically do not require the
+client to send a certificate, so there is usually no certificate
+checking. Also, it is typically useless to perform host name checking.
+
+Code Samples
+============
+
+The best samples of how to use the various SSL objects are in the tests
+directory, and the test\_ssl.py file specifically. There are additional
+samples in the demo directory, but they are not quaranteed to be up to
+date.
+
+NOTE: The tests and demos may not be secure as is. Use the information
+above on how to make them secure.
+
+ssldump
+=======
+
+ssldump "is an SSLv3/TLS network protocol analyser. It identifies TCP
+connections on the chosen network interface and attempts to interpret
+them as SSLv3/TLS traffic. When it identifies SSLv3/TLS traffic, it
+decodes the records and displays them in a textual form to stdout. If
+provided with the appropriate keying material, it will also decrypt the
+connections and display the application data traffic.
+
+If linked with OpenSSL, ssldump can display certificates in decoded form
+and decrypt traffic (provided that it has the appropriate keying
+material)."
+
+ssldump is written by Eric Rescorla.
diff --git a/doc/html/_sources/index.txt b/doc/html/_sources/index.txt
new file mode 100644
index 0000000..a472668
--- /dev/null
+++ b/doc/html/_sources/index.txt
@@ -0,0 +1,30 @@
+Welcome to M2Crypto's documentation!
+====================================
+
+Contents:
+
+.. toctree::
+ :maxdepth: 4
+
+ M2Crypto
+
+
+HOWTOs
+======
+
+* :ref:`howto-ca`
+
+* :ref:`howto-ssl`
+
+* :ref:`howto-smime`
+
+* :ref:`zserverssl-howto`
+
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
+
diff --git a/doc/html/_static/ajax-loader.gif b/doc/html/_static/ajax-loader.gif
new file mode 100644
index 0000000..61faf8c
--- /dev/null
+++ b/doc/html/_static/ajax-loader.gif
Binary files differ
diff --git a/doc/html/_static/basic.css b/doc/html/_static/basic.css
new file mode 100644
index 0000000..43e8baf
--- /dev/null
+++ b/doc/html/_static/basic.css
@@ -0,0 +1,540 @@
+/*
+ * basic.css
+ * ~~~~~~~~~
+ *
+ * Sphinx stylesheet -- basic theme.
+ *
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+/* -- main layout ----------------------------------------------------------- */
+
+div.clearer {
+ clear: both;
+}
+
+/* -- relbar ---------------------------------------------------------------- */
+
+div.related {
+ width: 100%;
+ font-size: 90%;
+}
+
+div.related h3 {
+ display: none;
+}
+
+div.related ul {
+ margin: 0;
+ padding: 0 0 0 10px;
+ list-style: none;
+}
+
+div.related li {
+ display: inline;
+}
+
+div.related li.right {
+ float: right;
+ margin-right: 5px;
+}
+
+/* -- sidebar --------------------------------------------------------------- */
+
+div.sphinxsidebarwrapper {
+ padding: 10px 5px 0 10px;
+}
+
+div.sphinxsidebar {
+ float: left;
+ width: 230px;
+ margin-left: -100%;
+ font-size: 90%;
+}
+
+div.sphinxsidebar ul {
+ list-style: none;
+}
+
+div.sphinxsidebar ul ul,
+div.sphinxsidebar ul.want-points {
+ margin-left: 20px;
+ list-style: square;
+}
+
+div.sphinxsidebar ul ul {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+div.sphinxsidebar form {
+ margin-top: 10px;
+}
+
+div.sphinxsidebar input {
+ border: 1px solid #98dbcc;
+ font-family: sans-serif;
+ font-size: 1em;
+}
+
+div.sphinxsidebar #searchbox input[type="text"] {
+ width: 170px;
+}
+
+div.sphinxsidebar #searchbox input[type="submit"] {
+ width: 30px;
+}
+
+img {
+ border: 0;
+}
+
+/* -- search page ----------------------------------------------------------- */
+
+ul.search {
+ margin: 10px 0 0 20px;
+ padding: 0;
+}
+
+ul.search li {
+ padding: 5px 0 5px 20px;
+ background-image: url(file.png);
+ background-repeat: no-repeat;
+ background-position: 0 7px;
+}
+
+ul.search li a {
+ font-weight: bold;
+}
+
+ul.search li div.context {
+ color: #888;
+ margin: 2px 0 0 30px;
+ text-align: left;
+}
+
+ul.keywordmatches li.goodmatch a {
+ font-weight: bold;
+}
+
+/* -- index page ------------------------------------------------------------ */
+
+table.contentstable {
+ width: 90%;
+}
+
+table.contentstable p.biglink {
+ line-height: 150%;
+}
+
+a.biglink {
+ font-size: 1.3em;
+}
+
+span.linkdescr {
+ font-style: italic;
+ padding-top: 5px;
+ font-size: 90%;
+}
+
+/* -- general index --------------------------------------------------------- */
+
+table.indextable {
+ width: 100%;
+}
+
+table.indextable td {
+ text-align: left;
+ vertical-align: top;
+}
+
+table.indextable dl, table.indextable dd {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+table.indextable tr.pcap {
+ height: 10px;
+}
+
+table.indextable tr.cap {
+ margin-top: 10px;
+ background-color: #f2f2f2;
+}
+
+img.toggler {
+ margin-right: 3px;
+ margin-top: 3px;
+ cursor: pointer;
+}
+
+div.modindex-jumpbox {
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+ margin: 1em 0 1em 0;
+ padding: 0.4em;
+}
+
+div.genindex-jumpbox {
+ border-top: 1px solid #ddd;
+ border-bottom: 1px solid #ddd;
+ margin: 1em 0 1em 0;
+ padding: 0.4em;
+}
+
+/* -- general body styles --------------------------------------------------- */
+
+a.headerlink {
+ visibility: hidden;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink {
+ visibility: visible;
+}
+
+div.body p.caption {
+ text-align: inherit;
+}
+
+div.body td {
+ text-align: left;
+}
+
+.field-list ul {
+ padding-left: 1em;
+}
+
+.first {
+ margin-top: 0 !important;
+}
+
+p.rubric {
+ margin-top: 30px;
+ font-weight: bold;
+}
+
+img.align-left, .figure.align-left, object.align-left {
+ clear: left;
+ float: left;
+ margin-right: 1em;
+}
+
+img.align-right, .figure.align-right, object.align-right {
+ clear: right;
+ float: right;
+ margin-left: 1em;
+}
+
+img.align-center, .figure.align-center, object.align-center {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.align-left {
+ text-align: left;
+}
+
+.align-center {
+ text-align: center;
+}
+
+.align-right {
+ text-align: right;
+}
+
+/* -- sidebars -------------------------------------------------------------- */
+
+div.sidebar {
+ margin: 0 0 0.5em 1em;
+ border: 1px solid #ddb;
+ padding: 7px 7px 0 7px;
+ background-color: #ffe;
+ width: 40%;
+ float: right;
+}
+
+p.sidebar-title {
+ font-weight: bold;
+}
+
+/* -- topics ---------------------------------------------------------------- */
+
+div.topic {
+ border: 1px solid #ccc;
+ padding: 7px 7px 0 7px;
+ margin: 10px 0 10px 0;
+}
+
+p.topic-title {
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 10px;
+}
+
+/* -- admonitions ----------------------------------------------------------- */
+
+div.admonition {
+ margin-top: 10px;
+ margin-bottom: 10px;
+ padding: 7px;
+}
+
+div.admonition dt {
+ font-weight: bold;
+}
+
+div.admonition dl {
+ margin-bottom: 0;
+}
+
+p.admonition-title {
+ margin: 0px 10px 5px 0px;
+ font-weight: bold;
+}
+
+div.body p.centered {
+ text-align: center;
+ margin-top: 25px;
+}
+
+/* -- tables ---------------------------------------------------------------- */
+
+table.docutils {
+ border: 0;
+ border-collapse: collapse;
+}
+
+table.docutils td, table.docutils th {
+ padding: 1px 8px 1px 5px;
+ border-top: 0;
+ border-left: 0;
+ border-right: 0;
+ border-bottom: 1px solid #aaa;
+}
+
+table.field-list td, table.field-list th {
+ border: 0 !important;
+}
+
+table.footnote td, table.footnote th {
+ border: 0 !important;
+}
+
+th {
+ text-align: left;
+ padding-right: 5px;
+}
+
+table.citation {
+ border-left: solid 1px gray;
+ margin-left: 1px;
+}
+
+table.citation td {
+ border-bottom: none;
+}
+
+/* -- other body styles ----------------------------------------------------- */
+
+ol.arabic {
+ list-style: decimal;
+}
+
+ol.loweralpha {
+ list-style: lower-alpha;
+}
+
+ol.upperalpha {
+ list-style: upper-alpha;
+}
+
+ol.lowerroman {
+ list-style: lower-roman;
+}
+
+ol.upperroman {
+ list-style: upper-roman;
+}
+
+dl {
+ margin-bottom: 15px;
+}
+
+dd p {
+ margin-top: 0px;
+}
+
+dd ul, dd table {
+ margin-bottom: 10px;
+}
+
+dd {
+ margin-top: 3px;
+ margin-bottom: 10px;
+ margin-left: 30px;
+}
+
+dt:target, .highlighted {
+ background-color: #fbe54e;
+}
+
+dl.glossary dt {
+ font-weight: bold;
+ font-size: 1.1em;
+}
+
+.field-list ul {
+ margin: 0;
+ padding-left: 1em;
+}
+
+.field-list p {
+ margin: 0;
+}
+
+.refcount {
+ color: #060;
+}
+
+.optional {
+ font-size: 1.3em;
+}
+
+.versionmodified {
+ font-style: italic;
+}
+
+.system-message {
+ background-color: #fda;
+ padding: 5px;
+ border: 3px solid red;
+}
+
+.footnote:target {
+ background-color: #ffa;
+}
+
+.line-block {
+ display: block;
+ margin-top: 1em;
+ margin-bottom: 1em;
+}
+
+.line-block .line-block {
+ margin-top: 0;
+ margin-bottom: 0;
+ margin-left: 1.5em;
+}
+
+.guilabel, .menuselection {
+ font-family: sans-serif;
+}
+
+.accelerator {
+ text-decoration: underline;
+}
+
+.classifier {
+ font-style: oblique;
+}
+
+abbr, acronym {
+ border-bottom: dotted 1px;
+ cursor: help;
+}
+
+/* -- code displays --------------------------------------------------------- */
+
+pre {
+ overflow: auto;
+ overflow-y: hidden; /* fixes display issues on Chrome browsers */
+}
+
+td.linenos pre {
+ padding: 5px 0px;
+ border: 0;
+ background-color: transparent;
+ color: #aaa;
+}
+
+table.highlighttable {
+ margin-left: 0.5em;
+}
+
+table.highlighttable td {
+ padding: 0 0.5em 0 0.5em;
+}
+
+tt.descname {
+ background-color: transparent;
+ font-weight: bold;
+ font-size: 1.2em;
+}
+
+tt.descclassname {
+ background-color: transparent;
+}
+
+tt.xref, a tt {
+ background-color: transparent;
+ font-weight: bold;
+}
+
+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
+ background-color: transparent;
+}
+
+.viewcode-link {
+ float: right;
+}
+
+.viewcode-back {
+ float: right;
+ font-family: sans-serif;
+}
+
+div.viewcode-block:target {
+ margin: -1px -10px;
+ padding: 0 10px;
+}
+
+/* -- math display ---------------------------------------------------------- */
+
+img.math {
+ vertical-align: middle;
+}
+
+div.body div.math p {
+ text-align: center;
+}
+
+span.eqno {
+ float: right;
+}
+
+/* -- printout stylesheet --------------------------------------------------- */
+
+@media print {
+ div.document,
+ div.documentwrapper,
+ div.bodywrapper {
+ margin: 0 !important;
+ width: 100%;
+ }
+
+ div.sphinxsidebar,
+ div.related,
+ div.footer,
+ #top-link {
+ display: none;
+ }
+} \ No newline at end of file
diff --git a/doc/html/_static/comment-bright.png b/doc/html/_static/comment-bright.png
new file mode 100644
index 0000000..551517b
--- /dev/null
+++ b/doc/html/_static/comment-bright.png
Binary files differ
diff --git a/doc/html/_static/comment-close.png b/doc/html/_static/comment-close.png
new file mode 100644
index 0000000..09b54be
--- /dev/null
+++ b/doc/html/_static/comment-close.png
Binary files differ
diff --git a/doc/html/_static/comment.png b/doc/html/_static/comment.png
new file mode 100644
index 0000000..92feb52
--- /dev/null
+++ b/doc/html/_static/comment.png
Binary files differ
diff --git a/doc/html/_static/default.css b/doc/html/_static/default.css
new file mode 100644
index 0000000..21f3f50
--- /dev/null
+++ b/doc/html/_static/default.css
@@ -0,0 +1,256 @@
+/*
+ * default.css_t
+ * ~~~~~~~~~~~~~
+ *
+ * Sphinx stylesheet -- default theme.
+ *
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+@import url("basic.css");
+
+/* -- page layout ----------------------------------------------------------- */
+
+body {
+ font-family: sans-serif;
+ font-size: 100%;
+ background-color: #11303d;
+ color: #000;
+ margin: 0;
+ padding: 0;
+}
+
+div.document {
+ background-color: #1c4e63;
+}
+
+div.documentwrapper {
+ float: left;
+ width: 100%;
+}
+
+div.bodywrapper {
+ margin: 0 0 0 230px;
+}
+
+div.body {
+ background-color: #ffffff;
+ color: #000000;
+ padding: 0 20px 30px 20px;
+}
+
+div.footer {
+ color: #ffffff;
+ width: 100%;
+ padding: 9px 0 9px 0;
+ text-align: center;
+ font-size: 75%;
+}
+
+div.footer a {
+ color: #ffffff;
+ text-decoration: underline;
+}
+
+div.related {
+ background-color: #133f52;
+ line-height: 30px;
+ color: #ffffff;
+}
+
+div.related a {
+ color: #ffffff;
+}
+
+div.sphinxsidebar {
+}
+
+div.sphinxsidebar h3 {
+ font-family: 'Trebuchet MS', sans-serif;
+ color: #ffffff;
+ font-size: 1.4em;
+ font-weight: normal;
+ margin: 0;
+ padding: 0;
+}
+
+div.sphinxsidebar h3 a {
+ color: #ffffff;
+}
+
+div.sphinxsidebar h4 {
+ font-family: 'Trebuchet MS', sans-serif;
+ color: #ffffff;
+ font-size: 1.3em;
+ font-weight: normal;
+ margin: 5px 0 0 0;
+ padding: 0;
+}
+
+div.sphinxsidebar p {
+ color: #ffffff;
+}
+
+div.sphinxsidebar p.topless {
+ margin: 5px 10px 10px 10px;
+}
+
+div.sphinxsidebar ul {
+ margin: 10px;
+ padding: 0;
+ color: #ffffff;
+}
+
+div.sphinxsidebar a {
+ color: #98dbcc;
+}
+
+div.sphinxsidebar input {
+ border: 1px solid #98dbcc;
+ font-family: sans-serif;
+ font-size: 1em;
+}
+
+
+
+/* -- hyperlink styles ------------------------------------------------------ */
+
+a {
+ color: #355f7c;
+ text-decoration: none;
+}
+
+a:visited {
+ color: #355f7c;
+ text-decoration: none;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+
+
+/* -- body styles ----------------------------------------------------------- */
+
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+ font-family: 'Trebuchet MS', sans-serif;
+ background-color: #f2f2f2;
+ font-weight: normal;
+ color: #20435c;
+ border-bottom: 1px solid #ccc;
+ margin: 20px -20px 10px -20px;
+ padding: 3px 0 3px 10px;
+}
+
+div.body h1 { margin-top: 0; font-size: 200%; }
+div.body h2 { font-size: 160%; }
+div.body h3 { font-size: 140%; }
+div.body h4 { font-size: 120%; }
+div.body h5 { font-size: 110%; }
+div.body h6 { font-size: 100%; }
+
+a.headerlink {
+ color: #c60f0f;
+ font-size: 0.8em;
+ padding: 0 4px 0 4px;
+ text-decoration: none;
+}
+
+a.headerlink:hover {
+ background-color: #c60f0f;
+ color: white;
+}
+
+div.body p, div.body dd, div.body li {
+ text-align: justify;
+ line-height: 130%;
+}
+
+div.admonition p.admonition-title + p {
+ display: inline;
+}
+
+div.admonition p {
+ margin-bottom: 5px;
+}
+
+div.admonition pre {
+ margin-bottom: 5px;
+}
+
+div.admonition ul, div.admonition ol {
+ margin-bottom: 5px;
+}
+
+div.note {
+ background-color: #eee;
+ border: 1px solid #ccc;
+}
+
+div.seealso {
+ background-color: #ffc;
+ border: 1px solid #ff6;
+}
+
+div.topic {
+ background-color: #eee;
+}
+
+div.warning {
+ background-color: #ffe4e4;
+ border: 1px solid #f66;
+}
+
+p.admonition-title {
+ display: inline;
+}
+
+p.admonition-title:after {
+ content: ":";
+}
+
+pre {
+ padding: 5px;
+ background-color: #eeffcc;
+ color: #333333;
+ line-height: 120%;
+ border: 1px solid #ac9;
+ border-left: none;
+ border-right: none;
+}
+
+tt {
+ background-color: #ecf0f3;
+ padding: 0 1px 0 1px;
+ font-size: 0.95em;
+}
+
+th {
+ background-color: #ede;
+}
+
+.warning tt {
+ background: #efc2c2;
+}
+
+.note tt {
+ background: #d6d6d6;
+}
+
+.viewcode-back {
+ font-family: sans-serif;
+}
+
+div.viewcode-block:target {
+ background-color: #f4debf;
+ border-top: 1px solid #ac9;
+ border-bottom: 1px solid #ac9;
+} \ No newline at end of file
diff --git a/doc/html/_static/doctools.js b/doc/html/_static/doctools.js
new file mode 100644
index 0000000..d4619fd
--- /dev/null
+++ b/doc/html/_static/doctools.js
@@ -0,0 +1,247 @@
+/*
+ * doctools.js
+ * ~~~~~~~~~~~
+ *
+ * Sphinx JavaScript utilities for all documentation.
+ *
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+/**
+ * select a different prefix for underscore
+ */
+$u = _.noConflict();
+
+/**
+ * make the code below compatible with browsers without
+ * an installed firebug like debugger
+if (!window.console || !console.firebug) {
+ var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
+ "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
+ "profile", "profileEnd"];
+ window.console = {};
+ for (var i = 0; i < names.length; ++i)
+ window.console[names[i]] = function() {};
+}
+ */
+
+/**
+ * small helper function to urldecode strings
+ */
+jQuery.urldecode = function(x) {
+ return decodeURIComponent(x).replace(/\+/g, ' ');
+}
+
+/**
+ * small helper function to urlencode strings
+ */
+jQuery.urlencode = encodeURIComponent;
+
+/**
+ * This function returns the parsed url parameters of the
+ * current request. Multiple values per key are supported,
+ * it will always return arrays of strings for the value parts.
+ */
+jQuery.getQueryParameters = function(s) {
+ if (typeof s == 'undefined')
+ s = document.location.search;
+ var parts = s.substr(s.indexOf('?') + 1).split('&');
+ var result = {};
+ for (var i = 0; i < parts.length; i++) {
+ var tmp = parts[i].split('=', 2);
+ var key = jQuery.urldecode(tmp[0]);
+ var value = jQuery.urldecode(tmp[1]);
+ if (key in result)
+ result[key].push(value);
+ else
+ result[key] = [value];
+ }
+ return result;
+};
+
+/**
+ * small function to check if an array contains
+ * a given item.
+ */
+jQuery.contains = function(arr, item) {
+ for (var i = 0; i < arr.length; i++) {
+ if (arr[i] == item)
+ return true;
+ }
+ return false;
+};
+
+/**
+ * highlight a given string on a jquery object by wrapping it in
+ * span elements with the given class name.
+ */
+jQuery.fn.highlightText = function(text, className) {
+ function highlight(node) {
+ if (node.nodeType == 3) {
+ var val = node.nodeValue;
+ var pos = val.toLowerCase().indexOf(text);
+ if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) {
+ var span = document.createElement("span");
+ span.className = className;
+ span.appendChild(document.createTextNode(val.substr(pos, text.length)));
+ node.parentNode.insertBefore(span, node.parentNode.insertBefore(
+ document.createTextNode(val.substr(pos + text.length)),
+ node.nextSibling));
+ node.nodeValue = val.substr(0, pos);
+ }
+ }
+ else if (!jQuery(node).is("button, select, textarea")) {
+ jQuery.each(node.childNodes, function() {
+ highlight(this);
+ });
+ }
+ }
+ return this.each(function() {
+ highlight(this);
+ });
+};
+
+/**
+ * Small JavaScript module for the documentation.
+ */
+var Documentation = {
+
+ init : function() {
+ this.fixFirefoxAnchorBug();
+ this.highlightSearchWords();
+ this.initIndexTable();
+ },
+
+ /**
+ * i18n support
+ */
+ TRANSLATIONS : {},
+ PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; },
+ LOCALE : 'unknown',
+
+ // gettext and ngettext don't access this so that the functions
+ // can safely bound to a different name (_ = Documentation.gettext)
+ gettext : function(string) {
+ var translated = Documentation.TRANSLATIONS[string];
+ if (typeof translated == 'undefined')
+ return string;
+ return (typeof translated == 'string') ? translated : translated[0];
+ },
+
+ ngettext : function(singular, plural, n) {
+ var translated = Documentation.TRANSLATIONS[singular];
+ if (typeof translated == 'undefined')
+ return (n == 1) ? singular : plural;
+ return translated[Documentation.PLURALEXPR(n)];
+ },
+
+ addTranslations : function(catalog) {
+ for (var key in catalog.messages)
+ this.TRANSLATIONS[key] = catalog.messages[key];
+ this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
+ this.LOCALE = catalog.locale;
+ },
+
+ /**
+ * add context elements like header anchor links
+ */
+ addContextElements : function() {
+ $('div[id] > :header:first').each(function() {
+ $('<a class="headerlink">\u00B6</a>').
+ attr('href', '#' + this.id).
+ attr('title', _('Permalink to this headline')).
+ appendTo(this);
+ });
+ $('dt[id]').each(function() {
+ $('<a class="headerlink">\u00B6</a>').
+ attr('href', '#' + this.id).
+ attr('title', _('Permalink to this definition')).
+ appendTo(this);
+ });
+ },
+
+ /**
+ * workaround a firefox stupidity
+ */
+ fixFirefoxAnchorBug : function() {
+ if (document.location.hash && $.browser.mozilla)
+ window.setTimeout(function() {
+ document.location.href += '';
+ }, 10);
+ },
+
+ /**
+ * highlight the search words provided in the url in the text
+ */
+ highlightSearchWords : function() {
+ var params = $.getQueryParameters();
+ var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
+ if (terms.length) {
+ var body = $('div.body');
+ window.setTimeout(function() {
+ $.each(terms, function() {
+ body.highlightText(this.toLowerCase(), 'highlighted');
+ });
+ }, 10);
+ $('<p class="highlight-link"><a href="javascript:Documentation.' +
+ 'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
+ .appendTo($('#searchbox'));
+ }
+ },
+
+ /**
+ * init the domain index toggle buttons
+ */
+ initIndexTable : function() {
+ var togglers = $('img.toggler').click(function() {
+ var src = $(this).attr('src');
+ var idnum = $(this).attr('id').substr(7);
+ $('tr.cg-' + idnum).toggle();
+ if (src.substr(-9) == 'minus.png')
+ $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
+ else
+ $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
+ }).css('display', '');
+ if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
+ togglers.click();
+ }
+ },
+
+ /**
+ * helper function to hide the search marks again
+ */
+ hideSearchWords : function() {
+ $('#searchbox .highlight-link').fadeOut(300);
+ $('span.highlighted').removeClass('highlighted');
+ },
+
+ /**
+ * make the url absolute
+ */
+ makeURL : function(relativeURL) {
+ return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
+ },
+
+ /**
+ * get the current relative url
+ */
+ getCurrentURL : function() {
+ var path = document.location.pathname;
+ var parts = path.split(/\//);
+ $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
+ if (this == '..')
+ parts.pop();
+ });
+ var url = parts.join('/');
+ return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
+ }
+};
+
+// quick alias for translations
+_ = Documentation.gettext;
+
+$(document).ready(function() {
+ Documentation.init();
+});
diff --git a/doc/html/_static/down-pressed.png b/doc/html/_static/down-pressed.png
new file mode 100644
index 0000000..6f7ad78
--- /dev/null
+++ b/doc/html/_static/down-pressed.png
Binary files differ
diff --git a/doc/html/_static/down.png b/doc/html/_static/down.png
new file mode 100644
index 0000000..3003a88
--- /dev/null
+++ b/doc/html/_static/down.png
Binary files differ
diff --git a/doc/html/_static/file.png b/doc/html/_static/file.png
new file mode 100644
index 0000000..d18082e
--- /dev/null
+++ b/doc/html/_static/file.png
Binary files differ
diff --git a/doc/html/_static/jquery.js b/doc/html/_static/jquery.js
new file mode 100644
index 0000000..7c24308
--- /dev/null
+++ b/doc/html/_static/jquery.js
@@ -0,0 +1,154 @@
+/*!
+ * jQuery JavaScript Library v1.4.2
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Sat Feb 13 22:33:48 2010 -0500
+ */
+(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
+e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
+j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
+"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
+true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
+Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
+(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
+a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
+"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
+function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
+c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
+L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
+"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
+a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
+d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
+a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
+!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
+true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
+var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
+parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
+false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
+s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
+applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
+else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
+a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
+w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
+cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
+i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
+" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
+this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
+e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
+c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
+a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
+function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
+k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
+C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
+null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
+e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
+f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
+if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
+d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
+"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=
+a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
+isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit=
+{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
+if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
+e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
+"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
+d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
+!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
+toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
+u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),
+function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
+if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
+t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
+g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
+for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
+1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
+CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
+relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
+l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
+h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
+CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
+g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
+text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
+setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
+h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
+m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
+"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
+h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
+!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
+h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
+q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
+if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
+(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
+function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
+gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
+c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
+{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
+"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
+d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
+a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
+1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
+a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
+c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
+wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
+prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
+this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
+return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
+""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
+this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
+u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
+1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
+return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
+""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
+c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
+c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
+function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
+Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
+"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
+a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
+a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
+"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
+serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),
+function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
+global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
+e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
+"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
+false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
+false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
+c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
+d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
+g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
+1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
+"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
+if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
+this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
+"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
+animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
+j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
+this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
+"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
+c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
+this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
+this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
+e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||
+c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
+function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
+this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
+k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
+f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
+a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
+c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
+d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
+f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
+"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
+e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
diff --git a/doc/html/_static/minus.png b/doc/html/_static/minus.png
new file mode 100644
index 0000000..da1c562
--- /dev/null
+++ b/doc/html/_static/minus.png
Binary files differ
diff --git a/doc/html/_static/plus.png b/doc/html/_static/plus.png
new file mode 100644
index 0000000..b3cb374
--- /dev/null
+++ b/doc/html/_static/plus.png
Binary files differ
diff --git a/doc/html/_static/pygments.css b/doc/html/_static/pygments.css
new file mode 100644
index 0000000..8213e90
--- /dev/null
+++ b/doc/html/_static/pygments.css
@@ -0,0 +1,65 @@
+.highlight .hll { background-color: #ffffcc }
+.highlight { background: #eeffcc; }
+.highlight .c { color: #408090; font-style: italic } /* Comment */
+.highlight .err { border: 1px solid #FF0000 } /* Error */
+.highlight .k { color: #007020; font-weight: bold } /* Keyword */
+.highlight .o { color: #666666 } /* Operator */
+.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */
+.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */
+.highlight .cp { color: #007020 } /* Comment.Preproc */
+.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */
+.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */
+.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */
+.highlight .gd { color: #A00000 } /* Generic.Deleted */
+.highlight .ge { font-style: italic } /* Generic.Emph */
+.highlight .gr { color: #FF0000 } /* Generic.Error */
+.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
+.highlight .gi { color: #00A000 } /* Generic.Inserted */
+.highlight .go { color: #333333 } /* Generic.Output */
+.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
+.highlight .gs { font-weight: bold } /* Generic.Strong */
+.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
+.highlight .gt { color: #0044DD } /* Generic.Traceback */
+.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
+.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
+.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
+.highlight .kp { color: #007020 } /* Keyword.Pseudo */
+.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
+.highlight .kt { color: #902000 } /* Keyword.Type */
+.highlight .m { color: #208050 } /* Literal.Number */
+.highlight .s { color: #4070a0 } /* Literal.String */
+.highlight .na { color: #4070a0 } /* Name.Attribute */
+.highlight .nb { color: #007020 } /* Name.Builtin */
+.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */
+.highlight .no { color: #60add5 } /* Name.Constant */
+.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */
+.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */
+.highlight .ne { color: #007020 } /* Name.Exception */
+.highlight .nf { color: #06287e } /* Name.Function */
+.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */
+.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
+.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */
+.highlight .nv { color: #bb60d5 } /* Name.Variable */
+.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */
+.highlight .w { color: #bbbbbb } /* Text.Whitespace */
+.highlight .mb { color: #208050 } /* Literal.Number.Bin */
+.highlight .mf { color: #208050 } /* Literal.Number.Float */
+.highlight .mh { color: #208050 } /* Literal.Number.Hex */
+.highlight .mi { color: #208050 } /* Literal.Number.Integer */
+.highlight .mo { color: #208050 } /* Literal.Number.Oct */
+.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */
+.highlight .sc { color: #4070a0 } /* Literal.String.Char */
+.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
+.highlight .s2 { color: #4070a0 } /* Literal.String.Double */
+.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
+.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */
+.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
+.highlight .sx { color: #c65d09 } /* Literal.String.Other */
+.highlight .sr { color: #235388 } /* Literal.String.Regex */
+.highlight .s1 { color: #4070a0 } /* Literal.String.Single */
+.highlight .ss { color: #517918 } /* Literal.String.Symbol */
+.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */
+.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */
+.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */
+.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */
+.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file
diff --git a/doc/html/_static/searchtools.js b/doc/html/_static/searchtools.js
new file mode 100644
index 0000000..663be4c
--- /dev/null
+++ b/doc/html/_static/searchtools.js
@@ -0,0 +1,560 @@
+/*
+ * searchtools.js_t
+ * ~~~~~~~~~~~~~~~~
+ *
+ * Sphinx JavaScript utilties for the full-text search.
+ *
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+/**
+ * helper function to return a node containing the
+ * search summary for a given text. keywords is a list
+ * of stemmed words, hlwords is the list of normal, unstemmed
+ * words. the first one is used to find the occurance, the
+ * latter for highlighting it.
+ */
+
+jQuery.makeSearchSummary = function(text, keywords, hlwords) {
+ var textLower = text.toLowerCase();
+ var start = 0;
+ $.each(keywords, function() {
+ var i = textLower.indexOf(this.toLowerCase());
+ if (i > -1)
+ start = i;
+ });
+ start = Math.max(start - 120, 0);
+ var excerpt = ((start > 0) ? '...' : '') +
+ $.trim(text.substr(start, 240)) +
+ ((start + 240 - text.length) ? '...' : '');
+ var rv = $('<div class="context"></div>').text(excerpt);
+ $.each(hlwords, function() {
+ rv = rv.highlightText(this, 'highlighted');
+ });
+ return rv;
+}
+
+
+/**
+ * Porter Stemmer
+ */
+var Stemmer = function() {
+
+ var step2list = {
+ ational: 'ate',
+ tional: 'tion',
+ enci: 'ence',
+ anci: 'ance',
+ izer: 'ize',
+ bli: 'ble',
+ alli: 'al',
+ entli: 'ent',
+ eli: 'e',
+ ousli: 'ous',
+ ization: 'ize',
+ ation: 'ate',
+ ator: 'ate',
+ alism: 'al',
+ iveness: 'ive',
+ fulness: 'ful',
+ ousness: 'ous',
+ aliti: 'al',
+ iviti: 'ive',
+ biliti: 'ble',
+ logi: 'log'
+ };
+
+ var step3list = {
+ icate: 'ic',
+ ative: '',
+ alize: 'al',
+ iciti: 'ic',
+ ical: 'ic',
+ ful: '',
+ ness: ''
+ };
+
+ var c = "[^aeiou]"; // consonant
+ var v = "[aeiouy]"; // vowel
+ var C = c + "[^aeiouy]*"; // consonant sequence
+ var V = v + "[aeiou]*"; // vowel sequence
+
+ var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0
+ var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1
+ var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1
+ var s_v = "^(" + C + ")?" + v; // vowel in stem
+
+ this.stemWord = function (w) {
+ var stem;
+ var suffix;
+ var firstch;
+ var origword = w;
+
+ if (w.length < 3)
+ return w;
+
+ var re;
+ var re2;
+ var re3;
+ var re4;
+
+ firstch = w.substr(0,1);
+ if (firstch == "y")
+ w = firstch.toUpperCase() + w.substr(1);
+
+ // Step 1a
+ re = /^(.+?)(ss|i)es$/;
+ re2 = /^(.+?)([^s])s$/;
+
+ if (re.test(w))
+ w = w.replace(re,"$1$2");
+ else if (re2.test(w))
+ w = w.replace(re2,"$1$2");
+
+ // Step 1b
+ re = /^(.+?)eed$/;
+ re2 = /^(.+?)(ed|ing)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ re = new RegExp(mgr0);
+ if (re.test(fp[1])) {
+ re = /.$/;
+ w = w.replace(re,"");
+ }
+ }
+ else if (re2.test(w)) {
+ var fp = re2.exec(w);
+ stem = fp[1];
+ re2 = new RegExp(s_v);
+ if (re2.test(stem)) {
+ w = stem;
+ re2 = /(at|bl|iz)$/;
+ re3 = new RegExp("([^aeiouylsz])\\1$");
+ re4 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+ if (re2.test(w))
+ w = w + "e";
+ else if (re3.test(w)) {
+ re = /.$/;
+ w = w.replace(re,"");
+ }
+ else if (re4.test(w))
+ w = w + "e";
+ }
+ }
+
+ // Step 1c
+ re = /^(.+?)y$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ re = new RegExp(s_v);
+ if (re.test(stem))
+ w = stem + "i";
+ }
+
+ // Step 2
+ re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ suffix = fp[2];
+ re = new RegExp(mgr0);
+ if (re.test(stem))
+ w = stem + step2list[suffix];
+ }
+
+ // Step 3
+ re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ suffix = fp[2];
+ re = new RegExp(mgr0);
+ if (re.test(stem))
+ w = stem + step3list[suffix];
+ }
+
+ // Step 4
+ re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
+ re2 = /^(.+?)(s|t)(ion)$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ re = new RegExp(mgr1);
+ if (re.test(stem))
+ w = stem;
+ }
+ else if (re2.test(w)) {
+ var fp = re2.exec(w);
+ stem = fp[1] + fp[2];
+ re2 = new RegExp(mgr1);
+ if (re2.test(stem))
+ w = stem;
+ }
+
+ // Step 5
+ re = /^(.+?)e$/;
+ if (re.test(w)) {
+ var fp = re.exec(w);
+ stem = fp[1];
+ re = new RegExp(mgr1);
+ re2 = new RegExp(meq1);
+ re3 = new RegExp("^" + C + v + "[^aeiouwxy]$");
+ if (re.test(stem) || (re2.test(stem) && !(re3.test(stem))))
+ w = stem;
+ }
+ re = /ll$/;
+ re2 = new RegExp(mgr1);
+ if (re.test(w) && re2.test(w)) {
+ re = /.$/;
+ w = w.replace(re,"");
+ }
+
+ // and turn initial Y back to y
+ if (firstch == "y")
+ w = firstch.toLowerCase() + w.substr(1);
+ return w;
+ }
+}
+
+
+/**
+ * Search Module
+ */
+var Search = {
+
+ _index : null,
+ _queued_query : null,
+ _pulse_status : -1,
+
+ init : function() {
+ var params = $.getQueryParameters();
+ if (params.q) {
+ var query = params.q[0];
+ $('input[name="q"]')[0].value = query;
+ this.performSearch(query);
+ }
+ },
+
+ loadIndex : function(url) {
+ $.ajax({type: "GET", url: url, data: null, success: null,
+ dataType: "script", cache: true});
+ },
+
+ setIndex : function(index) {
+ var q;
+ this._index = index;
+ if ((q = this._queued_query) !== null) {
+ this._queued_query = null;
+ Search.query(q);
+ }
+ },
+
+ hasIndex : function() {
+ return this._index !== null;
+ },
+
+ deferQuery : function(query) {
+ this._queued_query = query;
+ },
+
+ stopPulse : function() {
+ this._pulse_status = 0;
+ },
+
+ startPulse : function() {
+ if (this._pulse_status >= 0)
+ return;
+ function pulse() {
+ Search._pulse_status = (Search._pulse_status + 1) % 4;
+ var dotString = '';
+ for (var i = 0; i < Search._pulse_status; i++)
+ dotString += '.';
+ Search.dots.text(dotString);
+ if (Search._pulse_status > -1)
+ window.setTimeout(pulse, 500);
+ };
+ pulse();
+ },
+
+ /**
+ * perform a search for something
+ */
+ performSearch : function(query) {
+ // create the required interface elements
+ this.out = $('#search-results');
+ this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
+ this.dots = $('<span></span>').appendTo(this.title);
+ this.status = $('<p style="display: none"></p>').appendTo(this.out);
+ this.output = $('<ul class="search"/>').appendTo(this.out);
+
+ $('#search-progress').text(_('Preparing search...'));
+ this.startPulse();
+
+ // index already loaded, the browser was quick!
+ if (this.hasIndex())
+ this.query(query);
+ else
+ this.deferQuery(query);
+ },
+
+ query : function(query) {
+ var stopwords = ["and","then","into","it","as","are","in","if","for","no","there","their","was","is","be","to","that","but","they","not","such","with","by","a","on","these","of","will","this","near","the","or","at"];
+
+ // Stem the searchterms and add them to the correct list
+ var stemmer = new Stemmer();
+ var searchterms = [];
+ var excluded = [];
+ var hlterms = [];
+ var tmp = query.split(/\s+/);
+ var objectterms = [];
+ for (var i = 0; i < tmp.length; i++) {
+ if (tmp[i] != "") {
+ objectterms.push(tmp[i].toLowerCase());
+ }
+
+ if ($u.indexOf(stopwords, tmp[i]) != -1 || tmp[i].match(/^\d+$/) ||
+ tmp[i] == "") {
+ // skip this "word"
+ continue;
+ }
+ // stem the word
+ var word = stemmer.stemWord(tmp[i]).toLowerCase();
+ // select the correct list
+ if (word[0] == '-') {
+ var toAppend = excluded;
+ word = word.substr(1);
+ }
+ else {
+ var toAppend = searchterms;
+ hlterms.push(tmp[i].toLowerCase());
+ }
+ // only add if not already in the list
+ if (!$.contains(toAppend, word))
+ toAppend.push(word);
+ };
+ var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
+
+ // console.debug('SEARCH: searching for:');
+ // console.info('required: ', searchterms);
+ // console.info('excluded: ', excluded);
+
+ // prepare search
+ var filenames = this._index.filenames;
+ var titles = this._index.titles;
+ var terms = this._index.terms;
+ var fileMap = {};
+ var files = null;
+ // different result priorities
+ var importantResults = [];
+ var objectResults = [];
+ var regularResults = [];
+ var unimportantResults = [];
+ $('#search-progress').empty();
+
+ // lookup as object
+ for (var i = 0; i < objectterms.length; i++) {
+ var others = [].concat(objectterms.slice(0,i),
+ objectterms.slice(i+1, objectterms.length))
+ var results = this.performObjectSearch(objectterms[i], others);
+ // Assume first word is most likely to be the object,
+ // other words more likely to be in description.
+ // Therefore put matches for earlier words first.
+ // (Results are eventually used in reverse order).
+ objectResults = results[0].concat(objectResults);
+ importantResults = results[1].concat(importantResults);
+ unimportantResults = results[2].concat(unimportantResults);
+ }
+
+ // perform the search on the required terms
+ for (var i = 0; i < searchterms.length; i++) {
+ var word = searchterms[i];
+ // no match but word was a required one
+ if ((files = terms[word]) == null)
+ break;
+ if (files.length == undefined) {
+ files = [files];
+ }
+ // create the mapping
+ for (var j = 0; j < files.length; j++) {
+ var file = files[j];
+ if (file in fileMap)
+ fileMap[file].push(word);
+ else
+ fileMap[file] = [word];
+ }
+ }
+
+ // now check if the files don't contain excluded terms
+ for (var file in fileMap) {
+ var valid = true;
+
+ // check if all requirements are matched
+ if (fileMap[file].length != searchterms.length)
+ continue;
+
+ // ensure that none of the excluded terms is in the
+ // search result.
+ for (var i = 0; i < excluded.length; i++) {
+ if (terms[excluded[i]] == file ||
+ $.contains(terms[excluded[i]] || [], file)) {
+ valid = false;
+ break;
+ }
+ }
+
+ // if we have still a valid result we can add it
+ // to the result list
+ if (valid)
+ regularResults.push([filenames[file], titles[file], '', null]);
+ }
+
+ // delete unused variables in order to not waste
+ // memory until list is retrieved completely
+ delete filenames, titles, terms;
+
+ // now sort the regular results descending by title
+ regularResults.sort(function(a, b) {
+ var left = a[1].toLowerCase();
+ var right = b[1].toLowerCase();
+ return (left > right) ? -1 : ((left < right) ? 1 : 0);
+ });
+
+ // combine all results
+ var results = unimportantResults.concat(regularResults)
+ .concat(objectResults).concat(importantResults);
+
+ // print the results
+ var resultCount = results.length;
+ function displayNextItem() {
+ // results left, load the summary and display it
+ if (results.length) {
+ var item = results.pop();
+ var listItem = $('<li style="display:none"></li>');
+ if (DOCUMENTATION_OPTIONS.FILE_SUFFIX == '') {
+ // dirhtml builder
+ var dirname = item[0] + '/';
+ if (dirname.match(/\/index\/$/)) {
+ dirname = dirname.substring(0, dirname.length-6);
+ } else if (dirname == 'index/') {
+ dirname = '';
+ }
+ listItem.append($('<a/>').attr('href',
+ DOCUMENTATION_OPTIONS.URL_ROOT + dirname +
+ highlightstring + item[2]).html(item[1]));
+ } else {
+ // normal html builders
+ listItem.append($('<a/>').attr('href',
+ item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX +
+ highlightstring + item[2]).html(item[1]));
+ }
+ if (item[3]) {
+ listItem.append($('<span> (' + item[3] + ')</span>'));
+ Search.output.append(listItem);
+ listItem.slideDown(5, function() {
+ displayNextItem();
+ });
+ } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
+ $.get(DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' +
+ item[0] + '.txt', function(data) {
+ if (data != '') {
+ listItem.append($.makeSearchSummary(data, searchterms, hlterms));
+ Search.output.append(listItem);
+ }
+ listItem.slideDown(5, function() {
+ displayNextItem();
+ });
+ }, "text");
+ } else {
+ // no source available, just display title
+ Search.output.append(listItem);
+ listItem.slideDown(5, function() {
+ displayNextItem();
+ });
+ }
+ }
+ // search finished, update title and status message
+ else {
+ Search.stopPulse();
+ Search.title.text(_('Search Results'));
+ if (!resultCount)
+ Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
+ else
+ Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
+ Search.status.fadeIn(500);
+ }
+ }
+ displayNextItem();
+ },
+
+ performObjectSearch : function(object, otherterms) {
+ var filenames = this._index.filenames;
+ var objects = this._index.objects;
+ var objnames = this._index.objnames;
+ var titles = this._index.titles;
+
+ var importantResults = [];
+ var objectResults = [];
+ var unimportantResults = [];
+
+ for (var prefix in objects) {
+ for (var name in objects[prefix]) {
+ var fullname = (prefix ? prefix + '.' : '') + name;
+ if (fullname.toLowerCase().indexOf(object) > -1) {
+ var match = objects[prefix][name];
+ var objname = objnames[match[1]][2];
+ var title = titles[match[0]];
+ // If more than one term searched for, we require other words to be
+ // found in the name/title/description
+ if (otherterms.length > 0) {
+ var haystack = (prefix + ' ' + name + ' ' +
+ objname + ' ' + title).toLowerCase();
+ var allfound = true;
+ for (var i = 0; i < otherterms.length; i++) {
+ if (haystack.indexOf(otherterms[i]) == -1) {
+ allfound = false;
+ break;
+ }
+ }
+ if (!allfound) {
+ continue;
+ }
+ }
+ var descr = objname + _(', in ') + title;
+ anchor = match[3];
+ if (anchor == '')
+ anchor = fullname;
+ else if (anchor == '-')
+ anchor = objnames[match[1]][1] + '-' + fullname;
+ result = [filenames[match[0]], fullname, '#'+anchor, descr];
+ switch (match[2]) {
+ case 1: objectResults.push(result); break;
+ case 0: importantResults.push(result); break;
+ case 2: unimportantResults.push(result); break;
+ }
+ }
+ }
+ }
+
+ // sort results descending
+ objectResults.sort(function(a, b) {
+ return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
+ });
+
+ importantResults.sort(function(a, b) {
+ return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
+ });
+
+ unimportantResults.sort(function(a, b) {
+ return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0);
+ });
+
+ return [importantResults, objectResults, unimportantResults]
+ }
+}
+
+$(document).ready(function() {
+ Search.init();
+}); \ No newline at end of file
diff --git a/doc/html/_static/sidebar.js b/doc/html/_static/sidebar.js
new file mode 100644
index 0000000..a45e192
--- /dev/null
+++ b/doc/html/_static/sidebar.js
@@ -0,0 +1,151 @@
+/*
+ * sidebar.js
+ * ~~~~~~~~~~
+ *
+ * This script makes the Sphinx sidebar collapsible.
+ *
+ * .sphinxsidebar contains .sphinxsidebarwrapper. This script adds
+ * in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton
+ * used to collapse and expand the sidebar.
+ *
+ * When the sidebar is collapsed the .sphinxsidebarwrapper is hidden
+ * and the width of the sidebar and the margin-left of the document
+ * are decreased. When the sidebar is expanded the opposite happens.
+ * This script saves a per-browser/per-session cookie used to
+ * remember the position of the sidebar among the pages.
+ * Once the browser is closed the cookie is deleted and the position
+ * reset to the default (expanded).
+ *
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+$(function() {
+ // global elements used by the functions.
+ // the 'sidebarbutton' element is defined as global after its
+ // creation, in the add_sidebar_button function
+ var bodywrapper = $('.bodywrapper');
+ var sidebar = $('.sphinxsidebar');
+ var sidebarwrapper = $('.sphinxsidebarwrapper');
+
+ // for some reason, the document has no sidebar; do not run into errors
+ if (!sidebar.length) return;
+
+ // original margin-left of the bodywrapper and width of the sidebar
+ // with the sidebar expanded
+ var bw_margin_expanded = bodywrapper.css('margin-left');
+ var ssb_width_expanded = sidebar.width();
+
+ // margin-left of the bodywrapper and width of the sidebar
+ // with the sidebar collapsed
+ var bw_margin_collapsed = '.8em';
+ var ssb_width_collapsed = '.8em';
+
+ // colors used by the current theme
+ var dark_color = $('.related').css('background-color');
+ var light_color = $('.document').css('background-color');
+
+ function sidebar_is_collapsed() {
+ return sidebarwrapper.is(':not(:visible)');
+ }
+
+ function toggle_sidebar() {
+ if (sidebar_is_collapsed())
+ expand_sidebar();
+ else
+ collapse_sidebar();
+ }
+
+ function collapse_sidebar() {
+ sidebarwrapper.hide();
+ sidebar.css('width', ssb_width_collapsed);
+ bodywrapper.css('margin-left', bw_margin_collapsed);
+ sidebarbutton.css({
+ 'margin-left': '0',
+ 'height': bodywrapper.height()
+ });
+ sidebarbutton.find('span').text('»');
+ sidebarbutton.attr('title', _('Expand sidebar'));
+ document.cookie = 'sidebar=collapsed';
+ }
+
+ function expand_sidebar() {
+ bodywrapper.css('margin-left', bw_margin_expanded);
+ sidebar.css('width', ssb_width_expanded);
+ sidebarwrapper.show();
+ sidebarbutton.css({
+ 'margin-left': ssb_width_expanded-12,
+ 'height': bodywrapper.height()
+ });
+ sidebarbutton.find('span').text('«');
+ sidebarbutton.attr('title', _('Collapse sidebar'));
+ document.cookie = 'sidebar=expanded';
+ }
+
+ function add_sidebar_button() {
+ sidebarwrapper.css({
+ 'float': 'left',
+ 'margin-right': '0',
+ 'width': ssb_width_expanded - 28
+ });
+ // create the button
+ sidebar.append(
+ '<div id="sidebarbutton"><span>&laquo;</span></div>'
+ );
+ var sidebarbutton = $('#sidebarbutton');
+ light_color = sidebarbutton.css('background-color');
+ // find the height of the viewport to center the '<<' in the page
+ var viewport_height;
+ if (window.innerHeight)
+ viewport_height = window.innerHeight;
+ else
+ viewport_height = $(window).height();
+ sidebarbutton.find('span').css({
+ 'display': 'block',
+ 'margin-top': (viewport_height - sidebar.position().top - 20) / 2
+ });
+
+ sidebarbutton.click(toggle_sidebar);
+ sidebarbutton.attr('title', _('Collapse sidebar'));
+ sidebarbutton.css({
+ 'color': '#FFFFFF',
+ 'border-left': '1px solid ' + dark_color,
+ 'font-size': '1.2em',
+ 'cursor': 'pointer',
+ 'height': bodywrapper.height(),
+ 'padding-top': '1px',
+ 'margin-left': ssb_width_expanded - 12
+ });
+
+ sidebarbutton.hover(
+ function () {
+ $(this).css('background-color', dark_color);
+ },
+ function () {
+ $(this).css('background-color', light_color);
+ }
+ );
+ }
+
+ function set_position_from_cookie() {
+ if (!document.cookie)
+ return;
+ var items = document.cookie.split(';');
+ for(var k=0; k<items.length; k++) {
+ var key_val = items[k].split('=');
+ var key = key_val[0];
+ if (key == 'sidebar') {
+ var value = key_val[1];
+ if ((value == 'collapsed') && (!sidebar_is_collapsed()))
+ collapse_sidebar();
+ else if ((value == 'expanded') && (sidebar_is_collapsed()))
+ expand_sidebar();
+ }
+ }
+ }
+
+ add_sidebar_button();
+ var sidebarbutton = $('#sidebarbutton');
+ set_position_from_cookie();
+});
diff --git a/doc/html/_static/underscore.js b/doc/html/_static/underscore.js
new file mode 100644
index 0000000..5d89914
--- /dev/null
+++ b/doc/html/_static/underscore.js
@@ -0,0 +1,23 @@
+// Underscore.js 0.5.5
+// (c) 2009 Jeremy Ashkenas, DocumentCloud Inc.
+// Underscore is freely distributable under the terms of the MIT license.
+// Portions of Underscore are inspired by or borrowed from Prototype.js,
+// Oliver Steele's Functional, and John Resig's Micro-Templating.
+// For all details and documentation:
+// http://documentcloud.github.com/underscore/
+(function(){var j=this,n=j._,i=function(a){this._wrapped=a},m=typeof StopIteration!=="undefined"?StopIteration:"__break__",b=j._=function(a){return new i(a)};if(typeof exports!=="undefined")exports._=b;var k=Array.prototype.slice,o=Array.prototype.unshift,p=Object.prototype.toString,q=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;b.VERSION="0.5.5";b.each=function(a,c,d){try{if(a.forEach)a.forEach(c,d);else if(b.isArray(a)||b.isArguments(a))for(var e=0,f=a.length;e<f;e++)c.call(d,
+a[e],e,a);else{var g=b.keys(a);f=g.length;for(e=0;e<f;e++)c.call(d,a[g[e]],g[e],a)}}catch(h){if(h!=m)throw h;}return a};b.map=function(a,c,d){if(a&&b.isFunction(a.map))return a.map(c,d);var e=[];b.each(a,function(f,g,h){e.push(c.call(d,f,g,h))});return e};b.reduce=function(a,c,d,e){if(a&&b.isFunction(a.reduce))return a.reduce(b.bind(d,e),c);b.each(a,function(f,g,h){c=d.call(e,c,f,g,h)});return c};b.reduceRight=function(a,c,d,e){if(a&&b.isFunction(a.reduceRight))return a.reduceRight(b.bind(d,e),c);
+var f=b.clone(b.toArray(a)).reverse();b.each(f,function(g,h){c=d.call(e,c,g,h,a)});return c};b.detect=function(a,c,d){var e;b.each(a,function(f,g,h){if(c.call(d,f,g,h)){e=f;b.breakLoop()}});return e};b.select=function(a,c,d){if(a&&b.isFunction(a.filter))return a.filter(c,d);var e=[];b.each(a,function(f,g,h){c.call(d,f,g,h)&&e.push(f)});return e};b.reject=function(a,c,d){var e=[];b.each(a,function(f,g,h){!c.call(d,f,g,h)&&e.push(f)});return e};b.all=function(a,c,d){c=c||b.identity;if(a&&b.isFunction(a.every))return a.every(c,
+d);var e=true;b.each(a,function(f,g,h){(e=e&&c.call(d,f,g,h))||b.breakLoop()});return e};b.any=function(a,c,d){c=c||b.identity;if(a&&b.isFunction(a.some))return a.some(c,d);var e=false;b.each(a,function(f,g,h){if(e=c.call(d,f,g,h))b.breakLoop()});return e};b.include=function(a,c){if(b.isArray(a))return b.indexOf(a,c)!=-1;var d=false;b.each(a,function(e){if(d=e===c)b.breakLoop()});return d};b.invoke=function(a,c){var d=b.rest(arguments,2);return b.map(a,function(e){return(c?e[c]:e).apply(e,d)})};b.pluck=
+function(a,c){return b.map(a,function(d){return d[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);var e={computed:-Infinity};b.each(a,function(f,g,h){g=c?c.call(d,f,g,h):f;g>=e.computed&&(e={value:f,computed:g})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);var e={computed:Infinity};b.each(a,function(f,g,h){g=c?c.call(d,f,g,h):f;g<e.computed&&(e={value:f,computed:g})});return e.value};b.sortBy=function(a,c,d){return b.pluck(b.map(a,
+function(e,f,g){return{value:e,criteria:c.call(d,e,f,g)}}).sort(function(e,f){e=e.criteria;f=f.criteria;return e<f?-1:e>f?1:0}),"value")};b.sortedIndex=function(a,c,d){d=d||b.identity;for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?(e=g+1):(f=g)}return e};b.toArray=function(a){if(!a)return[];if(a.toArray)return a.toArray();if(b.isArray(a))return a;if(b.isArguments(a))return k.call(a);return b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=function(a,c,d){return c&&!d?k.call(a,
+0,c):a[0]};b.rest=function(a,c,d){return k.call(a,b.isUndefined(c)||d?1:c)};b.last=function(a){return a[a.length-1]};b.compact=function(a){return b.select(a,function(c){return!!c})};b.flatten=function(a){return b.reduce(a,[],function(c,d){if(b.isArray(d))return c.concat(b.flatten(d));c.push(d);return c})};b.without=function(a){var c=b.rest(arguments);return b.select(a,function(d){return!b.include(c,d)})};b.uniq=function(a,c){return b.reduce(a,[],function(d,e,f){if(0==f||(c===true?b.last(d)!=e:!b.include(d,
+e)))d.push(e);return d})};b.intersect=function(a){var c=b.rest(arguments);return b.select(b.uniq(a),function(d){return b.all(c,function(e){return b.indexOf(e,d)>=0})})};b.zip=function(){for(var a=b.toArray(arguments),c=b.max(b.pluck(a,"length")),d=new Array(c),e=0;e<c;e++)d[e]=b.pluck(a,String(e));return d};b.indexOf=function(a,c){if(a.indexOf)return a.indexOf(c);for(var d=0,e=a.length;d<e;d++)if(a[d]===c)return d;return-1};b.lastIndexOf=function(a,c){if(a.lastIndexOf)return a.lastIndexOf(c);for(var d=
+a.length;d--;)if(a[d]===c)return d;return-1};b.range=function(a,c,d){var e=b.toArray(arguments),f=e.length<=1;a=f?0:e[0];c=f?e[0]:e[1];d=e[2]||1;e=Math.ceil((c-a)/d);if(e<=0)return[];e=new Array(e);f=a;for(var g=0;1;f+=d){if((d>0?f-c:c-f)>=0)return e;e[g++]=f}};b.bind=function(a,c){var d=b.rest(arguments,2);return function(){return a.apply(c||j,d.concat(b.toArray(arguments)))}};b.bindAll=function(a){var c=b.rest(arguments);if(c.length==0)c=b.functions(a);b.each(c,function(d){a[d]=b.bind(a[d],a)});
+return a};b.delay=function(a,c){var d=b.rest(arguments,2);return setTimeout(function(){return a.apply(a,d)},c)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(b.rest(arguments)))};b.wrap=function(a,c){return function(){var d=[a].concat(b.toArray(arguments));return c.apply(c,d)}};b.compose=function(){var a=b.toArray(arguments);return function(){for(var c=b.toArray(arguments),d=a.length-1;d>=0;d--)c=[a[d].apply(this,c)];return c[0]}};b.keys=function(a){if(b.isArray(a))return b.range(0,a.length);
+var c=[];for(var d in a)q.call(a,d)&&c.push(d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=function(a){return b.select(b.keys(a),function(c){return b.isFunction(a[c])}).sort()};b.extend=function(a,c){for(var d in c)a[d]=c[d];return a};b.clone=function(a){if(b.isArray(a))return a.slice(0);return b.extend({},a)};b.tap=function(a,c){c(a);return a};b.isEqual=function(a,c){if(a===c)return true;var d=typeof a;if(d!=typeof c)return false;if(a==c)return true;if(!a&&c||a&&!c)return false;
+if(a.isEqual)return a.isEqual(c);if(b.isDate(a)&&b.isDate(c))return a.getTime()===c.getTime();if(b.isNaN(a)&&b.isNaN(c))return true;if(b.isRegExp(a)&&b.isRegExp(c))return a.source===c.source&&a.global===c.global&&a.ignoreCase===c.ignoreCase&&a.multiline===c.multiline;if(d!=="object")return false;if(a.length&&a.length!==c.length)return false;d=b.keys(a);var e=b.keys(c);if(d.length!=e.length)return false;for(var f in a)if(!b.isEqual(a[f],c[f]))return false;return true};b.isEmpty=function(a){return b.keys(a).length==
+0};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=function(a){return!!(a&&a.concat&&a.unshift)};b.isArguments=function(a){return a&&b.isNumber(a.length)&&!b.isArray(a)&&!r.call(a,"length")};b.isFunction=function(a){return!!(a&&a.constructor&&a.call&&a.apply)};b.isString=function(a){return!!(a===""||a&&a.charCodeAt&&a.substr)};b.isNumber=function(a){return p.call(a)==="[object Number]"};b.isDate=function(a){return!!(a&&a.getTimezoneOffset&&a.setUTCFullYear)};b.isRegExp=function(a){return!!(a&&
+a.test&&a.exec&&(a.ignoreCase||a.ignoreCase===false))};b.isNaN=function(a){return b.isNumber(a)&&isNaN(a)};b.isNull=function(a){return a===null};b.isUndefined=function(a){return typeof a=="undefined"};b.noConflict=function(){j._=n;return this};b.identity=function(a){return a};b.breakLoop=function(){throw m;};var s=0;b.uniqueId=function(a){var c=s++;return a?a+c:c};b.template=function(a,c){a=new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+a.replace(/[\r\t\n]/g,
+" ").replace(/'(?=[^%]*%>)/g,"\t").split("'").join("\\'").split("\t").join("'").replace(/<%=(.+?)%>/g,"',$1,'").split("<%").join("');").split("%>").join("p.push('")+"');}return p.join('');");return c?a(c):a};b.forEach=b.each;b.foldl=b.inject=b.reduce;b.foldr=b.reduceRight;b.filter=b.select;b.every=b.all;b.some=b.any;b.head=b.first;b.tail=b.rest;b.methods=b.functions;var l=function(a,c){return c?b(a).chain():a};b.each(b.functions(b),function(a){var c=b[a];i.prototype[a]=function(){var d=b.toArray(arguments);
+o.call(d,this._wrapped);return l(c.apply(b,d),this._chain)}});b.each(["pop","push","reverse","shift","sort","splice","unshift"],function(a){var c=Array.prototype[a];i.prototype[a]=function(){c.apply(this._wrapped,arguments);return l(this._wrapped,this._chain)}});b.each(["concat","join","slice"],function(a){var c=Array.prototype[a];i.prototype[a]=function(){return l(c.apply(this._wrapped,arguments),this._chain)}});i.prototype.chain=function(){this._chain=true;return this};i.prototype.value=function(){return this._wrapped}})();
diff --git a/doc/html/_static/up-pressed.png b/doc/html/_static/up-pressed.png
new file mode 100644
index 0000000..8bd587a
--- /dev/null
+++ b/doc/html/_static/up-pressed.png
Binary files differ
diff --git a/doc/html/_static/up.png b/doc/html/_static/up.png
new file mode 100644
index 0000000..b946256
--- /dev/null
+++ b/doc/html/_static/up.png
Binary files differ
diff --git a/doc/html/_static/websupport.js b/doc/html/_static/websupport.js
new file mode 100644
index 0000000..e9bd1b8
--- /dev/null
+++ b/doc/html/_static/websupport.js
@@ -0,0 +1,808 @@
+/*
+ * websupport.js
+ * ~~~~~~~~~~~~~
+ *
+ * sphinx.websupport utilties for all documentation.
+ *
+ * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
+ * :license: BSD, see LICENSE for details.
+ *
+ */
+
+(function($) {
+ $.fn.autogrow = function() {
+ return this.each(function() {
+ var textarea = this;
+
+ $.fn.autogrow.resize(textarea);
+
+ $(textarea)
+ .focus(function() {
+ textarea.interval = setInterval(function() {
+ $.fn.autogrow.resize(textarea);
+ }, 500);
+ })
+ .blur(function() {
+ clearInterval(textarea.interval);
+ });
+ });
+ };
+
+ $.fn.autogrow.resize = function(textarea) {
+ var lineHeight = parseInt($(textarea).css('line-height'), 10);
+ var lines = textarea.value.split('\n');
+ var columns = textarea.cols;
+ var lineCount = 0;
+ $.each(lines, function() {
+ lineCount += Math.ceil(this.length / columns) || 1;
+ });
+ var height = lineHeight * (lineCount + 1);
+ $(textarea).css('height', height);
+ };
+})(jQuery);
+
+(function($) {
+ var comp, by;
+
+ function init() {
+ initEvents();
+ initComparator();
+ }
+
+ function initEvents() {
+ $('a.comment-close').live("click", function(event) {
+ event.preventDefault();
+ hide($(this).attr('id').substring(2));
+ });
+ $('a.vote').live("click", function(event) {
+ event.preventDefault();
+ handleVote($(this));
+ });
+ $('a.reply').live("click", function(event) {
+ event.preventDefault();
+ openReply($(this).attr('id').substring(2));
+ });
+ $('a.close-reply').live("click", function(event) {
+ event.preventDefault();
+ closeReply($(this).attr('id').substring(2));
+ });
+ $('a.sort-option').live("click", function(event) {
+ event.preventDefault();
+ handleReSort($(this));
+ });
+ $('a.show-proposal').live("click", function(event) {
+ event.preventDefault();
+ showProposal($(this).attr('id').substring(2));
+ });
+ $('a.hide-proposal').live("click", function(event) {
+ event.preventDefault();
+ hideProposal($(this).attr('id').substring(2));
+ });
+ $('a.show-propose-change').live("click", function(event) {
+ event.preventDefault();
+ showProposeChange($(this).attr('id').substring(2));
+ });
+ $('a.hide-propose-change').live("click", function(event) {
+ event.preventDefault();
+ hideProposeChange($(this).attr('id').substring(2));
+ });
+ $('a.accept-comment').live("click", function(event) {
+ event.preventDefault();
+ acceptComment($(this).attr('id').substring(2));
+ });
+ $('a.delete-comment').live("click", function(event) {
+ event.preventDefault();
+ deleteComment($(this).attr('id').substring(2));
+ });
+ $('a.comment-markup').live("click", function(event) {
+ event.preventDefault();
+ toggleCommentMarkupBox($(this).attr('id').substring(2));
+ });
+ }
+
+ /**
+ * Set comp, which is a comparator function used for sorting and
+ * inserting comments into the list.
+ */
+ function setComparator() {
+ // If the first three letters are "asc", sort in ascending order
+ // and remove the prefix.
+ if (by.substring(0,3) == 'asc') {
+ var i = by.substring(3);
+ comp = function(a, b) { return a[i] - b[i]; };
+ } else {
+ // Otherwise sort in descending order.
+ comp = function(a, b) { return b[by] - a[by]; };
+ }
+
+ // Reset link styles and format the selected sort option.
+ $('a.sel').attr('href', '#').removeClass('sel');
+ $('a.by' + by).removeAttr('href').addClass('sel');
+ }
+
+ /**
+ * Create a comp function. If the user has preferences stored in
+ * the sortBy cookie, use those, otherwise use the default.
+ */
+ function initComparator() {
+ by = 'rating'; // Default to sort by rating.
+ // If the sortBy cookie is set, use that instead.
+ if (document.cookie.length > 0) {
+ var start = document.cookie.indexOf('sortBy=');
+ if (start != -1) {
+ start = start + 7;
+ var end = document.cookie.indexOf(";", start);
+ if (end == -1) {
+ end = document.cookie.length;
+ by = unescape(document.cookie.substring(start, end));
+ }
+ }
+ }
+ setComparator();
+ }
+
+ /**
+ * Show a comment div.
+ */
+ function show(id) {
+ $('#ao' + id).hide();
+ $('#ah' + id).show();
+ var context = $.extend({id: id}, opts);
+ var popup = $(renderTemplate(popupTemplate, context)).hide();
+ popup.find('textarea[name="proposal"]').hide();
+ popup.find('a.by' + by).addClass('sel');
+ var form = popup.find('#cf' + id);
+ form.submit(function(event) {
+ event.preventDefault();
+ addComment(form);
+ });
+ $('#s' + id).after(popup);
+ popup.slideDown('fast', function() {
+ getComments(id);
+ });
+ }
+
+ /**
+ * Hide a comment div.
+ */
+ function hide(id) {
+ $('#ah' + id).hide();
+ $('#ao' + id).show();
+ var div = $('#sc' + id);
+ div.slideUp('fast', function() {
+ div.remove();
+ });
+ }
+
+ /**
+ * Perform an ajax request to get comments for a node
+ * and insert the comments into the comments tree.
+ */
+ function getComments(id) {
+ $.ajax({
+ type: 'GET',
+ url: opts.getCommentsURL,
+ data: {node: id},
+ success: function(data, textStatus, request) {
+ var ul = $('#cl' + id);
+ var speed = 100;
+ $('#cf' + id)
+ .find('textarea[name="proposal"]')
+ .data('source', data.source);
+
+ if (data.comments.length === 0) {
+ ul.html('<li>No comments yet.</li>');
+ ul.data('empty', true);
+ } else {
+ // If there are comments, sort them and put them in the list.
+ var comments = sortComments(data.comments);
+ speed = data.comments.length * 100;
+ appendComments(comments, ul);
+ ul.data('empty', false);
+ }
+ $('#cn' + id).slideUp(speed + 200);
+ ul.slideDown(speed);
+ },
+ error: function(request, textStatus, error) {
+ showError('Oops, there was a problem retrieving the comments.');
+ },
+ dataType: 'json'
+ });
+ }
+
+ /**
+ * Add a comment via ajax and insert the comment into the comment tree.
+ */
+ function addComment(form) {
+ var node_id = form.find('input[name="node"]').val();
+ var parent_id = form.find('input[name="parent"]').val();
+ var text = form.find('textarea[name="comment"]').val();
+ var proposal = form.find('textarea[name="proposal"]').val();
+
+ if (text == '') {
+ showError('Please enter a comment.');
+ return;
+ }
+
+ // Disable the form that is being submitted.
+ form.find('textarea,input').attr('disabled', 'disabled');
+
+ // Send the comment to the server.
+ $.ajax({
+ type: "POST",
+ url: opts.addCommentURL,
+ dataType: 'json',
+ data: {
+ node: node_id,
+ parent: parent_id,
+ text: text,
+ proposal: proposal
+ },
+ success: function(data, textStatus, error) {
+ // Reset the form.
+ if (node_id) {
+ hideProposeChange(node_id);
+ }
+ form.find('textarea')
+ .val('')
+ .add(form.find('input'))
+ .removeAttr('disabled');
+ var ul = $('#cl' + (node_id || parent_id));
+ if (ul.data('empty')) {
+ $(ul).empty();
+ ul.data('empty', false);
+ }
+ insertComment(data.comment);
+ var ao = $('#ao' + node_id);
+ ao.find('img').attr({'src': opts.commentBrightImage});
+ if (node_id) {
+ // if this was a "root" comment, remove the commenting box
+ // (the user can get it back by reopening the comment popup)
+ $('#ca' + node_id).slideUp();
+ }
+ },
+ error: function(request, textStatus, error) {
+ form.find('textarea,input').removeAttr('disabled');
+ showError('Oops, there was a problem adding the comment.');
+ }
+ });
+ }
+
+ /**
+ * Recursively append comments to the main comment list and children
+ * lists, creating the comment tree.
+ */
+ function appendComments(comments, ul) {
+ $.each(comments, function() {
+ var div = createCommentDiv(this);
+ ul.append($(document.createElement('li')).html(div));
+ appendComments(this.children, div.find('ul.comment-children'));
+ // To avoid stagnating data, don't store the comments children in data.
+ this.children = null;
+ div.data('comment', this);
+ });
+ }
+
+ /**
+ * After adding a new comment, it must be inserted in the correct
+ * location in the comment tree.
+ */
+ function insertComment(comment) {
+ var div = createCommentDiv(comment);
+
+ // To avoid stagnating data, don't store the comments children in data.
+ comment.children = null;
+ div.data('comment', comment);
+
+ var ul = $('#cl' + (comment.node || comment.parent));
+ var siblings = getChildren(ul);
+
+ var li = $(document.createElement('li'));
+ li.hide();
+
+ // Determine where in the parents children list to insert this comment.
+ for(i=0; i < siblings.length; i++) {
+ if (comp(comment, siblings[i]) <= 0) {
+ $('#cd' + siblings[i].id)
+ .parent()
+ .before(li.html(div));
+ li.slideDown('fast');
+ return;
+ }
+ }
+
+ // If we get here, this comment rates lower than all the others,
+ // or it is the only comment in the list.
+ ul.append(li.html(div));
+ li.slideDown('fast');
+ }
+
+ function acceptComment(id) {
+ $.ajax({
+ type: 'POST',
+ url: opts.acceptCommentURL,
+ data: {id: id},
+ success: function(data, textStatus, request) {
+ $('#cm' + id).fadeOut('fast');
+ $('#cd' + id).removeClass('moderate');
+ },
+ error: function(request, textStatus, error) {
+ showError('Oops, there was a problem accepting the comment.');
+ }
+ });
+ }
+
+ function deleteComment(id) {
+ $.ajax({
+ type: 'POST',
+ url: opts.deleteCommentURL,
+ data: {id: id},
+ success: function(data, textStatus, request) {
+ var div = $('#cd' + id);
+ if (data == 'delete') {
+ // Moderator mode: remove the comment and all children immediately
+ div.slideUp('fast', function() {
+ div.remove();
+ });
+ return;
+ }
+ // User mode: only mark the comment as deleted
+ div
+ .find('span.user-id:first')
+ .text('[deleted]').end()
+ .find('div.comment-text:first')
+ .text('[deleted]').end()
+ .find('#cm' + id + ', #dc' + id + ', #ac' + id + ', #rc' + id +
+ ', #sp' + id + ', #hp' + id + ', #cr' + id + ', #rl' + id)
+ .remove();
+ var comment = div.data('comment');
+ comment.username = '[deleted]';
+ comment.text = '[deleted]';
+ div.data('comment', comment);
+ },
+ error: function(request, textStatus, error) {
+ showError('Oops, there was a problem deleting the comment.');
+ }
+ });
+ }
+
+ function showProposal(id) {
+ $('#sp' + id).hide();
+ $('#hp' + id).show();
+ $('#pr' + id).slideDown('fast');
+ }
+
+ function hideProposal(id) {
+ $('#hp' + id).hide();
+ $('#sp' + id).show();
+ $('#pr' + id).slideUp('fast');
+ }
+
+ function showProposeChange(id) {
+ $('#pc' + id).hide();
+ $('#hc' + id).show();
+ var textarea = $('#pt' + id);
+ textarea.val(textarea.data('source'));
+ $.fn.autogrow.resize(textarea[0]);
+ textarea.slideDown('fast');
+ }
+
+ function hideProposeChange(id) {
+ $('#hc' + id).hide();
+ $('#pc' + id).show();
+ var textarea = $('#pt' + id);
+ textarea.val('').removeAttr('disabled');
+ textarea.slideUp('fast');
+ }
+
+ function toggleCommentMarkupBox(id) {
+ $('#mb' + id).toggle();
+ }
+
+ /** Handle when the user clicks on a sort by link. */
+ function handleReSort(link) {
+ var classes = link.attr('class').split(/\s+/);
+ for (var i=0; i<classes.length; i++) {
+ if (classes[i] != 'sort-option') {
+ by = classes[i].substring(2);
+ }
+ }
+ setComparator();
+ // Save/update the sortBy cookie.
+ var expiration = new Date();
+ expiration.setDate(expiration.getDate() + 365);
+ document.cookie= 'sortBy=' + escape(by) +
+ ';expires=' + expiration.toUTCString();
+ $('ul.comment-ul').each(function(index, ul) {
+ var comments = getChildren($(ul), true);
+ comments = sortComments(comments);
+ appendComments(comments, $(ul).empty());
+ });
+ }
+
+ /**
+ * Function to process a vote when a user clicks an arrow.
+ */
+ function handleVote(link) {
+ if (!opts.voting) {
+ showError("You'll need to login to vote.");
+ return;
+ }
+
+ var id = link.attr('id');
+ if (!id) {
+ // Didn't click on one of the voting arrows.
+ return;
+ }
+ // If it is an unvote, the new vote value is 0,
+ // Otherwise it's 1 for an upvote, or -1 for a downvote.
+ var value = 0;
+ if (id.charAt(1) != 'u') {
+ value = id.charAt(0) == 'u' ? 1 : -1;
+ }
+ // The data to be sent to the server.
+ var d = {
+ comment_id: id.substring(2),
+ value: value
+ };
+
+ // Swap the vote and unvote links.
+ link.hide();
+ $('#' + id.charAt(0) + (id.charAt(1) == 'u' ? 'v' : 'u') + d.comment_id)
+ .show();
+
+ // The div the comment is displayed in.
+ var div = $('div#cd' + d.comment_id);
+ var data = div.data('comment');
+
+ // If this is not an unvote, and the other vote arrow has
+ // already been pressed, unpress it.
+ if ((d.value !== 0) && (data.vote === d.value * -1)) {
+ $('#' + (d.value == 1 ? 'd' : 'u') + 'u' + d.comment_id).hide();
+ $('#' + (d.value == 1 ? 'd' : 'u') + 'v' + d.comment_id).show();
+ }
+
+ // Update the comments rating in the local data.
+ data.rating += (data.vote === 0) ? d.value : (d.value - data.vote);
+ data.vote = d.value;
+ div.data('comment', data);
+
+ // Change the rating text.
+ div.find('.rating:first')
+ .text(data.rating + ' point' + (data.rating == 1 ? '' : 's'));
+
+ // Send the vote information to the server.
+ $.ajax({
+ type: "POST",
+ url: opts.processVoteURL,
+ data: d,
+ error: function(request, textStatus, error) {
+ showError('Oops, there was a problem casting that vote.');
+ }
+ });
+ }
+
+ /**
+ * Open a reply form used to reply to an existing comment.
+ */
+ function openReply(id) {
+ // Swap out the reply link for the hide link
+ $('#rl' + id).hide();
+ $('#cr' + id).show();
+
+ // Add the reply li to the children ul.
+ var div = $(renderTemplate(replyTemplate, {id: id})).hide();
+ $('#cl' + id)
+ .prepend(div)
+ // Setup the submit handler for the reply form.
+ .find('#rf' + id)
+ .submit(function(event) {
+ event.preventDefault();
+ addComment($('#rf' + id));
+ closeReply(id);
+ })
+ .find('input[type=button]')
+ .click(function() {
+ closeReply(id);
+ });
+ div.slideDown('fast', function() {
+ $('#rf' + id).find('textarea').focus();
+ });
+ }
+
+ /**
+ * Close the reply form opened with openReply.
+ */
+ function closeReply(id) {
+ // Remove the reply div from the DOM.
+ $('#rd' + id).slideUp('fast', function() {
+ $(this).remove();
+ });
+
+ // Swap out the hide link for the reply link
+ $('#cr' + id).hide();
+ $('#rl' + id).show();
+ }
+
+ /**
+ * Recursively sort a tree of comments using the comp comparator.
+ */
+ function sortComments(comments) {
+ comments.sort(comp);
+ $.each(comments, function() {
+ this.children = sortComments(this.children);
+ });
+ return comments;
+ }
+
+ /**
+ * Get the children comments from a ul. If recursive is true,
+ * recursively include childrens' children.
+ */
+ function getChildren(ul, recursive) {
+ var children = [];
+ ul.children().children("[id^='cd']")
+ .each(function() {
+ var comment = $(this).data('comment');
+ if (recursive)
+ comment.children = getChildren($(this).find('#cl' + comment.id), true);
+ children.push(comment);
+ });
+ return children;
+ }
+
+ /** Create a div to display a comment in. */
+ function createCommentDiv(comment) {
+ if (!comment.displayed && !opts.moderator) {
+ return $('<div class="moderate">Thank you! Your comment will show up '
+ + 'once it is has been approved by a moderator.</div>');
+ }
+ // Prettify the comment rating.
+ comment.pretty_rating = comment.rating + ' point' +
+ (comment.rating == 1 ? '' : 's');
+ // Make a class (for displaying not yet moderated comments differently)
+ comment.css_class = comment.displayed ? '' : ' moderate';
+ // Create a div for this comment.
+ var context = $.extend({}, opts, comment);
+ var div = $(renderTemplate(commentTemplate, context));
+
+ // If the user has voted on this comment, highlight the correct arrow.
+ if (comment.vote) {
+ var direction = (comment.vote == 1) ? 'u' : 'd';
+ div.find('#' + direction + 'v' + comment.id).hide();
+ div.find('#' + direction + 'u' + comment.id).show();
+ }
+
+ if (opts.moderator || comment.text != '[deleted]') {
+ div.find('a.reply').show();
+ if (comment.proposal_diff)
+ div.find('#sp' + comment.id).show();
+ if (opts.moderator && !comment.displayed)
+ div.find('#cm' + comment.id).show();
+ if (opts.moderator || (opts.username == comment.username))
+ div.find('#dc' + comment.id).show();
+ }
+ return div;
+ }
+
+ /**
+ * A simple template renderer. Placeholders such as <%id%> are replaced
+ * by context['id'] with items being escaped. Placeholders such as <#id#>
+ * are not escaped.
+ */
+ function renderTemplate(template, context) {
+ var esc = $(document.createElement('div'));
+
+ function handle(ph, escape) {
+ var cur = context;
+ $.each(ph.split('.'), function() {
+ cur = cur[this];
+ });
+ return escape ? esc.text(cur || "").html() : cur;
+ }
+
+ return template.replace(/<([%#])([\w\.]*)\1>/g, function() {
+ return handle(arguments[2], arguments[1] == '%' ? true : false);
+ });
+ }
+
+ /** Flash an error message briefly. */
+ function showError(message) {
+ $(document.createElement('div')).attr({'class': 'popup-error'})
+ .append($(document.createElement('div'))
+ .attr({'class': 'error-message'}).text(message))
+ .appendTo('body')
+ .fadeIn("slow")
+ .delay(2000)
+ .fadeOut("slow");
+ }
+
+ /** Add a link the user uses to open the comments popup. */
+ $.fn.comment = function() {
+ return this.each(function() {
+ var id = $(this).attr('id').substring(1);
+ var count = COMMENT_METADATA[id];
+ var title = count + ' comment' + (count == 1 ? '' : 's');
+ var image = count > 0 ? opts.commentBrightImage : opts.commentImage;
+ var addcls = count == 0 ? ' nocomment' : '';
+ $(this)
+ .append(
+ $(document.createElement('a')).attr({
+ href: '#',
+ 'class': 'sphinx-comment-open' + addcls,
+ id: 'ao' + id
+ })
+ .append($(document.createElement('img')).attr({
+ src: image,
+ alt: 'comment',
+ title: title
+ }))
+ .click(function(event) {
+ event.preventDefault();
+ show($(this).attr('id').substring(2));
+ })
+ )
+ .append(
+ $(document.createElement('a')).attr({
+ href: '#',
+ 'class': 'sphinx-comment-close hidden',
+ id: 'ah' + id
+ })
+ .append($(document.createElement('img')).attr({
+ src: opts.closeCommentImage,
+ alt: 'close',
+ title: 'close'
+ }))
+ .click(function(event) {
+ event.preventDefault();
+ hide($(this).attr('id').substring(2));
+ })
+ );
+ });
+ };
+
+ var opts = {
+ processVoteURL: '/_process_vote',
+ addCommentURL: '/_add_comment',
+ getCommentsURL: '/_get_comments',
+ acceptCommentURL: '/_accept_comment',
+ deleteCommentURL: '/_delete_comment',
+ commentImage: '/static/_static/comment.png',
+ closeCommentImage: '/static/_static/comment-close.png',
+ loadingImage: '/static/_static/ajax-loader.gif',
+ commentBrightImage: '/static/_static/comment-bright.png',
+ upArrow: '/static/_static/up.png',
+ downArrow: '/static/_static/down.png',
+ upArrowPressed: '/static/_static/up-pressed.png',
+ downArrowPressed: '/static/_static/down-pressed.png',
+ voting: false,
+ moderator: false
+ };
+
+ if (typeof COMMENT_OPTIONS != "undefined") {
+ opts = jQuery.extend(opts, COMMENT_OPTIONS);
+ }
+
+ var popupTemplate = '\
+ <div class="sphinx-comments" id="sc<%id%>">\
+ <p class="sort-options">\
+ Sort by:\
+ <a href="#" class="sort-option byrating">best rated</a>\
+ <a href="#" class="sort-option byascage">newest</a>\
+ <a href="#" class="sort-option byage">oldest</a>\
+ </p>\
+ <div class="comment-header">Comments</div>\
+ <div class="comment-loading" id="cn<%id%>">\
+ loading comments... <img src="<%loadingImage%>" alt="" /></div>\
+ <ul id="cl<%id%>" class="comment-ul"></ul>\
+ <div id="ca<%id%>">\
+ <p class="add-a-comment">Add a comment\
+ (<a href="#" class="comment-markup" id="ab<%id%>">markup</a>):</p>\
+ <div class="comment-markup-box" id="mb<%id%>">\
+ reStructured text markup: <i>*emph*</i>, <b>**strong**</b>, \
+ <tt>``code``</tt>, \
+ code blocks: <tt>::</tt> and an indented block after blank line</div>\
+ <form method="post" id="cf<%id%>" class="comment-form" action="">\
+ <textarea name="comment" cols="80"></textarea>\
+ <p class="propose-button">\
+ <a href="#" id="pc<%id%>" class="show-propose-change">\
+ Propose a change &#9657;\
+ </a>\
+ <a href="#" id="hc<%id%>" class="hide-propose-change">\
+ Propose a change &#9663;\
+ </a>\
+ </p>\
+ <textarea name="proposal" id="pt<%id%>" cols="80"\
+ spellcheck="false"></textarea>\
+ <input type="submit" value="Add comment" />\
+ <input type="hidden" name="node" value="<%id%>" />\
+ <input type="hidden" name="parent" value="" />\
+ </form>\
+ </div>\
+ </div>';
+
+ var commentTemplate = '\
+ <div id="cd<%id%>" class="sphinx-comment<%css_class%>">\
+ <div class="vote">\
+ <div class="arrow">\
+ <a href="#" id="uv<%id%>" class="vote" title="vote up">\
+ <img src="<%upArrow%>" />\
+ </a>\
+ <a href="#" id="uu<%id%>" class="un vote" title="vote up">\
+ <img src="<%upArrowPressed%>" />\
+ </a>\
+ </div>\
+ <div class="arrow">\
+ <a href="#" id="dv<%id%>" class="vote" title="vote down">\
+ <img src="<%downArrow%>" id="da<%id%>" />\
+ </a>\
+ <a href="#" id="du<%id%>" class="un vote" title="vote down">\
+ <img src="<%downArrowPressed%>" />\
+ </a>\
+ </div>\
+ </div>\
+ <div class="comment-content">\
+ <p class="tagline comment">\
+ <span class="user-id"><%username%></span>\
+ <span class="rating"><%pretty_rating%></span>\
+ <span class="delta"><%time.delta%></span>\
+ </p>\
+ <div class="comment-text comment"><#text#></div>\
+ <p class="comment-opts comment">\
+ <a href="#" class="reply hidden" id="rl<%id%>">reply &#9657;</a>\
+ <a href="#" class="close-reply" id="cr<%id%>">reply &#9663;</a>\
+ <a href="#" id="sp<%id%>" class="show-proposal">proposal &#9657;</a>\
+ <a href="#" id="hp<%id%>" class="hide-proposal">proposal &#9663;</a>\
+ <a href="#" id="dc<%id%>" class="delete-comment hidden">delete</a>\
+ <span id="cm<%id%>" class="moderation hidden">\
+ <a href="#" id="ac<%id%>" class="accept-comment">accept</a>\
+ </span>\
+ </p>\
+ <pre class="proposal" id="pr<%id%>">\
+<#proposal_diff#>\
+ </pre>\
+ <ul class="comment-children" id="cl<%id%>"></ul>\
+ </div>\
+ <div class="clearleft"></div>\
+ </div>\
+ </div>';
+
+ var replyTemplate = '\
+ <li>\
+ <div class="reply-div" id="rd<%id%>">\
+ <form id="rf<%id%>">\
+ <textarea name="comment" cols="80"></textarea>\
+ <input type="submit" value="Add reply" />\
+ <input type="button" value="Cancel" />\
+ <input type="hidden" name="parent" value="<%id%>" />\
+ <input type="hidden" name="node" value="" />\
+ </form>\
+ </div>\
+ </li>';
+
+ $(document).ready(function() {
+ init();
+ });
+})(jQuery);
+
+$(document).ready(function() {
+ // add comment anchors for all paragraphs that are commentable
+ $('.sphinx-has-comment').comment();
+
+ // highlight search words in search results
+ $("div.context").each(function() {
+ var params = $.getQueryParameters();
+ var terms = (params.q) ? params.q[0].split(/\s+/) : [];
+ var result = $(this);
+ $.each(terms, function() {
+ result.highlightText(this.toLowerCase(), 'highlighted');
+ });
+ });
+
+ // directly open comment window if requested
+ var anchor = document.location.hash;
+ if (anchor.substring(0, 9) == '#comment-') {
+ $('#ao' + anchor.substring(9)).click();
+ document.location.hash = '#s' + anchor.substring(9);
+ }
+});
diff --git a/doc/html/genindex.html b/doc/html/genindex.html
new file mode 100644
index 0000000..45f31b1
--- /dev/null
+++ b/doc/html/genindex.html
@@ -0,0 +1,3258 @@
+
+
+
+
+<!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>Index &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '',
+ VERSION: '',
+ 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="M2Crypto documentation" href="index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="#" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="index.html">M2Crypto documentation</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+
+<h1 id="index">Index</h1>
+
+<div class="genindex-jumpbox">
+ <a href="#A"><strong>A</strong></a>
+ | <a href="#B"><strong>B</strong></a>
+ | <a href="#C"><strong>C</strong></a>
+ | <a href="#D"><strong>D</strong></a>
+ | <a href="#E"><strong>E</strong></a>
+ | <a href="#F"><strong>F</strong></a>
+ | <a href="#G"><strong>G</strong></a>
+ | <a href="#H"><strong>H</strong></a>
+ | <a href="#I"><strong>I</strong></a>
+ | <a href="#K"><strong>K</strong></a>
+ | <a href="#L"><strong>L</strong></a>
+ | <a href="#M"><strong>M</strong></a>
+ | <a href="#N"><strong>N</strong></a>
+ | <a href="#O"><strong>O</strong></a>
+ | <a href="#P"><strong>P</strong></a>
+ | <a href="#Q"><strong>Q</strong></a>
+ | <a href="#R"><strong>R</strong></a>
+ | <a href="#S"><strong>S</strong></a>
+ | <a href="#T"><strong>T</strong></a>
+ | <a href="#U"><strong>U</strong></a>
+ | <a href="#V"><strong>V</strong></a>
+ | <a href="#W"><strong>W</strong></a>
+ | <a href="#X"><strong>X</strong></a>
+
+</div>
+<h2 id="A">A</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.accept">accept() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.accept_ssl">accept_ssl() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Store.add_cert">add_cert() (M2Crypto.X509.X509_Store method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Name.add_entry_by_txt">add_entry_by_txt() (M2Crypto.X509.X509_Name method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.add_ext">add_ext() (M2Crypto.X509.X509 method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.Request.add_extensions">add_extensions() (M2Crypto.X509.Request method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.add_session">add_session() (M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.PublicKey.PublicKey.add_signature">add_signature() (M2Crypto.PGP.PublicKey.PublicKey method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.PublicKey.PublicKey.add_userid">add_userid() (M2Crypto.PGP.PublicKey.PublicKey method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Store.add_x509">add_x509() (M2Crypto.X509.X509_Store method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.PKey.as_der">as_der() (M2Crypto.EVP.PKey method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Session.Session.as_der">(M2Crypto.SSL.Session.Session method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.Request.as_der">(M2Crypto.X509.Request method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.as_der">(M2Crypto.X509.X509 method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Name.as_der">(M2Crypto.X509.X509_Name method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Stack.as_der">(M2Crypto.X509.X509_Stack method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Name.as_hash">as_hash() (M2Crypto.X509.X509_Name method)</a>
+ </dt>
+
+ </dl></td>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.EC.as_pem">as_pem() (M2Crypto.EC.EC method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.PKey.as_pem">(M2Crypto.EVP.PKey method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSA.as_pem">(M2Crypto.RSA.RSA method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.Request.as_pem">(M2Crypto.X509.Request method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.as_pem">(M2Crypto.X509.X509 method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.ASN1.ASN1_String.as_text">as_text() (M2Crypto.ASN1.ASN1_String method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Session.Session.as_text">(M2Crypto.SSL.Session.Session method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.CRL.as_text">(M2Crypto.X509.CRL method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.Request.as_text">(M2Crypto.X509.Request method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.as_text">(M2Crypto.X509.X509 method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Name.as_text">(M2Crypto.X509.X509_Name method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.ASN1.ASN1_Integer">ASN1_Integer (class in M2Crypto.ASN1)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.ASN1.ASN1_Object">ASN1_Object (class in M2Crypto.ASN1)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.ASN1.ASN1_String">ASN1_String (class in M2Crypto.ASN1)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.ASN1.ASN1_TIME">ASN1_TIME (class in M2Crypto.ASN1)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.ASN1.ASN1_UTCTIME">ASN1_UTCTIME (in module M2Crypto.ASN1)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.PKey.assign_rsa">assign_rsa() (M2Crypto.EVP.PKey method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.ftpslib.FTP_TLS.auth_ssl">auth_ssl() (M2Crypto.ftpslib.FTP_TLS method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.ftpslib.FTP_TLS.auth_tls">auth_tls() (M2Crypto.ftpslib.FTP_TLS method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.AuthCookie.AuthCookie">AuthCookie (class in M2Crypto.AuthCookie)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.AuthCookie.AuthCookieJar">AuthCookieJar (class in M2Crypto.AuthCookie)</a>
+ </dt>
+
+ </dl></td>
+</tr></table>
+
+<h2 id="B">B</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.util.bin_to_hex">bin_to_hex() (in module M2Crypto.util)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.bind">bind() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.BIO">BIO (class in M2Crypto.BIO)</a>
+ </dt>
+
+ </dl></td>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.BIO.bio_ptr">bio_ptr() (M2Crypto.BIO.BIO method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.BIOError">BIOError</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.m2urllib2.build_opener">build_opener() (in module M2Crypto.m2urllib2)</a>
+ </dt>
+
+ </dl></td>
+</tr></table>
+
+<h2 id="C">C</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.check_ca">check_ca() (M2Crypto.X509.X509 method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.DSA.check_key">check_key() (M2Crypto.DSA.DSA method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.DSA_pub.check_key">(M2Crypto.DSA.DSA_pub method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.EC.check_key">(M2Crypto.EC.EC method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSA.check_key">(M2Crypto.RSA.RSA method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSA_pub.check_key">(M2Crypto.RSA.RSA_pub method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.DH.DH.check_params">check_params() (M2Crypto.DH.DH method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.check_purpose">check_purpose() (M2Crypto.X509.X509 method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Checker.Checker">Checker (class in M2Crypto.SSL.Checker)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.Cipher">Cipher (class in M2Crypto.EVP)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.Cipher">(class in M2Crypto.SMIME)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Cipher.Cipher">(class in M2Crypto.SSL.Cipher)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Cipher.Cipher_Stack">Cipher_Stack (class in M2Crypto.SSL.Cipher)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.CipherStream">CipherStream (class in M2Crypto.BIO)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.CKEPacket">CKEPacket (class in M2Crypto.PGP.packet)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.Engine.cleanup">cleanup() (in module M2Crypto.Engine)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.threading.cleanup">(in module M2Crypto.threading)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.clear">clear() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.clear">(M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.clientPostConnectionCheck">clientPostConnectionCheck (M2Crypto.SSL.Connection.Connection attribute)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.BIO.close">close() (M2Crypto.BIO.BIO method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.CipherStream.close">(M2Crypto.BIO.CipherStream method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.File.close">(M2Crypto.BIO.File method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.IOBuffer.close">(M2Crypto.BIO.IOBuffer method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.MemoryBuffer.close">(M2Crypto.BIO.MemoryBuffer method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.PacketStream.close">(M2Crypto.PGP.packet.PacketStream method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.close">(M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.close">(M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.httpslib.HTTPSConnection.close">(M2Crypto.httpslib.HTTPSConnection method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.CommentPacket">CommentPacket (class in M2Crypto.PGP.packet)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.CompressedPacket">CompressedPacket (class in M2Crypto.PGP.packet)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.EC.compute_dh_key">compute_dh_key() (M2Crypto.EC.EC method)</a>
+ </dt>
+
+ </dl></td>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.DH.DH.compute_key">compute_key() (M2Crypto.DH.DH method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.httpslib.HTTPSConnection.connect">connect() (M2Crypto.httpslib.HTTPSConnection method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.connect">(M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher.connect">(M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.httpslib.ProxyHTTPSConnection.connect">(M2Crypto.httpslib.ProxyHTTPSConnection method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.connect_ssl">connect_ssl() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection">Connection (class in M2Crypto.SSL.Connection)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.connectionLost">connectionLost() (M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.connectionMade">connectionMade() (M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.TwistedProtocolWrapper.connectSSL">connectSSL() (in module M2Crypto.SSL.TwistedProtocolWrapper)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.TwistedProtocolWrapper.connectTCP">connectTCP() (in module M2Crypto.SSL.TwistedProtocolWrapper)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context">Context (class in M2Crypto.SSL.Context)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.PacketStream.count">count() (M2Crypto.PGP.packet.PacketStream method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Name_Entry.create_by_txt">create_by_txt() (M2Crypto.X509.X509_Name_Entry method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher.create_socket">create_socket() (M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.CRL">CRL (class in M2Crypto.X509)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.Engine.Engine.ctrl_cmd_string">ctrl_cmd_string() (M2Crypto.Engine.Engine method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.ctxmap">ctxmap() (in module M2Crypto.SSL.Context)</a>
+ </dt>
+
+ </dl></td>
+</tr></table>
+
+<h2 id="D">D</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.AuthCookie.AuthCookie.data">data() (M2Crypto.AuthCookie.AuthCookie method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.dataReceived">dataReceived() (M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.PublicKey.PublicKey.decrypt">decrypt() (M2Crypto.PGP.PublicKey.PublicKey method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.SMIME.decrypt">(M2Crypto.SMIME.SMIME method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.httpslib.HTTPSConnection.default_port">default_port (M2Crypto.httpslib.HTTPSConnection attribute)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.DH.DH">DH (class in M2Crypto.DH)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.DH.DHError">DHError</a>
+ </dt>
+
+ </dl></td>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.HMAC.digest">digest() (M2Crypto.EVP.HMAC method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.MessageDigest.digest">(M2Crypto.EVP.MessageDigest method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.SSLBio.do_handshake">do_handshake() (M2Crypto.BIO.SSLBio method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.DSA">DSA (class in M2Crypto.DSA)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.DSA_pub">DSA_pub (class in M2Crypto.DSA)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.DSAError">DSAError</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.ASN1.LocalTimezone.dst">dst() (M2Crypto.ASN1.LocalTimezone method)</a>
+ </dt>
+
+ </dl></td>
+</tr></table>
+
+<h2 id="E">E</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.EC">EC (class in M2Crypto.EC)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.ec_error">ec_error() (in module M2Crypto.EC)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.EC_pub">EC_pub (class in M2Crypto.EC)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.ECError">ECError</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.PublicKey.PublicKey.encrypt">encrypt() (M2Crypto.PGP.PublicKey.PublicKey method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.SMIME.encrypt">(M2Crypto.SMIME.SMIME method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.httpslib.ProxyHTTPSConnection.endheaders">endheaders() (M2Crypto.httpslib.ProxyHTTPSConnection method)</a>
+ </dt>
+
+ </dl></td>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.Engine.Engine">Engine (class in M2Crypto.Engine)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.Engine.EngineError">EngineError</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Name.entry_count">entry_count() (M2Crypto.X509.X509_Name method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.EVPError">EVPError</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.AuthCookie.AuthCookie.expiry">expiry() (M2Crypto.AuthCookie.AuthCookie method)</a>
+ </dt>
+
+ </dl></td>
+</tr></table>
+
+<h2 id="F">F</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.File">File (class in M2Crypto.BIO)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.BIO.fileno">fileno() (M2Crypto.BIO.BIO method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.fileno">(M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.Cipher.final">final() (M2Crypto.EVP.Cipher method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.HMAC.final">(M2Crypto.EVP.HMAC method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.MessageDigest.final">(M2Crypto.EVP.MessageDigest method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.PKey.final">(M2Crypto.EVP.PKey method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RC4.RC4.final">(M2Crypto.RC4.RC4 method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.Engine.Engine.finish">finish() (M2Crypto.Engine.Engine method)</a>
+ </dt>
+
+ </dl></td>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.BIO.flush">flush() (M2Crypto.BIO.BIO method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.SSLServer.ForkingSSLServer">ForkingSSLServer (class in M2Crypto.SSL.SSLServer)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.ftpslib.FTP_TLS">FTP_TLS (class in M2Crypto.ftpslib)</a>
+ </dt>
+
+ </dl></td>
+</tr></table>
+
+<h2 id="G">G</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.gen_key">gen_key() (in module M2Crypto.RSA)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.DH.DH.gen_key">(M2Crypto.DH.DH method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.DSA.gen_key">(M2Crypto.DSA.DSA method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.EC.gen_key">(M2Crypto.EC.EC method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.DH.gen_params">gen_params() (in module M2Crypto.DH)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.gen_params">(in module M2Crypto.DSA)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.gen_params">(in module M2Crypto.EC)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.util.genparam_callback">genparam_callback() (in module M2Crypto.util)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.PKCS7.get0_signers">get0_signers() (M2Crypto.SMIME.PKCS7 method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Store_Context.get1_chain">get1_chain() (M2Crypto.X509.X509_Store_Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.get_allow_unknown_ca">get_allow_unknown_ca() (M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.get_builtin_curves">get_builtin_curves() (in module M2Crypto.EC)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.get_cert_store">get_cert_store() (M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_cipher">get_cipher() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_cipher_list">get_cipher_list() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_ciphers">get_ciphers() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_context">get_context() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Extension.get_critical">get_critical() (M2Crypto.X509.X509_Extension method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Store_Context.get_current_cert">get_current_cert() (M2Crypto.X509.X509_Store_Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Name_Entry.get_data">get_data() (M2Crypto.X509.X509_Name_Entry method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.ASN1.ASN1_TIME.get_datetime">get_datetime() (M2Crypto.ASN1.ASN1_TIME method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_default_session_timeout">get_default_session_timeout() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.EC_pub.get_der">get_der() (M2Crypto.EC.EC_pub method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Name.get_entries_by_nid">get_entries_by_nid() (M2Crypto.X509.X509_Name method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.Err.get_error">get_error() (in module M2Crypto.Err)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Store_Context.get_error">(M2Crypto.X509.X509_Store_Context method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.Err.get_error_code">get_error_code() (in module M2Crypto.Err)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Store_Context.get_error_depth">get_error_depth() (M2Crypto.X509.X509_Store_Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.Err.get_error_func">get_error_func() (in module M2Crypto.Err)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.Err.get_error_lib">get_error_lib() (in module M2Crypto.Err)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.Err.get_error_reason">get_error_reason() (in module M2Crypto.Err)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.get_ext">get_ext() (M2Crypto.X509.X509 method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.get_ext_at">get_ext_at() (M2Crypto.X509.X509 method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.get_ext_count">get_ext_count() (M2Crypto.X509.X509 method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.get_fingerprint">get_fingerprint() (M2Crypto.X509.X509 method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.Engine.Engine.get_id">get_id() (M2Crypto.Engine.Engine method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.get_issuer">get_issuer() (M2Crypto.X509.X509 method)</a>
+ </dt>
+
+ </dl></td>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.EC_pub.get_key">get_key() (M2Crypto.EC.EC_pub method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.PKey.get_modulus">get_modulus() (M2Crypto.EVP.PKey method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.Engine.Engine.get_name">get_name() (M2Crypto.Engine.Engine method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Extension.get_name">(M2Crypto.X509.X509_Extension method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.get_not_after">get_not_after() (M2Crypto.X509.X509 method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.get_not_before">get_not_before() (M2Crypto.X509.X509 method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Name_Entry.get_object">get_object() (M2Crypto.X509.X509_Name_Entry method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_peer_cert">get_peer_cert() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_peer_cert_chain">get_peer_cert_chain() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.Request.get_pubkey">get_pubkey() (M2Crypto.X509.Request method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.get_pubkey">(M2Crypto.X509.X509 method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.PKey.get_rsa">get_rsa() (M2Crypto.EVP.PKey method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.get_serial_number">get_serial_number() (M2Crypto.X509.X509 method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.httpslib.HTTPSConnection.get_session">get_session() (M2Crypto.httpslib.HTTPSConnection method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_session">(M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.get_session_cache_mode">get_session_cache_mode() (M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.get_session_timeout">get_session_timeout() (M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_shutdown">get_shutdown() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_socket_read_timeout">get_socket_read_timeout() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_socket_write_timeout">get_socket_write_timeout() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_state">get_state() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.Request.get_subject">get_subject() (M2Crypto.X509.Request method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.get_subject">(M2Crypto.X509.X509 method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Session.Session.get_time">get_time() (M2Crypto.SSL.Session.Session method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Session.Session.get_timeout">get_timeout() (M2Crypto.SSL.Session.Session method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Extension.get_value">get_value() (M2Crypto.X509.X509_Extension method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_verify_depth">get_verify_depth() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.get_verify_depth">(M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_verify_mode">get_verify_mode() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.get_verify_mode">(M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_verify_result">get_verify_result() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.get_version">get_version() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.Request.get_version">(M2Crypto.X509.Request method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.get_version">(M2Crypto.X509.X509 method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.Err.get_x509_verify_error">get_x509_verify_error() (in module M2Crypto.Err)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.getpeername">getpeername() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.getsockname">getsockname() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.getsockopt">getsockopt() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.MemoryBuffer.getvalue">getvalue() (M2Crypto.BIO.MemoryBuffer method)</a>
+ </dt>
+
+ </dl></td>
+</tr></table>
+
+<h2 id="H">H</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.SSLServer.SSLServer.handle_error">handle_error() (M2Crypto.SSL.SSLServer.SSLServer method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.SSLServer.SSLServer.handle_request">handle_request() (M2Crypto.SSL.SSLServer.SSLServer method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.AuthCookie.AuthCookie.headerValue">headerValue() (M2Crypto.AuthCookie.AuthCookie method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.HMAC">HMAC (class in M2Crypto.EVP)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.hmac">hmac() (in module M2Crypto.EVP)</a>
+ </dt>
+
+ </dl></td>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.m2urllib2.HTTPSHandler.https_open">https_open() (M2Crypto.m2urllib2.HTTPSHandler method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.m2urllib2.HTTPSHandler.https_request">https_request() (M2Crypto.m2urllib2.HTTPSHandler method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.httpslib.HTTPSConnection">HTTPSConnection (class in M2Crypto.httpslib)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.m2urllib2.HTTPSHandler">HTTPSHandler (class in M2Crypto.m2urllib2)</a>
+ </dt>
+
+ </dl></td>
+</tr></table>
+
+<h2 id="I">I</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.threading.init">init() (in module M2Crypto.threading)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.Engine.Engine.init">(M2Crypto.Engine.Engine method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.IOBuffer">IOBuffer (class in M2Crypto.BIO)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.is_ctb">is_ctb() (in module M2Crypto.PGP.packet)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.PrivateKeyPacket.is_encrypted">is_encrypted() (M2Crypto.PGP.packet.PrivateKeyPacket method)</a>
+ </dt>
+
+ </dl></td>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.AuthCookie.AuthCookie.isExpired">isExpired() (M2Crypto.AuthCookie.AuthCookie method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.AuthCookie.AuthCookieJar.isGoodCookie">isGoodCookie() (M2Crypto.AuthCookie.AuthCookieJar method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.AuthCookie.AuthCookieJar.isGoodCookieString">isGoodCookieString() (M2Crypto.AuthCookie.AuthCookieJar method)</a>
+ </dt>
+
+ </dl></td>
+</tr></table>
+
+<h2 id="K">K</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.keygen_callback">keygen_callback() (in module M2Crypto.RSA)</a>
+ </dt>
+
+ </dl></td>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.PublicKey.PublicKey.keyid">keyid() (M2Crypto.PGP.PublicKey.PublicKey method)</a>
+ </dt>
+
+ </dl></td>
+</tr></table>
+
+<h2 id="L">L</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.listen">listen() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.TwistedProtocolWrapper.listenSSL">listenSSL() (in module M2Crypto.SSL.TwistedProtocolWrapper)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.TwistedProtocolWrapper.listenTCP">listenTCP() (in module M2Crypto.SSL.TwistedProtocolWrapper)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.LiteralPacket">LiteralPacket (class in M2Crypto.PGP.packet)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.PublicKeyRing.PublicKeyRing.load">load() (M2Crypto.PGP.PublicKeyRing.PublicKeyRing method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.load_cert">load_cert() (in module M2Crypto.X509)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.load_cert">(M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.load_cert_bio">load_cert_bio() (in module M2Crypto.X509)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.load_cert_chain">load_cert_chain() (M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.load_cert_der_string">load_cert_der_string() (in module M2Crypto.X509)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.load_cert_string">load_cert_string() (in module M2Crypto.X509)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.Engine.Engine.load_certificate">load_certificate() (M2Crypto.Engine.Engine method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.load_client_CA">load_client_CA() (M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.load_client_ca">load_client_ca() (M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.load_crl">load_crl() (in module M2Crypto.X509)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.Engine.load_dynamic">load_dynamic() (in module M2Crypto.Engine)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.Engine.load_dynamic_engine">load_dynamic_engine() (in module M2Crypto.Engine)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.Rand.load_file">load_file() (in module M2Crypto.Rand)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Store.load_info">load_info() (M2Crypto.X509.X509_Store method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.load_key">load_key() (in module M2Crypto.DSA)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.SMIME.load_key">(M2Crypto.SMIME.SMIME method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.load_key">(in module M2Crypto.EC)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.load_key">(in module M2Crypto.EVP)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.load_key">(in module M2Crypto.RSA)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.load_key_bio">load_key_bio() (in module M2Crypto.DSA)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.SMIME.load_key_bio">(M2Crypto.SMIME.SMIME method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.load_key_bio">(in module M2Crypto.EC)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.load_key_bio">(in module M2Crypto.EVP)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.load_key_bio">(in module M2Crypto.RSA)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.load_key_bio_pubkey">load_key_bio_pubkey() (in module M2Crypto.EVP)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.load_key_string">load_key_string() (in module M2Crypto.EC)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.load_key_string">(in module M2Crypto.EVP)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.load_key_string">(in module M2Crypto.RSA)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.load_key_string_pubkey">load_key_string_pubkey() (in module M2Crypto.EC)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.load_key_string_pubkey">(in module M2Crypto.EVP)</a>
+ </dt>
+
+ </dl></dd>
+ </dl></td>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Store.load_locations">load_locations() (M2Crypto.X509.X509_Store method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.Engine.load_openssl">load_openssl() (in module M2Crypto.Engine)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.DH.load_params">load_params() (in module M2Crypto.DH)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.load_params">(in module M2Crypto.DSA)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.DH.load_params_bio">load_params_bio() (in module M2Crypto.DH)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.load_params_bio">(in module M2Crypto.DSA)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.load_pkcs7">load_pkcs7() (in module M2Crypto.SMIME)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.load_pkcs7_bio">load_pkcs7_bio() (in module M2Crypto.SMIME)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.load_pkcs7_bio_der">load_pkcs7_bio_der() (in module M2Crypto.SMIME)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.load_pkcs7_der">load_pkcs7_der() (in module M2Crypto.SMIME)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.Engine.Engine.load_private_key">load_private_key() (M2Crypto.Engine.Engine method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.load_pub_key">load_pub_key() (in module M2Crypto.DSA)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.load_pub_key">(in module M2Crypto.EC)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.load_pub_key">(in module M2Crypto.RSA)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.load_pub_key_bio">load_pub_key_bio() (in module M2Crypto.DSA)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.load_pub_key_bio">(in module M2Crypto.EC)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.load_pub_key_bio">(in module M2Crypto.RSA)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.Engine.Engine.load_public_key">load_public_key() (M2Crypto.Engine.Engine method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.PublicKeyRing.load_pubring">load_pubring() (in module M2Crypto.PGP.PublicKeyRing)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.load_request">load_request() (in module M2Crypto.X509)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.load_request_bio">load_request_bio() (in module M2Crypto.X509)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.load_request_der_string">load_request_der_string() (in module M2Crypto.X509)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.load_request_string">load_request_string() (in module M2Crypto.X509)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Session.load_session">load_session() (in module M2Crypto.SSL.Session)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.load_verify_info">load_verify_info() (M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.load_verify_locations">load_verify_locations() (M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.ASN1.LocalTimezone">LocalTimezone (class in M2Crypto.ASN1)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.loseConnection">loseConnection() (M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper method)</a>
+ </dt>
+
+ </dl></td>
+</tr></table>
+
+<h2 id="M">M</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.ASN1.ASN1_Integer.m2_asn1_integer_free">m2_asn1_integer_free() (M2Crypto.ASN1.ASN1_Integer method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.ASN1.ASN1_Object.m2_asn1_object_free">m2_asn1_object_free() (M2Crypto.ASN1.ASN1_Object method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.ASN1.ASN1_String.m2_asn1_string_free">m2_asn1_string_free() (M2Crypto.ASN1.ASN1_String method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.ASN1.ASN1_TIME.m2_asn1_time_free">m2_asn1_time_free() (M2Crypto.ASN1.ASN1_TIME method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.BIO.m2_bio_free">m2_bio_free() (M2Crypto.BIO.BIO method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.CipherStream.m2_bio_free">(M2Crypto.BIO.CipherStream method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.IOBuffer.m2_bio_free">(M2Crypto.BIO.IOBuffer method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.m2_bio_free">(M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.CipherStream.m2_bio_pop">m2_bio_pop() (M2Crypto.BIO.CipherStream method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.IOBuffer.m2_bio_pop">(M2Crypto.BIO.IOBuffer method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.Cipher.m2_cipher_ctx_free">m2_cipher_ctx_free() (M2Crypto.EVP.Cipher method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.DH.DH.m2_dh_free">m2_dh_free() (M2Crypto.DH.DH method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.DSA.m2_dsa_free">m2_dsa_free() (M2Crypto.DSA.DSA method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.EC.m2_ec_key_free">m2_ec_key_free() (M2Crypto.EC.EC method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.Engine.Engine.m2_engine_free">m2_engine_free() (M2Crypto.Engine.Engine method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.HMAC.m2_hmac_ctx_free">m2_hmac_ctx_free() (M2Crypto.EVP.HMAC method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.MessageDigest.m2_md_ctx_free">m2_md_ctx_free() (M2Crypto.EVP.MessageDigest method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.PKey.m2_md_ctx_free">(M2Crypto.EVP.PKey method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.PKCS7.m2_pkcs7_free">m2_pkcs7_free() (M2Crypto.SMIME.PKCS7 method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.PKey.m2_pkey_free">m2_pkey_free() (M2Crypto.EVP.PKey method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSA.m2_rsa_free">m2_rsa_free() (M2Crypto.RSA.RSA method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Extension_Stack.m2_sk_x509_extension_free">m2_sk_x509_extension_free() (M2Crypto.X509.X509_Extension_Stack method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Stack.m2_sk_x509_free">m2_sk_x509_free() (M2Crypto.X509.X509_Stack method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.m2_ssl_ctx_free">m2_ssl_ctx_free() (M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.m2_ssl_free">m2_ssl_free() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Session.Session.m2_ssl_session_free">m2_ssl_session_free() (M2Crypto.SSL.Session.Session method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.CRL.m2_x509_crl_free">m2_x509_crl_free() (M2Crypto.X509.CRL method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Extension.m2_x509_extension_free">m2_x509_extension_free() (M2Crypto.X509.X509_Extension method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.m2_x509_free">m2_x509_free() (M2Crypto.X509.X509 method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Name_Entry.m2_x509_name_entry_free">m2_x509_name_entry_free() (M2Crypto.X509.X509_Name_Entry method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Name.m2_x509_name_free">m2_x509_name_free() (M2Crypto.X509.X509_Name method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.Request.m2_x509_req_free">m2_x509_req_free() (M2Crypto.X509.Request method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Store_Context.m2_x509_store_ctx_free">m2_x509_store_ctx_free() (M2Crypto.X509.X509_Store_Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Store.m2_x509_store_free">m2_x509_store_free() (M2Crypto.X509.X509_Store method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#module-M2Crypto.__init__">M2Crypto.__init__ (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#module-M2Crypto.ASN1">M2Crypto.ASN1 (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#module-M2Crypto.AuthCookie">M2Crypto.AuthCookie (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#module-M2Crypto.BIO">M2Crypto.BIO (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#module-M2Crypto.BN">M2Crypto.BN (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#module-M2Crypto.callback">M2Crypto.callback (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#module-M2Crypto.DH">M2Crypto.DH (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#module-M2Crypto.DSA">M2Crypto.DSA (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#module-M2Crypto.EC">M2Crypto.EC (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#module-M2Crypto.Engine">M2Crypto.Engine (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#module-M2Crypto.Err">M2Crypto.Err (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#module-M2Crypto.EVP">M2Crypto.EVP (module)</a>
+ </dt>
+
+ </dl></td>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#module-M2Crypto.ftpslib">M2Crypto.ftpslib (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#module-M2Crypto.httpslib">M2Crypto.httpslib (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#module-M2Crypto.m2">M2Crypto.m2 (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#module-M2Crypto.m2crypto">M2Crypto.m2crypto (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#module-M2Crypto.m2urllib">M2Crypto.m2urllib (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#module-M2Crypto.m2urllib2">M2Crypto.m2urllib2 (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#module-M2Crypto.m2xmlrpclib">M2Crypto.m2xmlrpclib (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#module-M2Crypto.PGP">M2Crypto.PGP (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#module-M2Crypto.PGP.constants">M2Crypto.PGP.constants (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#module-M2Crypto.PGP.packet">M2Crypto.PGP.packet (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#module-M2Crypto.PGP.PublicKey">M2Crypto.PGP.PublicKey (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#module-M2Crypto.PGP.PublicKeyRing">M2Crypto.PGP.PublicKeyRing (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#module-M2Crypto.PGP.RSA">M2Crypto.PGP.RSA (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#module-M2Crypto.Rand">M2Crypto.Rand (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#module-M2Crypto.RC4">M2Crypto.RC4 (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#module-M2Crypto.RSA">M2Crypto.RSA (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#module-M2Crypto.SMIME">M2Crypto.SMIME (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#module-M2Crypto.SSL">M2Crypto.SSL (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#module-M2Crypto.SSL.cb">M2Crypto.SSL.cb (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#module-M2Crypto.SSL.Checker">M2Crypto.SSL.Checker (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#module-M2Crypto.SSL.Cipher">M2Crypto.SSL.Cipher (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#module-M2Crypto.SSL.Connection">M2Crypto.SSL.Connection (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#module-M2Crypto.SSL.Context">M2Crypto.SSL.Context (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#module-M2Crypto.SSL.Session">M2Crypto.SSL.Session (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#module-M2Crypto.SSL.ssl_dispatcher">M2Crypto.SSL.ssl_dispatcher (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#module-M2Crypto.SSL.SSLServer">M2Crypto.SSL.SSLServer (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#module-M2Crypto.SSL.timeout">M2Crypto.SSL.timeout (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#module-M2Crypto.SSL.TwistedProtocolWrapper">M2Crypto.SSL.TwistedProtocolWrapper (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#module-M2Crypto.threading">M2Crypto.threading (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#module-M2Crypto.util">M2Crypto.util (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#module-M2Crypto.X509">M2Crypto.X509 (module)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.Err.M2CryptoError">M2CryptoError</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.AuthCookie.AuthCookie.mac">mac() (M2Crypto.AuthCookie.AuthCookie method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.make_ctb">make_ctb() (in module M2Crypto.PGP.packet)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.AuthCookie.AuthCookieJar.makeCookie">makeCookie() (M2Crypto.AuthCookie.AuthCookieJar method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.makefile">makefile() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.map">map() (in module M2Crypto.SSL.Context)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.MemoryBuffer">MemoryBuffer (class in M2Crypto.BIO)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.MessageDigest">MessageDigest (class in M2Crypto.EVP)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.AuthCookie.mix">mix() (in module M2Crypto.AuthCookie)</a>
+ </dt>
+
+ </dl></td>
+</tr></table>
+
+<h2 id="N">N</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.AuthCookie.AuthCookie.name">name() (M2Crypto.AuthCookie.AuthCookie method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Cipher.Cipher.name">(M2Crypto.SSL.Cipher.Cipher method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.new_extension">new_extension() (in module M2Crypto.X509)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.RSA.new_pub_key">new_pub_key() (in module M2Crypto.PGP.RSA)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.new_pub_key">(in module M2Crypto.RSA)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.new_stack_from_der">new_stack_from_der() (in module M2Crypto.X509)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Name.nid">nid (M2Crypto.X509.X509_Name attribute)</a>
+ </dt>
+
+ </dl></td>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.util.no_passphrase_callback">no_passphrase_callback() (in module M2Crypto.util)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Checker.NoCertificate">NoCertificate</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.ftpslib.FTP_TLS.ntransfercmd">ntransfercmd() (M2Crypto.ftpslib.FTP_TLS method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Checker.Checker.numericIpMatch">numericIpMatch (M2Crypto.SSL.Checker.Checker attribute)</a>
+ </dt>
+
+ </dl></td>
+</tr></table>
+
+<h2 id="O">O</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.util.octx_to_num">octx_to_num() (in module M2Crypto.util)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.m2urllib.open_https">open_https() (in module M2Crypto.m2urllib)</a>
+ </dt>
+
+ </dl></td>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.openfile">openfile() (in module M2Crypto.BIO)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.AuthCookie.AuthCookie.output">output() (M2Crypto.AuthCookie.AuthCookie method)</a>
+ </dt>
+
+ </dl></td>
+</tr></table>
+
+<h2 id="P">P</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.CommentPacket.pack">pack() (M2Crypto.PGP.packet.CommentPacket method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.Packet.pack">(M2Crypto.PGP.packet.Packet method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.PublicKeyPacket.pack">(M2Crypto.PGP.packet.PublicKeyPacket method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.SignaturePacket.pack">(M2Crypto.PGP.packet.SignaturePacket method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.UserIDPacket.pack">(M2Crypto.PGP.packet.UserIDPacket method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.timeout.timeout.pack">(M2Crypto.SSL.timeout.timeout method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.Packet">Packet (class in M2Crypto.PGP.packet)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.PacketStream">PacketStream (class in M2Crypto.PGP.packet)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.util.passphrase_callback">passphrase_callback() (in module M2Crypto.util)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.pbkdf2">pbkdf2() (in module M2Crypto.EVP)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.Err.peek_error_code">peek_error_code() (in module M2Crypto.Err)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.pending">pending() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.Packet.pkc">pkc() (M2Crypto.PGP.packet.Packet method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.util.pkcs5_pad">pkcs5_pad() (in module M2Crypto.util)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.PKCS7">PKCS7 (class in M2Crypto.SMIME)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.PKCS7_Error">PKCS7_Error</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.util.pkcs7_pad">pkcs7_pad() (in module M2Crypto.util)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.PKEPacket">PKEPacket (class in M2Crypto.PGP.packet)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.PKey">PKey (class in M2Crypto.EVP)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Extension_Stack.pop">pop() (M2Crypto.X509.X509_Extension_Stack method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Stack.pop">(M2Crypto.X509.X509_Stack method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.DH.DH.print_params">print_params() (M2Crypto.DH.DH method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSA.private_decrypt">private_decrypt() (M2Crypto.RSA.RSA method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSA_pub.private_decrypt">(M2Crypto.RSA.RSA_pub method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSA.private_encrypt">private_encrypt() (M2Crypto.RSA.RSA method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSA_pub.private_encrypt">(M2Crypto.RSA.RSA_pub method)</a>
+ </dt>
+
+ </dl></dd>
+ </dl></td>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.PrivateKeyPacket">PrivateKeyPacket (class in M2Crypto.PGP.packet)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.ftpslib.FTP_TLS.prot_c">prot_c() (M2Crypto.ftpslib.FTP_TLS method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.ftpslib.FTP_TLS.prot_p">prot_p() (M2Crypto.ftpslib.FTP_TLS method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.httpslib.ProxyHTTPSConnection">ProxyHTTPSConnection (class in M2Crypto.httpslib)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.EC.pub">pub() (M2Crypto.EC.EC method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSA.pub">(M2Crypto.RSA.RSA method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.pub_key_from_der">pub_key_from_der() (in module M2Crypto.EC)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.pub_key_from_params">pub_key_from_params() (in module M2Crypto.DSA)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.pub_key_from_params">(in module M2Crypto.EC)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.PublicKeyPacket.pubkey">pubkey() (M2Crypto.PGP.packet.PublicKeyPacket method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSA.public_decrypt">public_decrypt() (M2Crypto.RSA.RSA method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSA.public_encrypt">public_encrypt() (M2Crypto.RSA.RSA method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.PublicKey.PublicKey">PublicKey (class in M2Crypto.PGP.PublicKey)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.PublicKeyPacket">PublicKeyPacket (class in M2Crypto.PGP.packet)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.PublicKeyRing.PublicKeyRing">PublicKeyRing (class in M2Crypto.PGP.PublicKeyRing)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Extension_Stack.push">push() (M2Crypto.X509.X509_Extension_Stack method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Stack.push">(M2Crypto.X509.X509_Stack method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.httpslib.ProxyHTTPSConnection.putheader">putheader() (M2Crypto.httpslib.ProxyHTTPSConnection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.httpslib.ProxyHTTPSConnection.putrequest">putrequest() (M2Crypto.httpslib.ProxyHTTPSConnection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.util.py3bytes">py3bytes() (in module M2Crypto.util)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.util.py3str">py3str() (in module M2Crypto.util)</a>
+ </dt>
+
+ </dl></td>
+</tr></table>
+
+<h2 id="Q">Q</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.util.quiet_genparam_callback">quiet_genparam_callback() (in module M2Crypto.util)</a>
+ </dt>
+
+ </dl></td>
+</tr></table>
+
+<h2 id="R">R</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.BN.rand">rand() (in module M2Crypto.BN)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.Rand.rand_add">rand_add() (in module M2Crypto.Rand)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.Rand.rand_bytes">rand_bytes() (in module M2Crypto.Rand)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.Rand.rand_file_name">rand_file_name() (in module M2Crypto.Rand)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.Rand.rand_pseudo_bytes">rand_pseudo_bytes() (in module M2Crypto.Rand)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.BN.rand_range">rand_range() (in module M2Crypto.BN)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.Rand.rand_seed">rand_seed() (in module M2Crypto.Rand)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.Rand.rand_status">rand_status() (in module M2Crypto.Rand)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.BN.randfname">randfname() (in module M2Crypto.BN)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RC4.RC4">RC4 (class in M2Crypto.RC4)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RC4.RC4.rc4_free">rc4_free() (M2Crypto.RC4.RC4 method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.BIO.read">read() (M2Crypto.BIO.BIO method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.MemoryBuffer.read">(M2Crypto.BIO.MemoryBuffer method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.PacketStream.read">(M2Crypto.PGP.packet.PacketStream method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.read">(M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.MemoryBuffer.read_all">read_all() (M2Crypto.BIO.MemoryBuffer method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.BIO.readable">readable() (M2Crypto.BIO.BIO method)</a>
+ </dt>
+
+ </dl></td>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.BIO.readline">readline() (M2Crypto.BIO.BIO method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.BIO.readlines">readlines() (M2Crypto.BIO.BIO method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.recv">recv() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher.recv">(M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.remove_session">remove_session() (M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.PublicKey.PublicKey.remove_userid">remove_userid() (M2Crypto.PGP.PublicKey.PublicKey method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.renegotiate">renegotiate() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.Request">Request (class in M2Crypto.X509)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.m2xmlrpclib.SSL_Transport.request">request() (M2Crypto.m2xmlrpclib.SSL_Transport method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.BIO.reset">reset() (M2Crypto.BIO.BIO method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.File.reset">(M2Crypto.BIO.File method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.HMAC.reset">(M2Crypto.EVP.HMAC method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.PKey.reset_context">reset_context() (M2Crypto.EVP.PKey method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSA">RSA (class in M2Crypto.RSA)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.rsa_error">rsa_error() (in module M2Crypto.RSA)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSA_pub">RSA_pub (class in M2Crypto.RSA)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSAError">RSAError</a>
+ </dt>
+
+ </dl></td>
+</tr></table>
+
+<h2 id="S">S</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.CipherStream.SALT_LEN">SALT_LEN (M2Crypto.BIO.CipherStream attribute)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.PublicKeyRing.PublicKeyRing.save">save() (M2Crypto.PGP.PublicKeyRing.PublicKeyRing method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.Request.save">(M2Crypto.X509.Request method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.save">(M2Crypto.X509.X509 method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.Rand.save_file">save_file() (in module M2Crypto.Rand)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.DSA.save_key">save_key() (M2Crypto.DSA.DSA method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.DSA_pub.save_key">(M2Crypto.DSA.DSA_pub method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.EC.save_key">(M2Crypto.EC.EC method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.EC_pub.save_key">(M2Crypto.EC.EC_pub method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.PKey.save_key">(M2Crypto.EVP.PKey method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSA.save_key">(M2Crypto.RSA.RSA method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSA_pub.save_key">(M2Crypto.RSA.RSA_pub method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.DSA.save_key_bio">save_key_bio() (M2Crypto.DSA.DSA method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.DSA_pub.save_key_bio">(M2Crypto.DSA.DSA_pub method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.EC.save_key_bio">(M2Crypto.EC.EC method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.EC_pub.save_key_bio">(M2Crypto.EC.EC_pub method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.PKey.save_key_bio">(M2Crypto.EVP.PKey method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSA.save_key_bio">(M2Crypto.RSA.RSA method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSA_pub.save_key_bio">(M2Crypto.RSA.RSA_pub method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSA.save_key_der">save_key_der() (M2Crypto.RSA.RSA method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSA.save_key_der_bio">save_key_der_bio() (M2Crypto.RSA.RSA method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.DSA.save_params">save_params() (M2Crypto.DSA.DSA method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.DSA.save_params_bio">save_params_bio() (M2Crypto.DSA.DSA method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSA.save_pem">save_pem() (M2Crypto.RSA.RSA method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.Request.save_pem">(M2Crypto.X509.Request method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.save_pem">(M2Crypto.X509.X509 method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.DSA.save_pub_key">save_pub_key() (M2Crypto.DSA.DSA method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.EC.save_pub_key">(M2Crypto.EC.EC method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSA.save_pub_key">(M2Crypto.RSA.RSA method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.DSA.save_pub_key_bio">save_pub_key_bio() (M2Crypto.DSA.DSA method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.EC.save_pub_key_bio">(M2Crypto.EC.EC method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSA.save_pub_key_bio">(M2Crypto.RSA.RSA method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.BIO.seek">seek() (M2Crypto.BIO.BIO method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.send">send() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher.send">(M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.sendall">sendall() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.serverPostConnectionCheck">serverPostConnectionCheck() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Session.Session">Session (class in M2Crypto.SSL.Session)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_accept_state">set_accept_state() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_allow_unknown_ca">set_allow_unknown_ca() (M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_bio">set_bio() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.CipherStream.set_cipher">set_cipher() (M2Crypto.BIO.CipherStream method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.SMIME.set_cipher">(M2Crypto.SMIME.SMIME method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_cipher_list">set_cipher_list() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_cipher_list">(M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_client_CA_list_from_context">set_client_CA_list_from_context() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_client_CA_list_from_file">set_client_CA_list_from_file() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_client_CA_list_from_file">(M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_connect_state">set_connect_state() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Extension.set_critical">set_critical() (M2Crypto.X509.X509_Extension method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Name_Entry.set_data">set_data() (M2Crypto.X509.X509_Name_Entry method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.ASN1.ASN1_TIME.set_datetime">set_datetime() (M2Crypto.ASN1.ASN1_TIME method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.Engine.Engine.set_default">set_default() (M2Crypto.Engine.Engine method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_default_verify_paths">set_default_verify_paths() (M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_info_callback">set_info_callback() (M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.set_issuer">set_issuer() (M2Crypto.X509.X509 method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.set_issuer_name">set_issuer_name() (M2Crypto.X509.X509 method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RC4.RC4.set_key">set_key() (M2Crypto.RC4.RC4 method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.set_not_after">set_not_after() (M2Crypto.X509.X509 method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.set_not_before">set_not_before() (M2Crypto.X509.X509 method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Name_Entry.set_object">set_object() (M2Crypto.X509.X509_Name_Entry method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_options">set_options() (M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.Cipher.set_padding">set_padding() (M2Crypto.EVP.Cipher method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.DH.set_params">set_params() (in module M2Crypto.DH)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.DSA.set_params">(M2Crypto.DSA.DSA method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.set_params">(in module M2Crypto.DSA)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_post_connection_check_callback">set_post_connection_check_callback() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.Request.set_pubkey">set_pubkey() (M2Crypto.X509.Request method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.set_pubkey">(M2Crypto.X509.X509 method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.set_serial_number">set_serial_number() (M2Crypto.X509.X509 method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.httpslib.HTTPSConnection.set_session">set_session() (M2Crypto.httpslib.HTTPSConnection method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_session">(M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_session_cache_mode">set_session_cache_mode() (M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_session_id_ctx">set_session_id_ctx() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_session_id_ctx">(M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_session_timeout">set_session_timeout() (M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_shutdown">set_shutdown() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_socket_read_timeout">set_socket_read_timeout() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_socket_write_timeout">set_socket_write_timeout() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.SSLBio.set_ssl">set_ssl() (M2Crypto.BIO.SSLBio method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_ssl_close_flag">set_ssl_close_flag() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.ASN1.ASN1_TIME.set_string">set_string() (M2Crypto.ASN1.ASN1_TIME method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.Request.set_subject">set_subject() (M2Crypto.X509.Request method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.set_subject">(M2Crypto.X509.X509 method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.Request.set_subject_name">set_subject_name() (M2Crypto.X509.Request method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.set_subject_name">(M2Crypto.X509.X509 method)</a>
+ </dt>
+
+ </dl></dd>
+ </dl></td>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.ASN1.ASN1_TIME.set_time">set_time() (M2Crypto.ASN1.ASN1_TIME method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Session.Session.set_time">(M2Crypto.SSL.Session.Session method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Session.Session.set_timeout">set_timeout() (M2Crypto.SSL.Session.Session method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.set_tlsext_host_name">set_tlsext_host_name() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_tmp_dh">set_tmp_dh() (M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_tmp_dh_callback">set_tmp_dh_callback() (M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_tmp_rsa">set_tmp_rsa() (M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_tmp_rsa_callback">set_tmp_rsa_callback() (M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Context.Context.set_verify">set_verify() (M2Crypto.SSL.Context.Context method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Store.set_verify_cb">set_verify_cb() (M2Crypto.X509.X509_Store method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.Request.set_version">set_version() (M2Crypto.X509.Request method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.set_version">(M2Crypto.X509.X509 method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.SMIME.set_x509_stack">set_x509_stack() (M2Crypto.SMIME.SMIME method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.SMIME.set_x509_store">set_x509_store() (M2Crypto.SMIME.SMIME method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.setblocking">setblocking() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.setsockopt">setsockopt() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.settimeout">settimeout() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.setup_addr">setup_addr() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.setup_ssl">setup_ssl() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.BIO.should_read">should_read() (M2Crypto.BIO.BIO method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.BIO.should_retry">should_retry() (M2Crypto.BIO.BIO method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.BIO.should_write">should_write() (M2Crypto.BIO.BIO method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.shutdown">shutdown() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.DSA.sign">sign() (M2Crypto.DSA.DSA method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.DSA_pub.sign">(M2Crypto.DSA.DSA_pub method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSA.sign">(M2Crypto.RSA.RSA method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.SMIME.sign">(M2Crypto.SMIME.SMIME method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.Request.sign">(M2Crypto.X509.Request method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.sign">(M2Crypto.X509.X509 method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.DSA.sign_asn1">sign_asn1() (M2Crypto.DSA.DSA method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.DSA_pub.sign_asn1">(M2Crypto.DSA.DSA_pub method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.EC.sign_dsa">sign_dsa() (M2Crypto.EC.EC method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.EC.sign_dsa_asn1">sign_dsa_asn1() (M2Crypto.EC.EC method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.PKey.sign_final">sign_final() (M2Crypto.EVP.PKey method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.PKey.sign_init">sign_init() (M2Crypto.EVP.PKey method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSA.sign_rsassa_pss">sign_rsassa_pss() (M2Crypto.RSA.RSA method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.PKey.sign_update">sign_update() (M2Crypto.EVP.PKey method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.SignaturePacket">SignaturePacket (class in M2Crypto.PGP.packet)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.PKey.size">size() (M2Crypto.EVP.PKey method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.SMIME">SMIME (class in M2Crypto.SMIME)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.SMIME_Error">SMIME_Error</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.smime_load_pkcs7">smime_load_pkcs7() (in module M2Crypto.SMIME)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.smime_load_pkcs7_bio">smime_load_pkcs7_bio() (in module M2Crypto.SMIME)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.PublicKeyRing.PublicKeyRing.spurious">spurious() (M2Crypto.PGP.PublicKeyRing.PublicKeyRing method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher">ssl_dispatcher (class in M2Crypto.SSL.ssl_dispatcher)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.ssl_get_error">ssl_get_error() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.cb.ssl_info_callback">ssl_info_callback() (in module M2Crypto.SSL.cb)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.m2xmlrpclib.SSL_Transport">SSL_Transport (class in M2Crypto.m2xmlrpclib)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.cb.ssl_verify_callback">ssl_verify_callback() (in module M2Crypto.SSL.cb)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.cb.ssl_verify_callback_allow_unknown_ca">ssl_verify_callback_allow_unknown_ca() (in module M2Crypto.SSL.cb)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.cb.ssl_verify_callback_stub">ssl_verify_callback_stub() (in module M2Crypto.SSL.cb)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.SSLBio">SSLBio (class in M2Crypto.BIO)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.Err.SSLError">SSLError</a>, <a href="M2Crypto.SSL.html#M2Crypto.SSL.SSLError">[1]</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.SSLServer.SSLServer">SSLServer (class in M2Crypto.SSL.SSLServer)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.SSLTimeoutError">SSLTimeoutError</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Checker.SSLVerificationError">SSLVerificationError</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.m2crypto.stack_st_OPENSSL_BLOCK.stack">stack (M2Crypto.m2crypto.stack_st_OPENSSL_BLOCK attribute)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.m2crypto.stack_st_OPENSSL_STRING.stack">(M2Crypto.m2crypto.stack_st_OPENSSL_STRING attribute)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.m2crypto.stack_st_OPENSSL_BLOCK">stack_st_OPENSSL_BLOCK (class in M2Crypto.m2crypto)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.m2crypto.stack_st_OPENSSL_STRING">stack_st_OPENSSL_STRING (class in M2Crypto.m2crypto)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.startTLS">startTLS() (M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.timeout.struct_size">struct_size() (in module M2Crypto.SSL.timeout)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.timeout.struct_to_timeout">struct_to_timeout() (in module M2Crypto.SSL.timeout)</a>
+ </dt>
+
+ </dl></td>
+</tr></table>
+
+<h2 id="T">T</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.BIO.tell">tell() (M2Crypto.BIO.BIO method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.text_crlf">text_crlf() (in module M2Crypto.SMIME)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.text_crlf_bio">text_crlf_bio() (in module M2Crypto.SMIME)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.m2crypto.stack_st_OPENSSL_BLOCK.this">this (M2Crypto.m2crypto.stack_st_OPENSSL_BLOCK attribute)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.m2crypto.stack_st_OPENSSL_STRING.this">(M2Crypto.m2crypto.stack_st_OPENSSL_STRING attribute)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.m2crypto.stack_st_OPENSSL_BLOCK.thisown">thisown (M2Crypto.m2crypto.stack_st_OPENSSL_BLOCK attribute)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.m2crypto.stack_st_OPENSSL_STRING.thisown">(M2Crypto.m2crypto.stack_st_OPENSSL_STRING attribute)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.SSLServer.ThreadingSSLServer">ThreadingSSLServer (class in M2Crypto.SSL.SSLServer)</a>
+ </dt>
+
+ </dl></td>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.timeout.timeout">timeout (class in M2Crypto.SSL.timeout)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.Packet.timestamp">timestamp() (M2Crypto.PGP.packet.Packet method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper">TLSProtocolWrapper (class in M2Crypto.SSL.TwistedProtocolWrapper)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.TrustPacket">TrustPacket (class in M2Crypto.PGP.packet)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.PKCS7.type">type() (M2Crypto.SMIME.PKCS7 method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.ASN1.LocalTimezone.tzname">tzname() (M2Crypto.ASN1.LocalTimezone method)</a>
+ </dt>
+
+ </dl></td>
+</tr></table>
+
+<h2 id="U">U</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.CompressedPacket.uncompress">uncompress() (M2Crypto.PGP.packet.CompressedPacket method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.AuthCookie.unmix">unmix() (in module M2Crypto.AuthCookie)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.AuthCookie.unmix3">unmix3() (in module M2Crypto.AuthCookie)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.SMIME.unset_cipher">unset_cipher() (M2Crypto.SMIME.SMIME method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.SMIME.unset_key">unset_key() (M2Crypto.SMIME.SMIME method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.SMIME.unset_x509_stack">unset_x509_stack() (M2Crypto.SMIME.SMIME method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.SMIME.unset_x509_store">unset_x509_store() (M2Crypto.SMIME.SMIME method)</a>
+ </dt>
+
+ </dl></td>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.Cipher.update">update() (M2Crypto.EVP.Cipher method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.HMAC.update">(M2Crypto.EVP.HMAC method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.MessageDigest.update">(M2Crypto.EVP.MessageDigest method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.PKey.update">(M2Crypto.EVP.PKey method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RC4.RC4.update">(M2Crypto.RC4.RC4 method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.m2xmlrpclib.SSL_Transport.user_agent">user_agent (M2Crypto.m2xmlrpclib.SSL_Transport attribute)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.UserIDPacket.userid">userid() (M2Crypto.PGP.packet.UserIDPacket method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.UserIDPacket">UserIDPacket (class in M2Crypto.PGP.packet)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.ASN1.LocalTimezone.utcoffset">utcoffset() (M2Crypto.ASN1.LocalTimezone method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.util.UtilError">UtilError</a>
+ </dt>
+
+ </dl></td>
+</tr></table>
+
+<h2 id="V">V</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.CompressedPacket.validate">validate() (M2Crypto.PGP.packet.CompressedPacket method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.Packet.validate">(M2Crypto.PGP.packet.Packet method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.SignaturePacket.validate">(M2Crypto.PGP.packet.SignaturePacket method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.Packet.validity">validity() (M2Crypto.PGP.packet.Packet method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.AuthCookie.AuthCookie.value">value() (M2Crypto.AuthCookie.AuthCookie method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.DSA.verify">verify() (M2Crypto.DSA.DSA method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSA.verify">(M2Crypto.RSA.RSA method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.SMIME.verify">(M2Crypto.SMIME.SMIME method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.Request.verify">(M2Crypto.X509.Request method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509.verify">(M2Crypto.X509.X509 method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.DSA.DSA.verify_asn1">verify_asn1() (M2Crypto.DSA.DSA method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.EC.verify_dsa">verify_dsa() (M2Crypto.EC.EC method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EC.EC.verify_dsa_asn1">verify_dsa_asn1() (M2Crypto.EC.EC method)</a>
+ </dt>
+
+ </dl></td>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.PKey.verify_final">verify_final() (M2Crypto.EVP.PKey method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.PKey.verify_init">verify_init() (M2Crypto.EVP.PKey method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.verify_ok">verify_ok() (M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.RSA.RSA.verify_rsassa_pss">verify_rsassa_pss() (M2Crypto.RSA.RSA method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.EVP.PKey.verify_update">verify_update() (M2Crypto.EVP.PKey method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.Packet.version">version() (M2Crypto.PGP.packet.Packet method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Cipher.Cipher.version">(M2Crypto.SSL.Cipher.Cipher method)</a>
+ </dt>
+
+ </dl></dd>
+ </dl></td>
+</tr></table>
+
+<h2 id="W">W</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.BIO.write">write() (M2Crypto.BIO.BIO method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.PublicKey.PublicKey.write">(M2Crypto.PGP.PublicKey.PublicKey method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.PKCS7.write">(M2Crypto.SMIME.PKCS7 method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.SMIME.write">(M2Crypto.SMIME.SMIME method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Connection.Connection.write">(M2Crypto.SSL.Connection.Connection method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.write">(M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Session.Session.write_bio">write_bio() (M2Crypto.SSL.Session.Session method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.BIO.write_close">write_close() (M2Crypto.BIO.BIO method)</a>
+ </dt>
+
+ <dd><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.CipherStream.write_close">(M2Crypto.BIO.CipherStream method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.MemoryBuffer.write_close">(M2Crypto.BIO.MemoryBuffer method)</a>
+ </dt>
+
+ </dl></dd>
+
+ <dt><a href="M2Crypto.html#M2Crypto.SMIME.PKCS7.write_der">write_der() (M2Crypto.SMIME.PKCS7 method)</a>
+ </dt>
+
+ </dl></td>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.BIO.BIO.writeable">writeable() (M2Crypto.BIO.BIO method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper.writeSequence">writeSequence() (M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper method)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Checker.WrongCertificate">WrongCertificate</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.SSL.html#M2Crypto.SSL.Checker.WrongHost">WrongHost</a>
+ </dt>
+
+ </dl></td>
+</tr></table>
+
+<h2 id="X">X</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509">X509 (class in M2Crypto.X509)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Extension">X509_Extension (class in M2Crypto.X509)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Extension_Stack">X509_Extension_Stack (class in M2Crypto.X509)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Name">X509_Name (class in M2Crypto.X509)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Name_Entry">X509_Name_Entry (class in M2Crypto.X509)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Stack">X509_Stack (class in M2Crypto.X509)</a>
+ </dt>
+
+ </dl></td>
+ <td style="width: 33%" valign="top"><dl>
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Store">X509_Store (class in M2Crypto.X509)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509_Store_Context">X509_Store_Context (class in M2Crypto.X509)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.x509_store_default_cb">x509_store_default_cb() (in module M2Crypto.X509)</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.html#M2Crypto.X509.X509Error">X509Error</a>
+ </dt>
+
+
+ <dt><a href="M2Crypto.PGP.html#M2Crypto.PGP.packet.XXXError">XXXError</a>
+ </dt>
+
+ </dl></td>
+</tr></table>
+
+
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+
+
+
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="#" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="index.html">M2Crypto documentation</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/howto.ca.html b/doc/html/howto.ca.html
new file mode 100644
index 0000000..b3625ec
--- /dev/null
+++ b/doc/html/howto.ca.html
@@ -0,0 +1,469 @@
+
+
+<!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>HOWTO: Creating your own CA with OpenSSL &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '',
+ VERSION: '',
+ 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="M2Crypto documentation" href="index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="index.html">M2Crypto documentation</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <div class="section" id="howto-creating-your-own-ca-with-openssl">
+<span id="howto-ca"></span><h1>HOWTO: Creating your own CA with OpenSSL<a class="headerlink" href="#howto-creating-your-own-ca-with-openssl" title="Permalink to this headline">¶</a></h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">author:</th><td class="field-body">Pheng Siong Ng &lt;<a class="reference external" href="mailto:ngps&#37;&#52;&#48;post1&#46;com">ngps<span>&#64;</span>post1<span>&#46;</span>com</a>&gt;</td>
+</tr>
+<tr class="field-even field"><th class="field-name">copyright:</th><td class="field-body">© 2000, 2001 by Ng Pheng Siong.</td>
+</tr>
+</tbody>
+</table>
+<div class="section" id="introduction">
+<h2>Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h2>
+<p>This is a HOWTO on creating your own <em>certification authority</em> (<em>CA</em>)
+with OpenSSL.</p>
+<p>I last created a CA about a year ago, when I began work on
+<a class="reference external" href="https://gitlab.com/m2crypto/m2crypto/">M2Crypto</a> and needed
+certificates for the SSL bits. I accepted the tools&#8217; default
+settings then, e.g., certificate validity of 365 days; this meant
+that my certificates, including my CA&#8217;s certificate, have now
+expired.</p>
+<p>Since I am using these certificates for M2Crypto&#8217;s demonstration
+programs (and I have forgotten the passphrase to the CA&#8217;s private
+key), I decided to discard the old CA and start afresh. I also
+decided to document the process, hence this HOWTO.</p>
+</div>
+<div class="section" id="the-procedure">
+<h2>The Procedure<a class="headerlink" href="#the-procedure" title="Permalink to this headline">¶</a></h2>
+<p>I use <tt class="docutils literal"><span class="pre">CA.pl</span></tt>, a Perl program written by Steve Hanson and bundled with
+OpenSSL.</p>
+<p>The following are the steps to create a CA:</p>
+<ol class="arabic">
+<li><p class="first">Choose a directory to do your CA work. All commands are executed
+within this directory. Let&#8217;s call the directory <tt class="docutils literal"><span class="pre">demo</span></tt>.</p>
+</li>
+<li><p class="first">Copy <tt class="docutils literal"><span class="pre">CA.pl</span></tt> and <tt class="docutils literal"><span class="pre">openssl.cnf</span></tt> into <tt class="docutils literal"><span class="pre">demo</span></tt>.</p>
+</li>
+<li><p class="first">Apply the following patch to <tt class="docutils literal"><span class="pre">CA.pl</span></tt>, which allows it to generate a
+CA certificate with a validity period of 1095 days, i.e.,
+3 years:</p>
+<div class="highlight-python"><pre>--- CA.pl.org Sat Mar 31 12:40:13 2001
++++ CA.pl Sat Mar 31 12:41:15 2001
+@@ -97,7 +97,7 @@
+ } else {
+ print &quot;Making CA certificate ...\n&quot;;
+ system (&quot;$REQ -new -x509 -keyout &quot; .
+- &quot;${CATOP}/private/$CAKEY -out ${CATOP}/$CACERT $DAYS&quot;);
++ &quot;${CATOP}/private/$CAKEY -out ${CATOP}/$CACERT -days 1095&quot;);
+ $RET=$?;
+ }
+ }</pre>
+</div>
+</li>
+<li><p class="first">Create a new CA like this:</p>
+<div class="highlight-python"><pre>./CA.pl -newca
+
+A certificate filename (or enter to create) &lt;enter&gt;
+
+Making CA certificate ...
+Using configuration from openssl.cnf
+Generating a 1024 bit RSA private key
+............++++++
+......................++++++
+writing new private key to &#x27;./demoCA/private/cakey.pem&#x27;
+Enter PEM pass phrase: &lt;secret passphrase here&gt;
+Verifying password - Enter PEM pass phrase: &lt;secret passphrase again&gt;
+-----
+You are about to be asked to enter information that will be incorporated
+into your certificate request.
+What you are about to enter is what is called a Distinguished Name or a DN.
+There are quite a few fields but you can leave some blank
+For some fields there will be a default value,
+If you enter &#x27;.&#x27;, the field will be left blank.
+-----
+Country Name (2 letter code) [AU]:SG
+State or Province Name (full name) [Some-State]:.
+Locality Name (eg, city) []:..
+Organization Name (eg, company) [Internet Widgits Pty Ltd]:DemoCA
+Organizational Unit Name (eg, section) []:.
+Common Name (eg, YOUR name) []:DemoCA Certificate Master
+Email Address []:certmaster@democa.dom</pre>
+</div>
+<p>This creates a new CA in the directory <tt class="docutils literal"><span class="pre">demoCA</span></tt>. The CA&#8217;s
+self-signed certificate is in <tt class="docutils literal"><span class="pre">demoCA/cacert.pem</span></tt> and its RSA key
+pair is in <tt class="docutils literal"><span class="pre">demoCA/private/cakey.pem</span></tt>.</p>
+<p><tt class="docutils literal"><span class="pre">demoCA/private/cakey.pem</span></tt> looks like this:</p>
+<div class="highlight-python"><pre>cat demoCA/private/cakey.pem
+
+-----BEGIN RSA PRIVATE KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: DES-EDE3-CBC,19973A9DBBB601BA
+
+eOq9WFScNiI4/UWEUaSnGTKpJv2JYuMD3HwQox2Q3Cd4zGqVjJ6gF3exa5126cKf
+X/bMVnwbPpuFZPiAIvaLyCjT6pYeXTBbSzs7/GQnvEOv+nYnDUFWi0Qm92qLk0uy
+pFi/M1aWheN3vir2ZlAw+DW0bOOZhj8tC7Co7lMYb0YE271b6/YRPZCwQ3GXAHUJ
++aMYxlUDrK45aCUa/1CZDzTgk7h9cDgx2QJSIvYMYytCfI3zsuZMJS8/4OXLL0bI
+lKmAc1dwB3DqGJt5XK4WJesiNfdxeCNEgAcYtEAgYZTPIApU+kTgTCIxJl2nMW7j
+ax+Q1z7g+4MpgG20WD633D4z4dTlDdz+dnLi0rvuvxiwt+dUhrqiML1tyi+Z6EBH
+jU4/cLBWev3rYfrlp4x8J9mDte0YKOk3t0wQOHqRetTsIfdtjnFp/Hu3qDmTCWjD
+z/g7PPoO/bg/B877J9WBPbL/1hXXFYo88M+2aGlPOgDcFdiOqbLb2DCscohMbbVr
+A4mgiy2kwWfIE73qiyV7yyG8FlRvr1iib+jbT3LTGf743utYAAs7HNGuOUObhoyt
+jYvBD7ACn35P5YX7KTqvqErwdijxYCaNBCnvmRtmYSaNw9Kv1UJTxc5Vx7YLwIPk
+E9KyBgKI7vPOjWBZ27+zOvNycmv1ciNtpALAw4bWtXnhCDVTHaVDy34OkheMzNCg
+2cjcBFzOkMIjcI03KbTQXOFIQGlsTWXGzkNf/zBQ+KksT1MCj+zBXSCvlDASMckg
+kef21pGgUqPF14gKGfWX3sV4bjc1vbrRwq6zlG3nMuYqR5MtJJY9eQ==
+-----END RSA PRIVATE KEY-----</pre>
+</div>
+</li>
+<li><p class="first">Next, generate a certificate request:</p>
+<div class="highlight-python"><pre>./CA.pl -newreq
+
+Using configuration from openssl.cnf
+Generating a 1024 bit RSA private key
+..........++++++
+..............++++++
+writing new private key to &#x27;newreq.pem&#x27;
+Enter PEM pass phrase: &lt;another secret passphrase here&gt;
+Verifying password - Enter PEM pass phrase: &lt;another secret passphrase again&gt;
+-----
+You are about to be asked to enter information that will be incorporated
+into your certificate request.
+What you are about to enter is what is called a Distinguished Name or a DN.
+There are quite a few fields but you can leave some blank
+For some fields there will be a default value,
+If you enter &#x27;.&#x27;, the field will be left blank.
+-----
+Country Name (2 letter code) [AU]:SG
+State or Province Name (full name) [Some-State]:..
+Locality Name (eg, city) []:.
+Organization Name (eg, company) [Internet Widgits Pty Ltd]:M2Crypto
+Organizational Unit Name (eg, section) []:.
+Common Name (eg, YOUR name) []:localhost
+Email Address []:admin@server.example.dom
+
+Please enter the following &#x27;extra&#x27; attributes
+to be sent with your certificate request
+A challenge password []:&lt;enter&gt;
+An optional company name []:&lt;enter&gt;
+Request (and private key) is in newreq.pem</pre>
+</div>
+</li>
+</ol>
+<p></p>
+<blockquote>
+<div><p>The certificate request and private key in <tt class="docutils literal"><span class="pre">newreq.pem</span></tt> looks like
+this:</p>
+<div class="highlight-python"><pre>cat newreq.pem
+
+-----BEGIN RSA PRIVATE KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: DES-EDE3-CBC,41B2874DF3D02DD4
+
+mg611EoVkLEooSTv+qTM0Ddmm/M1jE/Jy5RD/sc3LSMhuGu9xc26OgsTJmkQuIAh
+J/B4lAw8G59VTG6DykeEtrG0rUBx4bggc7PKbFuiN423YjJODWcHvVgnPOzXMQt+
+lY4tPl5+217MRHyx2NsWGrpkQNdu3GeSPOVMl3jeQiaXupONbwQ7rj42+X/VtAJP
+W4D1NNwu8aGCPyShsEXHc/fI1WDpphYWke97pOjIZVQESFZOPty5HjIYZux4U+td
+W81xODtq2ecJXc8fn2Wpa9y5VD1LT7oJksOuL1+Z04OVaeUe4x0swM17HlBm2kVt
+fe/C/L6kN27MwZhE331VjtTjSGl4/gknqQDbLOtqT06f3OISsDJETm2itllyhgzv
+C6Fi3N03rGFmKectijC+tws5k+P+HRG6sai33usk8xPokJqA+HYSWPz1XVlpRmv4
+kdjQOdST7ovU62mOTgf3ARcduPPwuzTfxOlYONe5NioO1APVHBrInQwcpLkpOTQR
+vI4roIN+b75/nihUWGUJn/nbbBa2Yl0N5Gs1Tyiy9Z+CcRT2TfWKBBFlEUIFl7Mb
+J9fTV3DI+k+akbR4il1NkQ8EcSmCr3WpA0I9n0EHI7ZVpVaHxc0sqaPFl8YGdFHq
+1Qk53C/w6+qPpDzT3yKFmG2LZytAAM1czvb6RbNRJJP2ZrpBwn/h99sUTo/yPfxY
+nueYmFJDm0uVNtG0icXGNUfSfnjKNTtHPAgyKGetRIC3kgJz/bo2w7EI6iEjBAzK
+l5TRm4x6ZJxwuXXMiJCehMMd8TC8ybwWO4AO19B3ebFFeTVsUgxSGA==
+-----END RSA PRIVATE KEY-----
+-----BEGIN CERTIFICATE REQUEST-----
+MIIBnTCCAQYCAQAwXTELMAkGA1UEBhMCU0cxETAPBgNVBAoTCE0yQ3J5cHRvMRIw
+EAYDVQQDEwlsb2NhbGhvc3QxJzAlBgkqhkiG9w0BCQEWGGFkbWluQHNlcnZlci5l
+eGFtcGxlLmRvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAr1nYY1Qrll1r
+uB/FqlCRrr5nvupdIN+3wF7q915tvEQoc74bnu6b8IbbGRMhzdzmvQ4SzFfVEAuM
+MuTHeybPq5th7YDrTNizKKxOBnqE2KYuX9X22A1Kh49soJJFg6kPb9MUgiZBiMlv
+tb7K3CHfgw5WagWnLl8Lb+ccvKZZl+8CAwEAAaAAMA0GCSqGSIb3DQEBBAUAA4GB
+AHpoRp5YS55CZpy+wdigQEwjL/wSluvo+WjtpvP0YoBMJu4VMKeZi405R7o8oEwi
+PdlrrliKNknFmHKIaCKTLRcU59ScA6ADEIWUzqmUzP5Cs6jrSRo3NKfg1bd09D1K
+9rsQkRc9Urv9mRBIsredGnYECNeRaK5R1yzpOowninXC
+-----END CERTIFICATE REQUEST-----</pre>
+</div>
+</div></blockquote>
+<p></p>
+<blockquote>
+<div><p>Decoding the certificate request gives the following:</p>
+<div class="highlight-python"><pre>openssl req -text -noout &lt; newreq.pem
+
+Using configuration from /usr/local/pkg/openssl/openssl.cnf
+Certificate Request:
+ Data:
+ Version: 0 (0x0)
+ Subject: C=SG, O=M2Crypto, CN=localhost/Email=admin@server.example.dom
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ RSA Public Key: (1024 bit)
+ Modulus (1024 bit):
+ 00:af:59:d8:63:54:2b:96:5d:6b:b8:1f:c5:aa:50:
+ 91:ae:be:67:be:ea:5d:20:df:b7:c0:5e:ea:f7:5e:
+ 6d:bc:44:28:73:be:1b:9e:ee:9b:f0:86:db:19:13:
+ 21:cd:dc:e6:bd:0e:12:cc:57:d5:10:0b:8c:32:e4:
+ c7:7b:26:cf:ab:9b:61:ed:80:eb:4c:d8:b3:28:ac:
+ 4e:06:7a:84:d8:a6:2e:5f:d5:f6:d8:0d:4a:87:8f:
+ 6c:a0:92:45:83:a9:0f:6f:d3:14:82:26:41:88:c9:
+ 6f:b5:be:ca:dc:21:df:83:0e:56:6a:05:a7:2e:5f:
+ 0b:6f:e7:1c:bc:a6:59:97:ef
+ Exponent: 65537 (0x10001)
+ Attributes:
+ a0:00
+ Signature Algorithm: md5WithRSAEncryption
+ 7a:68:46:9e:58:4b:9e:42:66:9c:be:c1:d8:a0:40:4c:23:2f:
+ fc:12:96:eb:e8:f9:68:ed:a6:f3:f4:62:80:4c:26:ee:15:30:
+ a7:99:8b:8d:39:47:ba:3c:a0:4c:22:3d:d9:6b:ae:58:8a:36:
+ 49:c5:98:72:88:68:22:93:2d:17:14:e7:d4:9c:03:a0:03:10:
+ 85:94:ce:a9:94:cc:fe:42:b3:a8:eb:49:1a:37:34:a7:e0:d5:
+ b7:74:f4:3d:4a:f6:bb:10:91:17:3d:52:bb:fd:99:10:48:b2:
+ b7:9d:1a:76:04:08:d7:91:68:ae:51:d7:2c:e9:3a:8c:27:8a:
+ 75:c2</pre>
+</div>
+</div></blockquote>
+<ol class="arabic" start="6">
+<li><p class="first">Now, sign the certificate request:</p>
+<div class="highlight-python"><pre>./CA.pl -sign
+
+Using configuration from openssl.cnf
+Enter PEM pass phrase: &lt;CA&#x27;s passphrase&gt;
+Check that the request matches the signature
+Signature ok
+The Subjects Distinguished Name is as follows
+countryName :PRINTABLE:&#x27;SG&#x27;
+organizationName :PRINTABLE:&#x27;M2Crypto&#x27;
+commonName :PRINTABLE:&#x27;localhost&#x27;
+emailAddress :IA5STRING:&#x27;admin@server.example.dom&#x27;
+Certificate is to be certified until Mar 31 02:57:30 2002 GMT (365 days)
+Sign the certificate? [y/n]:y
+
+
+1 out of 1 certificate requests certified, commit? [y/n]y
+Write out database with 1 new entries
+Data Base Updated
+Signed certificate is in newcert.pem</pre>
+</div>
+</li>
+</ol>
+<p></p>
+<blockquote>
+<div><p><tt class="docutils literal"><span class="pre">newcert.pem</span></tt> looks like this:</p>
+<div class="highlight-python"><pre>cat newcert.pem
+
+Certificate:
+Data:
+ Version: 3 (0x2)
+ Serial Number: 1 (0x1)
+ Signature Algorithm: md5WithRSAEncryption
+ Issuer: C=SG, O=DemoCA, CN=DemoCA Certificate Master/Email=certmaster@democa.dom
+ Validity
+ Not Before: Mar 31 02:57:30 2001 GMT
+ Not After : Mar 31 02:57:30 2002 GMT
+ Subject: C=SG, O=M2Crypto, CN=localhost/Email=admin@server.example.dom
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ RSA Public Key: (1024 bit)
+ Modulus (1024 bit):
+ 00:af:59:d8:63:54:2b:96:5d:6b:b8:1f:c5:aa:50:
+ 91:ae:be:67:be:ea:5d:20:df:b7:c0:5e:ea:f7:5e:
+ 6d:bc:44:28:73:be:1b:9e:ee:9b:f0:86:db:19:13:
+ 21:cd:dc:e6:bd:0e:12:cc:57:d5:10:0b:8c:32:e4:
+ c7:7b:26:cf:ab:9b:61:ed:80:eb:4c:d8:b3:28:ac:
+ 4e:06:7a:84:d8:a6:2e:5f:d5:f6:d8:0d:4a:87:8f:
+ 6c:a0:92:45:83:a9:0f:6f:d3:14:82:26:41:88:c9:
+ 6f:b5:be:ca:dc:21:df:83:0e:56:6a:05:a7:2e:5f:
+ 0b:6f:e7:1c:bc:a6:59:97:ef
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Basic Constraints:
+Certificate:
+Data:
+ Version: 3 (0x2)
+ Serial Number: 1 (0x1)
+ Signature Algorithm: md5WithRSAEncryption
+ Issuer: C=SG, O=DemoCA, CN=DemoCA Certificate Master/Email=certmaster@democa.dom
+ Validity
+ Not Before: Mar 31 02:57:30 2001 GMT
+ Not After : Mar 31 02:57:30 2002 GMT
+ Subject: C=SG, O=M2Crypto, CN=localhost/Email=admin@server.example.dom
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ RSA Public Key: (1024 bit)
+ Modulus (1024 bit):
+ 00:af:59:d8:63:54:2b:96:5d:6b:b8:1f:c5:aa:50:
+ 91:ae:be:67:be:ea:5d:20:df:b7:c0:5e:ea:f7:5e:
+ 6d:bc:44:28:73:be:1b:9e:ee:9b:f0:86:db:19:13:
+ 21:cd:dc:e6:bd:0e:12:cc:57:d5:10:0b:8c:32:e4:
+ c7:7b:26:cf:ab:9b:61:ed:80:eb:4c:d8:b3:28:ac:
+ 4e:06:7a:84:d8:a6:2e:5f:d5:f6:d8:0d:4a:87:8f:
+ 6c:a0:92:45:83:a9:0f:6f:d3:14:82:26:41:88:c9:
+ 6f:b5:be:ca:dc:21:df:83:0e:56:6a:05:a7:2e:5f:
+ 0b:6f:e7:1c:bc:a6:59:97:ef
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Basic Constraints:
+ CA:FALSE
+ Netscape Comment:
+ OpenSSL Generated Certificate
+ X509v3 Subject Key Identifier:
+ B3:D6:89:88:2F:B1:15:40:EC:0A:C0:30:35:3A:B7:DA:72:73:1B:4D
+ X509v3 Authority Key Identifier:
+ keyid:F9:6A:A6:34:97:6B:BC:BB:5A:17:0D:19:FC:62:21:0B:00:B5:0E:29
+ DirName:/C=SG/O=DemoCA/CN=DemoCA Certificate Master/Email=certmaster@democa.dom
+ serial:00
+
+Signature Algorithm: md5WithRSAEncryption</pre>
+</div>
+</div></blockquote>
+<ol class="arabic" start="7">
+<li><p class="first">In certain situations, e.g., where your certificate and private key
+are to be used in an unattended SSL server, you may wish to not
+encrypt the private key, i.e., leave the key in the clear. This
+decision should be governed by your site&#8217;s security policy and threat
+model, of course:</p>
+<div class="highlight-python"><pre>openssl rsa &lt; newkey.pem &gt; newkey2.pem
+
+read RSA key
+Enter PEM pass phrase:&lt;secret passphrase here&gt;
+writing RSA key</pre>
+</div>
+<p><tt class="docutils literal"><span class="pre">newkey2.pem</span></tt> looks like this:</p>
+<div class="highlight-python"><pre>cat newkey2.pem
+
+-----BEGIN RSA PRIVATE KEY-----
+MIICXgIBAAKBgQCvWdhjVCuWXWu4H8WqUJGuvme+6l0g37fAXur3Xm28RChzvhue
+7pvwhtsZEyHN3Oa9DhLMV9UQC4wy5Md7Js+rm2HtgOtM2LMorE4GeoTYpi5f1fbY
+DUqHj2ygkkWDqQ9v0xSCJkGIyW+1vsrcId+DDlZqBacuXwtv5xy8plmX7wIDAQAB
+AoGAbAkU8w3W1Qu15Hle1bJSL7GMReoreqeblOBmMAZz4by0l6sXZXJpjWXo86f/
++dASMYTMPC4ZTYtv06N07AFbjL+kDfqDMTfzQkYMHp1LAq1Ihbq1rHWSBH5n3ekq
+KiY8JKpv8DR5Po1iKaXJFuDByGDENJwYbSRSpSK3P+vkWWECQQDkEUE/ZPqqqZkQ
+2iWRPAsCbEID8SAraQl3DdCLYs/GgARfmmj4yUHEwkys9Jo1H8k4BdxugmaUwNi5
+YQ/CVzrXAkEAxNO80ArbGxPUmr11GHG/bGBYj1DUBkHZSc7dgxZdtUCLGNxQnNsg
+Iwq3n6j1sUzS3UW6abQ8bivYNOUcMKJAqQJBANQxFaLU4b/NQaODQ3aoBZpAfP9L
+5eFdvbet+7zjt2r5CpikgkwOfAmDuXEltx/8LevY0CllW+nErx9zJgVrwUsCQQCu
+76H5JiznPBDSF2FjgHWqVVdgyW4owY3mU739LHvNBLicN/RN9VPy0Suy8/CqzKT9
+lWPBXzf2k3FuUdNkRlFBAkEAmpXoybuiFR2S5Bma/ax96lVs0/VihhfC1zZP/X/F
+Br77+h9dIul+2DnyOl50zu0Sdzst1/7ay4JSDHyiBCMGSQ==
+-----END RSA PRIVATE KEY-----</pre>
+</div>
+</li>
+</ol>
+<p>That&#8217;s it! The certificate, <tt class="docutils literal"><span class="pre">newcert.pem</span></tt>, and the private key -
+<tt class="docutils literal"><span class="pre">newkey.pem</span></tt> (encrypted) or <tt class="docutils literal"><span class="pre">newkey2.pem</span></tt> (unencrypted) - are now
+ready to be used. You may wish to rename the files to more intuitive
+names.</p>
+<p>You should also keep the CA&#8217;s certificate <tt class="docutils literal"><span class="pre">demo/cacert.pem</span></tt> handy
+for use when developing and deploying SSL or S/MIME applications.</p>
+</div>
+<div class="section" id="conclusion">
+<h2>Conclusion<a class="headerlink" href="#conclusion" title="Permalink to this headline">¶</a></h2>
+<p>We&#8217;ve walked through the basic steps in the creation of a CA and
+certificates using the tools that come with OpenSSL. We did not cover
+more advanced topics such as constraining a certificate to be SSL-only
+or S/MIME-only.</p>
+<p>There exist several HOWTOs similar to this one on the net. This one is
+written specifically to facilitate discussions in my other HOWTOs on
+developing SSL and S/MIME applications in
+<a class="reference external" href="http://www.python.org">Python</a> using
+<a class="reference external" href="https://gitlab.com/m2crypto/m2crypto/">M2Crypto</a>.</p>
+</div>
+</div>
+
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+ <h3><a href="index.html">Table Of Contents</a></h3>
+ <ul>
+<li><a class="reference internal" href="#">HOWTO: Creating your own CA with OpenSSL</a><ul>
+<li><a class="reference internal" href="#introduction">Introduction</a></li>
+<li><a class="reference internal" href="#the-procedure">The Procedure</a></li>
+<li><a class="reference internal" href="#conclusion">Conclusion</a></li>
+</ul>
+</li>
+</ul>
+
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="_sources/howto.ca.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="index.html">M2Crypto documentation</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/howto.smime.html b/doc/html/howto.smime.html
new file mode 100644
index 0000000..d1ae312
--- /dev/null
+++ b/doc/html/howto.smime.html
@@ -0,0 +1,847 @@
+
+
+<!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>HOWTO: Programming S/MIME in Python with M2Crypto &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '',
+ VERSION: '',
+ 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="M2Crypto documentation" href="index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="index.html">M2Crypto documentation</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <div class="section" id="howto-programming-s-mime-in-python-with-m2crypto">
+<span id="howto-smime"></span><h1>HOWTO: Programming S/MIME in Python with M2Crypto<a class="headerlink" href="#howto-programming-s-mime-in-python-with-m2crypto" title="Permalink to this headline">¶</a></h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">author:</th><td class="field-body">Pheng Siong Ng &lt;<a class="reference external" href="mailto:ngps&#37;&#52;&#48;post1&#46;com">ngps<span>&#64;</span>post1<span>&#46;</span>com</a>&gt;</td>
+</tr>
+<tr class="field-even field"><th class="field-name">copyright:</th><td class="field-body">© 2000, 2001 by Ng Pheng Siong.</td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="introduction">
+<h1>Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h1>
+<p><a class="reference external" href="https://gitlab.com/m2crypto/m2crypto/">M2Crypto</a> is a
+<a class="reference external" href="http://www.python.org">Python</a> interface to
+<a class="reference external" href="http://www.openssl.org">OpenSSL</a>. It makes available to the Python
+programmer SSL functionality to implement clients and servers, S/MIME
+v2, RSA, DSA, DH, symmetric ciphers, message digests and HMACs.</p>
+<p>This document demonstrates programming S/MIME with M2Crypto.</p>
+</div>
+<div class="section" id="s-mime">
+<h1>S/MIME<a class="headerlink" href="#s-mime" title="Permalink to this headline">¶</a></h1>
+<p>S/MIME - Secure Multipurpose Internet Mail Extensions [RFC 2311, RFC
+2312] - provides a consistent way to send and receive secure MIME data.
+Based on the popular Internet MIME standard, S/MIME provides the
+following cryptographic security services for electronic messaging
+applications - <em>authentication</em>, <em>message integrity</em> and
+<em>non-repudiation of origin</em> (using <em>digital signatures</em>), and <em>privacy</em>
+and <em>data security</em> (using <em>encryption</em>).</p>
+</div>
+<div class="section" id="keys-and-certificates">
+<h1>Keys and Certificates<a class="headerlink" href="#keys-and-certificates" title="Permalink to this headline">¶</a></h1>
+<p>To create an S/MIME-signed message, you need an RSA key pair (this
+consists of a public key and a private key) and an X.509 certificate of
+said public key.</p>
+<p>To create an S/MIME-encrypted message, you need an X.509 certificate for
+each recipient.</p>
+<p>To create an S/MIME-signed <em>and</em> -encrypted message, first create a
+signed message, then encrypt the signed message with the recipients&#8217;
+certificates.</p>
+<p>You may generate key pairs and obtain certificates by using a commercial
+<em>certification authority</em> service.</p>
+<p>You can also do so using freely-available software. For many purposes,
+e.g., automated S/MIME messaging by system administration processes,
+this approach is cheap and effective.</p>
+<p>We now work through using OpenSSL to generate key pairs and
+certificates. This assumes you have OpenSSL installed properly on your
+system.</p>
+<p>First, we generate an X.509 certificate to be used for signing:</p>
+<div class="highlight-python"><pre>openssl req -newkey rsa:1024 -nodes -x509 -days 365 -out signer.pem
+
+Using configuration from /usr/local/pkg/openssl/openssl.cnf
+Generating a 1024 bit RSA private key
+..++++++
+....................++++++
+writing new private key to &#x27;privkey.pem&#x27;
+-----
+You are about to be asked to enter information that will be incorporated
+into your certificate request.
+What you are about to enter is what is called a Distinguished Name or a DN.
+There are quite a few fields but you can leave some blank
+For some fields there will be a default value,
+If you enter &#x27;.&#x27;, the field will be left blank.
+-----
+Country Name (2 letter code) [AU]:SG
+State or Province Name (full name) [Some-State]:.
+Locality Name (eg, city) []:.
+Organization Name (eg, company) [Internet Widgits Pty Ltd]:M2Crypto
+Organizational Unit Name (eg, section) []:.
+Common Name (eg, YOUR name) []:S/MIME Sender
+Email Address []:sender@example.dom</pre>
+</div>
+<p>This generates a 1024-bit RSA key pair, unencrypted, into
+<tt class="docutils literal"><span class="pre">privkey.pem</span></tt>; it also generates a self-signed X.509 certificate for
+the public key into <tt class="docutils literal"><span class="pre">signer.pem</span></tt>. The certificate is valid for 365
+days, i.e., a year.</p>
+<p>Let&#8217;s rename <tt class="docutils literal"><span class="pre">privkey.pem</span></tt> so that we know it is a companion of
+<tt class="docutils literal"><span class="pre">signer.pem</span></tt>&#8216;s:</p>
+<div class="highlight-python"><pre>mv privkey.pem signer_key.pem</pre>
+</div>
+<p>To verify the content of <tt class="docutils literal"><span class="pre">signer.pem</span></tt>, execute the following:</p>
+<div class="highlight-python"><pre>openssl x509 -noout -text -in signer.pem
+
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number: 0 (0x0)
+ Signature Algorithm: md5WithRSAEncryption
+ Issuer: C=SG, O=M2Crypto, CN=S/MIME Sender/Email=sender@example.dom
+ Validity
+ Not Before: Mar 24 12:56:16 2001 GMT
+ Not After : Mar 24 12:56:16 2002 GMT
+ Subject: C=SG, O=M2Crypto, CN=S/MIME Sender/Email=sender@example.dom
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ RSA Public Key: (1024 bit)
+ Modulus (1024 bit):
+ 00:a9:d6:e2:b5:11:3b:ae:3c:e2:17:31:70:e1:6e:
+ 01:f4:19:6d:bd:2a:42:36:2b:37:34:e2:83:1d:0d:
+ 11:2e:b4:99:44:db:10:67:be:97:5f:5b:1a:26:33:
+ 46:23:2f:95:04:7a:35:da:9d:f9:26:88:39:9e:17:
+ cd:3e:eb:a8:19:8d:a8:2a:f1:43:da:55:a9:2e:2c:
+ 65:ed:04:71:42:ce:73:53:b8:ea:7e:c7:f0:23:c6:
+ 63:c5:5e:68:96:64:a7:b4:2a:94:26:76:eb:79:ea:
+ e3:4e:aa:82:09:4f:44:87:4a:12:62:b5:d7:1f:ca:
+ f2:ce:d5:ba:7e:1f:48:fd:b9
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Subject Key Identifier:
+ 29:FB:38:B6:BF:E2:40:BB:FF:D5:71:D7:D5:C4:F0:83:1A:2B:C7:99
+ X509v3 Authority Key Identifier:
+ keyid:29:FB:38:B6:BF:E2:40:BB:FF:D5:71:D7:D5:C4:F0:83:1A:2B:C7:99
+ DirName:/C=SG/O=M2Crypto/CN=S/MIME Sender/Email=sender@example.dom
+ serial:00
+
+ X509v3 Basic Constraints:
+ CA:TRUE
+ Signature Algorithm: md5WithRSAEncryption
+ 68:c8:6b:1b:fa:7c:9a:39:35:76:18:15:c9:fd:89:97:62:db:
+ 7a:b0:2d:13:dd:97:e8:1b:7a:9f:22:27:83:24:9d:2e:56:ec:
+ 97:89:3c:ef:16:55:80:5a:18:7c:22:d0:f6:bb:e3:a4:e8:59:
+ 30:ff:99:5a:93:3e:ea:bc:ee:7f:8d:d6:7d:37:8c:ac:3d:74:
+ 80:ce:7a:99:ba:27:b9:2a:a3:71:fa:a5:25:ba:47:17:df:07:
+ 56:96:36:fd:60:b9:6c:96:06:e8:e3:7b:9f:4b:6a:95:71:a8:
+ 34:fc:fc:b5:88:8b:c4:3f:1e:24:f6:52:47:b2:7d:44:67:d9:
+ 83:e8</pre>
+</div>
+<p>Next, we generate a self-signed X.509 certificate for the recipient.
+Note that <tt class="docutils literal"><span class="pre">privkey.pem</span></tt> will be recreated:</p>
+<div class="highlight-python"><pre>openssl req -newkey rsa:1024 -nodes -x509 -days 365 -out recipient.pem
+
+Using configuration from /usr/local/pkg/openssl/openssl.cnf
+Generating a 1024 bit RSA private key
+.....................................++++++
+.................++++++
+writing new private key to &#x27;privkey.pem&#x27;
+-----
+You are about to be asked to enter information that will be incorporated
+into your certificate request.
+What you are about to enter is what is called a Distinguished Name or a DN.
+There are quite a few fields but you can leave some blank
+For some fields there will be a default value,
+If you enter &#x27;.&#x27;, the field will be left blank.
+-----
+Country Name (2 letter code) [AU]:SG
+State or Province Name (full name) [Some-State]:.
+Locality Name (eg, city) []:.
+Organization Name (eg, company) [Internet Widgits Pty Ltd]:M2Crypto
+Organizational Unit Name (eg, section) []:.
+Common Name (eg, YOUR name) []:S/MIME Recipient
+Email Address []:recipient@example.dom</pre>
+</div>
+<p>Again, rename <tt class="docutils literal"><span class="pre">privkey.pem</span></tt>:</p>
+<div class="highlight-python"><pre>mv privkey.pem recipient_key.pem</pre>
+</div>
+<p>In the examples to follow, S/MIME Sender, <tt class="docutils literal"><span class="pre">&lt;sender&#64;example.dom&gt;</span></tt>,
+shall be the sender of S/MIME messages, while S/MIME Recipient,
+<tt class="docutils literal"><span class="pre">&lt;recipient&#64;example.dom&gt;</span></tt>, shall be the recipient of S/MIME messages.</p>
+<p>Armed with the key pairs and certificates, we are now ready to begin
+programming S/MIME in Python.</p>
+<blockquote>
+<div><p><strong>Note:</strong> The private keys generated above are <em>not
+passphrase-protected</em>, i.e., they are <em>in the clear</em>. Anyone who has
+access to such a key can generate S/MIME-signed messages with it,
+and decrypt S/MIME messages encrypted to it&#8217;s corresponding public
+key.</p>
+<p>We may passphrase-protect the keys, if we so choose. M2Crypto will
+prompt the user for the passphrase when such a key is being loaded.</p>
+</div></blockquote>
+</div>
+<div class="section" id="m2crypto-smime">
+<h1>M2Crypto.SMIME<a class="headerlink" href="#m2crypto-smime" title="Permalink to this headline">¶</a></h1>
+<p>The Python programmer accesses M2Crypto&#8217;s S/MIME functionality through
+class <tt class="docutils literal"><span class="pre">SMIME</span></tt> in the module <tt class="docutils literal"><span class="pre">M2Crypto.SMIME</span></tt>. Typically, an
+<tt class="docutils literal"><span class="pre">SMIME</span></tt> object is instantiated; the object is then set up for the
+intended operation: sign, encrypt, decrypt or verify; finally, the
+operation is invoked on the object.</p>
+<p><tt class="docutils literal"><span class="pre">M2Crypto.SMIME</span></tt> makes extensive use of <tt class="docutils literal"><span class="pre">M2Crypto.BIO</span></tt>:
+<tt class="docutils literal"><span class="pre">M2Crypto.BIO</span></tt> is a Python abstraction of the <tt class="docutils literal"><span class="pre">BIO</span></tt> abstraction in
+OpenSSL. A commonly used <tt class="docutils literal"><span class="pre">BIO</span></tt> abstraction in M2Crypto is
+<tt class="docutils literal"><span class="pre">M2Crypto.BIO.MemoryBuffer</span></tt>, which implements a memory-based file-like
+object, similar to Python&#8217;s own <tt class="docutils literal"><span class="pre">StringIO</span></tt>.</p>
+</div>
+<div class="section" id="sign">
+<h1>Sign<a class="headerlink" href="#sign" title="Permalink to this headline">¶</a></h1>
+<p>The following code demonstrates how to generate an S/MIME-signed
+message. <tt class="docutils literal"><span class="pre">randpool.dat</span></tt> contains random data which is used to seed
+OpenSSL&#8217;s pseudo-random number generator via M2Crypto:</p>
+<div class="highlight-python"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">Rand</span><span class="p">,</span> <span class="n">SMIME</span>
+
+<span class="k">def</span> <span class="nf">makebuf</span><span class="p">(</span><span class="n">text</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
+
+<span class="c1"># Make a MemoryBuffer of the message.</span>
+<span class="n">buf</span> <span class="o">=</span> <span class="n">makebuf</span><span class="p">(</span><span class="s1">&#39;a sign of our times&#39;</span><span class="p">)</span>
+
+<span class="c1"># Seed the PRNG.</span>
+<span class="n">Rand</span><span class="o">.</span><span class="n">load_file</span><span class="p">(</span><span class="s1">&#39;randpool.dat&#39;</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
+
+<span class="c1"># Instantiate an SMIME object; set it up; sign the buffer.</span>
+<span class="n">s</span> <span class="o">=</span> <span class="n">SMIME</span><span class="o">.</span><span class="n">SMIME</span><span class="p">()</span>
+<span class="n">s</span><span class="o">.</span><span class="n">load_key</span><span class="p">(</span><span class="s1">&#39;signer_key.pem&#39;</span><span class="p">,</span> <span class="s1">&#39;signer.pem&#39;</span><span class="p">)</span>
+<span class="n">p7</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">sign</span><span class="p">(</span><span class="n">buf</span><span class="p">,</span> <span class="n">SMIME</span><span class="o">.</span><span class="n">PKCS7_DETACHED</span><span class="p">)</span>
+</pre></div>
+</div>
+<p><tt class="docutils literal"><span class="pre">p7</span></tt> now contains a <em>PKCS #7 signature blob</em> wrapped in an
+<tt class="docutils literal"><span class="pre">M2Crypto.SMIME.PKCS7</span></tt> object. Note that <tt class="docutils literal"><span class="pre">buf</span></tt> has been consumed by
+<tt class="docutils literal"><span class="pre">sign()</span></tt> and has to be recreated if it is to be used again.</p>
+<p>We may now send the signed message via SMTP. In these examples, we shall
+not do so; instead, we&#8217;ll render the S/MIME output in mail-friendly
+format, and pretend that our messages are sent and received
+correctly:</p>
+<div class="highlight-python"><div class="highlight"><pre><span></span><span class="c1"># Recreate buf.</span>
+<span class="n">buf</span> <span class="o">=</span> <span class="n">makebuf</span><span class="p">(</span><span class="s1">&#39;a sign of our times&#39;</span><span class="p">)</span>
+
+<span class="c1"># Output p7 in mail-friendly format.</span>
+<span class="n">out</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
+<span class="n">out</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;From: sender@example.dom</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
+<span class="n">out</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;To: recipient@example.dom</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
+<span class="n">out</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;Subject: M2Crypto S/MIME testing</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
+<span class="n">s</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="n">p7</span><span class="p">,</span> <span class="n">buf</span><span class="p">)</span>
+
+<span class="k">print</span><span class="p">(</span><span class="n">out</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>
+
+<span class="c1"># Save the PRNG&#39;s state.</span>
+<span class="n">Rand</span><span class="o">.</span><span class="n">save_file</span><span class="p">(</span><span class="s1">&#39;randpool.dat&#39;</span><span class="p">)</span>
+</pre></div>
+</div>
+<p>Here&#8217;s the output:</p>
+<div class="highlight-python"><pre>From: sender@example.dom
+To: recipient@example.dom
+Subject: M2Crypto S/MIME testing
+MIME-Version: 1.0
+Content-Type: multipart/signed ; protocol=&quot;application/x-pkcs7-signature&quot; ; micalg=sha1 ; boundary=&quot;----3C93156FC7B4EBF49FE9C7DB7F503087&quot;
+
+This is an S/MIME signed message
+
+------3C93156FC7B4EBF49FE9C7DB7F503087
+a sign of our times
+------3C93156FC7B4EBF49FE9C7DB7F503087
+Content-Type: application/x-pkcs7-signature; name=&quot;smime.p7s&quot;
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment; filename=&quot;smime.p7s&quot;
+
+MIIE8AYJKoZIhvcNAQcCoIIE4TCCBN0CAQExCzAJBgUrDgMCGgUAMCIGCSqGSIb3
+DQEHAaAVBBNhIHNpZ24gb2Ygb3VyIHRpbWVzoIIC5zCCAuMwggJMoAMCAQICAQAw
+DQYJKoZIhvcNAQEEBQAwWzELMAkGA1UEBhMCU0cxETAPBgNVBAoTCE0yQ3J5cHRv
+MRYwFAYDVQQDEw1TL01JTUUgU2VuZGVyMSEwHwYJKoZIhvcNAQkBFhJzZW5kZXJA
+ZXhhbXBsZS5kb20wHhcNMDEwMzMxMTE0MDMzWhcNMDIwMzMxMTE0MDMzWjBbMQsw
+CQYDVQQGEwJTRzERMA8GA1UEChMITTJDcnlwdG8xFjAUBgNVBAMTDVMvTUlNRSBT
+ZW5kZXIxITAfBgkqhkiG9w0BCQEWEnNlbmRlckBleGFtcGxlLmRvbTCBnzANBgkq
+hkiG9w0BAQEFAAOBjQAwgYkCgYEA5c5Tj1CHTSOxa1q2q0FYiwMWYHptJpJcvtZm
+UwrgU5sHrA8OnCM0cDXEj0KPf3cfNjHffB8HWMzI4UEgNmFXQNsxoGZ+iqwxLlNj
+y9Mh7eFW/Bjq5hNXbouSlQ0rWBRkoxV64y+t6lQehb32WfYXQbKFxFJSXzSxOx3R
+8YhSPd0CAwEAAaOBtjCBszAdBgNVHQ4EFgQUXOyolL1t4jaBwZFRM7MS8nBLzUow
+gYMGA1UdIwR8MHqAFFzsqJS9beI2gcGRUTOzEvJwS81KoV+kXTBbMQswCQYDVQQG
+EwJTRzERMA8GA1UEChMITTJDcnlwdG8xFjAUBgNVBAMTDVMvTUlNRSBTZW5kZXIx
+ITAfBgkqhkiG9w0BCQEWEnNlbmRlckBleGFtcGxlLmRvbYIBADAMBgNVHRMEBTAD
+AQH/MA0GCSqGSIb3DQEBBAUAA4GBAHo3DrCHR86fSTVAvfiXdSswWqKtCEhUHRdC
+TLFGl4hDk2GyZxaFuqZwiURz/H7nMicymI2wkz8H/wyHFg8G3BIehURpj2v/ZWXY
+eovbgS7EZALVVkDj4hNl/IIHWd6Gtv1UODf7URbxtl3hQ9/eTWITrefT1heuPnar
+8czydsOLMYIBujCCAbYCAQEwYDBbMQswCQYDVQQGEwJTRzERMA8GA1UEChMITTJD
+cnlwdG8xFjAUBgNVBAMTDVMvTUlNRSBTZW5kZXIxITAfBgkqhkiG9w0BCQEWEnNl
+bmRlckBleGFtcGxlLmRvbQIBADAJBgUrDgMCGgUAoIGxMBgGCSqGSIb3DQEJAzEL
+BgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTAxMDMzMTExNDUwMlowIwYJKoZI
+hvcNAQkEMRYEFOoeRUd8ExIYXfQq8BTFuKWrSP3iMFIGCSqGSIb3DQEJDzFFMEMw
+CgYIKoZIhvcNAwcwDgYIKoZIhvcNAwICAgCAMA0GCCqGSIb3DQMCAgFAMAcGBSsO
+AwIHMA0GCCqGSIb3DQMCAgEoMA0GCSqGSIb3DQEBAQUABIGAQpU8hFUtLCF6hO2t
+ec9EYJ/Imqqiiw+BxWxkUUVT81Vbjwdn9JST6+sztM5JRP2ZW+b4txEjZriYC8f3
+kv95YMTGbIsuWkJ93GrbvqoJ/CxO23r9WWRnZEm/1EZN9ZmlrYqzBTxnNRmP3Dhj
+cW8kzZwH+2/2zz2G7x1HxRWH95A=
+
+------3C93156FC7B4EBF49FE9C7DB7F503087--</pre>
+</div>
+</div>
+<div class="section" id="verify">
+<h1>Verify<a class="headerlink" href="#verify" title="Permalink to this headline">¶</a></h1>
+<p>Assume the above output has been saved into <tt class="docutils literal"><span class="pre">sign.p7</span></tt>. Let&#8217;s now
+verify the signature:</p>
+<div class="highlight-python"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">SMIME</span><span class="p">,</span> <span class="n">X509</span>
+
+<span class="c1"># Instantiate an SMIME object.</span>
+<span class="n">s</span> <span class="o">=</span> <span class="n">SMIME</span><span class="o">.</span><span class="n">SMIME</span><span class="p">()</span>
+
+<span class="c1"># Load the signer&#39;s cert.</span>
+<span class="n">x509</span> <span class="o">=</span> <span class="n">X509</span><span class="o">.</span><span class="n">load_cert</span><span class="p">(</span><span class="s1">&#39;signer.pem&#39;</span><span class="p">)</span>
+<span class="n">sk</span> <span class="o">=</span> <span class="n">X509</span><span class="o">.</span><span class="n">X509_Stack</span><span class="p">()</span>
+<span class="n">sk</span><span class="o">.</span><span class="n">push</span><span class="p">(</span><span class="n">x509</span><span class="p">)</span>
+<span class="n">s</span><span class="o">.</span><span class="n">set_x509_stack</span><span class="p">(</span><span class="n">sk</span><span class="p">)</span>
+
+<span class="c1"># Load the signer&#39;s CA cert. In this case, because the signer&#39;s</span>
+<span class="c1"># cert is self-signed, it is the signer&#39;s cert itself.</span>
+<span class="n">st</span> <span class="o">=</span> <span class="n">X509</span><span class="o">.</span><span class="n">X509_Store</span><span class="p">()</span>
+<span class="n">st</span><span class="o">.</span><span class="n">load_info</span><span class="p">(</span><span class="s1">&#39;signer.pem&#39;</span><span class="p">)</span>
+<span class="n">s</span><span class="o">.</span><span class="n">set_x509_store</span><span class="p">(</span><span class="n">st</span><span class="p">)</span>
+
+<span class="c1"># Load the data, verify it.</span>
+<span class="n">p7</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="n">SMIME</span><span class="o">.</span><span class="n">smime_load_pkcs7</span><span class="p">(</span><span class="s1">&#39;sign.p7&#39;</span><span class="p">)</span>
+<span class="n">v</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">verify</span><span class="p">(</span><span class="n">p7</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
+<span class="k">print</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
+<span class="k">print</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+<span class="k">print</span><span class="p">(</span><span class="n">data</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>
+</pre></div>
+</div>
+<p>Here&#8217;s the output of the above program:</p>
+<div class="highlight-python"><pre>a sign of our times
+&lt;M2Crypto.BIO.BIO instance at 0x822012c&gt;
+a sign of our times</pre>
+</div>
+<p>Suppose, instead of loading <tt class="docutils literal"><span class="pre">signer.pem</span></tt> above, we load
+<tt class="docutils literal"><span class="pre">recipient.pem</span></tt>. That is, we do a global substitution of
+<tt class="docutils literal"><span class="pre">recipient.pem</span></tt> for <tt class="docutils literal"><span class="pre">signer.pem</span></tt> in the above program. Here&#8217;s the
+modified program&#8217;s output:</p>
+<div class="highlight-python"><pre>Traceback (most recent call last):
+ File &quot;./verify.py&quot;, line 22, in ?
+ v = s.verify(p7)
+ File &quot;/usr/local/home/ngps/prog/m2/M2Crypto/SMIME.py&quot;, line 205, in verify
+ raise SMIME_Error, Err.get_error()
+M2Crypto.SMIME.SMIME_Error: 312:error:21075075:PKCS7 routines:PKCS7_verify:certificate verify error:pk7_smime.c:213:Verify error:self signed certificate</pre>
+</div>
+<p>As displayed, the error is generated by line 213 of OpenSSL&#8217;s
+<tt class="docutils literal"><span class="pre">pk7_smime.c</span></tt> (as of OpenSSL 0.9.6); if you are a C programmer, you
+may wish to look up the C source to explore OpenSSL&#8217;s S/MIME
+implementation and understand why the error message is worded thus.</p>
+</div>
+<div class="section" id="encrypt">
+<h1>Encrypt<a class="headerlink" href="#encrypt" title="Permalink to this headline">¶</a></h1>
+<p>We now demonstrate how to generate an S/MIME-encrypted message:</p>
+<div class="highlight-python"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">Rand</span><span class="p">,</span> <span class="n">SMIME</span><span class="p">,</span> <span class="n">X509</span>
+
+<span class="k">def</span> <span class="nf">makebuf</span><span class="p">(</span><span class="n">text</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
+
+<span class="c1"># Make a MemoryBuffer of the message.</span>
+<span class="n">buf</span> <span class="o">=</span> <span class="n">makebuf</span><span class="p">(</span><span class="s1">&#39;a sign of our times&#39;</span><span class="p">)</span>
+
+<span class="c1"># Seed the PRNG.</span>
+<span class="n">Rand</span><span class="o">.</span><span class="n">load_file</span><span class="p">(</span><span class="s1">&#39;randpool.dat&#39;</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
+
+<span class="c1"># Instantiate an SMIME object.</span>
+<span class="n">s</span> <span class="o">=</span> <span class="n">SMIME</span><span class="o">.</span><span class="n">SMIME</span><span class="p">()</span>
+
+<span class="c1"># Load target cert to encrypt to.</span>
+<span class="n">x509</span> <span class="o">=</span> <span class="n">X509</span><span class="o">.</span><span class="n">load_cert</span><span class="p">(</span><span class="s1">&#39;recipient.pem&#39;</span><span class="p">)</span>
+<span class="n">sk</span> <span class="o">=</span> <span class="n">X509</span><span class="o">.</span><span class="n">X509_Stack</span><span class="p">()</span>
+<span class="n">sk</span><span class="o">.</span><span class="n">push</span><span class="p">(</span><span class="n">x509</span><span class="p">)</span>
+<span class="n">s</span><span class="o">.</span><span class="n">set_x509_stack</span><span class="p">(</span><span class="n">sk</span><span class="p">)</span>
+
+<span class="c1"># Set cipher: 3-key triple-DES in CBC mode.</span>
+<span class="n">s</span><span class="o">.</span><span class="n">set_cipher</span><span class="p">(</span><span class="n">SMIME</span><span class="o">.</span><span class="n">Cipher</span><span class="p">(</span><span class="s1">&#39;des_ede3_cbc&#39;</span><span class="p">))</span>
+
+<span class="c1"># Encrypt the buffer.</span>
+<span class="n">p7</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">encrypt</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
+
+<span class="c1"># Output p7 in mail-friendly format.</span>
+<span class="n">out</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
+<span class="n">out</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;From: sender@example.dom</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
+<span class="n">out</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;To: recipient@example.dom</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
+<span class="n">out</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;Subject: M2Crypto S/MIME testing</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
+<span class="n">s</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="n">p7</span><span class="p">)</span>
+
+<span class="k">print</span><span class="p">(</span><span class="n">out</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>
+
+<span class="c1"># Save the PRNG&#39;s state.</span>
+<span class="n">Rand</span><span class="o">.</span><span class="n">save_file</span><span class="p">(</span><span class="s1">&#39;randpool.dat&#39;</span><span class="p">)</span>
+</pre></div>
+</div>
+<p>Here&#8217;s the output of the above program:</p>
+<div class="highlight-python"><pre>From: sender@example.dom
+To: recipient@example.dom
+Subject: M2Crypto S/MIME testing
+MIME-Version: 1.0
+Content-Disposition: attachment; filename=&quot;smime.p7m&quot;
+Content-Type: application/x-pkcs7-mime; name=&quot;smime.p7m&quot;
+Content-Transfer-Encoding: base64
+
+MIIBVwYJKoZIhvcNAQcDoIIBSDCCAUQCAQAxggEAMIH9AgEAMGYwYTELMAkGA1UE
+BhMCU0cxETAPBgNVBAoTCE0yQ3J5cHRvMRkwFwYDVQQDExBTL01JTUUgUmVjaXBp
+ZW50MSQwIgYJKoZIhvcNAQkBFhVyZWNpcGllbnRAZXhhbXBsZS5kb20CAQAwDQYJ
+KoZIhvcNAQEBBQAEgYCBaXZ+qjpBEZwdP7gjfzfAtQitESyMwo3i+LBOw6sSDir6
+FlNDPCnkrTvqDX3Rt6X6vBtTCYOm+qiN7ujPkOU61cN7h8dvHR8YW9+0IPY80/W0
+lZ/HihSRgwTNd7LnxUUcPx8YV1id0dlmP0Hz+Lg+mHf6rqaR//JcYhX9vW4XvjA7
+BgkqhkiG9w0BBwEwFAYIKoZIhvcNAwcECMN+qya6ADywgBgHr9Jkhwn5Gsdu7BwX
+nIQfYTYcdL9I5Sk=</pre>
+</div>
+</div>
+<div class="section" id="decrypt">
+<h1>Decrypt<a class="headerlink" href="#decrypt" title="Permalink to this headline">¶</a></h1>
+<p>Assume the above output has been saved into <tt class="docutils literal"><span class="pre">encrypt.p7</span></tt>. Decrypt the
+message thusly:</p>
+<div class="highlight-python"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">SMIME</span><span class="p">,</span> <span class="n">X509</span>
+
+<span class="c1"># Instantiate an SMIME object.</span>
+<span class="n">s</span> <span class="o">=</span> <span class="n">SMIME</span><span class="o">.</span><span class="n">SMIME</span><span class="p">()</span>
+
+<span class="c1"># Load private key and cert.</span>
+<span class="n">s</span><span class="o">.</span><span class="n">load_key</span><span class="p">(</span><span class="s1">&#39;recipient_key.pem&#39;</span><span class="p">,</span> <span class="s1">&#39;recipient.pem&#39;</span><span class="p">)</span>
+
+<span class="c1"># Load the encrypted data.</span>
+<span class="n">p7</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="n">SMIME</span><span class="o">.</span><span class="n">smime_load_pkcs7</span><span class="p">(</span><span class="s1">&#39;encrypt.p7&#39;</span><span class="p">)</span>
+
+<span class="c1"># Decrypt p7.</span>
+<span class="n">out</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">decrypt</span><span class="p">(</span><span class="n">p7</span><span class="p">)</span>
+
+<span class="k">print</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
+</pre></div>
+</div>
+<p>Here&#8217;s the output:</p>
+<div class="highlight-python"><pre>a sign of our times</pre>
+</div>
+</div>
+<div class="section" id="sign-and-encrypt">
+<h1>Sign and Encrypt<a class="headerlink" href="#sign-and-encrypt" title="Permalink to this headline">¶</a></h1>
+<p>Here&#8217;s how to generate an S/MIME-signed/encrypted message:</p>
+<div class="highlight-python"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">Rand</span><span class="p">,</span> <span class="n">SMIME</span><span class="p">,</span> <span class="n">X509</span>
+
+<span class="k">def</span> <span class="nf">makebuf</span><span class="p">(</span><span class="n">text</span><span class="p">):</span>
+ <span class="k">return</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
+
+<span class="c1"># Make a MemoryBuffer of the message.</span>
+<span class="n">buf</span> <span class="o">=</span> <span class="n">makebuf</span><span class="p">(</span><span class="s1">&#39;a sign of our times&#39;</span><span class="p">)</span>
+
+<span class="c1"># Seed the PRNG.</span>
+<span class="n">Rand</span><span class="o">.</span><span class="n">load_file</span><span class="p">(</span><span class="s1">&#39;randpool.dat&#39;</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
+
+<span class="c1"># Instantiate an SMIME object.</span>
+<span class="n">s</span> <span class="o">=</span> <span class="n">SMIME</span><span class="o">.</span><span class="n">SMIME</span><span class="p">()</span>
+
+<span class="c1"># Load signer&#39;s key and cert. Sign the buffer.</span>
+<span class="n">s</span><span class="o">.</span><span class="n">load_key</span><span class="p">(</span><span class="s1">&#39;signer_key.pem&#39;</span><span class="p">,</span> <span class="s1">&#39;signer.pem&#39;</span><span class="p">)</span>
+<span class="n">p7</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">sign</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
+
+<span class="c1"># Load target cert to encrypt the signed message to.</span>
+<span class="n">x509</span> <span class="o">=</span> <span class="n">X509</span><span class="o">.</span><span class="n">load_cert</span><span class="p">(</span><span class="s1">&#39;recipient.pem&#39;</span><span class="p">)</span>
+<span class="n">sk</span> <span class="o">=</span> <span class="n">X509</span><span class="o">.</span><span class="n">X509_Stack</span><span class="p">()</span>
+<span class="n">sk</span><span class="o">.</span><span class="n">push</span><span class="p">(</span><span class="n">x509</span><span class="p">)</span>
+<span class="n">s</span><span class="o">.</span><span class="n">set_x509_stack</span><span class="p">(</span><span class="n">sk</span><span class="p">)</span>
+
+<span class="c1"># Set cipher: 3-key triple-DES in CBC mode.</span>
+<span class="n">s</span><span class="o">.</span><span class="n">set_cipher</span><span class="p">(</span><span class="n">SMIME</span><span class="o">.</span><span class="n">Cipher</span><span class="p">(</span><span class="s1">&#39;des_ede3_cbc&#39;</span><span class="p">))</span>
+
+<span class="c1"># Create a temporary buffer.</span>
+<span class="n">tmp</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
+
+<span class="c1"># Write the signed message into the temporary buffer.</span>
+<span class="n">s</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">tmp</span><span class="p">,</span> <span class="n">p7</span><span class="p">)</span>
+
+<span class="c1"># Encrypt the temporary buffer.</span>
+<span class="n">p7</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">encrypt</span><span class="p">(</span><span class="n">tmp</span><span class="p">)</span>
+
+<span class="c1"># Output p7 in mail-friendly format.</span>
+<span class="n">out</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
+<span class="n">out</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;From: sender@example.dom</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
+<span class="n">out</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;To: recipient@example.dom</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
+<span class="n">out</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;Subject: M2Crypto S/MIME testing</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
+<span class="n">s</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="n">p7</span><span class="p">)</span>
+
+<span class="k">print</span><span class="p">(</span><span class="n">out</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>
+
+<span class="c1"># Save the PRNG&#39;s state.</span>
+<span class="n">Rand</span><span class="o">.</span><span class="n">save_file</span><span class="p">(</span><span class="s1">&#39;randpool.dat&#39;</span><span class="p">)</span>
+</pre></div>
+</div>
+<p>Here&#8217;s the output of the above program:</p>
+<div class="highlight-python"><pre>From: sender@example.dom
+To: recipient@example.dom
+Subject: M2Crypto S/MIME testing
+MIME-Version: 1.0
+Content-Disposition: attachment; filename=&quot;smime.p7m&quot;
+Content-Type: application/x-pkcs7-mime; name=&quot;smime.p7m&quot;
+Content-Transfer-Encoding: base64
+
+MIIIwwYJKoZIhvcNAQcDoIIItDCCCLACAQAxggEAMIH9AgEAMGYwYTELMAkGA1UE
+BhMCU0cxETAPBgNVBAoTCE0yQ3J5cHRvMRkwFwYDVQQDExBTL01JTUUgUmVjaXBp
+ZW50MSQwIgYJKoZIhvcNAQkBFhVyZWNpcGllbnRAZXhhbXBsZS5kb20CAQAwDQYJ
+KoZIhvcNAQEBBQAEgYBlZlGupFphwhsGtIAPvDExN61qisz3oem88xoXkUW0SzoR
+B9zJFFAuQTWzdNJgrKKYikhWjDojaAc/PFl1K5dYxRgtZLB36ULJD/v/yWmxnjz8
+TvtK+Wbal2P/MH2pZ4LVERXa/snTElhCawUlwtiFz/JvY5CiF/dcwd+AwFQq4jCC
+B6UGCSqGSIb3DQEHATAUBggqhkiG9w0DBwQIRF525UfwszaAggeA85RmX6AXQMxb
+eBDz/LJeCgc3RqU1UwIsbKMquIs1S46Ebbm5nP75izPnujOkJ2hv+LNzqOWADmOl
++CnGEq1qxTyduIgUDA2nBgCL/gVyVy+/XC9dtImUUTxtxLgYtB0ujkBNsOaENOlM
+fv4SGM3jkR+K/xlYG6HHzZGbfYyNGj2Y7yMZ1rL1m8SnRNmkCysKGTrudeNf6wT9
+J6wO9DzLTioz3ZnVr3LjsSKIb4tIp4ugqNJaLuW7m3FtZ3MAgxN68hBbJs8TZ8tL
+V/0jwUqS+grcgZEb9ymfcedxahtDUfHjRkpDpsxZzVVGkSBNcbQu92oByQVnRQ8m
+wrYLp3/eawM5AvuV7HNpTT5ZR+1t8luishHN9899IMP2Vyg0Ub67FqFypYmM2cm2
+sjAI4KpfvT00XFNvgLuYwYEKs9syGTO7hiHNQKcF44F5LYv6nTFwmFQB11dAtY9V
+ull4D2CLDx9OvyNyKwdEZB5dyV0r/uKIdkhST60V2Q9KegpzgFpoZtSKM/HPYSVH
+1Bc9f3Q/GqZCvNZZCMx8UvRjQR8dRWDSmPJ0VXG1+wJ+fCmSPP3AuQ1/VsgPRqx2
+56VrpGPpGut40hV8xQFbWIZ2whwWLKPFAHj8B79ZtFUzUrU6Z2rNpvv8inHc/+S/
+b6GR5s8/gucRblvd7n3OFNX5UJmPmcw9zWbu/1Dr9DY8l0nAQh21y5FGSS8B1wdE
+oD2M3Lp7JbwjQbRtnDhImqul2S4yu+m+wDD1aR2K4k3GAI7KKgOBWT0+BDClcn8A
+4Ju6/YUbj33YlMPJgnGijLnolFy0hNW7TmWqR+8tSI3wO5eNKg4qwBnarqc3vgCV
+quVxINAXyGQCO9lzdw6hudk8/+BlweGdqhONaIWbK5z1L/SfQo6LC9MTsj7FJydq
+bc+kEbfZS8aSq7uc9axW6Ti0eAPJ8EVHtwhSBgZQRweKFBXs6HbbhMIdc4N0M7Oq
+UiFXaF6s4n2uihVP6TqXtHEjTpZoC7pC+HCYiuKXUJtaqtXBOh+y3KLvHk09YL6D
+XmTDg+UTiFsh4jKKm/BhdelbR5JbpJcj5AId76Mfr8+F/1g9ePOvsWHpQr/oIQTo
+xEkaxCmzEgP0b6caMWfMUQrbVGxBBNcqKc/ir9fGGOPHATzzq/xLcQYvK1tZhd/D
+ah/gpMPndsyvVCEuFPluWyDiM0VkwHgC2/3pJIYFHaxK64IutmPsy393rHMEB4kN
+AHau6kWK+yL9qEVH1pP2zvswQ12P7gjt3T/G3bGsmvlXkEfztfjkXo6XnjcBNf5y
+G+974AKLcjnk1gzIgarz+lAMY57Gkw4oNDMrTqVQ2OJQlvOSbllPXzH+aAiavB8W
+ZPECLLwHxD4B1AuaiAArgKl935u/TOB+yQOR8JgGsUzROyJqHJ/SC51HkebgCkL1
+aggtjgPlIBEXLZAlhpWLZ9lAQyrQpvCVJYwaOvfMmvRav4NAFNoZ2/Q7S4Tn1z+U
+XX+f+GD58P4MPMhU5IKnz4yH4nlHnAiTEvcs85TZUAXze9g/uBOwZITeGtyLi52S
+aETIr4v7SgXMepX7ThQ1Pv/jddsK/u4j2F34u0XktwCP+UrbfkE2mocdXvdzxbmd
+tZSznK2qwgVSsPOs9MhUaepbnjmNBFFBrULhrUtSglM/VX/rWNiyh0aw4XYyHhIt
+9ZNlfEjKjJ67VEMBxBJ/ieUCouRGCxPYD1j65VT7oB3ZiyPu2F2nlUIcYNqPg1Sd
+QBCrdaOXdJ0uLwyTAUeVE+wMbgscLvWsfZcCCJHAvw9NHFMUcnrdWxAYMVETNUOn
+uryVAK7VfOldaz6z3NOSOi6nonNeHpR/sipBa4ik5xCRLT9e0S2QJgRvO9GyfAqz
+3DIzHtxIGePFzTiUYUTxS3i2gnMX2PEe3ChTLlYWD3jNeAKz0iOzpDphIF2xHLLQ
+1tCAqBmq/vUzALyDFFdFuTIqQZys4z/u4Dmyq9uXs421eN3v2hkVHvDy8uT2Ot29
+lg4Q5YezR1EjaW//9guL1BXbcKrTEdtxeNqtem7SpZOMTSwD2lhB8z65GrX90Cyt
+EMmaRSGYEdf5h1afL1SmKOMskbqxe1D2jG/vsXC7XX7xO/ioy0BdiJcYN1JiMOHJ
+EOzFol5I20YkiV6j+cenfQFwc/NkaSxEkR8AUHJSbvUmRQRl6r0nnsFpZdR1w7pv
+wkaT+eOpZynO4mY/ZtF6MpXJsixi6L4ZYXEbS6yHf+XGFfB0okILylmwv2bf6+Mq
+nqXlmGj3Jwq7X9/+2BDqvfpFFX5lSmItKZAobLdssjFR6roJxOqRsGia2aZ+0+U5
+VhgdITtnElgtHBaeZU5rHDswgdeLVBP+rGWnKxpJ+pLtNNi25sPYRcWFL6Erd25u
+eXiY8GEIr+u7rqBWpc9HR34sAPRs3ubbCUleT748keCbx247ImBtiDctZxcc1O86
++0QjHP6HUT7FSo/FmT7a120S3Gd2jixGh06l/9ij5Z6mJa7Rm7TTbSjup/XISnOT
+MKWcbI1nfVOhCv3xDq2eLae+s0oVoc041ceRazqFM2TL/Z6UXRME</pre>
+</div>
+</div>
+<div class="section" id="decrypt-and-verify">
+<h1>Decrypt and Verify<a class="headerlink" href="#decrypt-and-verify" title="Permalink to this headline">¶</a></h1>
+<p>Suppose the above output has been saved into <tt class="docutils literal"><span class="pre">se.p7</span></tt>. The following
+demonstrates how to decrypt and verify it:</p>
+<div class="highlight-python"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">SMIME</span><span class="p">,</span> <span class="n">X509</span>
+
+<span class="c1"># Instantiate an SMIME object.</span>
+<span class="n">s</span> <span class="o">=</span> <span class="n">SMIME</span><span class="o">.</span><span class="n">SMIME</span><span class="p">()</span>
+
+<span class="c1"># Load private key and cert.</span>
+<span class="n">s</span><span class="o">.</span><span class="n">load_key</span><span class="p">(</span><span class="s1">&#39;recipient_key.pem&#39;</span><span class="p">,</span> <span class="s1">&#39;recipient.pem&#39;</span><span class="p">)</span>
+
+<span class="c1"># Load the signed/encrypted data.</span>
+<span class="n">p7</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="n">SMIME</span><span class="o">.</span><span class="n">smime_load_pkcs7</span><span class="p">(</span><span class="s1">&#39;se.p7&#39;</span><span class="p">)</span>
+
+<span class="c1"># After the above step, &#39;data&#39; == None.</span>
+<span class="c1"># Decrypt p7. &#39;out&#39; now contains a PKCS #7 signed blob.</span>
+<span class="n">out</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">decrypt</span><span class="p">(</span><span class="n">p7</span><span class="p">)</span>
+
+<span class="c1"># Load the signer&#39;s cert.</span>
+<span class="n">x509</span> <span class="o">=</span> <span class="n">X509</span><span class="o">.</span><span class="n">load_cert</span><span class="p">(</span><span class="s1">&#39;signer.pem&#39;</span><span class="p">)</span>
+<span class="n">sk</span> <span class="o">=</span> <span class="n">X509</span><span class="o">.</span><span class="n">X509_Stack</span><span class="p">()</span>
+<span class="n">sk</span><span class="o">.</span><span class="n">push</span><span class="p">(</span><span class="n">x509</span><span class="p">)</span>
+<span class="n">s</span><span class="o">.</span><span class="n">set_x509_stack</span><span class="p">(</span><span class="n">sk</span><span class="p">)</span>
+
+<span class="c1"># Load the signer&#39;s CA cert. In this case, because the signer&#39;s</span>
+<span class="c1"># cert is self-signed, it is the signer&#39;s cert itself.</span>
+<span class="n">st</span> <span class="o">=</span> <span class="n">X509</span><span class="o">.</span><span class="n">X509_Store</span><span class="p">()</span>
+<span class="n">st</span><span class="o">.</span><span class="n">load_info</span><span class="p">(</span><span class="s1">&#39;signer.pem&#39;</span><span class="p">)</span>
+<span class="n">s</span><span class="o">.</span><span class="n">set_x509_store</span><span class="p">(</span><span class="n">st</span><span class="p">)</span>
+
+<span class="c1"># Recall &#39;out&#39; contains a PKCS #7 blob.</span>
+<span class="c1"># Transform &#39;out&#39;; verify the resulting PKCS #7 blob.</span>
+<span class="n">p7_bio</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">(</span><span class="n">out</span><span class="p">)</span>
+<span class="n">p7</span><span class="p">,</span> <span class="n">data</span> <span class="o">=</span> <span class="n">SMIME</span><span class="o">.</span><span class="n">smime_load_pkcs7_bio</span><span class="p">(</span><span class="n">p7_bio</span><span class="p">)</span>
+<span class="n">v</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">verify</span><span class="p">(</span><span class="n">p7</span><span class="p">)</span>
+
+<span class="k">print</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
+</pre></div>
+</div>
+<p>The output is as follows:</p>
+<div class="highlight-python"><pre>a sign of our times</pre>
+</div>
+</div>
+<div class="section" id="sending-s-mime-messages-via-smtp">
+<h1>Sending S/MIME messages via SMTP<a class="headerlink" href="#sending-s-mime-messages-via-smtp" title="Permalink to this headline">¶</a></h1>
+<p>In the above examples, we&#8217;ve assumed that our S/MIME messages are sent
+and received automagically. The following is a Python function that
+generates S/MIME-signed/encrypted messages and sends them via
+SMTP:</p>
+<div class="highlight-python"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">M2Crypto</span> <span class="kn">import</span> <span class="n">BIO</span><span class="p">,</span> <span class="n">SMIME</span><span class="p">,</span> <span class="n">X509</span>
+<span class="kn">import</span> <span class="nn">smtplib</span><span class="o">,</span> <span class="nn">string</span><span class="o">,</span> <span class="nn">sys</span>
+
+<span class="k">def</span> <span class="nf">sendsmime</span><span class="p">(</span><span class="n">from_addr</span><span class="p">,</span> <span class="n">to_addrs</span><span class="p">,</span> <span class="n">subject</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">from_key</span><span class="p">,</span> <span class="n">from_cert</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">to_certs</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">smtpd</span><span class="o">=</span><span class="s1">&#39;localhost&#39;</span><span class="p">):</span>
+
+ <span class="n">msg_bio</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
+ <span class="n">sign</span> <span class="o">=</span> <span class="n">from_key</span>
+ <span class="n">encrypt</span> <span class="o">=</span> <span class="n">to_certs</span>
+
+ <span class="n">s</span> <span class="o">=</span> <span class="n">SMIME</span><span class="o">.</span><span class="n">SMIME</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">sign</span><span class="p">:</span>
+ <span class="n">s</span><span class="o">.</span><span class="n">load_key</span><span class="p">(</span><span class="n">from_key</span><span class="p">,</span> <span class="n">from_cert</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">encrypt</span><span class="p">:</span>
+ <span class="n">p7</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">sign</span><span class="p">(</span><span class="n">msg_bio</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">SMIME</span><span class="o">.</span><span class="n">PKCS7_TEXT</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">p7</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">sign</span><span class="p">(</span><span class="n">msg_bio</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">SMIME</span><span class="o">.</span><span class="n">PKCS7_TEXT</span><span class="o">|</span><span class="n">SMIME</span><span class="o">.</span><span class="n">PKCS7_DETACHED</span><span class="p">)</span>
+ <span class="n">msg_bio</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> <span class="c1"># Recreate coz sign() has consumed it.</span>
+
+ <span class="k">if</span> <span class="n">encrypt</span><span class="p">:</span>
+ <span class="n">sk</span> <span class="o">=</span> <span class="n">X509</span><span class="o">.</span><span class="n">X509_Stack</span><span class="p">()</span>
+ <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">to_certs</span><span class="p">:</span>
+ <span class="n">sk</span><span class="o">.</span><span class="n">push</span><span class="p">(</span><span class="n">X509</span><span class="o">.</span><span class="n">load_cert</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>
+ <span class="n">s</span><span class="o">.</span><span class="n">set_x509_stack</span><span class="p">(</span><span class="n">sk</span><span class="p">)</span>
+ <span class="n">s</span><span class="o">.</span><span class="n">set_cipher</span><span class="p">(</span><span class="n">SMIME</span><span class="o">.</span><span class="n">Cipher</span><span class="p">(</span><span class="s1">&#39;des_ede3_cbc&#39;</span><span class="p">))</span>
+ <span class="n">tmp_bio</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">sign</span><span class="p">:</span>
+ <span class="n">s</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">tmp_bio</span><span class="p">,</span> <span class="n">p7</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">tmp_bio</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
+ <span class="n">p7</span> <span class="o">=</span> <span class="n">s</span><span class="o">.</span><span class="n">encrypt</span><span class="p">(</span><span class="n">tmp_bio</span><span class="p">)</span>
+
+ <span class="n">out</span> <span class="o">=</span> <span class="n">BIO</span><span class="o">.</span><span class="n">MemoryBuffer</span><span class="p">()</span>
+ <span class="n">out</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;From: </span><span class="si">%s</span><span class="se">\r\n</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">from_addr</span><span class="p">)</span>
+ <span class="n">out</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;To: </span><span class="si">%s</span><span class="se">\r\n</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">string</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">to_addrs</span><span class="p">,</span> <span class="s2">&quot;, &quot;</span><span class="p">))</span>
+ <span class="n">out</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;Subject: </span><span class="si">%s</span><span class="se">\r\n</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">subject</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">encrypt</span><span class="p">:</span>
+ <span class="n">s</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="n">p7</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">sign</span><span class="p">:</span>
+ <span class="n">s</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="n">p7</span><span class="p">,</span> <span class="n">msg_bio</span><span class="p">,</span> <span class="n">SMIME</span><span class="o">.</span><span class="n">PKCS7_TEXT</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">out</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\r\n</span><span class="s1">&#39;</span><span class="p">)</span>
+ <span class="n">out</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
+ <span class="n">out</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+
+ <span class="n">smtp</span> <span class="o">=</span> <span class="n">smtplib</span><span class="o">.</span><span class="n">SMTP</span><span class="p">()</span>
+ <span class="n">smtp</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">smtpd</span><span class="p">)</span>
+ <span class="n">smtp</span><span class="o">.</span><span class="n">sendmail</span><span class="p">(</span><span class="n">from_addr</span><span class="p">,</span> <span class="n">to_addrs</span><span class="p">,</span> <span class="n">out</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>
+ <span class="n">smtp</span><span class="o">.</span><span class="n">quit</span><span class="p">()</span>
+</pre></div>
+</div>
+<p>This function sends plain, S/MIME-signed, S/MIME-encrypted, and
+S/MIME-signed/encrypted messages, depending on the parameters
+<tt class="docutils literal"><span class="pre">from_key</span></tt> and <tt class="docutils literal"><span class="pre">to_certs</span></tt>. The function&#8217;s output interoperates with
+Netscape Messenger.</p>
+</div>
+<div class="section" id="verifying-origin-of-s-mime-messages">
+<h1>Verifying origin of S/MIME messages<a class="headerlink" href="#verifying-origin-of-s-mime-messages" title="Permalink to this headline">¶</a></h1>
+<p>In our examples above that decrypt or verify messages, we skipped a
+step: verifying that the <tt class="docutils literal"><span class="pre">from</span></tt> address of the message matches the
+<tt class="docutils literal"><span class="pre">email</span> <span class="pre">address</span></tt> attribute in the sender&#8217;s certificate.</p>
+<p>The premise of current X.509 certification practice is that the CA is
+supposed to verify your identity, and to issue a certificate with
+<tt class="docutils literal"><span class="pre">email</span> <span class="pre">address</span></tt> that matches your actual mail address. (Verisign&#8217;s
+March 2001 failure in identity verification resulting in Microsoft
+certificates being issued to spoofers notwithstanding.)</p>
+<p>If you run your own CA, your certification practice is up to you, of
+course, and it would probably be part of your security policy.</p>
+<p>Whether your S/MIME messaging application needs to verify the <tt class="docutils literal"><span class="pre">from</span></tt>
+addresses of S/MIME messages depends on your security policy and your
+system&#8217;s threat model, as always.</p>
+</div>
+<div class="section" id="interoperating-with-netscape-messenger">
+<h1>Interoperating with Netscape Messenger<a class="headerlink" href="#interoperating-with-netscape-messenger" title="Permalink to this headline">¶</a></h1>
+<p>Suppose S/MIME Recipient uses Netscape Messenger. To enable Messenger to
+handle S/MIME messages from S/MIME Sender, S/MIME Recipient needs to
+configure Messenger with his private key and certificate, as well as
+S/MIME Sender&#8217;s certificate.</p>
+<blockquote>
+<div><strong>Note:</strong> Configuring Messenger&#8217;s POP or IMAP settings so that it
+retrieves mail correctly is beyond the scope of this HOWTO.</div></blockquote>
+<p>The following steps demonstrate how to import S/MIME Recipient&#8217;s private
+key and certificate for Messenger:</p>
+<ol class="arabic">
+<li><p class="first">Transform S/MIME Recipient&#8217;s private key and certificate into <em>PKCS
+#12</em> format:</p>
+<div class="highlight-python"><pre>openssl pkcs12 -export -in recipient.pem -inkey recipient_key.pem \
+ -name &quot;S/MIME Recipient&quot; -out recipient.p12
+
+Enter Export Password:&lt;enter&gt;
+Verifying password - Enter Export Password:&lt;enter&gt;</pre>
+</div>
+</li>
+<li><p class="first">Start Messenger.</p>
+</li>
+<li><p class="first">Click on the (open) &#8220;lock&#8221; icon at the bottom left corner of
+Messenger&#8217;s window. This brings up the &#8220;Security Info&#8221; dialog box.</p>
+</li>
+<li><p class="first">Click on &#8220;Yours&#8221; under &#8220;Certificates&#8221;.</p>
+</li>
+<li><p class="first">Select &#8220;Import a certificate&#8221;, then pick <tt class="docutils literal"><span class="pre">recipient.p12</span></tt> from the
+ensuing file selection dialog box.</p>
+</li>
+</ol>
+<p>Next, you need to import <tt class="docutils literal"><span class="pre">signer.pem</span></tt> as a CA certificate, so that
+Messenger will mark messages signed by S/MIME Sender as &#8220;trusted&#8221;:</p>
+<ol class="arabic">
+<li><p class="first">Create a DER encoding of <tt class="docutils literal"><span class="pre">signer.pem</span></tt>:</p>
+<div class="highlight-python"><pre>openssl x509 -inform pem -outform der -in signer.pem -out signer.der</pre>
+</div>
+</li>
+<li><p class="first">Install <tt class="docutils literal"><span class="pre">signer.der</span></tt> into Messenger as MIME type
+<tt class="docutils literal"><span class="pre">application/x-x509-ca-cert</span></tt>. You do this by downloading
+<tt class="docutils literal"><span class="pre">signer.der</span></tt> via Navigator from a HTTP or HTTPS server, with the
+correct MIME type mapping. (You may use <tt class="docutils literal"><span class="pre">demo/ssl/https_srv.py</span></tt>,
+bundled with M2Crypto, for this purpose.) Follow the series of dialog
+boxes to accept <tt class="docutils literal"><span class="pre">signer.der</span></tt> as a CA for certifying email users.</p>
+</li>
+</ol>
+<p>S/MIME Recipient is now able to decrypt and read S/MIME Sender&#8217;s
+messages with Messenger. Messenger will indicate that S/MIME Sender&#8217;s
+messages are signed, encrypted, or encrypted <em>and</em> signed, as the case
+may be, via the &#8220;stamp&#8221; icon on the message window&#8217;s top right corner.</p>
+<p>Clicking on the &#8220;stamp&#8221; icon brings you to the Security Info dialog box.
+Messenger informs you that the message is, say, encrypted with 168-bit
+DES-EDE3-CBC and that it is digitally signed by the private key
+corresponding to the public key contained in the certificate
+<tt class="docutils literal"><span class="pre">signer.pem</span></tt>.</p>
+</div>
+<div class="section" id="interoperating-with-microsoft-outlook">
+<h1>Interoperating with Microsoft Outlook<a class="headerlink" href="#interoperating-with-microsoft-outlook" title="Permalink to this headline">¶</a></h1>
+<p>I do not know how to do this, as I do not use Outlook. (Nor do I use
+Netscape Messenger, actually. I use Mutt, top dog of MUAs. ;-)
+Information on how to configure Outlook with keys and certificates so
+that it handles S/MIME mail is gratefully accepted.</p>
+</div>
+<div class="section" id="zsmime">
+<h1>ZSmime<a class="headerlink" href="#zsmime" title="Permalink to this headline">¶</a></h1>
+<p>ZSmime is a <a class="reference external" href="http://www.zope.org">Zope</a> <em>product</em> that enables Zope
+to generate S/MIME-signed/encrypted messages. ZSmime demonstrates how to
+invoke M2Crypto in a web application server extension.</p>
+<p>ZSmime has its own
+<a class="reference external" href="http://sandbox.rulemaker.net/ngps/zope/zsmime/howto.html">HOWTO</a>
+explaining its usage. (That HOWTO has some overlap in content with this
+document.)</p>
+</div>
+<div class="section" id="resources">
+<h1>Resources<a class="headerlink" href="#resources" title="Permalink to this headline">¶</a></h1>
+<ul class="simple">
+<li>IETF S/MIME Working Group - <a class="reference external" href="http://www.imc.org/ietf-smime">http://www.imc.org/ietf-smime</a></li>
+<li>S/MIME and OpenPGP - <a class="reference external" href="http://www.imc.org/smime-pgpmime.html">http://www.imc.org/smime-pgpmime.html</a></li>
+<li>S/MIME Freeware Library -
+<a class="reference external" href="http://www.getronicsgov.com/hot/sfl_home.htm">http://www.getronicsgov.com/hot/sfl_home.htm</a></li>
+<li>Mozilla Network Security Services -
+<a class="reference external" href="http://www.mozilla.org/projects/security/pkg/nss">http://www.mozilla.org/projects/security/pkg/nss</a></li>
+<li>S/MIME Cracking Screen Saver - <a class="reference external" href="http://www.counterpane.com/smime.html">http://www.counterpane.com/smime.html</a></li>
+</ul>
+</div>
+
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+ <h3><a href="index.html">Table Of Contents</a></h3>
+ <ul>
+<li><a class="reference internal" href="#">HOWTO: Programming S/MIME in Python with M2Crypto</a></li>
+<li><a class="reference internal" href="#introduction">Introduction</a></li>
+<li><a class="reference internal" href="#s-mime">S/MIME</a></li>
+<li><a class="reference internal" href="#keys-and-certificates">Keys and Certificates</a></li>
+<li><a class="reference internal" href="#m2crypto-smime">M2Crypto.SMIME</a></li>
+<li><a class="reference internal" href="#sign">Sign</a></li>
+<li><a class="reference internal" href="#verify">Verify</a></li>
+<li><a class="reference internal" href="#encrypt">Encrypt</a></li>
+<li><a class="reference internal" href="#decrypt">Decrypt</a></li>
+<li><a class="reference internal" href="#sign-and-encrypt">Sign and Encrypt</a></li>
+<li><a class="reference internal" href="#decrypt-and-verify">Decrypt and Verify</a></li>
+<li><a class="reference internal" href="#sending-s-mime-messages-via-smtp">Sending S/MIME messages via SMTP</a></li>
+<li><a class="reference internal" href="#verifying-origin-of-s-mime-messages">Verifying origin of S/MIME messages</a></li>
+<li><a class="reference internal" href="#interoperating-with-netscape-messenger">Interoperating with Netscape Messenger</a></li>
+<li><a class="reference internal" href="#interoperating-with-microsoft-outlook">Interoperating with Microsoft Outlook</a></li>
+<li><a class="reference internal" href="#zsmime">ZSmime</a></li>
+<li><a class="reference internal" href="#resources">Resources</a></li>
+</ul>
+
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="_sources/howto.smime.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="index.html">M2Crypto documentation</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/howto.ssl.html b/doc/html/howto.ssl.html
new file mode 100644
index 0000000..e880fe8
--- /dev/null
+++ b/doc/html/howto.ssl.html
@@ -0,0 +1,220 @@
+
+
+<!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>HOWTO: Programming SSL in Python with M2Crypto &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '',
+ VERSION: '',
+ 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="M2Crypto documentation" href="index.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="index.html">M2Crypto documentation</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <div class="section" id="howto-programming-ssl-in-python-with-m2crypto">
+<span id="howto-ssl"></span><h1>HOWTO: Programming SSL in Python with M2Crypto<a class="headerlink" href="#howto-programming-ssl-in-python-with-m2crypto" title="Permalink to this headline">¶</a></h1>
+<table class="docutils field-list" frame="void" rules="none">
+<col class="field-name" />
+<col class="field-body" />
+<tbody valign="top">
+<tr class="field-odd field"><th class="field-name">author:</th><td class="field-body">Pheng Siong Ng &lt;<a class="reference external" href="mailto:ngps&#37;&#52;&#48;netmemetic&#46;com">ngps<span>&#64;</span>netmemetic<span>&#46;</span>com</a>&gt; and Heikki Toivonen (<a class="reference external" href="mailto:heikki&#37;&#52;&#48;osafoundation&#46;org">heikki<span>&#64;</span>osafoundation<span>&#46;</span>org</a>)</td>
+</tr>
+<tr class="field-even field"><th class="field-name">copyright:</th><td class="field-body">© 2000, 2001 by Ng Pheng Siong,
+portions © 2006 by Open Source Applications Foundation</td>
+</tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="introduction">
+<h1>Introduction<a class="headerlink" href="#introduction" title="Permalink to this headline">¶</a></h1>
+<p><a class="reference external" href="https://gitlab.com/m2crypto/m2crypto/">M2Crypto</a> is a
+<a class="reference external" href="http://www.python.org">Python</a> interface to
+<a class="reference external" href="http://www.openssl.org">OpenSSL</a>. It makes available to the Python
+programmer SSL functionality to implement clients and servers, S/MIME
+v2, RSA, DSA, DH, symmetric ciphers, message digests and HMACs.</p>
+<p>This document demonstrates programming HTTPS with M2Crypto.</p>
+</div>
+<div class="section" id="a-bit-of-history">
+<h1>A bit of history<a class="headerlink" href="#a-bit-of-history" title="Permalink to this headline">¶</a></h1>
+<p>M2Crypto was created during the time of Python 1.5, which features a
+module httplib providing client-side HTTP functionality. M2Crypto sports
+a httpslib based on httplib.</p>
+<p>Beginning with version 2.0, Python&#8217;s socket module provided
+(rudimentary) SSL support. Also in the same version, httplib was
+enhanced with class HTTPConnection, which is more sophisticated than the
+old class HTTP, and HTTPSConnection, which does HTTPS.</p>
+<p>Subsequently, M2Crypto.httpslib grew a compatible (but not identical)
+class HTTPSConnection.</p>
+<p>The primary interface difference between the two HTTPSConnection classes
+is that M2Crypto&#8217;s version accepts an M2Crypto.SSL.Context instance as a
+parameter, whereas Python 2.x&#8217;s SSL support does not permit Pythonic
+control of the SSL context.</p>
+<p>Within the implementations, Python&#8217;s <tt class="docutils literal"><span class="pre">HTTPSConnection</span></tt> employs a
+<tt class="docutils literal"><span class="pre">FakeSocket</span></tt> object, which collects all input from the SSL connection
+before returning it to the application as a <tt class="docutils literal"><span class="pre">StringIO</span></tt> buffer, whereas
+M2Crypto&#8217;s <tt class="docutils literal"><span class="pre">HTTPSConnection</span></tt> uses a buffering
+<tt class="docutils literal"><span class="pre">M2Crypto.BIO.IOBuffer</span></tt> object that works over the underlying
+M2Crypto.SSL.Connection directly.</p>
+<p>Since then M2Crypto has gained a Twisted wrapper that allows securing
+Twisted SSL connections with M2Crypto.</p>
+</div>
+<div class="section" id="secure-ssl">
+<h1>Secure SSL<a class="headerlink" href="#secure-ssl" title="Permalink to this headline">¶</a></h1>
+<p>It is recommended that you read the book Network Security with OpenSSL
+by John Viega, Matt Messier and Pravir Chandra, ISBN 059600270X.</p>
+<p>Using M2Crypto does not automatically make an SSL connection secure.
+There are various steps that need to be made before we can make that
+claim. Let&#8217;s see how a simple client can establish a secure
+connection:</p>
+<div class="highlight-python"><div class="highlight"><pre><span></span><span class="n">ctx</span> <span class="o">=</span> <span class="n">SSL</span><span class="o">.</span><span class="n">Context</span><span class="p">()</span>
+<span class="n">ctx</span><span class="o">.</span><span class="n">set_verify</span><span class="p">(</span><span class="n">SSL</span><span class="o">.</span><span class="n">verify_peer</span> <span class="o">|</span> <span class="n">SSL</span><span class="o">.</span><span class="n">verify_fail_if_no_peer_cert</span><span class="p">,</span> <span class="n">depth</span><span class="o">=</span><span class="mi">9</span><span class="p">)</span>
+<span class="k">if</span> <span class="n">ctx</span><span class="o">.</span><span class="n">load_verify_locations</span><span class="p">(</span><span class="s1">&#39;ca.pem&#39;</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;No CA certs&#39;</span><span class="p">)</span>
+<span class="n">s</span> <span class="o">=</span> <span class="n">SSL</span><span class="o">.</span><span class="n">Connection</span><span class="p">(</span><span class="n">ctx</span><span class="p">)</span>
+<span class="n">s</span><span class="o">.</span><span class="n">connect</span><span class="p">(</span><span class="n">server_address</span><span class="p">)</span>
+<span class="c1"># Normal protocol (for example HTTP) commands follow</span>
+</pre></div>
+</div>
+<p>The first line creates an SSL context. The defaults allow any SSL
+version (except SSL version 2 which has known weaknesses) and sets the
+allowed ciphers to secure ones.</p>
+<p>The second line tells M2Crypto to perform certificate validation. The
+flags shown above are typical for clients, and requires the server to
+send a certificate. The depth parameter tells how long certificate
+chains are allowed - 9 is pretty common default, although probably too
+long in practice.</p>
+<p>The third line loads the allowed root (certificate authority or CA)
+certificates. Most Linux distributions come with CA certificates in
+suitable format. You could also download the
+<a class="reference external" href="http://mxr.mozilla.org/seamonkey/source//security/nss/lib/ckfw/builtins/certdata.txt?raw=1">certdata.txt</a>
+file from the
+<a class="reference external" href="http://www.mozilla.org/projects/security/pki/nss/">NSS</a> project and
+convert it with the little M2Crypto utility script
+<a class="reference external" href="http://svn.osafoundation.org/m2crypto/trunk/demo/x509/certdata2pem.py">demo/x509/certdata2pem.py</a>.</p>
+<p>The fourth line creates an SSL connection object with the secure
+context.</p>
+<p>The fifth line connects to the server. During this time we perform the
+last security step: just after connection, but before exchanging any
+data, we compare the commonName (or subjectAltName DNS field) field in
+the certificate the server returned to the server address we tried to
+connect to. This happens automatically with SSL.Connection and the
+Twisted wrapper class, and anything that uses those. In all other cases
+you must do the check manually. It is recommended you call the
+SSL.Checker to do the actual check.</p>
+<p>SSL servers are different in that they typically do not require the
+client to send a certificate, so there is usually no certificate
+checking. Also, it is typically useless to perform host name checking.</p>
+</div>
+<div class="section" id="code-samples">
+<h1>Code Samples<a class="headerlink" href="#code-samples" title="Permalink to this headline">¶</a></h1>
+<p>The best samples of how to use the various SSL objects are in the tests
+directory, and the test_ssl.py file specifically. There are additional
+samples in the demo directory, but they are not quaranteed to be up to
+date.</p>
+<p>NOTE: The tests and demos may not be secure as is. Use the information
+above on how to make them secure.</p>
+</div>
+<div class="section" id="ssldump">
+<h1>ssldump<a class="headerlink" href="#ssldump" title="Permalink to this headline">¶</a></h1>
+<p>ssldump &#8220;is an SSLv3/TLS network protocol analyser. It identifies TCP
+connections on the chosen network interface and attempts to interpret
+them as SSLv3/TLS traffic. When it identifies SSLv3/TLS traffic, it
+decodes the records and displays them in a textual form to stdout. If
+provided with the appropriate keying material, it will also decrypt the
+connections and display the application data traffic.</p>
+<p>If linked with OpenSSL, ssldump can display certificates in decoded form
+and decrypt traffic (provided that it has the appropriate keying
+material).&#8221;</p>
+<p>ssldump is written by Eric Rescorla.</p>
+</div>
+
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+ <h3><a href="index.html">Table Of Contents</a></h3>
+ <ul>
+<li><a class="reference internal" href="#">HOWTO: Programming SSL in Python with M2Crypto</a></li>
+<li><a class="reference internal" href="#introduction">Introduction</a></li>
+<li><a class="reference internal" href="#a-bit-of-history">A bit of history</a></li>
+<li><a class="reference internal" href="#secure-ssl">Secure SSL</a></li>
+<li><a class="reference internal" href="#code-samples">Code Samples</a></li>
+<li><a class="reference internal" href="#ssldump">ssldump</a></li>
+</ul>
+
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="_sources/howto.ssl.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="index.html">M2Crypto documentation</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/index.html b/doc/html/index.html
new file mode 100644
index 0000000..ac8e968
--- /dev/null
+++ b/doc/html/index.html
@@ -0,0 +1,194 @@
+
+
+<!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>Welcome to M2Crypto’s documentation! &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '',
+ VERSION: '',
+ 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="M2Crypto documentation" href="#" />
+ <link rel="next" title="M2Crypto Package" href="M2Crypto.html" />
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="M2Crypto.html" title="M2Crypto Package"
+ accesskey="N">next</a> |</li>
+ <li><a href="#">M2Crypto documentation</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <div class="section" id="welcome-to-m2crypto-s-documentation">
+<h1>Welcome to M2Crypto&#8217;s documentation!<a class="headerlink" href="#welcome-to-m2crypto-s-documentation" title="Permalink to this headline">¶</a></h1>
+<p>Contents:</p>
+<div class="toctree-wrapper compound">
+<ul>
+<li class="toctree-l1"><a class="reference internal" href="M2Crypto.html">M2Crypto Package</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#id1"><tt class="docutils literal"><span class="pre">M2Crypto</span></tt> Package</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.ASN1"><tt class="docutils literal"><span class="pre">ASN1</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.AuthCookie"><tt class="docutils literal"><span class="pre">AuthCookie</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.BIO"><tt class="docutils literal"><span class="pre">BIO</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.BN"><tt class="docutils literal"><span class="pre">BN</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.DH"><tt class="docutils literal"><span class="pre">DH</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.DSA"><tt class="docutils literal"><span class="pre">DSA</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.EC"><tt class="docutils literal"><span class="pre">EC</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.EVP"><tt class="docutils literal"><span class="pre">EVP</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.Engine"><tt class="docutils literal"><span class="pre">Engine</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.Err"><tt class="docutils literal"><span class="pre">Err</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.RC4"><tt class="docutils literal"><span class="pre">RC4</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.RSA"><tt class="docutils literal"><span class="pre">RSA</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.Rand"><tt class="docutils literal"><span class="pre">Rand</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.SMIME"><tt class="docutils literal"><span class="pre">SMIME</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.X509"><tt class="docutils literal"><span class="pre">X509</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.callback"><tt class="docutils literal"><span class="pre">callback</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.ftpslib"><tt class="docutils literal"><span class="pre">ftpslib</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.httpslib"><tt class="docutils literal"><span class="pre">httpslib</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.m2"><tt class="docutils literal"><span class="pre">m2</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.m2crypto"><tt class="docutils literal"><span class="pre">m2crypto</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.m2urllib"><tt class="docutils literal"><span class="pre">m2urllib</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.m2urllib2"><tt class="docutils literal"><span class="pre">m2urllib2</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.m2xmlrpclib"><tt class="docutils literal"><span class="pre">m2xmlrpclib</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.threading"><tt class="docutils literal"><span class="pre">threading</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#module-M2Crypto.util"><tt class="docutils literal"><span class="pre">util</span></tt> Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="M2Crypto.html#subpackages">Subpackages</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="M2Crypto.PGP.html">PGP Package</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.PGP.html#id1"><tt class="docutils literal"><span class="pre">PGP</span></tt> Package</a></li>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.PGP.html#module-M2Crypto.PGP.PublicKey"><tt class="docutils literal"><span class="pre">PublicKey</span></tt> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.PGP.html#module-M2Crypto.PGP.PublicKeyRing"><tt class="docutils literal"><span class="pre">PublicKeyRing</span></tt> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.PGP.html#module-M2Crypto.PGP.RSA"><tt class="docutils literal"><span class="pre">RSA</span></tt> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.PGP.html#module-M2Crypto.PGP.constants"><tt class="docutils literal"><span class="pre">constants</span></tt> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.PGP.html#module-M2Crypto.PGP.packet"><tt class="docutils literal"><span class="pre">packet</span></tt> Module</a></li>
+</ul>
+</li>
+<li class="toctree-l3"><a class="reference internal" href="M2Crypto.SSL.html">SSL Package</a><ul>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#id1"><tt class="docutils literal"><span class="pre">SSL</span></tt> Package</a></li>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Checker"><tt class="docutils literal"><span class="pre">Checker</span></tt> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Cipher"><tt class="docutils literal"><span class="pre">Cipher</span></tt> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Connection"><tt class="docutils literal"><span class="pre">Connection</span></tt> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Context"><tt class="docutils literal"><span class="pre">Context</span></tt> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.SSLServer"><tt class="docutils literal"><span class="pre">SSLServer</span></tt> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.Session"><tt class="docutils literal"><span class="pre">Session</span></tt> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.TwistedProtocolWrapper"><tt class="docutils literal"><span class="pre">TwistedProtocolWrapper</span></tt> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.cb"><tt class="docutils literal"><span class="pre">cb</span></tt> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.ssl_dispatcher"><tt class="docutils literal"><span class="pre">ssl_dispatcher</span></tt> Module</a></li>
+<li class="toctree-l4"><a class="reference internal" href="M2Crypto.SSL.html#module-M2Crypto.SSL.timeout"><tt class="docutils literal"><span class="pre">timeout</span></tt> Module</a></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<div class="section" id="howtos">
+<h1>HOWTOs<a class="headerlink" href="#howtos" title="Permalink to this headline">¶</a></h1>
+<ul class="simple">
+<li><a class="reference internal" href="howto.ca.html#howto-ca"><em>HOWTO: Creating your own CA with OpenSSL</em></a></li>
+<li><a class="reference internal" href="howto.ssl.html#howto-ssl"><em>HOWTO: Programming SSL in Python with M2Crypto</em></a></li>
+<li><a class="reference internal" href="howto.smime.html#howto-smime"><em>HOWTO: Programming S/MIME in Python with M2Crypto</em></a></li>
+<li><a class="reference internal" href="ZServerSSL-HOWTO.html#zserverssl-howto"><em>1.&nbsp;&nbsp;&nbsp;ZServerSSL-HOWTO</em></a></li>
+</ul>
+</div>
+<div class="section" id="indices-and-tables">
+<h1>Indices and tables<a class="headerlink" href="#indices-and-tables" title="Permalink to this headline">¶</a></h1>
+<ul class="simple">
+<li><a class="reference internal" href="genindex.html"><em>Index</em></a></li>
+<li><a class="reference internal" href="py-modindex.html"><em>Module Index</em></a></li>
+<li><a class="reference internal" href="search.html"><em>Search Page</em></a></li>
+</ul>
+</div>
+
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+ <h3><a href="#">Table Of Contents</a></h3>
+ <ul>
+<li><a class="reference internal" href="#">Welcome to M2Crypto&#8217;s documentation!</a><ul>
+</ul>
+</li>
+<li><a class="reference internal" href="#howtos">HOWTOs</a></li>
+<li><a class="reference internal" href="#indices-and-tables">Indices and tables</a></li>
+</ul>
+
+ <h4>Next topic</h4>
+ <p class="topless"><a href="M2Crypto.html"
+ title="next chapter">M2Crypto Package</a></p>
+ <h3>This Page</h3>
+ <ul class="this-page-menu">
+ <li><a href="_sources/index.txt"
+ rel="nofollow">Show Source</a></li>
+ </ul>
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li class="right" >
+ <a href="M2Crypto.html" title="M2Crypto Package"
+ >next</a> |</li>
+ <li><a href="#">M2Crypto documentation</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/objects.inv b/doc/html/objects.inv
new file mode 100644
index 0000000..9d7632e
--- /dev/null
+++ b/doc/html/objects.inv
Binary files differ
diff --git a/doc/html/py-modindex.html b/doc/html/py-modindex.html
new file mode 100644
index 0000000..100b720
--- /dev/null
+++ b/doc/html/py-modindex.html
@@ -0,0 +1,326 @@
+
+
+<!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>Python Module Index &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '',
+ VERSION: '',
+ 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="M2Crypto documentation" href="index.html" />
+
+
+
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="#" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="index.html">M2Crypto documentation</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+
+ <h1>Python Module Index</h1>
+
+ <div class="modindex-jumpbox">
+ <a href="#cap-m"><strong>m</strong></a>
+ </div>
+
+ <table class="indextable modindextable" cellspacing="0" cellpadding="2">
+ <tr class="pcap"><td></td><td>&nbsp;</td><td></td></tr>
+ <tr class="cap" id="cap-m"><td></td><td>
+ <strong>m</strong></td><td></td></tr>
+ <tr>
+ <td><img src="_static/minus.png" class="toggler"
+ id="toggle-1" style="display: none" alt="-" /></td>
+ <td>
+ <tt class="xref">M2Crypto</tt></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.html#module-M2Crypto.__init__"><tt class="xref">M2Crypto.__init__</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.html#module-M2Crypto.ASN1"><tt class="xref">M2Crypto.ASN1</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.html#module-M2Crypto.AuthCookie"><tt class="xref">M2Crypto.AuthCookie</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.html#module-M2Crypto.BIO"><tt class="xref">M2Crypto.BIO</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.html#module-M2Crypto.BN"><tt class="xref">M2Crypto.BN</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.html#module-M2Crypto.callback"><tt class="xref">M2Crypto.callback</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.html#module-M2Crypto.DH"><tt class="xref">M2Crypto.DH</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.html#module-M2Crypto.DSA"><tt class="xref">M2Crypto.DSA</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.html#module-M2Crypto.EC"><tt class="xref">M2Crypto.EC</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.html#module-M2Crypto.Engine"><tt class="xref">M2Crypto.Engine</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.html#module-M2Crypto.Err"><tt class="xref">M2Crypto.Err</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.html#module-M2Crypto.EVP"><tt class="xref">M2Crypto.EVP</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.html#module-M2Crypto.ftpslib"><tt class="xref">M2Crypto.ftpslib</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.html#module-M2Crypto.httpslib"><tt class="xref">M2Crypto.httpslib</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.html#module-M2Crypto.m2"><tt class="xref">M2Crypto.m2</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.html#module-M2Crypto.m2crypto"><tt class="xref">M2Crypto.m2crypto</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.html#module-M2Crypto.m2urllib"><tt class="xref">M2Crypto.m2urllib</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.html#module-M2Crypto.m2urllib2"><tt class="xref">M2Crypto.m2urllib2</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.html#module-M2Crypto.m2xmlrpclib"><tt class="xref">M2Crypto.m2xmlrpclib</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.PGP.html#module-M2Crypto.PGP"><tt class="xref">M2Crypto.PGP</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.PGP.html#module-M2Crypto.PGP.constants"><tt class="xref">M2Crypto.PGP.constants</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.PGP.html#module-M2Crypto.PGP.packet"><tt class="xref">M2Crypto.PGP.packet</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.PGP.html#module-M2Crypto.PGP.PublicKey"><tt class="xref">M2Crypto.PGP.PublicKey</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.PGP.html#module-M2Crypto.PGP.PublicKeyRing"><tt class="xref">M2Crypto.PGP.PublicKeyRing</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.PGP.html#module-M2Crypto.PGP.RSA"><tt class="xref">M2Crypto.PGP.RSA</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.html#module-M2Crypto.Rand"><tt class="xref">M2Crypto.Rand</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.html#module-M2Crypto.RC4"><tt class="xref">M2Crypto.RC4</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.html#module-M2Crypto.RSA"><tt class="xref">M2Crypto.RSA</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.html#module-M2Crypto.SMIME"><tt class="xref">M2Crypto.SMIME</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.SSL.html#module-M2Crypto.SSL"><tt class="xref">M2Crypto.SSL</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.SSL.html#module-M2Crypto.SSL.cb"><tt class="xref">M2Crypto.SSL.cb</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.SSL.html#module-M2Crypto.SSL.Checker"><tt class="xref">M2Crypto.SSL.Checker</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.SSL.html#module-M2Crypto.SSL.Cipher"><tt class="xref">M2Crypto.SSL.Cipher</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.SSL.html#module-M2Crypto.SSL.Connection"><tt class="xref">M2Crypto.SSL.Connection</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.SSL.html#module-M2Crypto.SSL.Context"><tt class="xref">M2Crypto.SSL.Context</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.SSL.html#module-M2Crypto.SSL.Session"><tt class="xref">M2Crypto.SSL.Session</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.SSL.html#module-M2Crypto.SSL.ssl_dispatcher"><tt class="xref">M2Crypto.SSL.ssl_dispatcher</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.SSL.html#module-M2Crypto.SSL.SSLServer"><tt class="xref">M2Crypto.SSL.SSLServer</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.SSL.html#module-M2Crypto.SSL.timeout"><tt class="xref">M2Crypto.SSL.timeout</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.SSL.html#module-M2Crypto.SSL.TwistedProtocolWrapper"><tt class="xref">M2Crypto.SSL.TwistedProtocolWrapper</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.html#module-M2Crypto.threading"><tt class="xref">M2Crypto.threading</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.html#module-M2Crypto.util"><tt class="xref">M2Crypto.util</tt></a></td><td>
+ <em></em></td></tr>
+ <tr class="cg-1">
+ <td></td>
+ <td>&nbsp;&nbsp;&nbsp;
+ <a href="M2Crypto.html#module-M2Crypto.X509"><tt class="xref">M2Crypto.X509</tt></a></td><td>
+ <em></em></td></tr>
+ </table>
+
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none">
+ <h3>Quick 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>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="#" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="index.html">M2Crypto documentation</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/search.html b/doc/html/search.html
new file mode 100644
index 0000000..d5386cc
--- /dev/null
+++ b/doc/html/search.html
@@ -0,0 +1,105 @@
+
+
+<!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>Search &mdash; M2Crypto documentation</title>
+
+ <link rel="stylesheet" href="_static/default.css" type="text/css" />
+ <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+
+ <script type="text/javascript">
+ var DOCUMENTATION_OPTIONS = {
+ URL_ROOT: '',
+ VERSION: '',
+ 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>
+ <script type="text/javascript" src="_static/searchtools.js"></script>
+ <link rel="top" title="M2Crypto documentation" href="index.html" />
+ <script type="text/javascript">
+ jQuery(function() { Search.loadIndex("searchindex.js"); });
+ </script>
+
+
+ </head>
+ <body>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="genindex.html" title="General Index"
+ accesskey="I">index</a></li>
+ <li class="right" >
+ <a href="py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="index.html">M2Crypto documentation</a> &raquo;</li>
+ </ul>
+ </div>
+
+ <div class="document">
+ <div class="documentwrapper">
+ <div class="bodywrapper">
+ <div class="body">
+
+ <h1 id="search-documentation">Search</h1>
+ <div id="fallback" class="admonition warning">
+ <script type="text/javascript">$('#fallback').hide();</script>
+ <p>
+ Please activate JavaScript to enable the search
+ functionality.
+ </p>
+ </div>
+ <p>
+ From here you can search these documents. Enter your search
+ words into the box below and click "search". Note that the search
+ function will automatically search for all of the words. Pages
+ containing fewer words won't appear in the result list.
+ </p>
+ <form action="" method="get">
+ <input type="text" name="q" value="" />
+ <input type="submit" value="search" />
+ <span id="search-progress" style="padding-left: 10px"></span>
+ </form>
+
+ <div id="search-results">
+
+ </div>
+
+ </div>
+ </div>
+ </div>
+ <div class="sphinxsidebar">
+ <div class="sphinxsidebarwrapper">
+ </div>
+ </div>
+ <div class="clearer"></div>
+ </div>
+ <div class="related">
+ <h3>Navigation</h3>
+ <ul>
+ <li class="right" style="margin-right: 10px">
+ <a href="genindex.html" title="General Index"
+ >index</a></li>
+ <li class="right" >
+ <a href="py-modindex.html" title="Python Module Index"
+ >modules</a> |</li>
+ <li><a href="index.html">M2Crypto documentation</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; Copyright 2017, Matej Cepl &lt;mcepl@cepl.eu&gt;.
+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/doc/html/searchindex.js b/doc/html/searchindex.js
new file mode 100644
index 0000000..4ca9b1b
--- /dev/null
+++ b/doc/html/searchindex.js
@@ -0,0 +1 @@
+Search.setIndex({objects:{"M2Crypto.SSL.TwistedProtocolWrapper.TLSProtocolWrapper":{connectionMade:[6,1,1,""],startTLS:[6,1,1,""],clear:[6,1,1,""],write:[6,1,1,""],connectionLost:[6,1,1,""],loseConnection:[6,1,1,""],dataReceived:[6,1,1,""],writeSequence:[6,1,1,""]},"M2Crypto.threading":{init:[3,2,1,""],cleanup:[3,2,1,""]},"M2Crypto.AuthCookie":{mix:[3,2,1,""],unmix:[3,2,1,""],unmix3:[3,2,1,""],AuthCookie:[3,3,1,""],AuthCookieJar:[3,3,1,""]},"M2Crypto.PGP":{PublicKey:[4,0,1,""],PublicKeyRing:[4,0,1,""],packet:[4,0,1,""],constants:[4,0,1,""],RSA:[4,0,1,""]},"M2Crypto.PGP.packet.Packet":{timestamp:[4,1,1,""],validity:[4,1,1,""],pkc:[4,1,1,""],version:[4,1,1,""],validate:[4,1,1,""],pack:[4,1,1,""]},"M2Crypto.X509.X509_Name":{add_entry_by_txt:[3,1,1,""],as_hash:[3,1,1,""],as_text:[3,1,1,""],nid:[3,4,1,""],entry_count:[3,1,1,""],as_der:[3,1,1,""],m2_x509_name_free:[3,1,1,""],get_entries_by_nid:[3,1,1,""]},"M2Crypto.PGP.packet.UserIDPacket":{userid:[4,1,1,""],pack:[4,1,1,""]},"M2Crypto.EVP.Cipher":{set_padding:[3,1,1,""],"final":[3,1,1,""],m2_cipher_ctx_free:[3,1,1,""],update:[3,1,1,""]},"M2Crypto.SSL.Session":{Session:[6,3,1,""],load_session:[6,2,1,""]},"M2Crypto.BIO.MemoryBuffer":{read_all:[3,1,1,""],close:[3,1,1,""],write_close:[3,1,1,""],read:[3,1,1,""],getvalue:[3,1,1,""]},"M2Crypto.m2urllib":{open_https:[3,2,1,""]},"M2Crypto.SSL.timeout.timeout":{pack:[6,1,1,""]},"M2Crypto.SMIME.SMIME":{unset_key:[3,1,1,""],encrypt:[3,1,1,""],set_x509_store:[3,1,1,""],load_key:[3,1,1,""],unset_x509_store:[3,1,1,""],decrypt:[3,1,1,""],sign:[3,1,1,""],write:[3,1,1,""],set_cipher:[3,1,1,""],verify:[3,1,1,""],set_x509_stack:[3,1,1,""],load_key_bio:[3,1,1,""],unset_cipher:[3,1,1,""],unset_x509_stack:[3,1,1,""]},"M2Crypto.m2xmlrpclib":{SSL_Transport:[3,3,1,""]},"M2Crypto.SSL.Checker":{WrongCertificate:[6,5,1,""],Checker:[6,3,1,""],SSLVerificationError:[6,5,1,""],WrongHost:[6,5,1,""],NoCertificate:[6,5,1,""]},"M2Crypto.EC.EC_pub":{get_der:[3,1,1,""],save_key:[3,1,1,""],save_key_bio:[3,1,1,""],get_key:[3,1,1,""]},"M2Crypto.SSL.ssl_dispatcher":{ssl_dispatcher:[6,3,1,""]},"M2Crypto.EVP":{MessageDigest:[3,3,1,""],PKey:[3,3,1,""],load_key_string:[3,2,1,""],load_key:[3,2,1,""],pbkdf2:[3,2,1,""],load_key_bio_pubkey:[3,2,1,""],HMAC:[3,3,1,""],Cipher:[3,3,1,""],EVPError:[3,5,1,""],load_key_string_pubkey:[3,2,1,""],hmac:[3,2,1,""],load_key_bio:[3,2,1,""]},"M2Crypto.SSL.ssl_dispatcher.ssl_dispatcher":{recv:[6,1,1,""],connect:[6,1,1,""],send:[6,1,1,""],create_socket:[6,1,1,""]},"M2Crypto.BIO.SSLBio":{set_ssl:[3,1,1,""],do_handshake:[3,1,1,""]},"M2Crypto.SSL.Checker.Checker":{numericIpMatch:[6,4,1,""]},"M2Crypto.PGP.packet.CompressedPacket":{validate:[4,1,1,""],uncompress:[4,1,1,""]},"M2Crypto.BIO.IOBuffer":{m2_bio_pop:[3,1,1,""],close:[3,1,1,""],m2_bio_free:[3,1,1,""]},"M2Crypto.PGP.packet.SignaturePacket":{validate:[4,1,1,""],pack:[4,1,1,""]},"M2Crypto.BN":{randfname:[3,2,1,""],rand_range:[3,2,1,""],rand:[3,2,1,""]},"M2Crypto.X509.X509_Name_Entry":{get_object:[3,1,1,""],get_data:[3,1,1,""],create_by_txt:[3,1,1,""],set_data:[3,1,1,""],set_object:[3,1,1,""],m2_x509_name_entry_free:[3,1,1,""]},"M2Crypto.Err":{get_error_reason:[3,2,1,""],get_error_code:[3,2,1,""],peek_error_code:[3,2,1,""],get_error_lib:[3,2,1,""],M2CryptoError:[3,5,1,""],get_error:[3,2,1,""],SSLError:[3,5,1,""],get_error_func:[3,2,1,""],get_x509_verify_error:[3,2,1,""]},"M2Crypto.SSL.Session.Session":{write_bio:[6,1,1,""],as_text:[6,1,1,""],m2_ssl_session_free:[6,1,1,""],get_timeout:[6,1,1,""],as_der:[6,1,1,""],get_time:[6,1,1,""],set_timeout:[6,1,1,""],set_time:[6,1,1,""]},"M2Crypto.m2urllib2":{HTTPSHandler:[3,3,1,""],build_opener:[3,2,1,""]},"M2Crypto.m2crypto.stack_st_OPENSSL_BLOCK":{"this":[3,4,1,""],thisown:[3,4,1,""],stack:[3,4,1,""]},"M2Crypto.SMIME":{text_crlf:[3,2,1,""],load_pkcs7:[3,2,1,""],load_pkcs7_bio_der:[3,2,1,""],SMIME_Error:[3,5,1,""],load_pkcs7_bio:[3,2,1,""],load_pkcs7_der:[3,2,1,""],smime_load_pkcs7_bio:[3,2,1,""],PKCS7_Error:[3,5,1,""],Cipher:[3,3,1,""],SMIME:[3,3,1,""],smime_load_pkcs7:[3,2,1,""],text_crlf_bio:[3,2,1,""],PKCS7:[3,3,1,""]},"M2Crypto.PGP.packet":{CompressedPacket:[4,3,1,""],LiteralPacket:[4,3,1,""],PKEPacket:[4,3,1,""],CommentPacket:[4,3,1,""],make_ctb:[4,2,1,""],is_ctb:[4,2,1,""],CKEPacket:[4,3,1,""],Packet:[4,3,1,""],XXXError:[4,5,1,""],PacketStream:[4,3,1,""],UserIDPacket:[4,3,1,""],SignaturePacket:[4,3,1,""],TrustPacket:[4,3,1,""],PrivateKeyPacket:[4,3,1,""],PublicKeyPacket:[4,3,1,""]},"M2Crypto.EVP.PKey":{as_pem:[3,1,1,""],"final":[3,1,1,""],save_key_bio:[3,1,1,""],verify_final:[3,1,1,""],sign_init:[3,1,1,""],reset_context:[3,1,1,""],update:[3,1,1,""],as_der:[3,1,1,""],verify_init:[3,1,1,""],get_rsa:[3,1,1,""],verify_update:[3,1,1,""],m2_pkey_free:[3,1,1,""],save_key:[3,1,1,""],sign_final:[3,1,1,""],get_modulus:[3,1,1,""],assign_rsa:[3,1,1,""],m2_md_ctx_free:[3,1,1,""],sign_update:[3,1,1,""],size:[3,1,1,""]},"M2Crypto.httpslib.HTTPSConnection":{close:[3,1,1,""],get_session:[3,1,1,""],connect:[3,1,1,""],set_session:[3,1,1,""],default_port:[3,4,1,""]},"M2Crypto.SSL.Connection.Connection":{m2_bio_free:[6,1,1,""],set_connect_state:[6,1,1,""],set_accept_state:[6,1,1,""],set_session_id_ctx:[6,1,1,""],get_peer_cert:[6,1,1,""],accept:[6,1,1,""],set_tlsext_host_name:[6,1,1,""],connect:[6,1,1,""],shutdown:[6,1,1,""],serverPostConnectionCheck:[6,1,1,""],close:[6,1,1,""],ssl_get_error:[6,1,1,""],write:[6,1,1,""],get_socket_read_timeout:[6,1,1,""],getsockopt:[6,1,1,""],get_verify_depth:[6,1,1,""],verify_ok:[6,1,1,""],get_version:[6,1,1,""],makefile:[6,1,1,""],setup_addr:[6,1,1,""],send:[6,1,1,""],m2_ssl_free:[6,1,1,""],get_verify_mode:[6,1,1,""],get_peer_cert_chain:[6,1,1,""],set_cipher_list:[6,1,1,""],get_context:[6,1,1,""],get_ciphers:[6,1,1,""],listen:[6,1,1,""],set_socket_write_timeout:[6,1,1,""],set_client_CA_list_from_context:[6,1,1,""],get_session:[6,1,1,""],set_post_connection_check_callback:[6,1,1,""],get_verify_result:[6,1,1,""],fileno:[6,1,1,""],getsockname:[6,1,1,""],get_cipher:[6,1,1,""],set_session:[6,1,1,""],setup_ssl:[6,1,1,""],set_bio:[6,1,1,""],get_cipher_list:[6,1,1,""],get_state:[6,1,1,""],get_shutdown:[6,1,1,""],getpeername:[6,1,1,""],recv:[6,1,1,""],setblocking:[6,1,1,""],set_client_CA_list_from_file:[6,1,1,""],setsockopt:[6,1,1,""],get_default_session_timeout:[6,1,1,""],accept_ssl:[6,1,1,""],connect_ssl:[6,1,1,""],read:[6,1,1,""],bind:[6,1,1,""],clear:[6,1,1,""],clientPostConnectionCheck:[6,4,1,""],set_shutdown:[6,1,1,""],renegotiate:[6,1,1,""],get_socket_write_timeout:[6,1,1,""],pending:[6,1,1,""],sendall:[6,1,1,""],set_ssl_close_flag:[6,1,1,""],settimeout:[6,1,1,""],set_socket_read_timeout:[6,1,1,""]},"M2Crypto.ASN1.ASN1_Integer":{m2_asn1_integer_free:[3,1,1,""]},"M2Crypto.EVP.HMAC":{m2_hmac_ctx_free:[3,1,1,""],reset:[3,1,1,""],"final":[3,1,1,""],digest:[3,1,1,""],update:[3,1,1,""]},"M2Crypto.X509.X509":{get_serial_number:[3,1,1,""],get_subject:[3,1,1,""],add_ext:[3,1,1,""],sign:[3,1,1,""],get_not_after:[3,1,1,""],set_version:[3,1,1,""],set_subject:[3,1,1,""],set_serial_number:[3,1,1,""],as_pem:[3,1,1,""],get_issuer:[3,1,1,""],m2_x509_free:[3,1,1,""],get_version:[3,1,1,""],as_der:[3,1,1,""],check_purpose:[3,1,1,""],save:[3,1,1,""],get_fingerprint:[3,1,1,""],as_text:[3,1,1,""],save_pem:[3,1,1,""],set_issuer_name:[3,1,1,""],set_not_after:[3,1,1,""],set_subject_name:[3,1,1,""],get_ext_at:[3,1,1,""],check_ca:[3,1,1,""],set_issuer:[3,1,1,""],verify:[3,1,1,""],get_pubkey:[3,1,1,""],get_not_before:[3,1,1,""],set_not_before:[3,1,1,""],set_pubkey:[3,1,1,""],get_ext:[3,1,1,""],get_ext_count:[3,1,1,""]},"M2Crypto.RC4.RC4":{rc4_free:[3,1,1,""],set_key:[3,1,1,""],update:[3,1,1,""],"final":[3,1,1,""]},"M2Crypto.SSL.cb":{ssl_verify_callback_allow_unknown_ca:[6,2,1,""],ssl_info_callback:[6,2,1,""],ssl_verify_callback_stub:[6,2,1,""],ssl_verify_callback:[6,2,1,""]},"M2Crypto.httpslib.ProxyHTTPSConnection":{putrequest:[3,1,1,""],endheaders:[3,1,1,""],connect:[3,1,1,""],putheader:[3,1,1,""]},"M2Crypto.SSL.SSLServer":{ThreadingSSLServer:[6,3,1,""],SSLServer:[6,3,1,""],ForkingSSLServer:[6,3,1,""]},"M2Crypto.PGP.PublicKey.PublicKey":{keyid:[4,1,1,""],encrypt:[4,1,1,""],decrypt:[4,1,1,""],write:[4,1,1,""],add_userid:[4,1,1,""],add_signature:[4,1,1,""],remove_userid:[4,1,1,""]},"M2Crypto.X509.X509_Store_Context":{get1_chain:[3,1,1,""],get_error_depth:[3,1,1,""],get_current_cert:[3,1,1,""],get_error:[3,1,1,""],m2_x509_store_ctx_free:[3,1,1,""]},"M2Crypto.X509":{load_request_string:[3,2,1,""],x509_store_default_cb:[3,2,1,""],new_extension:[3,2,1,""],new_stack_from_der:[3,2,1,""],load_crl:[3,2,1,""],load_request_bio:[3,2,1,""],X509_Extension_Stack:[3,3,1,""],CRL:[3,3,1,""],X509_Store_Context:[3,3,1,""],load_cert_bio:[3,2,1,""],X509:[3,3,1,""],load_cert_string:[3,2,1,""],load_request:[3,2,1,""],X509_Name_Entry:[3,3,1,""],load_request_der_string:[3,2,1,""],load_cert_der_string:[3,2,1,""],Request:[3,3,1,""],X509_Store:[3,3,1,""],X509Error:[3,5,1,""],load_cert:[3,2,1,""],X509_Name:[3,3,1,""],X509_Stack:[3,3,1,""],X509_Extension:[3,3,1,""]},"M2Crypto.PGP.PublicKeyRing":{load_pubring:[4,2,1,""],PublicKeyRing:[4,3,1,""]},"M2Crypto.DSA.DSA_pub":{sign_asn1:[3,1,1,""],save_key:[3,1,1,""],save_key_bio:[3,1,1,""],check_key:[3,1,1,""],sign:[3,1,1,""]},"M2Crypto.RC4":{RC4:[3,3,1,""]},"M2Crypto.RSA.RSA":{private_decrypt:[3,1,1,""],sign_rsassa_pss:[3,1,1,""],m2_rsa_free:[3,1,1,""],save_key_der_bio:[3,1,1,""],private_encrypt:[3,1,1,""],verify:[3,1,1,""],verify_rsassa_pss:[3,1,1,""],save_key:[3,1,1,""],save_key_bio:[3,1,1,""],pub:[3,1,1,""],check_key:[3,1,1,""],save_pem:[3,1,1,""],save_pub_key:[3,1,1,""],public_decrypt:[3,1,1,""],save_key_der:[3,1,1,""],save_pub_key_bio:[3,1,1,""],public_encrypt:[3,1,1,""],as_pem:[3,1,1,""],sign:[3,1,1,""]},"M2Crypto.m2urllib2.HTTPSHandler":{https_request:[3,1,1,""],https_open:[3,1,1,""]},"M2Crypto.X509.X509_Extension":{get_critical:[3,1,1,""],get_value:[3,1,1,""],set_critical:[3,1,1,""],m2_x509_extension_free:[3,1,1,""],get_name:[3,1,1,""]},"M2Crypto.BIO.CipherStream":{m2_bio_free:[3,1,1,""],m2_bio_pop:[3,1,1,""],set_cipher:[3,1,1,""],write_close:[3,1,1,""],close:[3,1,1,""],SALT_LEN:[3,4,1,""]},"M2Crypto.ASN1.ASN1_String":{m2_asn1_string_free:[3,1,1,""],as_text:[3,1,1,""]},"M2Crypto.ASN1.LocalTimezone":{utcoffset:[3,1,1,""],tzname:[3,1,1,""],dst:[3,1,1,""]},"M2Crypto.X509.Request":{as_text:[3,1,1,""],get_pubkey:[3,1,1,""],get_version:[3,1,1,""],get_subject:[3,1,1,""],as_der:[3,1,1,""],sign:[3,1,1,""],save_pem:[3,1,1,""],set_pubkey:[3,1,1,""],add_extensions:[3,1,1,""],set_version:[3,1,1,""],set_subject:[3,1,1,""],verify:[3,1,1,""],set_subject_name:[3,1,1,""],m2_x509_req_free:[3,1,1,""],save:[3,1,1,""],as_pem:[3,1,1,""]},"M2Crypto.m2xmlrpclib.SSL_Transport":{request:[3,1,1,""],user_agent:[3,4,1,""]},"M2Crypto.DH":{gen_params:[3,2,1,""],DH:[3,3,1,""],DHError:[3,5,1,""],load_params:[3,2,1,""],set_params:[3,2,1,""],load_params_bio:[3,2,1,""]},"M2Crypto.DSA":{pub_key_from_params:[3,2,1,""],gen_params:[3,2,1,""],load_pub_key:[3,2,1,""],DSA_pub:[3,3,1,""],load_params:[3,2,1,""],load_key:[3,2,1,""],set_params:[3,2,1,""],DSAError:[3,5,1,""],load_pub_key_bio:[3,2,1,""],DSA:[3,3,1,""],load_params_bio:[3,2,1,""],load_key_bio:[3,2,1,""]},"M2Crypto.m2crypto.stack_st_OPENSSL_STRING":{"this":[3,4,1,""],thisown:[3,4,1,""],stack:[3,4,1,""]},"M2Crypto.SSL.Cipher":{Cipher:[6,3,1,""],Cipher_Stack:[6,3,1,""]},"M2Crypto.AuthCookie.AuthCookie":{headerValue:[3,1,1,""],value:[3,1,1,""],expiry:[3,1,1,""],mac:[3,1,1,""],output:[3,1,1,""],isExpired:[3,1,1,""],data:[3,1,1,""],name:[3,1,1,""]},"M2Crypto.SSL.timeout":{struct_to_timeout:[6,2,1,""],struct_size:[6,2,1,""],timeout:[6,3,1,""]},"M2Crypto.PGP.PublicKey":{PublicKey:[4,3,1,""]},"M2Crypto.RSA":{new_pub_key:[3,2,1,""],gen_key:[3,2,1,""],load_key:[3,2,1,""],rsa_error:[3,2,1,""],RSA:[3,3,1,""],RSA_pub:[3,3,1,""],load_pub_key:[3,2,1,""],keygen_callback:[3,2,1,""],load_pub_key_bio:[3,2,1,""],load_key_bio:[3,2,1,""],RSAError:[3,5,1,""],load_key_string:[3,2,1,""]},"M2Crypto.PGP.packet.CommentPacket":{pack:[4,1,1,""]},"M2Crypto.AuthCookie.AuthCookieJar":{isGoodCookie:[3,1,1,""],makeCookie:[3,1,1,""],isGoodCookieString:[3,1,1,""]},"M2Crypto.ftpslib.FTP_TLS":{prot_p:[3,1,1,""],ntransfercmd:[3,1,1,""],prot_c:[3,1,1,""],auth_ssl:[3,1,1,""],auth_tls:[3,1,1,""]},"M2Crypto.ASN1.ASN1_TIME":{get_datetime:[3,1,1,""],set_time:[3,1,1,""],set_string:[3,1,1,""],set_datetime:[3,1,1,""],m2_asn1_time_free:[3,1,1,""]},"M2Crypto.ASN1.ASN1_Object":{m2_asn1_object_free:[3,1,1,""]},"M2Crypto.ftpslib":{FTP_TLS:[3,3,1,""]},"M2Crypto.ASN1":{ASN1_Object:[3,3,1,""],ASN1_Integer:[3,3,1,""],ASN1_TIME:[3,3,1,""],ASN1_UTCTIME:[3,4,1,""],LocalTimezone:[3,3,1,""],ASN1_String:[3,3,1,""]},"M2Crypto.SSL.Connection":{Connection:[6,3,1,""]},"M2Crypto.SSL.Cipher.Cipher":{version:[6,1,1,""],name:[6,1,1,""]},"M2Crypto.SSL.Context.Context":{set_tmp_dh_callback:[6,1,1,""],set_session_id_ctx:[6,1,1,""],set_verify:[6,1,1,""],set_session_timeout:[6,1,1,""],close:[6,1,1,""],set_tmp_rsa_callback:[6,1,1,""],get_session_timeout:[6,1,1,""],set_tmp_dh:[6,1,1,""],load_cert:[6,1,1,""],remove_session:[6,1,1,""],get_verify_depth:[6,1,1,""],get_verify_mode:[6,1,1,""],set_tmp_rsa:[6,1,1,""],load_client_CA:[6,1,1,""],set_cipher_list:[6,1,1,""],add_session:[6,1,1,""],set_default_verify_paths:[6,1,1,""],set_client_CA_list_from_file:[6,1,1,""],load_verify_locations:[6,1,1,""],set_session_cache_mode:[6,1,1,""],load_cert_chain:[6,1,1,""],set_options:[6,1,1,""],get_cert_store:[6,1,1,""],get_allow_unknown_ca:[6,1,1,""],set_allow_unknown_ca:[6,1,1,""],m2_ssl_ctx_free:[6,1,1,""],set_info_callback:[6,1,1,""],load_client_ca:[6,1,1,""],load_verify_info:[6,1,1,""],get_session_cache_mode:[6,1,1,""]},"M2Crypto.SSL.TwistedProtocolWrapper":{connectSSL:[6,2,1,""],TLSProtocolWrapper:[6,3,1,""],listenTCP:[6,2,1,""],listenSSL:[6,2,1,""],connectTCP:[6,2,1,""]},"M2Crypto.EC.EC":{verify_dsa_asn1:[3,1,1,""],verify_dsa:[3,1,1,""],gen_key:[3,1,1,""],save_key:[3,1,1,""],save_key_bio:[3,1,1,""],pub:[3,1,1,""],as_pem:[3,1,1,""],compute_dh_key:[3,1,1,""],sign_dsa:[3,1,1,""],m2_ec_key_free:[3,1,1,""],save_pub_key_bio:[3,1,1,""],save_pub_key:[3,1,1,""],check_key:[3,1,1,""],sign_dsa_asn1:[3,1,1,""]},"M2Crypto.SSL.Context":{map:[6,2,1,""],ctxmap:[6,2,1,""],Context:[6,3,1,""]},"M2Crypto.Engine":{Engine:[3,3,1,""],load_dynamic_engine:[3,2,1,""],load_openssl:[3,2,1,""],EngineError:[3,5,1,""],load_dynamic:[3,2,1,""],cleanup:[3,2,1,""]},"M2Crypto.BIO":{BIO:[3,3,1,""],openfile:[3,2,1,""],SSLBio:[3,3,1,""],BIOError:[3,5,1,""],IOBuffer:[3,3,1,""],File:[3,3,1,""],CipherStream:[3,3,1,""],MemoryBuffer:[3,3,1,""]},"M2Crypto.X509.CRL":{m2_x509_crl_free:[3,1,1,""],as_text:[3,1,1,""]},"M2Crypto.Engine.Engine":{ctrl_cmd_string:[3,1,1,""],finish:[3,1,1,""],load_public_key:[3,1,1,""],m2_engine_free:[3,1,1,""],load_certificate:[3,1,1,""],init:[3,1,1,""],get_name:[3,1,1,""],get_id:[3,1,1,""],set_default:[3,1,1,""],load_private_key:[3,1,1,""]},"M2Crypto.X509.X509_Store":{set_verify_cb:[3,1,1,""],add_x509:[3,1,1,""],load_locations:[3,1,1,""],load_info:[3,1,1,""],add_cert:[3,1,1,""],m2_x509_store_free:[3,1,1,""]},"M2Crypto.SMIME.PKCS7":{get0_signers:[3,1,1,""],type:[3,1,1,""],write:[3,1,1,""],m2_pkcs7_free:[3,1,1,""],write_der:[3,1,1,""]},"M2Crypto.X509.X509_Extension_Stack":{push:[3,1,1,""],m2_sk_x509_extension_free:[3,1,1,""],pop:[3,1,1,""]},"M2Crypto.X509.X509_Stack":{push:[3,1,1,""],pop:[3,1,1,""],m2_sk_x509_free:[3,1,1,""],as_der:[3,1,1,""]},"M2Crypto.PGP.PublicKeyRing.PublicKeyRing":{spurious:[4,1,1,""],load:[4,1,1,""],save:[4,1,1,""]},"M2Crypto.DH.DH":{compute_key:[3,1,1,""],print_params:[3,1,1,""],gen_key:[3,1,1,""],check_params:[3,1,1,""],m2_dh_free:[3,1,1,""]},"M2Crypto.PGP.RSA":{new_pub_key:[4,2,1,""]},"M2Crypto.RSA.RSA_pub":{private_encrypt:[3,1,1,""],private_decrypt:[3,1,1,""],save_key_bio:[3,1,1,""],check_key:[3,1,1,""],save_key:[3,1,1,""]},"M2Crypto.Rand":{rand_pseudo_bytes:[3,2,1,""],save_file:[3,2,1,""],rand_seed:[3,2,1,""],rand_bytes:[3,2,1,""],rand_add:[3,2,1,""],load_file:[3,2,1,""],rand_status:[3,2,1,""],rand_file_name:[3,2,1,""]},"M2Crypto.BIO.File":{reset:[3,1,1,""],close:[3,1,1,""]},M2Crypto:{DH:[3,0,1,""],BN:[3,0,1,""],m2urllib2:[3,0,1,""],ASN1:[3,0,1,""],EVP:[3,0,1,""],"__init__":[3,0,1,""],Engine:[3,0,1,""],BIO:[3,0,1,""],callback:[3,0,1,""],X509:[3,0,1,""],PGP:[4,0,1,""],m2:[3,0,1,""],Err:[3,0,1,""],m2xmlrpclib:[3,0,1,""],httpslib:[3,0,1,""],EC:[3,0,1,""],util:[3,0,1,""],m2crypto:[3,0,1,""],ftpslib:[3,0,1,""],SMIME:[3,0,1,""],SSL:[6,0,1,""],DSA:[3,0,1,""],Rand:[3,0,1,""],RC4:[3,0,1,""],RSA:[3,0,1,""],threading:[3,0,1,""],m2urllib:[3,0,1,""],AuthCookie:[3,0,1,""]},"M2Crypto.PGP.packet.PacketStream":{read:[4,1,1,""],close:[4,1,1,""],count:[4,1,1,""]},"M2Crypto.util":{no_passphrase_callback:[3,2,1,""],py3str:[3,2,1,""],quiet_genparam_callback:[3,2,1,""],pkcs7_pad:[3,2,1,""],genparam_callback:[3,2,1,""],passphrase_callback:[3,2,1,""],UtilError:[3,5,1,""],octx_to_num:[3,2,1,""],py3bytes:[3,2,1,""],bin_to_hex:[3,2,1,""],pkcs5_pad:[3,2,1,""]},"M2Crypto.SSL":{SSLServer:[6,0,1,""],Context:[6,0,1,""],Session:[6,0,1,""],cb:[6,0,1,""],Checker:[6,0,1,""],ssl_dispatcher:[6,0,1,""],SSLTimeoutError:[6,5,1,""],Connection:[6,0,1,""],Cipher:[6,0,1,""],timeout:[6,0,1,""],SSLError:[6,5,1,""],TwistedProtocolWrapper:[6,0,1,""]},"M2Crypto.EVP.MessageDigest":{m2_md_ctx_free:[3,1,1,""],update:[3,1,1,""],digest:[3,1,1,""],"final":[3,1,1,""]},"M2Crypto.EC":{pub_key_from_der:[3,2,1,""],pub_key_from_params:[3,2,1,""],gen_params:[3,2,1,""],EC_pub:[3,3,1,""],load_pub_key:[3,2,1,""],EC:[3,3,1,""],ec_error:[3,2,1,""],ECError:[3,5,1,""],load_key_bio:[3,2,1,""],load_pub_key_bio:[3,2,1,""],get_builtin_curves:[3,2,1,""],load_key_string:[3,2,1,""],load_key:[3,2,1,""],load_key_string_pubkey:[3,2,1,""]},"M2Crypto.m2crypto":{stack_st_OPENSSL_STRING:[3,3,1,""],stack_st_OPENSSL_BLOCK:[3,3,1,""]},"M2Crypto.SSL.SSLServer.SSLServer":{handle_request:[6,1,1,""],handle_error:[6,1,1,""]},"M2Crypto.httpslib":{HTTPSConnection:[3,3,1,""],ProxyHTTPSConnection:[3,3,1,""]},"M2Crypto.DSA.DSA":{sign_asn1:[3,1,1,""],gen_key:[3,1,1,""],save_params_bio:[3,1,1,""],verify:[3,1,1,""],save_key_bio:[3,1,1,""],sign:[3,1,1,""],set_params:[3,1,1,""],m2_dsa_free:[3,1,1,""],save_params:[3,1,1,""],save_key:[3,1,1,""],save_pub_key_bio:[3,1,1,""],save_pub_key:[3,1,1,""],check_key:[3,1,1,""],verify_asn1:[3,1,1,""]},"M2Crypto.PGP.packet.PublicKeyPacket":{pubkey:[4,1,1,""],pack:[4,1,1,""]},"M2Crypto.BIO.BIO":{m2_bio_free:[3,1,1,""],writeable:[3,1,1,""],fileno:[3,1,1,""],read:[3,1,1,""],readable:[3,1,1,""],flush:[3,1,1,""],readlines:[3,1,1,""],should_retry:[3,1,1,""],reset:[3,1,1,""],readline:[3,1,1,""],write:[3,1,1,""],should_write:[3,1,1,""],write_close:[3,1,1,""],close:[3,1,1,""],bio_ptr:[3,1,1,""],should_read:[3,1,1,""],seek:[3,1,1,""],tell:[3,1,1,""]},"M2Crypto.PGP.packet.PrivateKeyPacket":{is_encrypted:[4,1,1,""]}},terms:{represent:3,get_object:3,saver:7,"1g9epovswhpqr":7,load_cert_der_str:3,prefix:3,dirnam:[5,7],makecooki:3,"8tsi3wo5enkg4qwbnarqc3vgcv":7,whose:3,ssl_dispatch:[1,3,6],set_param:3,ecdh:3,wdigqewjl:5,v_asn1_ia5str:3,under:7,save_pub_key_bio:3,sha256:3,untrust:2,bgkqhkig9w0bbwewfayikozihvcnawcecmn:7,digit:7,dherror:3,toivonen:[0,6],govern:5,readbio:6,msg_bio:7,i2d_ssl_sess:6,four:6,qlen:6,cmd:3,zsyncer:2,correct:[6,7],multipurpos:7,verif:[3,6,7],initialis:[3,6],set_accept_st:6,sizehint:3,second:[0,3,6],follow:[0,3,7,5,2],wmbgsclvwsfzcccjhavw9nhfmucnrdwxaymvetnuon:7,xgffb0okilylmwv2bf6:7,even:3,get_stat:6,bioerror:3,neg:3,m2_asn1_time_fre:3,load_openssl:3,ssl_transport:[3,2],"new":[3,7,5,6,2],symmetr:[0,3,7],set_opt:6,eoq9wfscnii4:5,here:[3,5,7],text_crlf:3,lamy57gkw4ondmrtqvq2ojqlvosbllpxzh:7,path:3,peercertdigest:6,m2_x509_name_fre:3,set_session_cache_mod:6,fcgiserv:2,datetim:3,bitmask:6,"9rsqkrc9urv9mrbisredgnyecnerak5r1yzpoowninxc":5,aka:3,set_connect_st:6,q1z7g:5,readlin:3,unix:6,certbio:3,org:[0,7,5,2],cqydvqqgewjtrzerma8ga1uechmittjdcnlwdg8xfjaubgnvbamtdvmvtulnrsbt:7,txt:0,abstracthttphandl:3,subjectaltnam:[0,3],get_der:3,describ:[3,6],would:[3,6,7],emailaddress:[3,5],getpeernam:6,recommend:[0,3],type:[3,7,5,6,2],until:[5,6],skip_accept_encod:3,set_default_verify_path:6,warn:[3,2,6],hold:3,unpack:2,must:[0,3,6],join:7,err:[1,3,7],work:[0,2,3,5,6,7],"2bconvert":6,standard_error_messag:2,rn9vpy0suy8:5,root:0,could:[0,3,6],overrid:6,give:5,smtp:7,indic:[1,6,7],rsassa:3,under_bio:3,end:[3,5,6],load_cert_bio:3,duqhj2ygkkwdqq9v0xscjkgiyw:5,how:[0,3,6,7],hot:7,conn:3,pgp2:4,verifi:[3,7,5,6,2],bio_f_ciph:3,updat:[3,5],x509:[0,1,3,5,7],after:[0,3,5,6,7],dw0boozhj8tc7co7lmyb0ye271b6:5,befor:[0,3,5,6,7],httpconnect:[0,3],serialnumb:3,gen_param:3,demonstr:[0,5,7],xlyg6hhzzgbfyyngj2y7ymz1rl1m8snrnmkcyskgtrudenf6wt9:7,set_verify_cb:3,attempt:[0,3],third:0,ntransfercmd:3,perform:[0,3],maintain:6,environ:6,incorpor:[5,7],enter:[3,7,5,2],struct_to_timeout:6,asn1obj:3,oper:[3,2,6,7],sslserver:[1,3,6],composit:[4,3],feedback:3,private_encrypt:3,b9zjffauqtwzdnjgrkkyikhwjdojaac:7,over:[0,3,2,6],failur:[3,6,7],becaus:[3,6,7],wbal2p:7,affect:6,medusa:2,digest:[0,3,7],standard_html_head:2,cngeq1qxtyduiguda2nbgcl:7,imc:7,img:2,better:3,set_socket_write_timeout:6,them:[0,7],thei:[0,3,6,7],proce:6,safe:3,"break":2,pkcs7_error:3,getvalu:3,timeout:[1,3,6],each:[3,6,7],complet:[3,6],side:[0,3,6],mean:3,zw5kzxixitafbgkqhkig9w0bcqewennlbmrlckblegftcgxllmrvbtcbnzanbgkq:7,zserverssl:[1,2],bio_clos:6,kozihvcnaqebbqaegycbaxz:7,pgp:[1,3,4],save_params_bio:3,extract:6,proxyhttpsconnect:3,qtm0ddmm:5,network:[0,7],goe:[3,6],open:[0,3,2,6,7],dst:3,content:[1,3,2,6,7],public_decrypt:3,keyr:4,size:[3,6],dsa:[0,1,3,7],multilin:3,navig:7,wherea:[0,3],situat:5,renegoti:6,ireactortcp:6,fixm:6,md5:3,pubr:4,instal:[2,7],traceback:7,openssl:[0,1,2,3,4,5,6,7],unknown:[3,6],onto:3,niqfytycdl9i5sk:7,wjtpvp0yobmju4vmkezi405r7o8oewi:5,rand:[1,3,2,7],rang:3,render:7,load_pkcs7_bio:3,hook:6,instruct:2,alreadi:6,wrapper:[0,3,6],primari:0,set_client_ca_list_from_context:6,top:[3,2,7],noout:[5,7],master:5,too:0,"4mpgg20wd633d4z4dtlddz":5,john:0,listen:6,zssl:2,pkepacket:4,tool:5,privaci:7,get_cipher_list:6,sync:3,get_datetim:3,b4law8g59vtg6dykeetrg0rubx4bggc7pkbfuin423yjjodwchvvgnpozxmqt:5,md5withrsaencrypt:[5,7],keyid:[4,5,7],target:[3,2,7],provid:[0,3,2,6,7],project:[0,7],tzname:3,get_not_aft:3,fashion:2,seed:[2,7],lg4q5yezr1ejaw:7,seek:3,minu:3,p7_bio:[3,7],getsocknam:6,recreat:7,latter:6,nerx9zjgvrwuscqqcu:5,genparam_callback:3,set_tmp_rsa:6,set_datetim:3,unset_x509_stack:3,"0x2057cf8":6,unknow:3,shall:[2,7],add_x509:3,object:[0,4,3,6,7],regular:3,verify_fail_if_no_peer_cert:[0,6],letter:[5,6,7],geturl:3,x509_extension_stack:3,don:3,dom:[5,7],dog:7,doe:[0,3,6],commonnam:[0,3,5,6],freewar:7,"1tcaqbmq":7,jcyhx9vw4xvja7:7,listentcp:6,x509_store_default_cb:3,set_issu:3,random:[3,7],privkei:7,pkcs7_text:7,pkc:[4,7],set_info_callback:6,pkg:[5,7],protocol:[0,3,2,6,7],load_loc:3,bmrlckblegftcgxllmrvbqibadajbgurdgmcgguaoigxmbggcsqgsib3dqejazel:7,absolut:3,acquir:3,"059600270x":0,m2_ssl_session_fre:6,explain:7,configur:[5,7],apach:2,gymga1udiwr8mhqaffzsqjs9bei2gcgrutozevjws81kov:7,tzinfo:3,peek_error_cod:3,get_vers:[3,6],xekaxcmzegp0b6camwfmuqrbvgxbbncqkc:7,test_ssl:0,stop:2,ssldump:0,net:5,bat:2,ietf:7,stack_st_openssl_str:3,"public":[4,3,5,7],twice:6,bad:6,u4j2f34u0xktwcp:7,keylen:3,fieldnam:6,format_format_d:3,yqor8jggsuzroyjqhj:7,result:[3,6,7],utilerror:3,fail:[3,6],best:0,subject:[3,5,7],newkey2:5,said:[3,7],databas:5,z04ovaeue4x0swm17hlbm2kvt:5,urllib:2,ssl_verify_callback:6,mua:7,awai:[3,6],approach:7,attribut:[3,5,7],accord:[3,6],manpag:[3,6],ssl_cert_fil:6,weak:0,extens:[3,5,6,7],ywmxnjz8:7,zbq:5,memorybuff:[3,7],protect:[3,6,7],howev:6,coz:7,against:3,logic:6,bio_f_buff:3,browser:2,sre_pattern:[3,6],ctxt:4,"509v3":2,height:2,"19973a9dbbb601ba":5,load_kei:[3,7],trust:7,assum:[2,6,7],strong:3,awihma0gccqgsib3dqmcageoma0gcsqgsib3dqebaquabigaqpu8hfutlcf6ho2t:7,recipient_kei:7,verify_ok:6,been:[3,6,7],skip_host:3,interpret:[0,3,6],interest:6,basic:[5,7],ext_stack:3,sendsmim:7,get_verify_result:6,argument:3,load_cert_chain:6,j6wo9dzltioz3znvr3ljsskib4tip4ugqnjaluw7m3ftz3magxn68hbbjs8tz8tl:7,rand_pseudo_byt:3,emploi:0,ident:[0,2,6,7],servic:[6,7],commerci:7,calcul:3,p7file:3,kef21pgguqpf14gkgfwx3sv4bjc1vbrrwq6zlg3nmuyqr5mtjjy9eq:5,printabl:5,get_verify_mod:6,zopebutton:2,need:[0,3,5,6,7],kwarg:3,sever:[3,5,6],credit:2,receiv:[6,7],suggest:3,make:[0,3,5,6,7],thusli:[2,7],cipher_stack:6,sopath:3,should_writ:3,get1_chain:3,key_as_byt:3,zsmime:7,nid:3,"1t8luishhn9899imp2vyg0ub67fqfypymm2cm2":7,rais:[0,3,6,7],portal:2,errdepth:6,get_verify_depth:6,thu:[3,7],inherit:[3,6],client:[0,3,6,7],thi:[0,2,3,5,6,7],pubkey_pkt:4,programm:[0,7],settimeout:6,left:[5,7],countrynam:5,identifi:[0,3,5,7],just:[0,6],salt_length:3,xisnot:7,kkst1mcj:5,yet:6,previous:6,wrappedprotocol:6,els:[3,5,6,7],ffffff:2,save:[4,3,7],applic:[0,3,5,6,7],blwegdqhonaiwbk5z1l:7,disposit:7,verify_dsa_asn1:3,"_close_cb":3,"0x4996190":6,hihsrgwtnd7lnxuucpx8yv1id0dlmp0hz:7,get_allow_unknown_ca:6,x509_store:[3,7],viega:0,specif:[0,5,6],filenam:[4,3,5,6,7],client_addr:3,manual:[0,3],modulu:[3,5,7],miiiwwyjkozihvcnaqcdoiiitdccclacaqaxggeamih9ageamgywytelmakga1u:7,underli:[0,3,6],openfil:3,right:[4,6,7],old:[0,5],famili:6,propertymap:2,intern:[3,6],"1hxxfyo88m":5,load_pub_key_bio:3,successfulli:6,startpassthrough:6,requesthandlerclass:6,trace:3,temp_fold:2,subclass:3,cnf:[5,7],unit:[5,7],condit:3,localhost:[7,5,2],plu:6,uncompress:4,save_key_d:3,pkcs7_detach:7,kxtbbmqswcqydvqqg:7,"2aglpogdcfdioqblb2dcscohmbbvr":5,post:3,rwniyh0aw4xyyhhit:7,unsaf:3,ireactorssl:6,m2_asn1_integer_fre:3,ctxmap:6,from_kei:7,produc:3,"float":3,encod:[3,2,6,7],www:[3,2,7],ditto:3,"9ij5z6mja7rm7ttbsjup":7,pair:[3,7,5,6,2],tmp_bio:7,getproto:6,netscap:[5,7],wrap:7,od2m3lp7jbwjqbrtndhimqul2s4yu:7,sign_asn1:3,wai:[6,7],sfl_home:7,support:[0,3,6],frill:3,transform:7,load_key_string_pubkei:3,avail:[0,2,6,7],width:2,reli:[3,6],set_not_aft:3,call:[0,3,5,6,7],x509_ext_ptr:3,"0x1faa758":3,so_:6,gqnveov:5,head:2,form:[0,3,6],micalg:7,write_bio:6,refcount:[3,6],"0x1ec24a0":3,"4oxll0bi":5,"true":[3,6,7],pub_key_from_d:3,reset:3,absent:6,duhrqiml1tyi:5,py3str:3,maximum:6,dcwd:7,tell:[0,3],featur:0,fv4sgm3jkr:7,"abstract":[3,7],decrypt:[0,4,3,7],exist:[5,2],x509_store_ctx:3,localtimezon:3,p7m:7,check:[0,3,5,6,2],ec9eyj:7,encrypt:[4,3,5,6,7],kdjqodst7ovu62motgf3arcduppwuztfxolyone5nioo1apvhbrinqwcplkpotqr:5,when:[0,3,5,6,7],https_open:3,test:[0,3,2,7],jvy5cif:7,node:7,add_ext:3,intend:7,determin:3,stringio:[0,7],notwithstand:7,consid:6,useridpacket:4,longer:3,"1dr9dy8l0naqh21y5fgss8b1wd":7,pbkdf2:3,bottom:[3,7],pseudo:7,pathnam:2,time:[0,3,2,6,7],push:[3,7],bio_ptr:3,chain:[0,3,6],u7rqbwpc9hr34saprs3ubbculet748kecbx247imbtidctzxcc1o86:7,"41b2874df3d02dd4":5,consum:7,cadav:2,from_cert:7,cacert:[5,6],signific:[3,6],emmarsgyedf5h1afl1smkomskbqxe1d2jg:7,ztf6mpxjsixi6l4zyxebs6yhf:7,vsgprqx2:7,llf:4,should_retri:3,decid:[5,6],depend:[3,2,6,7],"5efdvbet":5,get_crit:3,readabl:3,post1:[7,5,2],decis:5,multivalu:3,sourc:[0,3,4,2,6,7],string:[4,3,2,6,7],load_param:3,ftpserver:2,word:7,brows:2,m2_x509_store_fre:3,pub_key_from_param:3,administr:7,level:[2,6],did:[5,6],iter:3,item:3,cooki:3,authcooki:[1,3],upper:3,ssl_verify_callback_stub:6,unmix:3,set_client_ca_list_from_fil:6,htm:7,sign:[3,5,7],port:[3,2,6],load_key_bio_pubkei:3,addr:6,repli:2,current:[3,6,7],eovbgs7ezalvvkdj4hnl:7,m2_engine_fre:3,deriv:3,gener:[3,5,6,7],swigpyobject:3,ckepacket:4,nconnect:2,get_serial_numb:3,m2_dh_free:3,along:3,kdfqdmtfzqkymhp1laq1ihbq1rhwsbh5n3ekq:5,wait:6,m2_bio_pop:3,m2_sk_x509_free:3,load_sess:6,behav:6,http_class:3,load_fil:[3,7],commonli:7,dqehaaavbbnhihnpz24gb2ygb3vyihrpbwvzoiic5zccaumwggjmoamcaqicaqaw:7,extra:5,modul:[0,1,3,4,6,7],keyfil:[3,6],peer:6,bio_noclos:6,asn1:[1,3],regex:3,memori:[3,7],msu:3,rsa_error:3,perl:5,rc4:[1,3],bio_s_pyfd:3,handler:[3,6],msg:7,scope:7,msb:3,cipher_list:6,tb7k3chfgw5wagwnll8lb:5,keep_tri:4,enhanc:0,visual:3,ioy0bdijcyn1jimohj:7,nueymfjdm0uvntg0icxgnufsfnjkntthpagykgetric3kgjz:5,signer_kei:7,commentpacket:4,prepar:2,pretend:7,mpint:3,bxwxkuuvt81vbjwdn9jst6:7,setblock:6,can:[0,2,3,5,6,7],save_param:3,purpos:[3,7],cookie_str:3,m2_pkey_fre:3,claim:0,stream:[4,3],add_extens:3,agent:2,topic:5,critic:3,kv95ymtgbisuwkj93grbvqoj:7,occur:[3,6],alwai:[3,7],close_pyfil:3,qppdzt3ykfmg2lzytaam1czvb6rbnrjjp2zrpbwn:5,rand_add:3,write:[4,3,5,6,7],anyon:7,fourth:0,m2urllib:[1,3,2],map:[6,7],product:7,mar:[5,7],as_text:[3,6],sni:6,sol_tcp:6,mac:3,commit:5,mai:[0,3,7,5,2],data:[0,2,3,5,6,7],aes_128_cbc:3,practic:[0,3,7],newkei:[5,7],democa:5,"7pvwhtszeyhn3oa9dhlmv9uqc4wy5md7j":5,inform:[0,7,5,6,2],combin:6,callabl:[3,6],zhttps_server:2,optnam:6,eawm5avuv7hnptt5zr:7,load_crl:3,coll:2,nbsp:2,print_param:3,get_error_depth:3,still:6,pointer:3,xmtdg:7,dynam:3,verify_dsa:3,polici:[5,6,7],is_encrypt:4,ma0gcsqgsib3dqebbauaa4gbaho3drchr86fstvavfixdsswwqktcehuhrdc:7,window:[2,7],mail:7,keyout:5,non:[3,6,7],within:[0,5,6],recal:7,ssl_verify_callback_allow_unknown_ca:6,reject:6,initi:[3,6],bound:6,pavel:3,aggtjgplibexlzalhpwlz9laqyrqpvcvjywaovfmmvrav4nafnoz2:7,now:[5,7],negoti:6,nor:[6,7],introduct:[0,7,5,2],pfl1k5dyxrgtzlb36uljd:7,down:6,zwxy:7,name:[0,3,5,6,7],verify_fin:3,h7nmicymi2wkz8h:7,ssl_connect:6,bufsiz:6,compil:3,set_sess:[3,6],https_srv:7,continu:6,egftcgxllmrvbtcbnzanbgkqhkig9w0baqefaaobjqawgykcgyear1nyy1qrll1r:5,lkmac1dwb3dqgjt5xk4wjesinfdxecnegacyteagyztpiapu:5,fi1wdpphywke97pojizvqesfzopty5hjiyzux4u:5,keypair:3,year:[5,7],happen:0,newcert:5,dispos:6,subjectnam:3,asn1_utctim:3,shown:[0,2],space:3,ahporp5ys55czpi:5,"_pyfree_x509":3,load_verify_loc:[0,6],internet:[5,6,7],text_nam:3,factori:[4,3,6],get_error_func:3,sc51hkebgckl1:7,fakesocket:0,state:[3,5,6,7],argv:3,mime:[0,1,5,7],plen:3,"byte":[4,3,6],tzsznk2qwgvsspos9mhuaepbnjmnbffbrulhrutsglm:7,ax96lvs0:5,get_pubkei:3,first:[0,3,7],origin:[3,7],directli:[0,6],onc:[3,6],save_pub_kei:3,amyxludrk45acua:5,"long":[0,6],sztm5jrp2zw:7,wronghost:6,zhttps_handler:2,publickeypacket:4,given:[3,6],bio_f_ssl:3,engineerror:3,"8levy0cllw":5,cgyikozihvcnawcwdgyikozihvcnawicagcama0gccqgsib3dqmcagfamacgbsso:7,citi:[5,7],checker:[0,1,3,6],ssl_:6,conveni:6,zovnycmv1cintpalaw4bwtxnhcdvthavdy34okhemzncg:5,provinc:[5,7],copi:[5,6,2],rsa_pub:[4,3],specifi:[3,6],ecerror:3,get_ext_at:3,than:[0,3,6],serv:2,ddlzqbacuxwtv5xy8plmx7widaqab:5,sha224:3,zw50msqwigyjkozihvcnaqkbfhvyzwnpcgllbnrazxhhbxbszs5kb20caqawdqyj:7,dyman:3,were:6,seri:7,sai:7,smime_load_pkcs7_bio:[3,7],ani:[0,3,6],ly4tpl5:5,load_params_bio:3,sat:[5,2],add_entry_by_txt:3,bitwis:3,engin:[1,3,6],inkei:7,note:[0,3,6,7],addhead:2,take:6,bgbyj1dubkhzsc7dgxzdtuclgnxqnnsg:5,cipherstream:3,"0x3f0bc68":6,noth:3,channel:[2,6],begin:[0,5,7],sure:3,makebuf:7,normal:[0,6],buffer:[0,3,6,7],add_userid:4,"0qjhp6hut7fso":7,set_mod:6,icon:7,renam:[5,7],contextfactori:6,messier:0,ftp_tl:3,link:[0,2],salt:3,hmac:[0,3,7],recipi:7,cheap:7,connectssl:6,hack:2,corner:7,m2_sk_x509_extension_fre:3,gqzcvnzzcmx8uvrjqr8drwdsmpj0vxg1:7,fifth:0,onli:[3,5,6],explicitli:6,get_error_reason:3,load_certif:3,lwpbxzf2k3fuudnkrlfbakeampxoybuifr2s5bma:5,engine_method_:3,set_x509_stor:[3,7],algorigthm:3,shramov:3,analys:0,get_fingerprint:3,verify_upd:3,variou:[0,6],get:[3,2,6],ssl_ptr:6,ssl:[0,1,2,3,5,6,7],sslbio:3,requir:[0,3,6],prime:[4,3],fileno:[3,6],save_kei:3,l6kn27mwzhe331vjttjsgl4:5,seldom:3,verify_init:3,error_log:2,through:[3,5,6,7],where:[3,5,6],e_n:[4,3],pkcs7_verifi:7,rand_byt:3,br77:5,set_tmp_rsa_callback:6,sport:0,m2_x509_req_fre:3,load_request_str:3,asn1int:3,between:0,"import":[3,2,6,7],create_socket:6,gratefulli:7,screen:[2,7],rsaencrypt:[5,7],set_data:3,sslverificationerror:6,come:[0,5],tue:2,"76h5jiznpbdsf2fjghwqvvdgyw4owy3mu739lhvnblicn":5,load_cert_str:3,evp_ciph:3,set_socket_read_timeout:6,mani:[3,2,7],ewjtrzerma8ga1uechmittjdcnlwdg8xfjaubgnvbamtdvmvtulnrsbtzw5kzxix:7,period:5,pop:[3,7],set_pad:3,b6ugcsqgsib3dqehataubggqhkig9w0dbwqirf525ufwszaaggea85rmx6axqmxb:7,bo2w7ei6iejbazk:5,mark:[3,7],zserver:2,certifi:[5,7],valueerror:3,get_rsa:3,get_id:3,standard:[3,7],"case":[0,6,7],interoper:7,heikki:[0,6],eaydvqqdewlsb2nhbghvc3qxjzalbgkqhkig9w0bcqewggfkbwluqhnlcnzlci5l:5,invok:[3,2,6,7],sol_socket:6,stdout:[0,3],set_session_id_ctx:6,henc:5,dsaerror:3,clutter:2,get_session_timeout:6,m2xmlrpclib:[1,3,2],httpserver:2,develop:5,author:[0,3,7,5,2],j9ftv3di:5,same:[0,3,6],binari:[4,3,6],epoch:3,html:[2,7],pad:3,document:[0,1,2,5,6,7],load_dynam:3,finish:[3,6],companion:7,"_mode_":6,extern:6,wrylp3:7,sign_dsa_asn1:3,appropri:[0,3,6],x509_name:[3,6],set_subject_nam:3,s0ovoc041cerazqfm2tl:7,"0x822012c":7,sfqo6lc9mtsj7fjydq:7,x509_stack:[3,7],model:[5,7],execut:[5,7],t6lqehb32wfyxqbkfxfjsxzsxox3r:7,m2urllib2:[1,3],auth_ssl:3,rest:3,addinfourl:3,q7s4tn1z:7,get_cert_stor:6,struct:6,m2_x509_free:3,except:[0,4,3,6],param:3,desktop:2,catop:5,blob:[3,7],struct_siz:6,real:3,stack_st_openssl_block:3,"2bdqvfpffx5lsmitkzaobldssjfr6rojxoqrsgia2az":7,read:[0,2,3,4,5,6,7],hkig9w0baqefaaobjqawgykcgyea5c5tj1chtsoxa1q2q0fyiwmwyhptjpjcvtzm:7,httplib:[0,3],traffic:0,dispatch:6,world:6,integ:6,server:[0,7,5,6,2],either:[3,6],smime:[1,3,7],output:[3,7],manag:2,set_tmp_dh:6,handshak:[3,6],pythonwar:3,nonzero:3,mbstring_asc:3,tvtk:7,freebsd:2,save_key_der_bio:3,legal:3,exit:3,"9znlfejkjj67vembxbj":7,freed:6,power:2,to_addr:7,urllib2:3,set_ciph:[3,7],passphrase_callback:[3,6],asn1_str:3,gvyvi:7,src:2,mg611eovkleoostv:5,eozfol5i20ykiv6j:7,pkcs5_pad:3,ssl_info_callback:6,other:[0,3,5,6],routin:[6,7],outlook:7,wsluvo:5,"0jwuq":7,awfqq4jcc:7,build_open:3,get_issu:3,ju4:5,your:[1,3,7,5,2],loc:3,buffer_s:6,hex:3,overwrit:2,start:[7,5,6,2],interfac:[0,3,6,7],ipv4:6,ipv6:6,premis:7,handle_request:6,load_pkcs7:3,tupl:[4,3,6],bundl:[7,5,2],dqyjkozihvcnaqeebqawwzelmakga1uebhmcu0cxetapbgnvbaotce0yq3j5chrv:7,jun:2,add_signatur:4,cryptograph:[3,7],miicxgibaakbgqcvwdhjvcuwxwu4h8wqujguvm:5,conclus:[5,2],tripl:7,immedi:6,get_not_befor:3,possibl:[3,6],"default":[0,2,3,5,6,7],mbstring_utf8:3,format_d:3,set_timeout:6,expect:3,cbc:[5,7],hellman:[3,2],creat:[0,1,2,3,5,6,7],certain:[5,6],w81xodtq2ecjxc8fn2wpa9y5vd1lt7ojksoul1:5,mhf6rqar:7,stack_of:6,file:[0,2,3,5,6,7],again:[3,5,7],fqlcrrr5nvupdin:5,get_data:3,tcpserver:6,field:[0,3,5,7],cleanup:3,ignor:3,you:[0,2,3,5,6,7],private_decrypt:3,ssl_sess_cache_:6,yubj33ylmpjgngijlnolfy0hnw7tmwqr:7,symbol:6,publickeyr:[1,3,4],blklen:3,set_pubkei:3,nyndufwi0qm92qlk0ui:5,directori:[0,5,6,2],bindaddress:6,newli:3,ngp:[0,7,5,2],pemfil:6,all:[0,4,3,5,6],ssl_cert_dir:6,alg:3,pty:[5,7],iqwxllnj:7,m2_x509_name_entry_fre:3,alt:2,"7zjt2r5cpikgkwofamduxeltx":5,osafound:0,init:3,program:[0,1,5,7],those:0,h9diul:5,octx_to_num:3,get_peer_cert_chain:6,global:7,fals:[3,5,6],mpi:3,util:[0,1,3],zpecllwhxd4b1auaiaargkl935u:7,get_kei:3,veri:[3,6],gucrblvd7n3ofnx5ujmpmcw9zwbu:7,load_cert:[3,6,7],list:[3,2,6],stderr:6,default_port:3,open_http:3,webdav:2,get_peer_cert:6,zero:3,pass:[3,5,6],further:6,b4txejzriyc8f3:7,"6l0g37faxur3xm28rchzvhu":5,what:[3,5,7],sun:2,section:[5,7],abl:7,overload:6,delet:3,version:[0,3,4,5,6,7],method:[3,6],"9gul1bxbckrtedtxenqtem7spzomtswd2lhb8z65grx90cyt":7,expon:[4,3,5,7],set_ssl:3,full:[5,7],hash:3,sophist:0,"3dizhtxigepfztiuyutxs3i2gnmx2pee3chtllywd3jneakz0iozpdphif2xhllq":7,behaviour:6,get_entries_by_nid:3,rudimentari:0,modifi:[3,2,7],valu:[4,3,5,6,7],search:1,sender:7,reason:[3,6],ccvkzzl:5,starttl:6,pick:7,action:6,diffi:[3,2],via:[3,6,7],literalpacket:4,nhost:2,cafil:6,wkat:7,href:2,s_pkt:4,signaturepacket:4,establish:[0,3,6],handle_error:6,select:[2,6,7],fcmspp3auq1:7,recv:6,two:[0,3,6],as_der:[3,6],organizationnam:[3,5],tlsprotocolwrapp:6,ede3:[5,7],more:[0,3,5,6],prot_p:3,epollreactor:6,mozilla:[2,7],flag:[0,3,6,7],prot_c:3,"1czdztgk7h9cdgx2qjsivymyytcfi3zsuzmjs8":5,known:0,compani:[5,7],cach:6,ensu:7,none:[4,3,6,7],"56vrpgppgut40hv8xqfbwiz2whwwlkpfahj8b79ztfuzuru6z2rnpvv8inhc":7,der:[3,7],m2_asn1_string_fre:3,dev:2,histori:0,dek:5,dec:2,def:7,randfnam:3,prompt:7,m2crypto_xmlrpc:3,expectedhost:6,share:3,accept:[0,7,5,6,2],explor:7,phrase:5,add_cert:3,cours:[5,7],get_socket_read_timeout:6,secur:[0,3,5,6,7],rather:6,anoth:[5,6],kiy8jkpv8dr5po1ikaxjfudbygdenjwybsrspsk3p:5,lnzqowadmol:7,"__init__":2,m2_x509_extension_fre:3,simpl:[0,3,6],css:2,get_tim:6,resourc:7,check_purpos:3,catalog:2,load_pkcs7_bio_d:3,"1bc9f3q":7,associ:6,set_serial_numb:3,cenfqfwc:7,caus:3,callback:[1,3,6],ssl_ctx_flush_sess:6,"8yhspd0caweaaaobtjcbszadbgnvhq4efgquxoyoll1t4jabwzfrm7ms8nblzuow":7,"0x3f0b3f8":6,u4dmyq9uxs421en3v2hkvhvdy8ut2ot29:7,dough:3,untouch:6,paramet:[0,3,2,6,7],getronicsgov:7,style:6,get_valu:3,sc3lsmhugu9xc26ogstjmkquiah:5,pend:6,set_x509_stack:[3,7],bjq5hnxbouslq0rwbrkoxv64i:7,assign_rsa:3,might:6,rwb:3,good:3,"return":[0,3,6,7],rgwnkxpj:7,timestamp:4,x509_purpose_:3,entry_count:3,qbcrdaoxdj0ulwytauev:7,vihhfc1zzp:5,mkwcbi1nfvohcv3xdq2ela:7,userid:4,authent:7,mysteri:3,chandra:0,man:6,found:6,nocertif:6,text_crlf_bio:3,format_pem:3,hard:3,hrg6sai33usk8xpokjqa:5,procedur:5,connect:[0,1,3,2,6,7],y3klvhk09yl6d:7,beyond:7,hostnam:6,ftp:[3,2],grcgzeb9ymfcedxahtdufhjrkpdpsxzzvvgksbncbqu92obyqvnrq8m:7,zbxscvldasmckg:5,etag:2,print:[3,7,5,6,2],"3wf7q915tveqoc74bnu6b8ibbgrmhzdzmvq4szffveaum":5,get_sess:[3,6],rand_rang:3,proxi:3,advanc:5,rm2htgotm2lmore4geotypi5f1fbi:5,pub:3,m2_cipher_ctx_fre:3,base:[0,2,3,4,5,6,7],connecttcp:6,eopzyno4mi:7,ask:[3,5,7],get_default_session_timeout:6,refer:[3,2],basi:6,messagedigest:3,thread:[1,3],pub_kei:3,threat:[5,7],pkcs7_pad:3,lifetim:6,python3:6,assign:[3,6],feed:3,certfil:[3,6],notifi:6,exchang:[0,3],set_tmp_dh_callback:6,number:[4,3,5,6,7],ec_error:3,urbfke2mocdxvdzxbmd:7,done:[2,6],blank:[5,7],miss:6,differ:[0,6],script:0,uweuasngtkpjv2jyumd3hwqox2q3cd4zgqvjj6gf3exa5126ckf:5,least:6,m2_ssl_free:6,bdclcn8a:7,buf_len:3,"0x1fe7dd0":6,store:[3,6],option:[3,5,6],create_by_txt:3,tob:7,part:7,check_ca:3,kind:6,grew:0,asyncor:[2,6],whenev:6,remot:6,remov:6,ecdsa:3,reus:6,str:6,comput:3,fmt7a120s3gd2jixgh06l:7,evperror:3,packag:[1,3,6,4],m2_pkcs7_free:3,expir:[3,5,6],"null":[3,6],x509error:3,vsxc7xx7xo:7,built:6,equival:6,self:[3,5,6,7],also:[0,2,3,5,6,7],unset_kei:3,load_client_ca:6,useless:0,puthead:3,distribut:[0,2],previou:3,most:[0,3,6,7],user_ag:3,dai:[5,7],appear:2,m2_x509_store_ctx_fre:3,clear:[3,5,6,7],cover:5,ext:3,exp:3,microsoft:7,des_ede3_cbc:7,load_key_str:3,remove_userid:4,microsec:6,find:6,access:[2,7],"0x1faa848":[3,6],post_connection_check:6,copyright:[0,2,4,5,6,7],unattend:5,putrequest:3,smtplib:7,writebio:6,localitynam:3,get_current_cert:3,thisown:3,verify_p:[0,6],m2_x509_crl_free:3,utcoffset:3,rfc:[3,7],no_passphrase_callback:3,common:[0,5,7],should_read:3,crl:3,certif:[0,2,3,5,6,7],add_sess:6,set:[0,3,5,6,7],netmemet:0,see:[0,3,2,6],sec:6,arg:[3,6],reserv:[4,6],set_not_befor:3,passphras:[3,5,6,7],set_vers:3,altern:[2,6],signatur:[3,5,7],web:[2,7],numer:2,ssl_sent_shutdown:6,numericipmatch:6,peercerthash:6,succeed:[3,2,6],"0x49948c0":6,distinguish:[5,6,7],acl_us:2,read_al:3,both:[3,2,6],last:[0,5,6,7],bhmcu0cxetapbgnvbaotce0yq3j5chrvmrkwfwydvqqdexbtl01jtuugumvjaxbp:7,kozihvcnaqebbqaegyblzlgupfphwhsgtiapvdexn61qisz3oem88xoxkuw0szor:7,get_error:[3,6,7],forgotten:5,prng:[2,7],load:[0,3,4,2,6,7],simpli:3,ec_pub:3,point:3,instanti:[4,3,7],address:[0,5,6,7],header:[3,2],littl:[0,2],shutdown:6,suppli:[3,6],cakei:5,surnam:3,stamp:7,due:6,bgcolor:2,secret:5,vi4roin:5,box:[2,7],buflen:6,append:3,understand:7,"2zz2g7x1hxrwh95a":7,imap:7,look:[5,7],get0_sign:3,ypfxy:5,index_html:2,"while":[3,2,6,7],abov:[0,2,6,7],error:[3,6,7],asn1_string_print_ex:3,pack:[4,6],propag:3,readi:[5,6,7],itself:[3,7],uwrgu5shra8oncm0cdxej0kpf3cfnjhffb8hwmzi4uegnmfxqnsxogz:7,set_tim:[3,6],around:2,setup_addr:6,"_ptr":3,close_flag:3,decod:[0,5,6],zope:[2,7],qya6adywgbghr9jkhwn5gsdu7bwx:7,obio:3,jddsk:7,uifxaf6s4n2uihvp6tqxthejtpzoc7pc:7,alert:6,temporari:[6,7],user:7,stack:[3,6],recent:7,subpackag:[1,3],sha1:[3,6,7],set_allow_unknown_ca:6,entri:[3,5],without:3,"0x7fc7ebc63150":3,set_kei:3,bio_fre:6,explan:6,predetermin:3,utifsh4jkkm:7,load_request_bio:3,pss:3,set_object:3,m2_asn1_object_fre:3,pubkei:[4,3],fancyurlopen:2,browser_id_manag:2,"_sre":[3,6],sslerror:[3,6],input:[0,4,6],subsequ:0,certdata2pem:0,bio:[0,1,3,6,7],march:7,format:[0,4,3,6,7],rc4_free:3,big:[4,3],wdd1ar2k4k3gai7kkgobwt0:7,intuit:5,bio_in:3,etwitreft1heupnar:7,gd58p4mpmhu5iknz4yh4nlhnaitevcs85tzuaxze9g:7,bit:[0,3,5,6,7],bin_to_hex:3,pdlrrliknknfmhkiacktlrcu59sca6adeiwuzqmuzp5cs6jrsro3nkfg1bd09d1k:5,signal:3,resolv:2,cw8kzzwh:7,collect:[0,2],princip:3,get_socket_write_timeout:6,givennam:3,popular:7,ssl_ctx_set_timeout:6,creation:[5,6],some:[5,6,7],sampl:0,control_panel:2,m2_bio_fre:[3,6],nqxlmgj3jwq7x9:7,endhead:3,pltnni25spyrcwfl6erd25u:7,per:[3,2,6],pem:[0,2,3,5,6,7],substitut:7,prog:7,stateorprovincenam:3,proc:5,privatekeypacket:4,asn1_object:3,run:[3,2,7],do_handshak:3,clientpostconnectioncheck:6,jyvbd7acn35p5yx7ktqvqerwdijxycanbcnvmrtmysanw9kv1ujtxc5vx7ylwipk:5,step:[0,5,7],loseconnect:6,ftpslib:[1,3],jy5rd:5,load_key_bio:3,"3pjiyfhaxk64iutmpsy393rhmeb4kn":7,is_ctb:4,idx:6,constraint:[5,7],materi:[0,2],new_pub_kei:[4,3],keybio:3,dialog:[2,7],smtpd:7,block:6,https_server:2,compute_kei:3,chang:[3,6],nss:[0,7],enabl:[6,7],sock:6,textual:0,custom:6,includ:[3,5],sslv3:[0,6],suit:6,set_cipher_list:6,yl9qevh1pp2zvswq12p7gjt3t:7,properli:7,bio_s_mem:3,skip:7,newer:3,line:[0,3,7],aqh:7,info:[3,5,7],concaten:6,consist:[3,7],caller:6,protocolwrapp:6,sign_rsassa_pss:3,unlock:3,py3byt:3,akbr4il1nkq8ecsmcr3wpa0i9n0ehi7zvpvahxc0sqapfl8ygdfhq:5,similar:[7,5,6,2],curv:3,constant:[1,3,6,4],retriev:[3,7],doesn:6,repres:[3,6],m2_ec_key_fre:3,get_ciph:6,compressedpacket:4,yrpzcwq3gxahuj:5,titl:2,invalid:3,public_encrypt:3,librari:[6,7],clean:[3,6],hanson:5,m2_md_ctx_free:3,ago:5,ccrt2tfwkbbfleuifl7mb:5,twistedprotocolwrapp:[1,3,6],algorithm:[3,5,7],pkei:3,ubowzitegtyli52:7,rand_se:3,"1vsrcid":5,depth:[0,3,6],algo:3,get_subject:3,lbow6ssdir6:7,asyncio:6,load_request_der_str:3,code:[0,3,5,6,7],queri:6,der_str:3,steve:5,urandom:2,ssltimeouterror:6,issuer:[3,5,7],privat:[3,5,6,7],"_debug":3,base64:7,reset_context:3,friendli:7,send:[0,2,6,7],flowinfo:6,ahau6kwk:7,sens:6,fatal:6,ripemd160:3,sent:[3,5,6,7],get_error_cod:3,mutheybpq5th7ydrtnizkkxobnqe2kyux9x22a1kh49sojjfg6kpb9mugizbimlv:5,electron:7,b877j9wbpbl:5,get_shutdown:6,tri:[0,6],iobuff:[0,3],newreq:5,get_timeout:6,m2_ssl_ctx_free:6,certdata:0,session:[1,3,6],evp:[1,3],uryvak7vfoldaz6z3nosoi6nonnehpr:7,pleas:5,x509v3:[5,7],dasmytmpc4ztytv06n07afbjl:5,"0x2":[5,7],"0x1":5,"0x0":[5,7],pkcs12:7,oiqto:7,download:[0,2,7],write_clos:3,cat:5,odd:3,click:[2,7],client_address:6,compat:0,index:[1,3],"974aklcjnk1gzigarz":7,compar:0,henceforth:2,weak_crypto:6,make_ctb:4,ssl_ctx_set_opt:6,mimetool:3,pep484:6,len:3,vkwwecqqdkeu:5,ssl_received_shutdown:6,kebfzs8asq7uc9axw6ti0eapj8evhtwhsbgzqrwekfbxs6hbbhmidc4n0m7oq:7,let:[0,5,7],threadingsslserv:6,relativedistinguishednam:3,sinc:[0,3,5],kilroi:3,convert:[0,3],iihwd6gtv1uodf7urbxtl3hq9:7,pretti:0,"1qk53c":5,ctx:[0,3,6],later:6,cert:[0,3,6,7],ctb:4,pheng:[0,2,4,5,6,7],typic:[0,6,7],rdn:3,revoc:3,ggarfmmj4yuhewkys9jo1h8k4bdxugmauwni5:5,appli:[3,5,2],foundat:[0,6],api:[3,6],set_subject:3,clbwev3ryfrlp4x8j9mdte0ykok3t0wqohqrettsifdtjnfp:5,from:[0,2,3,4,5,6,7],getsockopt:6,zip:2,commun:[3,6],check_kei:3,next:[3,5,7],prompt1:3,few:[5,7],prompt2:3,usr:[5,7],get_nam:3,pfi:5,socketserv:6,about:[5,6,7],forkingsslserv:6,load_info:[3,7],ctrl_cmd_string:3,m2_rsa_fre:3,tunnel:3,alia:3,bmvnwbppufzpiaivalycjt6pyextbbszs7:5,set_tlsext_host_nam:6,b6gr5s8:7,endian:[4,3],serverpostconnectioncheck:6,get_ext_count:3,aliv:6,control:[0,3,6],process:[5,6,7],lock:7,rescorla:0,m2_hmac_ctx_fre:3,httpsconnect:[0,3],serial:[3,5,7],hvcnaqkemryefooerud8exiyxfqq8btfukwrsp3imfigcsqgsib3dqejdzffmemw:7,gknqqdblotqt06f3oissdjetm2itllyhgzv:5,load_verify_info:6,ssl_get_default_timeout:6,bgkqhkig9w0bbwewhayjkozihvcnaqkfmq8xdtaxmdmzmtexnduwmlowiwyjkozi:7,rand_file_nam:3,scopeid:6,hcyiukxujtaqtxboh:7,m1je:5,pkcs7:[3,7],imqqiiw:7,m1awhen3vir2zlaw:5,qjpbezwdp7gjfzfatqitesymwo3i:7,farm:2,zxhhbxbszs5kb20whhcnmdewmzmxmte0mdmzwhcnmdiwmzmxmte0mdmzwjbbmqsw:7,pyfil:3,sign_init:3,load_pub_kei:3,nuser:2,connectionmad:6,"3c93156fc7b4ebf49fe9c7db7f503087":7,bind:6,correspond:7,issu:[2,6,7],l5trm4x6zjxwuxxmijcehmmd8tc8ybwwo4ao19b3ebffetvsugxsga:5,packetstream:4,allow:[0,3,5,6],sendal:6,https_request:3,ir9fggophatzzq:7,get_builtin_curv:3,dnli0rvuvxiwt:5,load_pubr:4,mutt:7,siong:[0,2,4,5,6,7],chosen:0,request_bodi:3,therefor:6,"217mrhyx2nswgrpkqndu3gespovml3jeqiaxuponbwq7rj42":5,crash:3,ktgtcixjl2nmw7j:5,dh1024:2,python:[0,1,2,3,5,6,7],handi:5,auth:3,dat:[2,7],"8czydsolmyibujccabycaqewydbbmqswcqydvqqgewjtrzerma8ga1uechmittjd":7,dav:2,facilit:5,instead:[2,7],"0x1ffa410":3,spoofer:7,miie8ayjkozihvcnaqccoiie4tccbn0caqexczajbgurdgmcgguamcigcsqgsib3:7,wrongcertif:6,anyth:0,capath:6,mode:[3,2,6,7],organizationunitnam:3,postconnectioncheck:6,get_x509_verify_error:3,x509_store_context:3,vhgdittnelgthbaezu5rhdswgdelvbp:7,portal0:2,"7ay4jsdhyibcmgsq":5,jbt3ltgf743utyaas7hnguouobhoyt:5,usernam:3,our:7,patch:[5,2],b75:5,variabl:6,matt:0,req:[3,5,7],xc9dtimuutxtxlgytb0ujkbnsoaenolm:7,ret:[5,6],as_pem:3,suitabl:0,binstr:6,get_context:6,"2dnyol50zu0sdzst1":5,shut:6,sendmail:7,manipul:[3,6],save_key_bio:3,releas:3,as_hash:3,get_modulu:3,indent:3,accept_ssl:6,c6fi3n03rgfmkectijc:5,keep:5,dhpfile:6,length:[3,2,6],timeo:6,ltd:[5,7],datareceiv:6,organiz:[5,7],softwar:7,isbn:0,pk7_smime:7,"_timeout_":6,smartcard:3,date:[0,3,2],"1ezn9zmlryqzbtxnnrmp3dhj":7,rand_statu:3,utc:3,publickei:[1,3,4],strict:3,ssl_ctx_ptr:6,system:[7,5,6,2],messag:[0,3,7],asn1_integ:3,attach:7,ssl_ctx_set_session_cache_mod:6,termin:6,"0x10001":[5,7],"final":[3,7],xlcqyvk1tzhd:7,tws5k:5,"__del__":6,"4ju6":7,rsa:[0,1,2,3,4,5,6,7],load_pkcs7_der:3,nqaodq3aobzpafp9l:5,structur:[3,6],charact:3,unset_ciph:3,headervalu:3,unencrypt:[5,7],iwq3n6j1suzs3uw6abq8bivynoucmkjaqqjbanqxfalu4b:5,httpshandler:3,quarante:0,authcookiejar:3,set_str:3,have:[5,6,7],tabl:1,close:[4,3,2,6,7],border:2,automat:[0,6],widgit:[5,7],messeng:7,arm:7,mix:3,builtin:3,connectionlost:6,which:[0,3,5,6,7],sign_upd:3,singl:3,newca:5,repudi:7,actualhost:6,who:7,flndpcnkrtvqdx3rt6x6vbttcyom:7,aogabaku8w3w1qu15hle1bjsl7gmreoreqeblobmmazz4by0l6sxzxjpjwxo86f:5,ljecgc3rqu1uwisbkmquis1s46ebbm5np75izpnujokj2hv:7,cipher:[0,1,3,6,7],deploi:5,aetir4v7sgxmepx7thq1pv:7,why:7,afresh:5,url:[3,2],request:[3,5,6,7],quvxinaxygqco9lzdw6hudk8:7,unmix3:3,get_ext:3,constrain:5,skunk:2,itafbgkqhkig9w0bcqewennlbmrlckblegftcgxllmrvbyibadambgnvhrmebtad:7,z6ebh:5,text:[3,7,5,2],get_error_lib:3,verbos:3,bring:7,empir:3,zpqqqzkq:5,miibvwyjkozihvcnaqcdoiibsdccauqcaqaxggeamih9ageamgywytelmakga1u:7,sjai4kpfvt00xfnvgluywyeks9sygto7hihnqkcf44f5lyv6ntfwmfqb11daty9v:7,setup_ssl:6,locat:[2,6],set_issuer_nam:3,should:[3,5,6],jan:2,suppos:7,ebdz:7,"2iwrpascbeid8saraql3ddcli":5,local:[7,5,2],trustpacket:4,meant:5,load_private_kei:3,autom:7,g3bgsmvlxkefztfjkxo6xnjcbnf5i:7,dsa_pub:3,cstringio:3,write_d:3,ukidkhst60v2q9kegpzgfpoztskm:7,organ:[5,7],sha:3,integr:7,contain:[3,2,6,7],challeng:5,hpysvh:7,ftplib:3,ssl_ctx:3,x509_name_entri:3,packet:[1,3,4],malfunct:6,sign_dsa:3,x509_store_set_verify_cb:3,listenssl:6,multipart:7,h99suto:5,mrywfaydvqqdew1tl01jtuugu2vuzgvymsewhwyjkozihvcnaqkbfhjzzw5kzxja:7,statu:[3,6],isgoodcooki:3,correctli:7,boundari:7,below:2,randpool:[2,7],written:[0,3,5],exiy8geir:7,m2cryptoerror:3,limit:3,neither:6,reactor:6,email:[3,5,7],verisign:7,kei:[0,2,3,5,6,7],sign_fin:3,get_session_cache_mod:6,group:7,cvzrxakeaxno80arbgxpumr11ghg:5,salt_len:3,problem:3,addit:[0,3,6],d2i_ssl_sess:6,g7ppoo:5,admin:5,sipba4ik5xcrlt9e0s2qjgrvo9gyfaqz:7,standard_templ:2,etc:6,pgpmime:7,instanc:[0,3,6,7],gen_kei:3,freeli:7,mh2pz4lverxa:7,nbbba2yl0n5gs1tyiy9z:5,comment:5,ssl_get_error:6,"8caweaaaaama0gcsqgsib3dqebbauaa4gb":5,walk:5,respect:[3,6],bio_push:3,quit:[7,5,2],compos:2,out_bio:3,treat:6,pcgiserv:2,"2cjcbfzokmijci03kbtqxofiqglstwxgzknf":5,u_pkt:4,set_post_connection_check_callback:6,z6uxrm:7,setsockopt:6,ptxt:4,save_pem:3,hyswpz1xvlprmv4:5,aaiavb8w:7,togeth:6,openpgp:7,present:[2,6],connect_ssl:6,plain:7,permit:0,noncrit:3,defin:6,isgoodcookiestr:3,"0ipy80":7,smime_load_pkcs7:[3,7],session_data_manag:2,set_ssl_close_flag:6,bind_and_activ:6,almost:3,demo:[0,7,5,2],site:5,set_session_timeout:6,forkingmixin:6,load_public_kei:3,"_alwayssucceedspostconnectioncheck":6,save_fil:[3,7],welcom:1,began:5,x509_ext:3,handl:7,keygen_callback:3,set_verifi:[0,6],m2_dsa_fre:3,http:[0,3,2,7],context:[0,1,3,6],pystack:3,effect:7,ssl_context:[3,6],tlfgl4hdk2gyzxafuqzwiurz:7,miibntccaqycaqawxtelmakga1uebhmcu0cxetapbgnvbaotce0yq3j5chrvmriw:5,m2crypto:[0,1,2,3,4,5,6,7],asn1str:3,countri:[5,7],y9mh7efw:7,off:3,com:[0,3,7,5,2],well:[3,2,6,7],p12:7,exampl:[0,2,3,5,6,7],command:[0,5],choos:[5,7],usual:[0,3],less:3,bhdelbr5jbpjcj5aid76mfr8:7,fingerprint:3,asn1_tim:3,obtain:[3,7],tcp:[0,6],a4mgiy2kwwfie73qiyv7yyg8flrvr1iib:5,load_dynamic_engin:3,outform:7,smime_error:[3,7],makefil:[3,6],discuss:5,"_top":2,add:[3,2,6],valid:[0,3,4,5,6,7],crack:7,bool:6,logger:2,match:[3,5,7],gmt:[7,5,2],threadingmixin:6,xmlrpc:2,wyhfg8g3biehurpj2v:7,howto:[0,1,7,5,2],imec:3,realiz:6,set_bio:6,know:7,password:[3,5,7],rsaerror:3,verify_asn1:3,insert:3,x509_extens:3,resid:6,like:[3,5,7],success:[3,6],set_shutdown:6,nihuwgujn:5,ieucourgcxpyd1j65vt7ob3ziypu2f2nluicynqpg1sd:7,necessari:3,vuzalydffdfutiqqzys4z:7,page:[1,2,6],backlog:6,zhttp_handler:2,captur:3,linux:0,"export":[6,7],flush:3,proper:6,home:[2,7],transport:3,tmp:7,lead:[3,6],quiet_genparam_callback:3,leak:3,avoid:2,octet:[3,6],overlap:7,leav:[5,7],new_stack_from_d:3,nkasxekr8auhjsbvumrqrl6r0nnsfpzdr1w7pv:7,to_cert:7,httpslib:[0,1,3],standard_html_foot:2,usag:7,isexpir:3,host:[0,3,6],although:0,offset:3,"0x202cf50":6,expiri:3,err_get_error:3,actual:[0,3,6,7],socket:[0,3,6],certchainfil:6,discard:5,vtajp:5,disabl:6,w4d1nnwu8agcpyshsexhc:5,own:[1,2,3,5,6,7],auth_tl:3,ull4d2cldx9ovynykwdezb5dyv0r:7,cnlwdg8xfjaubgnvbamtdvmvtulnrsbtzw5kzxixitafbgkqhkig9w0bcqewennl:7,automag:[3,7],x509_ptr:6,sid_ctx:6,qin7ujpkou61cn7h8dvhr8yw9:7,transfer:[3,7],cqzkt9:5,certmast:5,"function":[0,3,4,2,6,7],set_crit:3,errnum:6,check_param:3,"_pyfre":[3,6],bodi:[4,2],new_extens:3,gain:0,spuriou:4,naccept:2,buf:7,compute_dh_kei:3,count:[4,3,2],ia5str:5,made:0,whether:[3,7],wish:[7,5,2],writeabl:3,displai:[0,7],record:0,gpmpndsyvvceufpluwydim0vkwhgc2:7,data_bio:3,ensur:6,signer:7,otherwis:3,server_address:[0,6],engine_ctrl_cmd_str:3,pin:3,"int":[3,6],dure:[0,3,6],twist:[0,6],ephemer:6,implement:[0,3,7],unset_x509_stor:3,eric:0,cxo23r9wwrnzem:7,probabl:[0,7],e9kybgki7vpojwbz27:5,from_addr:7,xxxerror:4,book:0,pravir:0,load_request:3,set_default:3,out:[3,7,5,6,2],writesequ:6,hu3qdmtcwjd:5,"class":[0,4,3,6,7],counterpan:7,verify_rsassa_pss:3,zhttp_server:2,xmlrpclib:3,indirectli:3,portion:[0,3],sntelhcawulwtifz:7,remove_sess:6},objtypes:{"0":"py:module","1":"py:method","2":"py:function","3":"py:class","4":"py:attribute","5":"py:exception"},titles:["HOWTO: Programming SSL in Python with M2Crypto","Welcome to M2Crypto&#8217;s documentation!","1.&nbsp;&nbsp;&nbsp;ZServerSSL-HOWTO","M2Crypto Package","PGP Package","HOWTO: Creating your own CA with OpenSSL","SSL Package","HOWTO: Programming S/MIME in Python with M2Crypto"],objnames:{"0":["py","module","Python module"],"1":["py","method","Python method"],"2":["py","function","Python function"],"3":["py","class","Python class"],"4":["py","attribute","Python attribute"],"5":["py","exception","Python exception"]},filenames:["howto.ssl","index","ZServerSSL-HOWTO","M2Crypto","M2Crypto.PGP","howto.ca","M2Crypto.SSL","howto.smime"]}) \ No newline at end of file