[pypy-svn] r77862 - pypy/branch/fast-forward/pypy/rlib

afa at codespeak.net afa at codespeak.net
Wed Oct 13 14:04:56 CEST 2010


Author: afa
Date: Wed Oct 13 14:04:55 2010
New Revision: 77862

Added:
   pypy/branch/fast-forward/pypy/rlib/ropenssl.py   (contents, props changed)
Log:
Add missing file


Added: pypy/branch/fast-forward/pypy/rlib/ropenssl.py
==============================================================================
--- (empty file)
+++ pypy/branch/fast-forward/pypy/rlib/ropenssl.py	Wed Oct 13 14:04:55 2010
@@ -0,0 +1,195 @@
+from pypy.rpython.lltypesystem import rffi, lltype
+from pypy.rpython.tool import rffi_platform
+from pypy.translator.platform import platform
+from pypy.translator.tool.cbuild import ExternalCompilationInfo
+
+import sys
+
+if sys.platform == 'win32' and platform.name != 'mingw32':
+    libraries = ['libeay32', 'ssleay32', 'user32', 'advapi32', 'gdi32']
+    includes = [
+        # ssl.h includes winsock.h, which will conflict with our own
+        # need of winsock2.  Remove this when separate compilation is
+        # available...
+        'winsock2.h',
+        # wincrypt.h defines X509_NAME, include it here
+        # so that openssl/ssl.h can repair this nonsense.
+        'wincrypt.h',
+        'openssl/ssl.h',
+        'openssl/err.h']
+else:
+    libraries = ['ssl', 'crypto']
+    includes = ['openssl/ssl.h', 'openssl/err.h']
+
+eci = ExternalCompilationInfo(
+    libraries = libraries,
+    includes = includes,
+    export_symbols = ['SSL_load_error_strings'],
+    )
+
+eci = rffi_platform.configure_external_library(
+    'openssl', eci,
+    [dict(prefix='openssl-',
+          include_dir='inc32', library_dir='out32'),
+     ])
+
+## user defined constants
+X509_NAME_MAXLEN = 256
+## # these mirror ssl.h
+PY_SSL_ERROR_NONE, PY_SSL_ERROR_SSL = 0, 1
+PY_SSL_ERROR_WANT_READ, PY_SSL_ERROR_WANT_WRITE = 2, 3
+PY_SSL_ERROR_WANT_X509_LOOKUP = 4
+PY_SSL_ERROR_SYSCALL = 5 # look at error stack/return value/errno
+PY_SSL_ERROR_ZERO_RETURN, PY_SSL_ERROR_WANT_CONNECT = 6, 7
+# start of non ssl.h errorcodes
+PY_SSL_ERROR_EOF = 8 # special case of SSL_ERROR_SYSCALL
+PY_SSL_ERROR_INVALID_ERROR_CODE = 9
+
+PY_SSL_CERT_NONE, PY_SSL_CERT_OPTIONAL, PY_SSL_CERT_REQUIRED = 0, 1, 2
+
+(PY_SSL_VERSION_SSL2, PY_SSL_VERSION_SSL3,
+ PY_SSL_VERSION_SSL23, PY_SSL_VERSION_TLS1) = range(4)
+
+SOCKET_IS_NONBLOCKING, SOCKET_IS_BLOCKING = 0, 1
+SOCKET_HAS_TIMED_OUT, SOCKET_HAS_BEEN_CLOSED = 2, 3
+SOCKET_TOO_LARGE_FOR_SELECT, SOCKET_OPERATION_OK = 4, 5
+
+# WinSock does not use a bitmask in select, and uses
+# socket handles greater than FD_SETSIZE
+if sys.platform == 'win32':
+    MAX_FD_SIZE = None
+else:
+    from pypy.rlib._rsocket_rffi import FD_SETSIZE as MAX_FD_SIZE
+
+HAVE_RPOLL = True  # Even win32 has rpoll.poll
+
+class CConfig:
+    _compilation_info_ = eci
+
+    OPENSSL_VERSION_NUMBER = rffi_platform.ConstantInteger(
+        "OPENSSL_VERSION_NUMBER")
+    SSLEAY_VERSION = rffi_platform.DefinedConstantString(
+        "SSLEAY_VERSION", "SSLeay_version(SSLEAY_VERSION)")
+    SSL_FILETYPE_PEM = rffi_platform.ConstantInteger("SSL_FILETYPE_PEM")
+    SSL_OP_ALL = rffi_platform.ConstantInteger("SSL_OP_ALL")
+    SSL_VERIFY_NONE = rffi_platform.ConstantInteger("SSL_VERIFY_NONE")
+    SSL_ERROR_WANT_READ = rffi_platform.ConstantInteger(
+        "SSL_ERROR_WANT_READ")
+    SSL_ERROR_WANT_WRITE = rffi_platform.ConstantInteger(
+        "SSL_ERROR_WANT_WRITE")
+    SSL_ERROR_ZERO_RETURN = rffi_platform.ConstantInteger(
+        "SSL_ERROR_ZERO_RETURN")
+    SSL_ERROR_WANT_X509_LOOKUP = rffi_platform.ConstantInteger(
+        "SSL_ERROR_WANT_X509_LOOKUP")
+    SSL_ERROR_WANT_CONNECT = rffi_platform.ConstantInteger(
+        "SSL_ERROR_WANT_CONNECT")
+    SSL_ERROR_SYSCALL = rffi_platform.ConstantInteger("SSL_ERROR_SYSCALL")
+    SSL_ERROR_SSL = rffi_platform.ConstantInteger("SSL_ERROR_SSL")
+    SSL_CTRL_OPTIONS = rffi_platform.ConstantInteger("SSL_CTRL_OPTIONS")
+    BIO_C_SET_NBIO = rffi_platform.ConstantInteger("BIO_C_SET_NBIO")
+
+for k, v in rffi_platform.configure(CConfig).items():
+    globals()[k] = v
+
+# opaque structures
+SSL_METHOD = rffi.COpaquePtr('SSL_METHOD')
+SSL_CTX = rffi.COpaquePtr('SSL_CTX')
+SSL = rffi.COpaquePtr('SSL')
+BIO = rffi.COpaquePtr('BIO')
+X509 = rffi.COpaquePtr('X509')
+X509_NAME = rffi.COpaquePtr('X509_NAME')
+
+HAVE_OPENSSL_RAND = OPENSSL_VERSION_NUMBER >= 0x0090500f
+
+constants = {}
+constants["SSL_ERROR_ZERO_RETURN"] = PY_SSL_ERROR_ZERO_RETURN
+constants["SSL_ERROR_WANT_READ"] = PY_SSL_ERROR_WANT_READ
+constants["SSL_ERROR_WANT_WRITE"] = PY_SSL_ERROR_WANT_WRITE
+constants["SSL_ERROR_WANT_X509_LOOKUP"] = PY_SSL_ERROR_WANT_X509_LOOKUP
+constants["SSL_ERROR_SYSCALL"] = PY_SSL_ERROR_SYSCALL
+constants["SSL_ERROR_SSL"] = PY_SSL_ERROR_SSL
+constants["SSL_ERROR_WANT_CONNECT"] = PY_SSL_ERROR_WANT_CONNECT
+constants["SSL_ERROR_EOF"] = PY_SSL_ERROR_EOF
+constants["SSL_ERROR_INVALID_ERROR_CODE"] = PY_SSL_ERROR_INVALID_ERROR_CODE
+
+constants["CERT_NONE"]     = PY_SSL_CERT_NONE
+constants["CERT_OPTIONAL"] = PY_SSL_CERT_OPTIONAL
+constants["CERT_REQUIRED"] = PY_SSL_CERT_REQUIRED
+
+constants["PROTOCOL_SSLv2"]  = PY_SSL_VERSION_SSL2
+constants["PROTOCOL_SSLv3"]  = PY_SSL_VERSION_SSL3
+constants["PROTOCOL_SSLv23"] = PY_SSL_VERSION_SSL23
+constants["PROTOCOL_TLSv1"]  = PY_SSL_VERSION_TLS1
+
+constants["OPENSSL_VERSION_NUMBER"] = OPENSSL_VERSION_NUMBER
+ver = OPENSSL_VERSION_NUMBER
+ver, status = divmod(ver, 16)
+ver, patch  = divmod(ver, 256)
+ver, fix    = divmod(ver, 256)
+ver, minor  = divmod(ver, 256)
+ver, major  = divmod(ver, 256)
+constants["OPENSSL_VERSION_INFO"] = (major, minor, fix, patch, status)
+constants["OPENSSL_VERSION"] = SSLEAY_VERSION
+
+def external(name, argtypes, restype, **kw):
+    kw['compilation_info'] = eci
+    return rffi.llexternal(
+        name, argtypes, restype, **kw)
+
+def ssl_external(name, argtypes, restype, **kw):
+    globals()['libssl_' + name] = external(
+        name, argtypes, restype, **kw)
+
+ssl_external('SSL_load_error_strings', [], lltype.Void)
+ssl_external('SSL_library_init', [], rffi.INT)
+if HAVE_OPENSSL_RAND:
+    ssl_external('RAND_add', [rffi.CCHARP, rffi.INT, rffi.DOUBLE], lltype.Void)
+    ssl_external('RAND_status', [], rffi.INT)
+    ssl_external('RAND_egd', [rffi.CCHARP], rffi.INT)
+ssl_external('SSL_CTX_new', [SSL_METHOD], SSL_CTX)
+ssl_external('SSLv23_method', [], SSL_METHOD)
+ssl_external('SSL_CTX_use_PrivateKey_file', [SSL_CTX, rffi.CCHARP, rffi.INT], rffi.INT)
+ssl_external('SSL_CTX_use_certificate_chain_file', [SSL_CTX, rffi.CCHARP], rffi.INT)
+ssl_external('SSL_CTX_ctrl', [SSL_CTX, rffi.INT, rffi.INT, rffi.VOIDP], rffi.INT)
+ssl_external('SSL_CTX_set_verify', [SSL_CTX, rffi.INT, rffi.VOIDP], lltype.Void)
+ssl_external('SSL_new', [SSL_CTX], SSL)
+ssl_external('SSL_set_fd', [SSL, rffi.INT], rffi.INT)
+ssl_external('BIO_ctrl', [BIO, rffi.INT, rffi.INT, rffi.VOIDP], rffi.INT)
+ssl_external('SSL_get_rbio', [SSL], BIO)
+ssl_external('SSL_get_wbio', [SSL], BIO)
+ssl_external('SSL_set_connect_state', [SSL], lltype.Void)
+ssl_external('SSL_connect', [SSL], rffi.INT)
+ssl_external('SSL_get_error', [SSL, rffi.INT], rffi.INT)
+
+ssl_external('ERR_get_error', [], rffi.INT)
+ssl_external('ERR_error_string', [rffi.ULONG, rffi.CCHARP], rffi.CCHARP)
+ssl_external('SSL_get_peer_certificate', [SSL], X509)
+ssl_external('X509_get_subject_name', [X509], X509_NAME)
+ssl_external('X509_get_issuer_name', [X509], X509_NAME)
+ssl_external('X509_NAME_oneline', [X509_NAME, rffi.CCHARP, rffi.INT], rffi.CCHARP)
+ssl_external('X509_free', [X509], lltype.Void)
+ssl_external('SSL_free', [SSL], lltype.Void)
+ssl_external('SSL_CTX_free', [SSL_CTX], lltype.Void)
+ssl_external('SSL_write', [SSL, rffi.CCHARP, rffi.INT], rffi.INT)
+ssl_external('SSL_pending', [SSL], rffi.INT)
+ssl_external('SSL_read', [SSL, rffi.CCHARP, rffi.INT], rffi.INT)
+
+ssl_external('SSL_read', [SSL, rffi.CCHARP, rffi.INT], rffi.INT)
+
+EVP_MD_CTX = rffi.COpaquePtr('EVP_MD_CTX')
+EVP_MD     = rffi.COpaquePtr('EVP_MD')
+
+EVP_get_digestbyname = external(
+    'EVP_get_digestbyname',
+    [rffi.CCHARP], EVP_MD)
+EVP_DigestInit = external(
+    'EVP_DigestInit',
+    [EVP_MD_CTX, EVP_MD], rffi.INT)
+EVP_DigestUpdate = external(
+    'EVP_DigestUpdate',
+    [EVP_MD_CTX, rffi.CCHARP, rffi.SIZE_T], rffi.INT)
+
+def _init_ssl():
+    libssl_SSL_load_error_strings()
+    libssl_SSL_library_init()
+



More information about the Pypy-commit mailing list