Author: Amaury Forgeot d'Arc <[email protected]>
Branch: stdlib-2.7.9
Changeset: r75516:35f8bc7e346a
Date: 2015-01-25 17:37 +0100
http://bitbucket.org/pypy/pypy/changeset/35f8bc7e346a/

Log:    ssl: add SSLContext.load_dh_params()

diff --git a/pypy/module/_ssl/interp_ssl.py b/pypy/module/_ssl/interp_ssl.py
--- a/pypy/module/_ssl/interp_ssl.py
+++ b/pypy/module/_ssl/interp_ssl.py
@@ -1025,6 +1025,31 @@
         if ret != 1:
             raise _ssl_seterror(space, None, -1)
 
+    @unwrap_spec(filepath=str)
+    def load_dh_params_w(self, space, filepath):
+        bio = libssl_BIO_new_file(filepath, "r")
+        if not bio:
+            libssl_ERR_clear_error()
+            errno = get_errno()
+            raise wrap_oserror(space, OSError(errno, ''))
+        try:
+            set_errno(0)
+            dh = libssl_PEM_read_bio_DHparams(bio, None, None, None)
+        finally:
+            libssl_BIO_free(bio)
+        if not dh:
+            errno = get_errno()
+            if errno != 0:
+                libssl_ERR_clear_error()
+                raise wrap_oserror(space, OSError(errno, ''))
+            else:
+                raise _ssl_seterror(space, None, 0)
+        try:
+            if libssl_SSL_CTX_set_tmp_dh(self.ctx, dh) == 0:
+                raise _ssl_seterror(space, None, 0)
+        finally:
+            libssl_DH_free(dh)        
+
     def load_verify_locations_w(self, space, w_cafile=None, w_capath=None,
                                 w_cadata=None):
         if space.is_none(w_cafile):
@@ -1156,9 +1181,10 @@
     __new__=interp2app(_SSLContext.descr_new),
     _wrap_socket=interp2app(_SSLContext.descr_wrap_socket),
     set_ciphers=interp2app(_SSLContext.descr_set_ciphers),
-    load_verify_locations=interp2app(_SSLContext.load_verify_locations_w),
     cert_store_stats=interp2app(_SSLContext.cert_store_stats_w),
     load_cert_chain=interp2app(_SSLContext.load_cert_chain_w),
+    load_dh_params=interp2app(_SSLContext.load_dh_params_w),
+    load_verify_locations=interp2app(_SSLContext.load_verify_locations_w),
     
set_default_verify_paths=interp2app(_SSLContext.descr_set_default_verify_paths),
     _set_npn_protocols=interp2app(_SSLContext.set_npn_protocols_w),
 
diff --git a/pypy/module/_ssl/test/test_ssl.py 
b/pypy/module/_ssl/test/test_ssl.py
--- a/pypy/module/_ssl/test/test_ssl.py
+++ b/pypy/module/_ssl/test/test_ssl.py
@@ -1,11 +1,11 @@
 from rpython.tool.udir import udir
+import os
 
 
 class AppTestSSL:
     spaceconfig = dict(usemodules=('_ssl', '_socket', 'thread'))
 
     def setup_class(cls):
-        import os
         cls.w_nullbytecert = cls.space.wrap(os.path.join(
             os.path.dirname(__file__), 'nullbytecert.pem'))
 
@@ -269,6 +269,8 @@
         tmpfile = udir / "emptycert.pem"
         tmpfile.write(SSL_EMPTYCERT)
         cls.w_emptycert = cls.space.wrap(str(tmpfile))
+        cls.w_dh512 = cls.space.wrap(os.path.join(
+            os.path.dirname(__file__), 'dh512.pem'))
 
     def test_load_cert_chain(self):
         import _ssl
@@ -291,6 +293,14 @@
         ctx.load_verify_locations(cadata=cacert_pem)
         assert ctx.cert_store_stats()["x509_ca"]
 
+    def test_load_dh_params(self):
+        import _ssl
+        ctx = _ssl._SSLContext(_ssl.PROTOCOL_TLSv1)
+        ctx.load_dh_params(self.dh512)
+        raises(TypeError, ctx.load_dh_params)
+        raises(TypeError, ctx.load_dh_params, None)
+        raises(_ssl.SSLError, ctx.load_dh_params, self.keycert)
+
 SSL_CERTIFICATE = """
 -----BEGIN CERTIFICATE-----
 MIICVDCCAb2gAwIBAgIJANfHOBkZr8JOMA0GCSqGSIb3DQEBBQUAMF8xCzAJBgNV
diff --git a/rpython/rlib/ropenssl.py b/rpython/rlib/ropenssl.py
--- a/rpython/rlib/ropenssl.py
+++ b/rpython/rlib/ropenssl.py
@@ -53,6 +53,7 @@
 ASN1_ITEM = rffi.COpaquePtr('ASN1_ITEM')
 X509_NAME = rffi.COpaquePtr('X509_NAME')
 stack_st_X509_OBJECT = rffi.COpaquePtr('struct stack_st_X509_OBJECT')
+DH = rffi.COpaquePtr('DH')
 
 class CConfigBootstrap:
     _compilation_info_ = eci
@@ -356,6 +357,7 @@
 ssl_external('BIO_s_file', [], BIO_METHOD)
 ssl_external('BIO_new', [BIO_METHOD], BIO)
 ssl_external('BIO_set_nbio', [BIO, rffi.INT], rffi.INT, macro=True)
+ssl_external('BIO_new_file', [rffi.CCHARP, rffi.CCHARP], BIO)
 ssl_external('BIO_new_mem_buf', [rffi.VOIDP, rffi.INT], BIO)
 ssl_external('BIO_free', [BIO], rffi.INT)
 ssl_external('BIO_reset', [BIO], rffi.INT, macro=True)
@@ -367,6 +369,11 @@
 ssl_external('PEM_read_bio_X509_AUX',
              [BIO, rffi.VOIDP, rffi.VOIDP, rffi.VOIDP], X509)
 
+ssl_external('PEM_read_bio_DHparams',
+             [BIO, rffi.VOIDP, rffi.VOIDP, rffi.VOIDP], DH)
+ssl_external('SSL_CTX_set_tmp_dh', [SSL_CTX, DH], rffi.INT, macro=True)
+ssl_external('DH_free', [DH], lltype.Void, releasegil=False)
+
 if HAS_NPN:
     SSL_NEXT_PROTOS_ADV_CB = lltype.Ptr(lltype.FuncType(
         [SSL, rffi.CCHARPP, rffi.UINTP, rffi.VOIDP], rffi.INT))
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to