blob: 5cf39c0d9c7cd74660d4c4468f37fe98fb51c475 [file] [log] [blame]
Paul Kehrer55fb3412017-06-29 18:44:08 -05001import os
Maximilian Hils1d95dea2015-08-17 19:27:20 +02002import socket
Konstantinos Koukopoulos541150d2014-01-31 01:00:19 +02003from sys import platform
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -05004from functools import wraps, partial
Cory Benfieldbe3e7b82014-05-10 09:48:55 +01005from itertools import count, chain
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08006from weakref import WeakValueDictionary
7from errno import errorcode
Jean-Paul Calderone935d2da2013-03-04 08:11:19 -08008
Alex Gaynor10d30832017-06-29 15:31:39 -07009from cryptography.utils import deprecated
10
Alex Gaynor336d8022017-06-29 21:46:42 -070011from six import (
12 binary_type as _binary_type, integer_types as integer_types, int2byte,
13 indexbytes)
Jean-Paul Calderone63eab692014-01-18 10:19:56 -050014
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -050015from OpenSSL._util import (
Hynek Schlawackaa861212016-03-13 13:53:48 +010016 UNSPECIFIED as _UNSPECIFIED,
17 exception_from_error_queue as _exception_from_error_queue,
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -050018 ffi as _ffi,
19 lib as _lib,
Hynek Schlawackf90e3682016-03-11 11:21:13 +010020 make_assert as _make_assert,
Hynek Schlawackaa861212016-03-13 13:53:48 +010021 native as _native,
Jean-Paul Calderone55f9e882015-04-12 09:31:03 -040022 path_string as _path_string,
Hynek Schlawackaa861212016-03-13 13:53:48 +010023 text_to_bytes_and_warn as _text_to_bytes_and_warn,
Cory Benfielde62840e2016-11-28 12:17:08 +000024 no_zero_allocator as _no_zero_allocator,
Jean-Paul Calderone55f9e882015-04-12 09:31:03 -040025)
Jean-Paul Calderone935d2da2013-03-04 08:11:19 -080026
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -080027from OpenSSL.crypto import (
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -050028 FILETYPE_PEM, _PassphraseHelper, PKey, X509Name, X509, X509Store)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -080029
Nicolas Karolak736c6212017-11-26 14:40:28 +010030__all__ = [
31 'OPENSSL_VERSION_NUMBER',
32 'SSLEAY_VERSION',
33 'SSLEAY_CFLAGS',
34 'SSLEAY_PLATFORM',
35 'SSLEAY_DIR',
36 'SSLEAY_BUILT_ON',
37 'SENT_SHUTDOWN',
38 'RECEIVED_SHUTDOWN',
39 'SSLv2_METHOD',
40 'SSLv3_METHOD',
41 'SSLv23_METHOD',
42 'TLSv1_METHOD',
43 'TLSv1_1_METHOD',
44 'TLSv1_2_METHOD',
45 'OP_NO_SSLv2',
46 'OP_NO_SSLv3',
47 'OP_NO_TLSv1',
48 'OP_NO_TLSv1_1',
49 'OP_NO_TLSv1_2',
50 'MODE_RELEASE_BUFFERS',
51 'OP_SINGLE_DH_USE',
52 'OP_SINGLE_ECDH_USE',
53 'OP_EPHEMERAL_RSA',
54 'OP_MICROSOFT_SESS_ID_BUG',
55 'OP_NETSCAPE_CHALLENGE_BUG',
56 'OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG',
57 'OP_SSLREF2_REUSE_CERT_TYPE_BUG',
58 'OP_MICROSOFT_BIG_SSLV3_BUFFER',
59 'OP_MSIE_SSLV2_RSA_PADDING',
60 'OP_SSLEAY_080_CLIENT_DH_BUG',
61 'OP_TLS_D5_BUG',
62 'OP_TLS_BLOCK_PADDING_BUG',
63 'OP_DONT_INSERT_EMPTY_FRAGMENTS',
64 'OP_CIPHER_SERVER_PREFERENCE',
65 'OP_TLS_ROLLBACK_BUG',
66 'OP_PKCS1_CHECK_1',
67 'OP_PKCS1_CHECK_2',
68 'OP_NETSCAPE_CA_DN_BUG',
69 'OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG',
70 'OP_NO_COMPRESSION',
71 'OP_NO_QUERY_MTU',
72 'OP_COOKIE_EXCHANGE',
73 'OP_NO_TICKET',
74 'OP_ALL',
75 'VERIFY_PEER',
76 'VERIFY_FAIL_IF_NO_PEER_CERT',
77 'VERIFY_CLIENT_ONCE',
78 'VERIFY_NONE',
79 'SESS_CACHE_OFF',
80 'SESS_CACHE_CLIENT',
81 'SESS_CACHE_SERVER',
82 'SESS_CACHE_BOTH',
83 'SESS_CACHE_NO_AUTO_CLEAR',
84 'SESS_CACHE_NO_INTERNAL_LOOKUP',
85 'SESS_CACHE_NO_INTERNAL_STORE',
86 'SESS_CACHE_NO_INTERNAL',
87 'SSL_ST_CONNECT',
88 'SSL_ST_ACCEPT',
89 'SSL_ST_MASK',
Nicolas Karolak736c6212017-11-26 14:40:28 +010090 'SSL_CB_LOOP',
91 'SSL_CB_EXIT',
92 'SSL_CB_READ',
93 'SSL_CB_WRITE',
94 'SSL_CB_ALERT',
95 'SSL_CB_READ_ALERT',
96 'SSL_CB_WRITE_ALERT',
97 'SSL_CB_ACCEPT_LOOP',
98 'SSL_CB_ACCEPT_EXIT',
99 'SSL_CB_CONNECT_LOOP',
100 'SSL_CB_CONNECT_EXIT',
101 'SSL_CB_HANDSHAKE_START',
102 'SSL_CB_HANDSHAKE_DONE',
103 'Error',
104 'WantReadError',
105 'WantWriteError',
106 'WantX509LookupError',
107 'ZeroReturnError',
108 'SysCallError',
109 'SSLeay_version',
110 'Session',
111 'Context',
112 'Connection'
113]
114
Jean-Paul Calderone8fb53182013-12-30 08:35:49 -0500115try:
Markus Unterwaditzer8e41d022014-04-19 12:27:11 +0200116 _buffer = buffer
117except NameError:
118 class _buffer(object):
119 pass
120
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500121OPENSSL_VERSION_NUMBER = _lib.OPENSSL_VERSION_NUMBER
122SSLEAY_VERSION = _lib.SSLEAY_VERSION
123SSLEAY_CFLAGS = _lib.SSLEAY_CFLAGS
124SSLEAY_PLATFORM = _lib.SSLEAY_PLATFORM
125SSLEAY_DIR = _lib.SSLEAY_DIR
126SSLEAY_BUILT_ON = _lib.SSLEAY_BUILT_ON
Jean-Paul Calderone935d2da2013-03-04 08:11:19 -0800127
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500128SENT_SHUTDOWN = _lib.SSL_SENT_SHUTDOWN
129RECEIVED_SHUTDOWN = _lib.SSL_RECEIVED_SHUTDOWN
Jean-Paul Calderone935d2da2013-03-04 08:11:19 -0800130
131SSLv2_METHOD = 1
132SSLv3_METHOD = 2
133SSLv23_METHOD = 3
134TLSv1_METHOD = 4
Jean-Paul Calderone56bff942013-11-03 11:30:43 -0500135TLSv1_1_METHOD = 5
136TLSv1_2_METHOD = 6
Jean-Paul Calderone935d2da2013-03-04 08:11:19 -0800137
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500138OP_NO_SSLv2 = _lib.SSL_OP_NO_SSLv2
139OP_NO_SSLv3 = _lib.SSL_OP_NO_SSLv3
140OP_NO_TLSv1 = _lib.SSL_OP_NO_TLSv1
Alex Gaynor336d8022017-06-29 21:46:42 -0700141OP_NO_TLSv1_1 = _lib.SSL_OP_NO_TLSv1_1
142OP_NO_TLSv1_2 = _lib.SSL_OP_NO_TLSv1_2
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -0800143
Alex Gaynorbf012872016-06-04 13:18:39 -0700144MODE_RELEASE_BUFFERS = _lib.SSL_MODE_RELEASE_BUFFERS
Jean-Paul Calderone935d2da2013-03-04 08:11:19 -0800145
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500146OP_SINGLE_DH_USE = _lib.SSL_OP_SINGLE_DH_USE
Akihiro Yamazakie64d80c2015-09-06 00:16:57 +0900147OP_SINGLE_ECDH_USE = _lib.SSL_OP_SINGLE_ECDH_USE
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500148OP_EPHEMERAL_RSA = _lib.SSL_OP_EPHEMERAL_RSA
149OP_MICROSOFT_SESS_ID_BUG = _lib.SSL_OP_MICROSOFT_SESS_ID_BUG
150OP_NETSCAPE_CHALLENGE_BUG = _lib.SSL_OP_NETSCAPE_CHALLENGE_BUG
Alex Gaynor62da94d2015-09-05 14:37:34 -0400151OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG = (
152 _lib.SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG
153)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500154OP_SSLREF2_REUSE_CERT_TYPE_BUG = _lib.SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG
155OP_MICROSOFT_BIG_SSLV3_BUFFER = _lib.SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER
Alex Gaynor5bb2bd12016-07-03 10:48:32 -0400156OP_MSIE_SSLV2_RSA_PADDING = _lib.SSL_OP_MSIE_SSLV2_RSA_PADDING
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500157OP_SSLEAY_080_CLIENT_DH_BUG = _lib.SSL_OP_SSLEAY_080_CLIENT_DH_BUG
158OP_TLS_D5_BUG = _lib.SSL_OP_TLS_D5_BUG
159OP_TLS_BLOCK_PADDING_BUG = _lib.SSL_OP_TLS_BLOCK_PADDING_BUG
160OP_DONT_INSERT_EMPTY_FRAGMENTS = _lib.SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS
161OP_CIPHER_SERVER_PREFERENCE = _lib.SSL_OP_CIPHER_SERVER_PREFERENCE
162OP_TLS_ROLLBACK_BUG = _lib.SSL_OP_TLS_ROLLBACK_BUG
163OP_PKCS1_CHECK_1 = _lib.SSL_OP_PKCS1_CHECK_1
164OP_PKCS1_CHECK_2 = _lib.SSL_OP_PKCS1_CHECK_2
165OP_NETSCAPE_CA_DN_BUG = _lib.SSL_OP_NETSCAPE_CA_DN_BUG
Alex Gaynor62da94d2015-09-05 14:37:34 -0400166OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG = (
167 _lib.SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG
168)
Alex Gaynorbf012872016-06-04 13:18:39 -0700169OP_NO_COMPRESSION = _lib.SSL_OP_NO_COMPRESSION
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -0800170
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500171OP_NO_QUERY_MTU = _lib.SSL_OP_NO_QUERY_MTU
172OP_COOKIE_EXCHANGE = _lib.SSL_OP_COOKIE_EXCHANGE
Alex Gaynor5bb2bd12016-07-03 10:48:32 -0400173OP_NO_TICKET = _lib.SSL_OP_NO_TICKET
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -0800174
Alex Gaynorc4889812015-09-04 08:43:17 -0400175OP_ALL = _lib.SSL_OP_ALL
Jean-Paul Calderone935d2da2013-03-04 08:11:19 -0800176
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500177VERIFY_PEER = _lib.SSL_VERIFY_PEER
178VERIFY_FAIL_IF_NO_PEER_CERT = _lib.SSL_VERIFY_FAIL_IF_NO_PEER_CERT
179VERIFY_CLIENT_ONCE = _lib.SSL_VERIFY_CLIENT_ONCE
180VERIFY_NONE = _lib.SSL_VERIFY_NONE
Jean-Paul Calderone935d2da2013-03-04 08:11:19 -0800181
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500182SESS_CACHE_OFF = _lib.SSL_SESS_CACHE_OFF
183SESS_CACHE_CLIENT = _lib.SSL_SESS_CACHE_CLIENT
184SESS_CACHE_SERVER = _lib.SSL_SESS_CACHE_SERVER
185SESS_CACHE_BOTH = _lib.SSL_SESS_CACHE_BOTH
186SESS_CACHE_NO_AUTO_CLEAR = _lib.SSL_SESS_CACHE_NO_AUTO_CLEAR
187SESS_CACHE_NO_INTERNAL_LOOKUP = _lib.SSL_SESS_CACHE_NO_INTERNAL_LOOKUP
188SESS_CACHE_NO_INTERNAL_STORE = _lib.SSL_SESS_CACHE_NO_INTERNAL_STORE
189SESS_CACHE_NO_INTERNAL = _lib.SSL_SESS_CACHE_NO_INTERNAL
Jean-Paul Calderoned39a3f62013-03-04 12:23:51 -0800190
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500191SSL_ST_CONNECT = _lib.SSL_ST_CONNECT
192SSL_ST_ACCEPT = _lib.SSL_ST_ACCEPT
193SSL_ST_MASK = _lib.SSL_ST_MASK
Alex Gaynor5af32d02016-09-24 01:52:21 -0400194if _lib.Cryptography_HAS_SSL_ST:
195 SSL_ST_INIT = _lib.SSL_ST_INIT
196 SSL_ST_BEFORE = _lib.SSL_ST_BEFORE
197 SSL_ST_OK = _lib.SSL_ST_OK
198 SSL_ST_RENEGOTIATE = _lib.SSL_ST_RENEGOTIATE
Ondřej Nový993c4e42018-03-01 14:09:37 +0100199 __all__.extend([
200 'SSL_ST_INIT',
201 'SSL_ST_BEFORE',
202 'SSL_ST_OK',
203 'SSL_ST_RENEGOTIATE',
204 ])
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -0800205
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500206SSL_CB_LOOP = _lib.SSL_CB_LOOP
207SSL_CB_EXIT = _lib.SSL_CB_EXIT
208SSL_CB_READ = _lib.SSL_CB_READ
209SSL_CB_WRITE = _lib.SSL_CB_WRITE
210SSL_CB_ALERT = _lib.SSL_CB_ALERT
211SSL_CB_READ_ALERT = _lib.SSL_CB_READ_ALERT
212SSL_CB_WRITE_ALERT = _lib.SSL_CB_WRITE_ALERT
213SSL_CB_ACCEPT_LOOP = _lib.SSL_CB_ACCEPT_LOOP
214SSL_CB_ACCEPT_EXIT = _lib.SSL_CB_ACCEPT_EXIT
215SSL_CB_CONNECT_LOOP = _lib.SSL_CB_CONNECT_LOOP
216SSL_CB_CONNECT_EXIT = _lib.SSL_CB_CONNECT_EXIT
217SSL_CB_HANDSHAKE_START = _lib.SSL_CB_HANDSHAKE_START
218SSL_CB_HANDSHAKE_DONE = _lib.SSL_CB_HANDSHAKE_DONE
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -0800219
Paul Kehrer55fb3412017-06-29 18:44:08 -0500220# Taken from https://golang.org/src/crypto/x509/root_linux.go
221_CERTIFICATE_FILE_LOCATIONS = [
222 "/etc/ssl/certs/ca-certificates.crt", # Debian/Ubuntu/Gentoo etc.
223 "/etc/pki/tls/certs/ca-bundle.crt", # Fedora/RHEL 6
224 "/etc/ssl/ca-bundle.pem", # OpenSUSE
225 "/etc/pki/tls/cacert.pem", # OpenELEC
226 "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem", # CentOS/RHEL 7
227]
228
229_CERTIFICATE_PATH_LOCATIONS = [
230 "/etc/ssl/certs", # SLES10/SLES11
231]
232
Paul Kehrera92a1a72017-07-19 15:53:23 +0200233# These values are compared to output from cffi's ffi.string so they must be
234# byte strings.
235_CRYPTOGRAPHY_MANYLINUX1_CA_DIR = b"/opt/pyca/cryptography/openssl/certs"
236_CRYPTOGRAPHY_MANYLINUX1_CA_FILE = b"/opt/pyca/cryptography/openssl/cert.pem"
Paul Kehrer55fb3412017-06-29 18:44:08 -0500237
Alex Gaynor83284952015-09-05 10:43:30 -0400238
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500239class Error(Exception):
Jean-Paul Calderone511cde02013-12-29 10:31:13 -0500240 """
241 An error occurred in an `OpenSSL.SSL` API.
242 """
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500243
244
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500245_raise_current_error = partial(_exception_from_error_queue, Error)
Hynek Schlawackf90e3682016-03-11 11:21:13 +0100246_openssl_assert = _make_assert(Error)
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500247
248
249class WantReadError(Error):
250 pass
251
252
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500253class WantWriteError(Error):
254 pass
255
256
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500257class WantX509LookupError(Error):
258 pass
259
260
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500261class ZeroReturnError(Error):
262 pass
263
264
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500265class SysCallError(Error):
266 pass
267
268
Cory Benfield0ea76e72015-03-22 09:05:28 +0000269class _CallbackExceptionHelper(object):
270 """
271 A base class for wrapper classes that allow for intelligent exception
272 handling in OpenSSL callbacks.
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500273
Jean-Paul Calderone1b172982015-03-22 19:37:11 -0400274 :ivar list _problems: Any exceptions that occurred while executing in a
275 context where they could not be raised in the normal way. Typically
276 this is because OpenSSL has called into some Python code and requires a
277 return value. The exceptions are saved to be raised later when it is
278 possible to do so.
Cory Benfield0ea76e72015-03-22 09:05:28 +0000279 """
Alex Gaynor62da94d2015-09-05 14:37:34 -0400280
Jean-Paul Calderone09540d72015-03-22 19:37:20 -0400281 def __init__(self):
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800282 self._problems = []
283
Cory Benfield0ea76e72015-03-22 09:05:28 +0000284 def raise_if_problem(self):
Jean-Paul Calderone1b172982015-03-22 19:37:11 -0400285 """
286 Raise an exception from the OpenSSL error queue or that was previously
287 captured whe running a callback.
288 """
Cory Benfield0ea76e72015-03-22 09:05:28 +0000289 if self._problems:
290 try:
291 _raise_current_error()
292 except Error:
293 pass
294 raise self._problems.pop(0)
295
296
297class _VerifyHelper(_CallbackExceptionHelper):
Jean-Paul Calderone1b172982015-03-22 19:37:11 -0400298 """
299 Wrap a callback such that it can be used as a certificate verification
300 callback.
301 """
Alex Gaynor62da94d2015-09-05 14:37:34 -0400302
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800303 def __init__(self, callback):
Jean-Paul Calderone837f4032015-03-22 17:38:28 -0400304 _CallbackExceptionHelper.__init__(self)
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800305
306 @wraps(callback)
307 def wrapper(ok, store_ctx):
Paul Kehrere7381862017-11-30 20:55:25 +0800308 x509 = _lib.X509_STORE_CTX_get_current_cert(store_ctx)
309 _lib.X509_up_ref(x509)
310 cert = X509._from_raw_x509_ptr(x509)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500311 error_number = _lib.X509_STORE_CTX_get_error(store_ctx)
312 error_depth = _lib.X509_STORE_CTX_get_error_depth(store_ctx)
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800313
Jean-Paul Calderone6a8cd112014-04-02 21:09:08 -0400314 index = _lib.SSL_get_ex_data_X509_STORE_CTX_idx()
315 ssl = _lib.X509_STORE_CTX_get_ex_data(store_ctx, index)
316 connection = Connection._reverse_mapping[ssl]
317
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800318 try:
Alex Gaynor62da94d2015-09-05 14:37:34 -0400319 result = callback(
320 connection, cert, error_number, error_depth, ok
321 )
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800322 except Exception as e:
323 self._problems.append(e)
324 return 0
325 else:
326 if result:
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500327 _lib.X509_STORE_CTX_set_error(store_ctx, _lib.X509_V_OK)
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800328 return 1
329 else:
330 return 0
331
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500332 self.callback = _ffi.callback(
333 "int (*)(int, X509_STORE_CTX *)", wrapper)
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800334
335
Cory Benfield0ea76e72015-03-22 09:05:28 +0000336class _NpnAdvertiseHelper(_CallbackExceptionHelper):
Jean-Paul Calderone1b172982015-03-22 19:37:11 -0400337 """
338 Wrap a callback such that it can be used as an NPN advertisement callback.
339 """
Alex Gaynor62da94d2015-09-05 14:37:34 -0400340
Cory Benfield0ea76e72015-03-22 09:05:28 +0000341 def __init__(self, callback):
Jean-Paul Calderone837f4032015-03-22 17:38:28 -0400342 _CallbackExceptionHelper.__init__(self)
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800343
Cory Benfield0ea76e72015-03-22 09:05:28 +0000344 @wraps(callback)
345 def wrapper(ssl, out, outlen, arg):
346 try:
347 conn = Connection._reverse_mapping[ssl]
348 protos = callback(conn)
349
350 # Join the protocols into a Python bytestring, length-prefixing
351 # each element.
352 protostr = b''.join(
353 chain.from_iterable((int2byte(len(p)), p) for p in protos)
354 )
355
356 # Save our callback arguments on the connection object. This is
357 # done to make sure that they don't get freed before OpenSSL
358 # uses them. Then, return them appropriately in the output
359 # parameters.
360 conn._npn_advertise_callback_args = [
361 _ffi.new("unsigned int *", len(protostr)),
362 _ffi.new("unsigned char[]", protostr),
363 ]
364 outlen[0] = conn._npn_advertise_callback_args[0][0]
365 out[0] = conn._npn_advertise_callback_args[1]
366 return 0
367 except Exception as e:
368 self._problems.append(e)
369 return 2 # SSL_TLSEXT_ERR_ALERT_FATAL
370
371 self.callback = _ffi.callback(
372 "int (*)(SSL *, const unsigned char **, unsigned int *, void *)",
373 wrapper
374 )
375
376
377class _NpnSelectHelper(_CallbackExceptionHelper):
Jean-Paul Calderone1b172982015-03-22 19:37:11 -0400378 """
379 Wrap a callback such that it can be used as an NPN selection callback.
380 """
Alex Gaynor62da94d2015-09-05 14:37:34 -0400381
Cory Benfield0ea76e72015-03-22 09:05:28 +0000382 def __init__(self, callback):
Jean-Paul Calderone837f4032015-03-22 17:38:28 -0400383 _CallbackExceptionHelper.__init__(self)
Cory Benfield0ea76e72015-03-22 09:05:28 +0000384
385 @wraps(callback)
386 def wrapper(ssl, out, outlen, in_, inlen, arg):
387 try:
388 conn = Connection._reverse_mapping[ssl]
389
390 # The string passed to us is actually made up of multiple
391 # length-prefixed bytestrings. We need to split that into a
392 # list.
393 instr = _ffi.buffer(in_, inlen)[:]
394 protolist = []
395 while instr:
Alex Gaynorc3697ad2017-11-20 08:19:32 -0500396 length = indexbytes(instr, 0)
397 proto = instr[1:length + 1]
Cory Benfield0ea76e72015-03-22 09:05:28 +0000398 protolist.append(proto)
Alex Gaynorc3697ad2017-11-20 08:19:32 -0500399 instr = instr[length + 1:]
Cory Benfield0ea76e72015-03-22 09:05:28 +0000400
401 # Call the callback
402 outstr = callback(conn, protolist)
403
404 # Save our callback arguments on the connection object. This is
405 # done to make sure that they don't get freed before OpenSSL
406 # uses them. Then, return them appropriately in the output
407 # parameters.
408 conn._npn_select_callback_args = [
409 _ffi.new("unsigned char *", len(outstr)),
410 _ffi.new("unsigned char[]", outstr),
411 ]
412 outlen[0] = conn._npn_select_callback_args[0][0]
413 out[0] = conn._npn_select_callback_args[1]
414 return 0
415 except Exception as e:
416 self._problems.append(e)
417 return 2 # SSL_TLSEXT_ERR_ALERT_FATAL
418
419 self.callback = _ffi.callback(
Alex Gaynor62da94d2015-09-05 14:37:34 -0400420 ("int (*)(SSL *, unsigned char **, unsigned char *, "
421 "const unsigned char *, unsigned int, void *)"),
Cory Benfield0ea76e72015-03-22 09:05:28 +0000422 wrapper
423 )
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800424
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800425
Cory Benfield9da5ffb2015-04-13 17:20:14 -0400426class _ALPNSelectHelper(_CallbackExceptionHelper):
Cory Benfieldf1177e72015-04-12 09:11:49 -0400427 """
428 Wrap a callback such that it can be used as an ALPN selection callback.
429 """
Alex Gaynor62da94d2015-09-05 14:37:34 -0400430
Cory Benfieldf1177e72015-04-12 09:11:49 -0400431 def __init__(self, callback):
432 _CallbackExceptionHelper.__init__(self)
433
434 @wraps(callback)
435 def wrapper(ssl, out, outlen, in_, inlen, arg):
436 try:
437 conn = Connection._reverse_mapping[ssl]
438
439 # The string passed to us is made up of multiple
440 # length-prefixed bytestrings. We need to split that into a
441 # list.
442 instr = _ffi.buffer(in_, inlen)[:]
443 protolist = []
444 while instr:
Cory Benfield93134db2015-04-13 17:22:13 -0400445 encoded_len = indexbytes(instr, 0)
446 proto = instr[1:encoded_len + 1]
Cory Benfieldf1177e72015-04-12 09:11:49 -0400447 protolist.append(proto)
Cory Benfield93134db2015-04-13 17:22:13 -0400448 instr = instr[encoded_len + 1:]
Cory Benfieldf1177e72015-04-12 09:11:49 -0400449
450 # Call the callback
451 outstr = callback(conn, protolist)
452
453 if not isinstance(outstr, _binary_type):
454 raise TypeError("ALPN callback must return a bytestring.")
455
456 # Save our callback arguments on the connection object to make
457 # sure that they don't get freed before OpenSSL can use them.
458 # Then, return them in the appropriate output parameters.
459 conn._alpn_select_callback_args = [
460 _ffi.new("unsigned char *", len(outstr)),
461 _ffi.new("unsigned char[]", outstr),
462 ]
463 outlen[0] = conn._alpn_select_callback_args[0][0]
464 out[0] = conn._alpn_select_callback_args[1]
465 return 0
466 except Exception as e:
467 self._problems.append(e)
468 return 2 # SSL_TLSEXT_ERR_ALERT_FATAL
469
470 self.callback = _ffi.callback(
Alex Gaynor62da94d2015-09-05 14:37:34 -0400471 ("int (*)(SSL *, unsigned char **, unsigned char *, "
472 "const unsigned char *, unsigned int, void *)"),
Cory Benfieldf1177e72015-04-12 09:11:49 -0400473 wrapper
474 )
475
476
Cory Benfield496652a2017-01-24 11:42:56 +0000477class _OCSPServerCallbackHelper(_CallbackExceptionHelper):
478 """
479 Wrap a callback such that it can be used as an OCSP callback for the server
480 side.
481
482 Annoyingly, OpenSSL defines one OCSP callback but uses it in two different
483 ways. For servers, that callback is expected to retrieve some OCSP data and
484 hand it to OpenSSL, and may return only SSL_TLSEXT_ERR_OK,
485 SSL_TLSEXT_ERR_FATAL, and SSL_TLSEXT_ERR_NOACK. For clients, that callback
486 is expected to check the OCSP data, and returns a negative value on error,
487 0 if the response is not acceptable, or positive if it is. These are
488 mutually exclusive return code behaviours, and they mean that we need two
489 helpers so that we always return an appropriate error code if the user's
490 code throws an exception.
491
492 Given that we have to have two helpers anyway, these helpers are a bit more
493 helpery than most: specifically, they hide a few more of the OpenSSL
494 functions so that the user has an easier time writing these callbacks.
495
496 This helper implements the server side.
497 """
498
499 def __init__(self, callback):
500 _CallbackExceptionHelper.__init__(self)
501
502 @wraps(callback)
503 def wrapper(ssl, cdata):
504 try:
505 conn = Connection._reverse_mapping[ssl]
506
507 # Extract the data if any was provided.
508 if cdata != _ffi.NULL:
509 data = _ffi.from_handle(cdata)
510 else:
511 data = None
512
513 # Call the callback.
514 ocsp_data = callback(conn, data)
515
516 if not isinstance(ocsp_data, _binary_type):
517 raise TypeError("OCSP callback must return a bytestring.")
518
519 # If the OCSP data was provided, we will pass it to OpenSSL.
520 # However, we have an early exit here: if no OCSP data was
521 # provided we will just exit out and tell OpenSSL that there
522 # is nothing to do.
523 if not ocsp_data:
524 return 3 # SSL_TLSEXT_ERR_NOACK
525
David Benjamin7ac5f272018-05-21 21:24:04 -0400526 # OpenSSL takes ownership of this data and expects it to have
527 # been allocated by OPENSSL_malloc.
Cory Benfield496652a2017-01-24 11:42:56 +0000528 ocsp_data_length = len(ocsp_data)
529 data_ptr = _lib.OPENSSL_malloc(ocsp_data_length)
530 _ffi.buffer(data_ptr, ocsp_data_length)[:] = ocsp_data
531
532 _lib.SSL_set_tlsext_status_ocsp_resp(
533 ssl, data_ptr, ocsp_data_length
534 )
535
536 return 0
537 except Exception as e:
538 self._problems.append(e)
539 return 2 # SSL_TLSEXT_ERR_ALERT_FATAL
540
541 self.callback = _ffi.callback("int (*)(SSL *, void *)", wrapper)
542
543
544class _OCSPClientCallbackHelper(_CallbackExceptionHelper):
545 """
546 Wrap a callback such that it can be used as an OCSP callback for the client
547 side.
548
549 Annoyingly, OpenSSL defines one OCSP callback but uses it in two different
550 ways. For servers, that callback is expected to retrieve some OCSP data and
551 hand it to OpenSSL, and may return only SSL_TLSEXT_ERR_OK,
552 SSL_TLSEXT_ERR_FATAL, and SSL_TLSEXT_ERR_NOACK. For clients, that callback
553 is expected to check the OCSP data, and returns a negative value on error,
554 0 if the response is not acceptable, or positive if it is. These are
555 mutually exclusive return code behaviours, and they mean that we need two
556 helpers so that we always return an appropriate error code if the user's
557 code throws an exception.
558
559 Given that we have to have two helpers anyway, these helpers are a bit more
560 helpery than most: specifically, they hide a few more of the OpenSSL
561 functions so that the user has an easier time writing these callbacks.
562
563 This helper implements the client side.
564 """
565
566 def __init__(self, callback):
567 _CallbackExceptionHelper.__init__(self)
568
569 @wraps(callback)
570 def wrapper(ssl, cdata):
571 try:
572 conn = Connection._reverse_mapping[ssl]
573
574 # Extract the data if any was provided.
575 if cdata != _ffi.NULL:
576 data = _ffi.from_handle(cdata)
577 else:
578 data = None
579
580 # Get the OCSP data.
581 ocsp_ptr = _ffi.new("unsigned char **")
582 ocsp_len = _lib.SSL_get_tlsext_status_ocsp_resp(ssl, ocsp_ptr)
583 if ocsp_len < 0:
584 # No OCSP data.
585 ocsp_data = b''
586 else:
587 # Copy the OCSP data, then pass it to the callback.
588 ocsp_data = _ffi.buffer(ocsp_ptr[0], ocsp_len)[:]
589
590 valid = callback(conn, ocsp_data, data)
591
592 # Return 1 on success or 0 on error.
593 return int(bool(valid))
594
595 except Exception as e:
596 self._problems.append(e)
597 # Return negative value if an exception is hit.
598 return -1
599
600 self.callback = _ffi.callback("int (*)(SSL *, void *)", wrapper)
601
602
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800603def _asFileDescriptor(obj):
604 fd = None
Konstantinos Koukopoulosc8b13ea2014-01-28 00:21:50 -0800605 if not isinstance(obj, integer_types):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800606 meth = getattr(obj, "fileno", None)
607 if meth is not None:
608 obj = meth()
609
Konstantinos Koukopoulosc8b13ea2014-01-28 00:21:50 -0800610 if isinstance(obj, integer_types):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800611 fd = obj
612
Konstantinos Koukopoulosc8b13ea2014-01-28 00:21:50 -0800613 if not isinstance(fd, integer_types):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800614 raise TypeError("argument must be an int, or have a fileno() method.")
615 elif fd < 0:
616 raise ValueError(
617 "file descriptor cannot be a negative integer (%i)" % (fd,))
618
619 return fd
620
621
Jean-Paul Calderoned39a3f62013-03-04 12:23:51 -0800622def SSLeay_version(type):
623 """
624 Return a string describing the version of OpenSSL in use.
625
Alex Chand072cae2018-02-15 09:57:59 +0000626 :param type: One of the :const:`SSLEAY_` constants defined in this module.
Jean-Paul Calderoned39a3f62013-03-04 12:23:51 -0800627 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500628 return _ffi.string(_lib.SSLeay_version(type))
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800629
630
Cory Benfieldef404df2016-03-29 15:32:48 +0100631def _make_requires(flag, error):
Cory Benfielda876cef2015-04-13 17:29:12 -0400632 """
Cory Benfieldef404df2016-03-29 15:32:48 +0100633 Builds a decorator that ensures that functions that rely on OpenSSL
634 functions that are not present in this build raise NotImplementedError,
635 rather than AttributeError coming out of cryptography.
636
637 :param flag: A cryptography flag that guards the functions, e.g.
638 ``Cryptography_HAS_NEXTPROTONEG``.
639 :param error: The string to be used in the exception if the flag is false.
Cory Benfielda876cef2015-04-13 17:29:12 -0400640 """
Cory Benfieldef404df2016-03-29 15:32:48 +0100641 def _requires_decorator(func):
642 if not flag:
643 @wraps(func)
644 def explode(*args, **kwargs):
645 raise NotImplementedError(error)
646 return explode
647 else:
648 return func
Cory Benfield10b277f2015-04-13 17:12:42 -0400649
Cory Benfieldef404df2016-03-29 15:32:48 +0100650 return _requires_decorator
Cory Benfield10b277f2015-04-13 17:12:42 -0400651
652
Cory Benfieldef404df2016-03-29 15:32:48 +0100653_requires_npn = _make_requires(
654 _lib.Cryptography_HAS_NEXTPROTONEG, "NPN not available"
655)
Cory Benfield7907e332015-04-13 17:18:25 -0400656
657
Cory Benfieldef404df2016-03-29 15:32:48 +0100658_requires_alpn = _make_requires(
659 _lib.Cryptography_HAS_ALPN, "ALPN not available"
660)
Cory Benfielde6f35882016-03-29 11:21:04 +0100661
Cory Benfielde6f35882016-03-29 11:21:04 +0100662
Cory Benfieldef404df2016-03-29 15:32:48 +0100663_requires_sni = _make_requires(
664 _lib.Cryptography_HAS_TLSEXT_HOSTNAME, "SNI not available"
665)
Cory Benfielde6f35882016-03-29 11:21:04 +0100666
667
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -0800668class Session(object):
Alex Chand072cae2018-02-15 09:57:59 +0000669 """
670 A class representing an SSL session. A session defines certain connection
671 parameters which may be re-used to speed up the setup of subsequent
672 connections.
673
674 .. versionadded:: 0.14
675 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -0800676 pass
677
678
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800679class Context(object):
680 """
Hynek Schlawackf90e3682016-03-11 11:21:13 +0100681 :class:`OpenSSL.SSL.Context` instances define the parameters for setting
Alex Gaynor62da94d2015-09-05 14:37:34 -0400682 up new SSL connections.
Alex Chand072cae2018-02-15 09:57:59 +0000683
684 :param method: One of SSLv2_METHOD, SSLv3_METHOD, SSLv23_METHOD, or
685 TLSv1_METHOD.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800686 """
687 _methods = {
Andrew Dunhamec84a0a2014-02-24 12:41:37 -0800688 SSLv2_METHOD: "SSLv2_method",
Jean-Paul Calderonebe2bb422013-12-29 07:34:08 -0500689 SSLv3_METHOD: "SSLv3_method",
690 SSLv23_METHOD: "SSLv23_method",
691 TLSv1_METHOD: "TLSv1_method",
692 TLSv1_1_METHOD: "TLSv1_1_method",
693 TLSv1_2_METHOD: "TLSv1_2_method",
Alex Gaynorc4889812015-09-04 08:43:17 -0400694 }
Jean-Paul Calderonebe2bb422013-12-29 07:34:08 -0500695 _methods = dict(
696 (identifier, getattr(_lib, name))
697 for (identifier, name) in _methods.items()
698 if getattr(_lib, name, None) is not None)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800699
700 def __init__(self, method):
Jean-Paul Calderonef73a3cb2014-02-09 08:49:06 -0500701 if not isinstance(method, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800702 raise TypeError("method must be an integer")
703
704 try:
705 method_func = self._methods[method]
706 except KeyError:
707 raise ValueError("No such protocol")
708
709 method_obj = method_func()
Alex Gaynora829e902016-06-04 18:16:01 -0700710 _openssl_assert(method_obj != _ffi.NULL)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800711
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500712 context = _lib.SSL_CTX_new(method_obj)
Alex Gaynora829e902016-06-04 18:16:01 -0700713 _openssl_assert(context != _ffi.NULL)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500714 context = _ffi.gc(context, _lib.SSL_CTX_free)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800715
Paul Kehrer6c6bf862016-12-19 06:03:48 -0600716 # If SSL_CTX_set_ecdh_auto is available then set it so the ECDH curve
717 # will be auto-selected. This function was added in 1.0.2 and made a
718 # noop in 1.1.0+ (where it is set automatically).
719 try:
720 res = _lib.SSL_CTX_set_ecdh_auto(context, 1)
721 _openssl_assert(res == 1)
722 except AttributeError:
723 pass
724
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800725 self._context = context
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800726 self._passphrase_helper = None
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800727 self._passphrase_callback = None
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800728 self._passphrase_userdata = None
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800729 self._verify_helper = None
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800730 self._verify_callback = None
731 self._info_callback = None
732 self._tlsext_servername_callback = None
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800733 self._app_data = None
Cory Benfield0ea76e72015-03-22 09:05:28 +0000734 self._npn_advertise_helper = None
Cory Benfield84a121e2014-03-31 20:30:25 +0100735 self._npn_advertise_callback = None
Cory Benfield0ea76e72015-03-22 09:05:28 +0000736 self._npn_select_helper = None
Cory Benfield84a121e2014-03-31 20:30:25 +0100737 self._npn_select_callback = None
Cory Benfieldf1177e72015-04-12 09:11:49 -0400738 self._alpn_select_helper = None
Cory Benfield12eae892014-06-07 15:42:56 +0100739 self._alpn_select_callback = None
Cory Benfield496652a2017-01-24 11:42:56 +0000740 self._ocsp_helper = None
741 self._ocsp_callback = None
742 self._ocsp_data = None
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800743
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500744 self.set_mode(_lib.SSL_MODE_ENABLE_PARTIAL_WRITE)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800745
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800746 def load_verify_locations(self, cafile, capath=None):
747 """
748 Let SSL know where we can find trusted certificates for the certificate
Alex Chand072cae2018-02-15 09:57:59 +0000749 chain. Note that the certificates have to be in PEM format.
750
751 If capath is passed, it must be a directory prepared using the
752 ``c_rehash`` tool included with OpenSSL. Either, but not both, of
753 *pemfile* or *capath* may be :data:`None`.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800754
Jean-Paul Calderone55f9e882015-04-12 09:31:03 -0400755 :param cafile: In which file we can find the certificates (``bytes`` or
756 ``unicode``).
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800757 :param capath: In which directory we can find the certificates
Jean-Paul Calderone55f9e882015-04-12 09:31:03 -0400758 (``bytes`` or ``unicode``).
759
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800760 :return: None
761 """
762 if cafile is None:
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500763 cafile = _ffi.NULL
Jean-Paul Calderone55f9e882015-04-12 09:31:03 -0400764 else:
765 cafile = _path_string(cafile)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800766
767 if capath is None:
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500768 capath = _ffi.NULL
Jean-Paul Calderone55f9e882015-04-12 09:31:03 -0400769 else:
770 capath = _path_string(capath)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800771
Alex Gaynor62da94d2015-09-05 14:37:34 -0400772 load_result = _lib.SSL_CTX_load_verify_locations(
773 self._context, cafile, capath
774 )
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800775 if not load_result:
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500776 _raise_current_error()
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800777
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800778 def _wrap_callback(self, callback):
779 @wraps(callback)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800780 def wrapper(size, verify, userdata):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800781 return callback(size, verify, self._passphrase_userdata)
782 return _PassphraseHelper(
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800783 FILETYPE_PEM, wrapper, more_args=True, truncate=True)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800784
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800785 def set_passwd_cb(self, callback, userdata=None):
786 """
Alex Chand072cae2018-02-15 09:57:59 +0000787 Set the passphrase callback. This function will be called
788 when a private key with a passphrase is loaded.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800789
Alex Chand072cae2018-02-15 09:57:59 +0000790 :param callback: The Python callback to use. This must accept three
791 positional arguments. First, an integer giving the maximum length
792 of the passphrase it may return. If the returned passphrase is
793 longer than this, it will be truncated. Second, a boolean value
794 which will be true if the user should be prompted for the
795 passphrase twice and the callback should verify that the two values
796 supplied are equal. Third, the value given as the *userdata*
797 parameter to :meth:`set_passwd_cb`. The *callback* must return
798 a byte string. If an error occurs, *callback* should return a false
799 value (e.g. an empty string).
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800800 :param userdata: (optional) A Python object which will be given as
801 argument to the callback
802 :return: None
803 """
804 if not callable(callback):
805 raise TypeError("callback must be callable")
806
807 self._passphrase_helper = self._wrap_callback(callback)
808 self._passphrase_callback = self._passphrase_helper.callback
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500809 _lib.SSL_CTX_set_default_passwd_cb(
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800810 self._context, self._passphrase_callback)
811 self._passphrase_userdata = userdata
812
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800813 def set_default_verify_paths(self):
814 """
Alex Chand072cae2018-02-15 09:57:59 +0000815 Specify that the platform provided CA certificates are to be used for
816 verification purposes. This method has some caveats related to the
817 binary wheels that cryptography (pyOpenSSL's primary dependency) ships:
818
819 * macOS will only load certificates using this method if the user has
820 the ``openssl@1.1`` `Homebrew <https://brew.sh>`_ formula installed
821 in the default location.
822 * Windows will not work.
823 * manylinux1 cryptography wheels will work on most common Linux
824 distributions in pyOpenSSL 17.1.0 and above. pyOpenSSL detects the
825 manylinux1 wheel and attempts to load roots via a fallback path.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800826
827 :return: None
828 """
Paul Kehrer55fb3412017-06-29 18:44:08 -0500829 # SSL_CTX_set_default_verify_paths will attempt to load certs from
830 # both a cafile and capath that are set at compile time. However,
831 # it will first check environment variables and, if present, load
832 # those paths instead
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500833 set_result = _lib.SSL_CTX_set_default_verify_paths(self._context)
Alex Gaynor09f19f52016-07-03 09:54:09 -0400834 _openssl_assert(set_result == 1)
Paul Kehrer55fb3412017-06-29 18:44:08 -0500835 # After attempting to set default_verify_paths we need to know whether
836 # to go down the fallback path.
837 # First we'll check to see if any env vars have been set. If so,
838 # we won't try to do anything else because the user has set the path
839 # themselves.
840 dir_env_var = _ffi.string(
841 _lib.X509_get_default_cert_dir_env()
842 ).decode("ascii")
843 file_env_var = _ffi.string(
844 _lib.X509_get_default_cert_file_env()
845 ).decode("ascii")
846 if not self._check_env_vars_set(dir_env_var, file_env_var):
847 default_dir = _ffi.string(_lib.X509_get_default_cert_dir())
848 default_file = _ffi.string(_lib.X509_get_default_cert_file())
849 # Now we check to see if the default_dir and default_file are set
850 # to the exact values we use in our manylinux1 builds. If they are
851 # then we know to load the fallbacks
852 if (
853 default_dir == _CRYPTOGRAPHY_MANYLINUX1_CA_DIR and
854 default_file == _CRYPTOGRAPHY_MANYLINUX1_CA_FILE
855 ):
856 # This is manylinux1, let's load our fallback paths
857 self._fallback_default_verify_paths(
858 _CERTIFICATE_FILE_LOCATIONS,
859 _CERTIFICATE_PATH_LOCATIONS
860 )
861
862 def _check_env_vars_set(self, dir_env_var, file_env_var):
863 """
864 Check to see if the default cert dir/file environment vars are present.
865
866 :return: bool
867 """
868 return (
869 os.environ.get(file_env_var) is not None or
870 os.environ.get(dir_env_var) is not None
871 )
872
873 def _fallback_default_verify_paths(self, file_path, dir_path):
874 """
875 Default verify paths are based on the compiled version of OpenSSL.
876 However, when pyca/cryptography is compiled as a manylinux1 wheel
877 that compiled location can potentially be wrong. So, like Go, we
878 will try a predefined set of paths and attempt to load roots
879 from there.
880
881 :return: None
882 """
883 for cafile in file_path:
884 if os.path.isfile(cafile):
885 self.load_verify_locations(cafile)
886 break
887
888 for capath in dir_path:
889 if os.path.isdir(capath):
890 self.load_verify_locations(None, capath)
891 break
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800892
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800893 def use_certificate_chain_file(self, certfile):
894 """
Alex Chand072cae2018-02-15 09:57:59 +0000895 Load a certificate chain from a file.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800896
Jean-Paul Calderoneb6f8a792015-04-13 10:10:06 -0400897 :param certfile: The name of the certificate chain file (``bytes`` or
Alex Chand072cae2018-02-15 09:57:59 +0000898 ``unicode``). Must be PEM encoded.
Jean-Paul Calderoneb6f8a792015-04-13 10:10:06 -0400899
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800900 :return: None
901 """
Jean-Paul Calderoneaac43a32015-04-12 09:51:21 -0400902 certfile = _path_string(certfile)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800903
Alex Gaynor62da94d2015-09-05 14:37:34 -0400904 result = _lib.SSL_CTX_use_certificate_chain_file(
905 self._context, certfile
906 )
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800907 if not result:
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500908 _raise_current_error()
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800909
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800910 def use_certificate_file(self, certfile, filetype=FILETYPE_PEM):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800911 """
912 Load a certificate from a file
913
Jean-Paul Calderoneb6f8a792015-04-13 10:10:06 -0400914 :param certfile: The name of the certificate file (``bytes`` or
915 ``unicode``).
Alex Chand072cae2018-02-15 09:57:59 +0000916 :param filetype: (optional) The encoding of the file, which is either
917 :const:`FILETYPE_PEM` or :const:`FILETYPE_ASN1`. The default is
918 :const:`FILETYPE_PEM`.
Jean-Paul Calderoneb6f8a792015-04-13 10:10:06 -0400919
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800920 :return: None
921 """
Jean-Paul Calderoned57a7b62015-04-12 09:57:36 -0400922 certfile = _path_string(certfile)
Jean-Paul Calderonef73a3cb2014-02-09 08:49:06 -0500923 if not isinstance(filetype, integer_types):
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800924 raise TypeError("filetype must be an integer")
925
Alex Gaynor62da94d2015-09-05 14:37:34 -0400926 use_result = _lib.SSL_CTX_use_certificate_file(
927 self._context, certfile, filetype
928 )
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800929 if not use_result:
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500930 _raise_current_error()
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800931
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800932 def use_certificate(self, cert):
933 """
934 Load a certificate from a X509 object
935
936 :param cert: The X509 object
937 :return: None
938 """
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800939 if not isinstance(cert, X509):
940 raise TypeError("cert must be an X509 instance")
941
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500942 use_result = _lib.SSL_CTX_use_certificate(self._context, cert._x509)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800943 if not use_result:
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500944 _raise_current_error()
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800945
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800946 def add_extra_chain_cert(self, certobj):
947 """
948 Add certificate to chain
949
950 :param certobj: The X509 certificate object to add to the chain
951 :return: None
952 """
953 if not isinstance(certobj, X509):
954 raise TypeError("certobj must be an X509 instance")
955
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500956 copy = _lib.X509_dup(certobj._x509)
957 add_result = _lib.SSL_CTX_add_extra_chain_cert(self._context, copy)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800958 if not add_result:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -0500959 # TODO: This is untested.
960 _lib.X509_free(copy)
961 _raise_current_error()
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800962
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800963 def _raise_passphrase_exception(self):
Greg Bowser36eb2de2017-01-24 11:38:55 -0500964 if self._passphrase_helper is not None:
965 self._passphrase_helper.raise_if_problem(Error)
966
967 _raise_current_error()
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800968
Jean-Paul Calderone00f84eb2015-04-13 12:47:21 -0400969 def use_privatekey_file(self, keyfile, filetype=_UNSPECIFIED):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800970 """
971 Load a private key from a file
972
Jean-Paul Calderoneb6f8a792015-04-13 10:10:06 -0400973 :param keyfile: The name of the key file (``bytes`` or ``unicode``)
Alex Chand072cae2018-02-15 09:57:59 +0000974 :param filetype: (optional) The encoding of the file, which is either
975 :const:`FILETYPE_PEM` or :const:`FILETYPE_ASN1`. The default is
976 :const:`FILETYPE_PEM`.
Jean-Paul Calderoneb6f8a792015-04-13 10:10:06 -0400977
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800978 :return: None
979 """
Jean-Paul Calderone69a4e5b2015-04-12 10:04:28 -0400980 keyfile = _path_string(keyfile)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800981
Jean-Paul Calderone00f84eb2015-04-13 12:47:21 -0400982 if filetype is _UNSPECIFIED:
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800983 filetype = FILETYPE_PEM
Jean-Paul Calderonef73a3cb2014-02-09 08:49:06 -0500984 elif not isinstance(filetype, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800985 raise TypeError("filetype must be an integer")
986
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500987 use_result = _lib.SSL_CTX_use_PrivateKey_file(
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800988 self._context, keyfile, filetype)
989 if not use_result:
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800990 self._raise_passphrase_exception()
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800991
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800992 def use_privatekey(self, pkey):
993 """
994 Load a private key from a PKey object
995
996 :param pkey: The PKey object
997 :return: None
998 """
999 if not isinstance(pkey, PKey):
1000 raise TypeError("pkey must be a PKey instance")
1001
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001002 use_result = _lib.SSL_CTX_use_PrivateKey(self._context, pkey._pkey)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001003 if not use_result:
Jean-Paul Calderone173cff92013-03-06 10:29:21 -08001004 self._raise_passphrase_exception()
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001005
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001006 def check_privatekey(self):
1007 """
Alex Chand072cae2018-02-15 09:57:59 +00001008 Check if the private key (loaded with :meth:`use_privatekey`) matches
1009 the certificate (loaded with :meth:`use_certificate`)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001010
Alex Chand072cae2018-02-15 09:57:59 +00001011 :return: :data:`None` (raises :exc:`Error` if something's wrong)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001012 """
Jean-Paul Calderonea0344922014-12-11 14:02:31 -05001013 if not _lib.SSL_CTX_check_private_key(self._context):
1014 _raise_current_error()
1015
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001016 def load_client_ca(self, cafile):
1017 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001018 Load the trusted certificates that will be sent to the client. Does
1019 not actually imply any of the certificates are trusted; that must be
Alex Gaynor62da94d2015-09-05 14:37:34 -04001020 configured separately.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001021
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001022 :param bytes cafile: The path to a certificates file in PEM format.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001023 :return: None
1024 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001025 ca_list = _lib.SSL_load_client_CA_file(
1026 _text_to_bytes_and_warn("cafile", cafile)
1027 )
1028 _openssl_assert(ca_list != _ffi.NULL)
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001029 _lib.SSL_CTX_set_client_CA_list(self._context, ca_list)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001030
1031 def set_session_id(self, buf):
1032 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001033 Set the session id to *buf* within which a session can be reused for
1034 this Context object. This is needed when doing session resumption,
1035 because there is no way for a stored session to know which Context
1036 object it is associated with.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001037
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001038 :param bytes buf: The session id.
1039
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001040 :returns: None
1041 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001042 buf = _text_to_bytes_and_warn("buf", buf)
1043 _openssl_assert(
1044 _lib.SSL_CTX_set_session_id_context(
1045 self._context,
1046 buf,
1047 len(buf),
1048 ) == 1
1049 )
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001050
1051 def set_session_cache_mode(self, mode):
1052 """
Alex Chand072cae2018-02-15 09:57:59 +00001053 Set the behavior of the session cache used by all connections using
1054 this Context. The previously set mode is returned. See
1055 :const:`SESS_CACHE_*` for details about particular modes.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001056
1057 :param mode: One or more of the SESS_CACHE_* flags (combine using
1058 bitwise or)
1059 :returns: The previously set caching mode.
Alex Chand072cae2018-02-15 09:57:59 +00001060
1061 .. versionadded:: 0.14
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001062 """
Jean-Paul Calderonebef4f4c2014-02-02 18:13:31 -05001063 if not isinstance(mode, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001064 raise TypeError("mode must be an integer")
1065
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001066 return _lib.SSL_CTX_set_session_cache_mode(self._context, mode)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001067
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001068 def get_session_cache_mode(self):
1069 """
Alex Chand072cae2018-02-15 09:57:59 +00001070 Get the current session cache mode.
1071
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001072 :returns: The currently used cache mode.
Alex Chand072cae2018-02-15 09:57:59 +00001073
1074 .. versionadded:: 0.14
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001075 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001076 return _lib.SSL_CTX_get_session_cache_mode(self._context)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001077
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001078 def set_verify(self, mode, callback):
1079 """
Alex Chand072cae2018-02-15 09:57:59 +00001080 et the verification flags for this Context object to *mode* and specify
1081 that *callback* should be used for verification callbacks.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001082
Alex Chand072cae2018-02-15 09:57:59 +00001083 :param mode: The verify mode, this should be one of
1084 :const:`VERIFY_NONE` and :const:`VERIFY_PEER`. If
1085 :const:`VERIFY_PEER` is used, *mode* can be OR:ed with
1086 :const:`VERIFY_FAIL_IF_NO_PEER_CERT` and
1087 :const:`VERIFY_CLIENT_ONCE` to further control the behaviour.
1088 :param callback: The Python callback to use. This should take five
1089 arguments: A Connection object, an X509 object, and three integer
1090 variables, which are in turn potential error number, error depth
1091 and return code. *callback* should return True if verification
1092 passes and False otherwise.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001093 :return: None
1094
1095 See SSL_CTX_set_verify(3SSL) for further details.
1096 """
Jean-Paul Calderonebef4f4c2014-02-02 18:13:31 -05001097 if not isinstance(mode, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001098 raise TypeError("mode must be an integer")
1099
1100 if not callable(callback):
1101 raise TypeError("callback must be callable")
1102
Jean-Paul Calderone6a8cd112014-04-02 21:09:08 -04001103 self._verify_helper = _VerifyHelper(callback)
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -08001104 self._verify_callback = self._verify_helper.callback
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001105 _lib.SSL_CTX_set_verify(self._context, mode, self._verify_callback)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001106
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001107 def set_verify_depth(self, depth):
1108 """
Alex Chand072cae2018-02-15 09:57:59 +00001109 Set the maximum depth for the certificate chain verification that shall
1110 be allowed for this Context object.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001111
1112 :param depth: An integer specifying the verify depth
1113 :return: None
1114 """
Jean-Paul Calderonebef4f4c2014-02-02 18:13:31 -05001115 if not isinstance(depth, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001116 raise TypeError("depth must be an integer")
1117
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001118 _lib.SSL_CTX_set_verify_depth(self._context, depth)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001119
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001120 def get_verify_mode(self):
1121 """
Alex Chand072cae2018-02-15 09:57:59 +00001122 Retrieve the Context object's verify mode, as set by
1123 :meth:`set_verify`.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001124
1125 :return: The verify mode
1126 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001127 return _lib.SSL_CTX_get_verify_mode(self._context)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001128
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001129 def get_verify_depth(self):
1130 """
Alex Chand072cae2018-02-15 09:57:59 +00001131 Retrieve the Context object's verify depth, as set by
1132 :meth:`set_verify_depth`.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001133
1134 :return: The verify depth
1135 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001136 return _lib.SSL_CTX_get_verify_depth(self._context)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001137
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001138 def load_tmp_dh(self, dhfile):
1139 """
1140 Load parameters for Ephemeral Diffie-Hellman
1141
Jean-Paul Calderone4e0c43f2015-04-13 10:15:17 -04001142 :param dhfile: The file to load EDH parameters from (``bytes`` or
1143 ``unicode``).
1144
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001145 :return: None
1146 """
Jean-Paul Calderone9e1c1dd2015-04-12 10:13:13 -04001147 dhfile = _path_string(dhfile)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001148
Jean-Paul Calderone4f0467a2014-01-11 11:58:41 -05001149 bio = _lib.BIO_new_file(dhfile, b"r")
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001150 if bio == _ffi.NULL:
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -05001151 _raise_current_error()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001152 bio = _ffi.gc(bio, _lib.BIO_free)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001153
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001154 dh = _lib.PEM_read_bio_DHparams(bio, _ffi.NULL, _ffi.NULL, _ffi.NULL)
1155 dh = _ffi.gc(dh, _lib.DH_free)
1156 _lib.SSL_CTX_set_tmp_dh(self._context, dh)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001157
Jean-Paul Calderone3e4e3352014-04-19 09:28:28 -04001158 def set_tmp_ecdh(self, curve):
Alex Gaynor7b8d57a2014-01-17 12:08:54 -06001159 """
Andy Lutomirski76a61332014-03-12 15:02:56 -07001160 Select a curve to use for ECDHE key exchange.
Alex Gaynor7b8d57a2014-01-17 12:08:54 -06001161
Jean-Paul Calderonec09fd582014-04-18 22:00:10 -04001162 :param curve: A curve object to use as returned by either
Alex Chand072cae2018-02-15 09:57:59 +00001163 :meth:`OpenSSL.crypto.get_elliptic_curve` or
1164 :meth:`OpenSSL.crypto.get_elliptic_curves`.
Andy Lutomirskif05a2732014-03-13 17:22:25 -07001165
Alex Gaynor7b8d57a2014-01-17 12:08:54 -06001166 :return: None
1167 """
Jean-Paul Calderonec09fd582014-04-18 22:00:10 -04001168 _lib.SSL_CTX_set_tmp_ecdh(self._context, curve._to_EC_KEY())
Alex Gaynor7b8d57a2014-01-17 12:08:54 -06001169
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001170 def set_cipher_list(self, cipher_list):
1171 """
Hynek Schlawackf90e3682016-03-11 11:21:13 +01001172 Set the list of ciphers to be used in this context.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001173
Hynek Schlawackf90e3682016-03-11 11:21:13 +01001174 See the OpenSSL manual for more information (e.g.
1175 :manpage:`ciphers(1)`).
1176
1177 :param bytes cipher_list: An OpenSSL cipher string.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001178 :return: None
1179 """
Hynek Schlawackf90e3682016-03-11 11:21:13 +01001180 cipher_list = _text_to_bytes_and_warn("cipher_list", cipher_list)
Jean-Paul Calderone63eab692014-01-18 10:19:56 -05001181
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001182 if not isinstance(cipher_list, bytes):
Hynek Schlawacka7a63af2016-03-11 12:05:26 +01001183 raise TypeError("cipher_list must be a byte string.")
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001184
Hynek Schlawackf90e3682016-03-11 11:21:13 +01001185 _openssl_assert(
Hynek Schlawack22a4b662016-03-11 14:59:39 +01001186 _lib.SSL_CTX_set_cipher_list(self._context, cipher_list) == 1
Hynek Schlawackf90e3682016-03-11 11:21:13 +01001187 )
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001188
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001189 def set_client_ca_list(self, certificate_authorities):
1190 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04001191 Set the list of preferred client certificate signers for this server
1192 context.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001193
Alex Gaynor62da94d2015-09-05 14:37:34 -04001194 This list of certificate authorities will be sent to the client when
1195 the server requests a client certificate.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001196
1197 :param certificate_authorities: a sequence of X509Names.
1198 :return: None
Alex Chand072cae2018-02-15 09:57:59 +00001199
1200 .. versionadded:: 0.10
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001201 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001202 name_stack = _lib.sk_X509_NAME_new_null()
Alex Gaynora829e902016-06-04 18:16:01 -07001203 _openssl_assert(name_stack != _ffi.NULL)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001204
1205 try:
1206 for ca_name in certificate_authorities:
1207 if not isinstance(ca_name, X509Name):
1208 raise TypeError(
Alex Gaynor62da94d2015-09-05 14:37:34 -04001209 "client CAs must be X509Name objects, not %s "
1210 "objects" % (
1211 type(ca_name).__name__,
1212 )
1213 )
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001214 copy = _lib.X509_NAME_dup(ca_name._name)
Alex Gaynora829e902016-06-04 18:16:01 -07001215 _openssl_assert(copy != _ffi.NULL)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001216 push_result = _lib.sk_X509_NAME_push(name_stack, copy)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001217 if not push_result:
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001218 _lib.X509_NAME_free(copy)
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -05001219 _raise_current_error()
Alex Gaynorc3697ad2017-11-20 08:19:32 -05001220 except Exception:
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001221 _lib.sk_X509_NAME_free(name_stack)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001222 raise
1223
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001224 _lib.SSL_CTX_set_client_CA_list(self._context, name_stack)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001225
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001226 def add_client_ca(self, certificate_authority):
1227 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04001228 Add the CA certificate to the list of preferred signers for this
1229 context.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001230
1231 The list of certificate authorities will be sent to the client when the
1232 server requests a client certificate.
1233
1234 :param certificate_authority: certificate authority's X509 certificate.
1235 :return: None
Alex Chand072cae2018-02-15 09:57:59 +00001236
1237 .. versionadded:: 0.10
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001238 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001239 if not isinstance(certificate_authority, X509):
1240 raise TypeError("certificate_authority must be an X509 instance")
1241
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001242 add_result = _lib.SSL_CTX_add_client_CA(
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001243 self._context, certificate_authority._x509)
Alex Gaynor09f19f52016-07-03 09:54:09 -04001244 _openssl_assert(add_result == 1)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001245
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001246 def set_timeout(self, timeout):
1247 """
Alex Chand072cae2018-02-15 09:57:59 +00001248 Set the timeout for newly created sessions for this Context object to
1249 *timeout*. The default value is 300 seconds. See the OpenSSL manual
1250 for more information (e.g. :manpage:`SSL_CTX_set_timeout(3)`).
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001251
Alex Chand072cae2018-02-15 09:57:59 +00001252 :param timeout: The timeout in (whole) seconds
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001253 :return: The previous session timeout
1254 """
Jean-Paul Calderonebef4f4c2014-02-02 18:13:31 -05001255 if not isinstance(timeout, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001256 raise TypeError("timeout must be an integer")
1257
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001258 return _lib.SSL_CTX_set_timeout(self._context, timeout)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001259
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001260 def get_timeout(self):
1261 """
Alex Chand072cae2018-02-15 09:57:59 +00001262 Retrieve session timeout, as set by :meth:`set_timeout`. The default
1263 is 300 seconds.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001264
1265 :return: The session timeout
1266 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001267 return _lib.SSL_CTX_get_timeout(self._context)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001268
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001269 def set_info_callback(self, callback):
1270 """
Alex Chand072cae2018-02-15 09:57:59 +00001271 Set the information callback to *callback*. This function will be
1272 called from time to time during SSL handshakes.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001273
Alex Chand072cae2018-02-15 09:57:59 +00001274 :param callback: The Python callback to use. This should take three
1275 arguments: a Connection object and two integers. The first integer
1276 specifies where in the SSL handshake the function was called, and
1277 the other the return code from a (possibly failed) internal
1278 function call.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001279 :return: None
1280 """
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001281 @wraps(callback)
1282 def wrapper(ssl, where, return_code):
Jean-Paul Calderonef2bbc9c2014-02-02 10:59:14 -05001283 callback(Connection._reverse_mapping[ssl], where, return_code)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001284 self._info_callback = _ffi.callback(
1285 "void (*)(const SSL *, int, int)", wrapper)
1286 _lib.SSL_CTX_set_info_callback(self._context, self._info_callback)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001287
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001288 def get_app_data(self):
1289 """
Alex Chand072cae2018-02-15 09:57:59 +00001290 Get the application data (supplied via :meth:`set_app_data()`)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001291
1292 :return: The application data
1293 """
1294 return self._app_data
1295
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001296 def set_app_data(self, data):
1297 """
1298 Set the application data (will be returned from get_app_data())
1299
1300 :param data: Any Python object
1301 :return: None
1302 """
1303 self._app_data = data
1304
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001305 def get_cert_store(self):
1306 """
Alex Chand072cae2018-02-15 09:57:59 +00001307 Get the certificate store for the context. This can be used to add
1308 "trusted" certificates without using the
1309 :meth:`load_verify_locations` method.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001310
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001311 :return: A X509Store object or None if it does not have one.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001312 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001313 store = _lib.SSL_CTX_get_cert_store(self._context)
1314 if store == _ffi.NULL:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001315 # TODO: This is untested.
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001316 return None
1317
1318 pystore = X509Store.__new__(X509Store)
1319 pystore._store = store
1320 return pystore
1321
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001322 def set_options(self, options):
1323 """
1324 Add options. Options set before are not cleared!
Alex Chand072cae2018-02-15 09:57:59 +00001325 This method should be used with the :const:`OP_*` constants.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001326
1327 :param options: The options to add.
1328 :return: The new option bitmask.
1329 """
Jean-Paul Calderonebef4f4c2014-02-02 18:13:31 -05001330 if not isinstance(options, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001331 raise TypeError("options must be an integer")
1332
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001333 return _lib.SSL_CTX_set_options(self._context, options)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001334
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001335 def set_mode(self, mode):
1336 """
Alex Chand072cae2018-02-15 09:57:59 +00001337 Add modes via bitmask. Modes set before are not cleared! This method
1338 should be used with the :const:`MODE_*` constants.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001339
1340 :param mode: The mode to add.
1341 :return: The new mode bitmask.
1342 """
Jean-Paul Calderonebef4f4c2014-02-02 18:13:31 -05001343 if not isinstance(mode, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001344 raise TypeError("mode must be an integer")
1345
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001346 return _lib.SSL_CTX_set_mode(self._context, mode)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001347
Cory Benfielde6f35882016-03-29 11:21:04 +01001348 @_requires_sni
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001349 def set_tlsext_servername_callback(self, callback):
1350 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04001351 Specify a callback function to be called when clients specify a server
1352 name.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001353
1354 :param callback: The callback function. It will be invoked with one
1355 argument, the Connection instance.
Alex Chand072cae2018-02-15 09:57:59 +00001356
1357 .. versionadded:: 0.13
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001358 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001359 @wraps(callback)
1360 def wrapper(ssl, alert, arg):
1361 callback(Connection._reverse_mapping[ssl])
1362 return 0
1363
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001364 self._tlsext_servername_callback = _ffi.callback(
David Benjamince5c3842018-05-21 21:14:46 -04001365 "int (*)(SSL *, int *, void *)", wrapper)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001366 _lib.SSL_CTX_set_tlsext_servername_callback(
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001367 self._context, self._tlsext_servername_callback)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001368
Jeremy Lainé02261ad2018-05-16 18:33:25 +02001369 def set_tlsext_use_srtp(self, profiles):
1370 """
1371 Enable support for negotiating SRTP keying material.
1372
1373 :param bytes profiles: A colon delimited list of protection profile
1374 names, like ``b'SRTP_AES128_CM_SHA1_80:SRTP_AES128_CM_SHA1_32'``.
1375 :return: None
1376 """
1377 if not isinstance(profiles, bytes):
1378 raise TypeError("profiles must be a byte string.")
1379
1380 _openssl_assert(
1381 _lib.SSL_CTX_set_tlsext_use_srtp(self._context, profiles) == 0
1382 )
1383
Cory Benfield10b277f2015-04-13 17:12:42 -04001384 @_requires_npn
Cory Benfield84a121e2014-03-31 20:30:25 +01001385 def set_npn_advertise_callback(self, callback):
1386 """
Cory Benfieldbe3e7b82014-05-10 09:48:55 +01001387 Specify a callback function that will be called when offering `Next
1388 Protocol Negotiation
1389 <https://technotes.googlecode.com/git/nextprotoneg.html>`_ as a server.
Cory Benfield84a121e2014-03-31 20:30:25 +01001390
1391 :param callback: The callback function. It will be invoked with one
Alex Chand072cae2018-02-15 09:57:59 +00001392 argument, the :class:`Connection` instance. It should return a
1393 list of bytestrings representing the advertised protocols, like
Cory Benfieldbe3e7b82014-05-10 09:48:55 +01001394 ``[b'http/1.1', b'spdy/2']``.
Alex Chand072cae2018-02-15 09:57:59 +00001395
1396 .. versionadded:: 0.15
Cory Benfield84a121e2014-03-31 20:30:25 +01001397 """
Cory Benfield0ea76e72015-03-22 09:05:28 +00001398 self._npn_advertise_helper = _NpnAdvertiseHelper(callback)
1399 self._npn_advertise_callback = self._npn_advertise_helper.callback
Cory Benfield84a121e2014-03-31 20:30:25 +01001400 _lib.SSL_CTX_set_next_protos_advertised_cb(
1401 self._context, self._npn_advertise_callback, _ffi.NULL)
1402
Cory Benfield10b277f2015-04-13 17:12:42 -04001403 @_requires_npn
Cory Benfield84a121e2014-03-31 20:30:25 +01001404 def set_npn_select_callback(self, callback):
1405 """
1406 Specify a callback function that will be called when a server offers
1407 Next Protocol Negotiation options.
1408
1409 :param callback: The callback function. It will be invoked with two
1410 arguments: the Connection, and a list of offered protocols as
Cory Benfieldbe3e7b82014-05-10 09:48:55 +01001411 bytestrings, e.g. ``[b'http/1.1', b'spdy/2']``. It should return
1412 one of those bytestrings, the chosen protocol.
Alex Chand072cae2018-02-15 09:57:59 +00001413
1414 .. versionadded:: 0.15
Cory Benfield84a121e2014-03-31 20:30:25 +01001415 """
Cory Benfield0ea76e72015-03-22 09:05:28 +00001416 self._npn_select_helper = _NpnSelectHelper(callback)
1417 self._npn_select_callback = self._npn_select_helper.callback
Cory Benfield84a121e2014-03-31 20:30:25 +01001418 _lib.SSL_CTX_set_next_proto_select_cb(
1419 self._context, self._npn_select_callback, _ffi.NULL)
1420
Cory Benfield7907e332015-04-13 17:18:25 -04001421 @_requires_alpn
Cory Benfield12eae892014-06-07 15:42:56 +01001422 def set_alpn_protos(self, protos):
1423 """
Alex Chand072cae2018-02-15 09:57:59 +00001424 Specify the protocols that the client is prepared to speak after the
1425 TLS connection has been negotiated using Application Layer Protocol
1426 Negotiation.
Cory Benfield12eae892014-06-07 15:42:56 +01001427
1428 :param protos: A list of the protocols to be offered to the server.
1429 This list should be a Python list of bytestrings representing the
1430 protocols to offer, e.g. ``[b'http/1.1', b'spdy/2']``.
1431 """
1432 # Take the list of protocols and join them together, prefixing them
1433 # with their lengths.
1434 protostr = b''.join(
1435 chain.from_iterable((int2byte(len(p)), p) for p in protos)
1436 )
1437
1438 # Build a C string from the list. We don't need to save this off
1439 # because OpenSSL immediately copies the data out.
1440 input_str = _ffi.new("unsigned char[]", protostr)
Alex Gaynord61c46a2017-06-29 22:51:33 -07001441 _lib.SSL_CTX_set_alpn_protos(self._context, input_str, len(protostr))
Cory Benfield12eae892014-06-07 15:42:56 +01001442
Cory Benfield7907e332015-04-13 17:18:25 -04001443 @_requires_alpn
Cory Benfield12eae892014-06-07 15:42:56 +01001444 def set_alpn_select_callback(self, callback):
1445 """
Alex Chand072cae2018-02-15 09:57:59 +00001446 Specify a callback function that will be called on the server when a
1447 client offers protocols using ALPN.
Cory Benfield12eae892014-06-07 15:42:56 +01001448
1449 :param callback: The callback function. It will be invoked with two
1450 arguments: the Connection, and a list of offered protocols as
1451 bytestrings, e.g ``[b'http/1.1', b'spdy/2']``. It should return
Cory Benfielde8e9c382015-04-11 17:33:48 -04001452 one of those bytestrings, the chosen protocol.
Cory Benfield12eae892014-06-07 15:42:56 +01001453 """
Cory Benfield9da5ffb2015-04-13 17:20:14 -04001454 self._alpn_select_helper = _ALPNSelectHelper(callback)
Cory Benfieldf1177e72015-04-12 09:11:49 -04001455 self._alpn_select_callback = self._alpn_select_helper.callback
Cory Benfield12eae892014-06-07 15:42:56 +01001456 _lib.SSL_CTX_set_alpn_select_cb(
1457 self._context, self._alpn_select_callback, _ffi.NULL)
1458
Cory Benfield496652a2017-01-24 11:42:56 +00001459 def _set_ocsp_callback(self, helper, data):
1460 """
1461 This internal helper does the common work for
1462 ``set_ocsp_server_callback`` and ``set_ocsp_client_callback``, which is
1463 almost all of it.
1464 """
1465 self._ocsp_helper = helper
1466 self._ocsp_callback = helper.callback
1467 if data is None:
1468 self._ocsp_data = _ffi.NULL
1469 else:
1470 self._ocsp_data = _ffi.new_handle(data)
1471
1472 rc = _lib.SSL_CTX_set_tlsext_status_cb(
1473 self._context, self._ocsp_callback
1474 )
1475 _openssl_assert(rc == 1)
1476 rc = _lib.SSL_CTX_set_tlsext_status_arg(self._context, self._ocsp_data)
1477 _openssl_assert(rc == 1)
1478
1479 def set_ocsp_server_callback(self, callback, data=None):
1480 """
1481 Set a callback to provide OCSP data to be stapled to the TLS handshake
1482 on the server side.
1483
1484 :param callback: The callback function. It will be invoked with two
1485 arguments: the Connection, and the optional arbitrary data you have
1486 provided. The callback must return a bytestring that contains the
1487 OCSP data to staple to the handshake. If no OCSP data is available
1488 for this connection, return the empty bytestring.
1489 :param data: Some opaque data that will be passed into the callback
1490 function when called. This can be used to avoid needing to do
1491 complex data lookups or to keep track of what context is being
1492 used. This parameter is optional.
1493 """
1494 helper = _OCSPServerCallbackHelper(callback)
1495 self._set_ocsp_callback(helper, data)
1496
1497 def set_ocsp_client_callback(self, callback, data=None):
1498 """
1499 Set a callback to validate OCSP data stapled to the TLS handshake on
1500 the client side.
1501
1502 :param callback: The callback function. It will be invoked with three
1503 arguments: the Connection, a bytestring containing the stapled OCSP
1504 assertion, and the optional arbitrary data you have provided. The
1505 callback must return a boolean that indicates the result of
1506 validating the OCSP data: ``True`` if the OCSP data is valid and
1507 the certificate can be trusted, or ``False`` if either the OCSP
1508 data is invalid or the certificate has been revoked.
1509 :param data: Some opaque data that will be passed into the callback
1510 function when called. This can be used to avoid needing to do
1511 complex data lookups or to keep track of what context is being
1512 used. This parameter is optional.
1513 """
1514 helper = _OCSPClientCallbackHelper(callback)
1515 self._set_ocsp_callback(helper, data)
1516
Alex Chanc6077062016-11-18 13:53:39 +00001517
Alex Gaynor10d30832017-06-29 15:31:39 -07001518ContextType = deprecated(
1519 Context, __name__,
1520 "ContextType has been deprecated, use Context instead", DeprecationWarning
1521)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001522
1523
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001524class Connection(object):
1525 """
1526 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001527 _reverse_mapping = WeakValueDictionary()
1528
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001529 def __init__(self, context, socket=None):
1530 """
1531 Create a new Connection object, using the given OpenSSL.SSL.Context
1532 instance and socket.
1533
1534 :param context: An SSL Context to use for this connection
1535 :param socket: The socket to use for transport layer
1536 """
1537 if not isinstance(context, Context):
1538 raise TypeError("context must be a Context instance")
1539
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001540 ssl = _lib.SSL_new(context._context)
1541 self._ssl = _ffi.gc(ssl, _lib.SSL_free)
Paul Kehrer15c29352018-05-14 13:31:27 -04001542 # We set SSL_MODE_AUTO_RETRY to handle situations where OpenSSL returns
1543 # an SSL_ERROR_WANT_READ when processing a non-application data packet
1544 # even though there is still data on the underlying transport.
1545 # See https://github.com/openssl/openssl/issues/6234 for more details.
1546 _lib.SSL_set_mode(self._ssl, _lib.SSL_MODE_AUTO_RETRY)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001547 self._context = context
Todd Chapman4f73e4f2015-08-27 11:26:43 -04001548 self._app_data = None
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001549
Cory Benfieldbe3e7b82014-05-10 09:48:55 +01001550 # References to strings used for Next Protocol Negotiation. OpenSSL's
1551 # header files suggest that these might get copied at some point, but
1552 # doesn't specify when, so we store them here to make sure they don't
1553 # get freed before OpenSSL uses them.
1554 self._npn_advertise_callback_args = None
1555 self._npn_select_callback_args = None
1556
Cory Benfield12eae892014-06-07 15:42:56 +01001557 # References to strings used for Application Layer Protocol
1558 # Negotiation. These strings get copied at some point but it's well
1559 # after the callback returns, so we have to hang them somewhere to
1560 # avoid them getting freed.
1561 self._alpn_select_callback_args = None
1562
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001563 self._reverse_mapping[self._ssl] = self
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001564
1565 if socket is None:
1566 self._socket = None
Jean-Paul Calderone73b15c22013-03-05 18:30:39 -08001567 # Don't set up any gc for these, SSL_free will take care of them.
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001568 self._into_ssl = _lib.BIO_new(_lib.BIO_s_mem())
Alex Gaynora829e902016-06-04 18:16:01 -07001569 _openssl_assert(self._into_ssl != _ffi.NULL)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001570
Alex Gaynora829e902016-06-04 18:16:01 -07001571 self._from_ssl = _lib.BIO_new(_lib.BIO_s_mem())
1572 _openssl_assert(self._from_ssl != _ffi.NULL)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001573
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001574 _lib.SSL_set_bio(self._ssl, self._into_ssl, self._from_ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001575 else:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001576 self._into_ssl = None
1577 self._from_ssl = None
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001578 self._socket = socket
Alex Gaynor62da94d2015-09-05 14:37:34 -04001579 set_result = _lib.SSL_set_fd(
1580 self._ssl, _asFileDescriptor(self._socket))
Alex Gaynor09f19f52016-07-03 09:54:09 -04001581 _openssl_assert(set_result == 1)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001582
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001583 def __getattr__(self, name):
1584 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04001585 Look up attributes on the wrapped socket object if they are not found
1586 on the Connection object.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001587 """
kjav0b66fa12015-09-02 11:51:26 +01001588 if self._socket is None:
Alex Gaynor62da94d2015-09-05 14:37:34 -04001589 raise AttributeError("'%s' object has no attribute '%s'" % (
1590 self.__class__.__name__, name
1591 ))
kjav0b66fa12015-09-02 11:51:26 +01001592 else:
1593 return getattr(self._socket, name)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001594
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001595 def _raise_ssl_error(self, ssl, result):
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -08001596 if self._context._verify_helper is not None:
1597 self._context._verify_helper.raise_if_problem()
Cory Benfield0ea76e72015-03-22 09:05:28 +00001598 if self._context._npn_advertise_helper is not None:
1599 self._context._npn_advertise_helper.raise_if_problem()
1600 if self._context._npn_select_helper is not None:
1601 self._context._npn_select_helper.raise_if_problem()
Cory Benfieldf1177e72015-04-12 09:11:49 -04001602 if self._context._alpn_select_helper is not None:
1603 self._context._alpn_select_helper.raise_if_problem()
Cory Benfield496652a2017-01-24 11:42:56 +00001604 if self._context._ocsp_helper is not None:
1605 self._context._ocsp_helper.raise_if_problem()
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -08001606
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001607 error = _lib.SSL_get_error(ssl, result)
1608 if error == _lib.SSL_ERROR_WANT_READ:
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001609 raise WantReadError()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001610 elif error == _lib.SSL_ERROR_WANT_WRITE:
Jean-Paul Calderoned899af02013-03-19 22:10:37 -07001611 raise WantWriteError()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001612 elif error == _lib.SSL_ERROR_ZERO_RETURN:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001613 raise ZeroReturnError()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001614 elif error == _lib.SSL_ERROR_WANT_X509_LOOKUP:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001615 # TODO: This is untested.
Jean-Paul Calderoned899af02013-03-19 22:10:37 -07001616 raise WantX509LookupError()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001617 elif error == _lib.SSL_ERROR_SYSCALL:
1618 if _lib.ERR_peek_error() == 0:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001619 if result < 0:
Konstantinos Koukopoulos541150d2014-01-31 01:00:19 +02001620 if platform == "win32":
1621 errno = _ffi.getwinerror()[0]
1622 else:
1623 errno = _ffi.errno
Alex Gaynor5af32d02016-09-24 01:52:21 -04001624
1625 if errno != 0:
1626 raise SysCallError(errno, errorcode.get(errno))
1627 raise SysCallError(-1, "Unexpected EOF")
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001628 else:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001629 # TODO: This is untested.
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -05001630 _raise_current_error()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001631 elif error == _lib.SSL_ERROR_NONE:
Jean-Paul Calderoned899af02013-03-19 22:10:37 -07001632 pass
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001633 else:
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -05001634 _raise_current_error()
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001635
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001636 def get_context(self):
1637 """
Alex Chand072cae2018-02-15 09:57:59 +00001638 Retrieve the :class:`Context` object associated with this
1639 :class:`Connection`.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001640 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001641 return self._context
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001642
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001643 def set_context(self, context):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001644 """
Alex Chand072cae2018-02-15 09:57:59 +00001645 Switch this connection to a new session context.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001646
Alex Chand072cae2018-02-15 09:57:59 +00001647 :param context: A :class:`Context` instance giving the new session
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001648 context to use.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001649 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001650 if not isinstance(context, Context):
1651 raise TypeError("context must be a Context instance")
1652
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001653 _lib.SSL_set_SSL_CTX(self._ssl, context._context)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001654 self._context = context
1655
Cory Benfielde6f35882016-03-29 11:21:04 +01001656 @_requires_sni
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001657 def get_servername(self):
1658 """
1659 Retrieve the servername extension value if provided in the client hello
1660 message, or None if there wasn't one.
1661
Alex Chand072cae2018-02-15 09:57:59 +00001662 :return: A byte string giving the server name or :data:`None`.
1663
1664 .. versionadded:: 0.13
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001665 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04001666 name = _lib.SSL_get_servername(
1667 self._ssl, _lib.TLSEXT_NAMETYPE_host_name
1668 )
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001669 if name == _ffi.NULL:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001670 return None
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001671
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001672 return _ffi.string(name)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001673
Cory Benfielde6f35882016-03-29 11:21:04 +01001674 @_requires_sni
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001675 def set_tlsext_host_name(self, name):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001676 """
1677 Set the value of the servername extension to send in the client hello.
1678
1679 :param name: A byte string giving the name.
Alex Chand072cae2018-02-15 09:57:59 +00001680
1681 .. versionadded:: 0.13
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001682 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001683 if not isinstance(name, bytes):
1684 raise TypeError("name must be a byte string")
Jean-Paul Calderone4f0467a2014-01-11 11:58:41 -05001685 elif b"\0" in name:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001686 raise TypeError("name must not contain NUL byte")
1687
1688 # XXX I guess this can fail sometimes?
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001689 _lib.SSL_set_tlsext_host_name(self._ssl, name)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001690
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001691 def pending(self):
1692 """
Alex Chand072cae2018-02-15 09:57:59 +00001693 Get the number of bytes that can be safely read from the SSL buffer
1694 (**not** the underlying transport buffer).
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001695
1696 :return: The number of bytes available in the receive buffer.
1697 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001698 return _lib.SSL_pending(self._ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001699
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001700 def send(self, buf, flags=0):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001701 """
1702 Send data on the connection. NOTE: If you get one of the WantRead,
1703 WantWrite or WantX509Lookup exceptions on this, you have to call the
1704 method again with the SAME buffer.
1705
Markus Unterwaditzer8e41d022014-04-19 12:27:11 +02001706 :param buf: The string, buffer or memoryview to send
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001707 :param flags: (optional) Included for compatibility with the socket
1708 API, the value is ignored
1709 :return: The number of bytes written
1710 """
Abraham Martine82326c2015-02-04 10:18:10 +00001711 # Backward compatibility
Jean-Paul Calderone39a8d592015-04-13 20:49:50 -04001712 buf = _text_to_bytes_and_warn("buf", buf)
Abraham Martine82326c2015-02-04 10:18:10 +00001713
Jeremy Lainé1ae7cb62018-03-21 14:49:42 +01001714 if isinstance(buf, memoryview):
Jean-Paul Calderone1aba4162013-03-05 18:50:00 -08001715 buf = buf.tobytes()
Markus Unterwaditzer8e41d022014-04-19 12:27:11 +02001716 if isinstance(buf, _buffer):
1717 buf = str(buf)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001718 if not isinstance(buf, bytes):
Markus Unterwaditzer8e41d022014-04-19 12:27:11 +02001719 raise TypeError("data must be a memoryview, buffer or byte string")
Maximilian Hils868dc3c2017-02-10 14:56:55 +01001720 if len(buf) > 2147483647:
1721 raise ValueError("Cannot send more than 2**31-1 bytes at once.")
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001722
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001723 result = _lib.SSL_write(self._ssl, buf, len(buf))
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001724 self._raise_ssl_error(self._ssl, result)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001725 return result
1726 write = send
1727
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001728 def sendall(self, buf, flags=0):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001729 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001730 Send "all" data on the connection. This calls send() repeatedly until
1731 all data is sent. If an error occurs, it's impossible to tell how much
1732 data has been sent.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001733
Markus Unterwaditzer8e41d022014-04-19 12:27:11 +02001734 :param buf: The string, buffer or memoryview to send
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001735 :param flags: (optional) Included for compatibility with the socket
1736 API, the value is ignored
1737 :return: The number of bytes written
1738 """
Jean-Paul Calderone39a8d592015-04-13 20:49:50 -04001739 buf = _text_to_bytes_and_warn("buf", buf)
Abraham Martine82326c2015-02-04 10:18:10 +00001740
Jeremy Lainé1ae7cb62018-03-21 14:49:42 +01001741 if isinstance(buf, memoryview):
Jean-Paul Calderone1aba4162013-03-05 18:50:00 -08001742 buf = buf.tobytes()
Markus Unterwaditzer8e41d022014-04-19 12:27:11 +02001743 if isinstance(buf, _buffer):
1744 buf = str(buf)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001745 if not isinstance(buf, bytes):
Markus Unterwaditzer8e41d022014-04-19 12:27:11 +02001746 raise TypeError("buf must be a memoryview, buffer or byte string")
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001747
1748 left_to_send = len(buf)
1749 total_sent = 0
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001750 data = _ffi.new("char[]", buf)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001751
1752 while left_to_send:
Maximilian Hils868dc3c2017-02-10 14:56:55 +01001753 # SSL_write's num arg is an int,
1754 # so we cannot send more than 2**31-1 bytes at once.
1755 result = _lib.SSL_write(
1756 self._ssl,
1757 data + total_sent,
1758 min(left_to_send, 2147483647)
1759 )
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001760 self._raise_ssl_error(self._ssl, result)
1761 total_sent += result
1762 left_to_send -= result
1763
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001764 def recv(self, bufsiz, flags=None):
1765 """
Alex Gaynor67fc8c92016-05-27 08:27:19 -04001766 Receive data on the connection.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001767
1768 :param bufsiz: The maximum number of bytes to read
Maximilian Hils1d95dea2015-08-17 19:27:20 +02001769 :param flags: (optional) The only supported flag is ``MSG_PEEK``,
1770 all other flags are ignored.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001771 :return: The string read from the Connection
1772 """
Cory Benfielde62840e2016-11-28 12:17:08 +00001773 buf = _no_zero_allocator("char[]", bufsiz)
Maximilian Hils1d95dea2015-08-17 19:27:20 +02001774 if flags is not None and flags & socket.MSG_PEEK:
1775 result = _lib.SSL_peek(self._ssl, buf, bufsiz)
1776 else:
1777 result = _lib.SSL_read(self._ssl, buf, bufsiz)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001778 self._raise_ssl_error(self._ssl, result)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001779 return _ffi.buffer(buf, result)[:]
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001780 read = recv
1781
Cory Benfield62d10332014-06-15 10:03:41 +01001782 def recv_into(self, buffer, nbytes=None, flags=None):
1783 """
Alex Chand072cae2018-02-15 09:57:59 +00001784 Receive data on the connection and copy it directly into the provided
1785 buffer, rather than creating a new string.
Cory Benfield62d10332014-06-15 10:03:41 +01001786
1787 :param buffer: The buffer to copy into.
1788 :param nbytes: (optional) The maximum number of bytes to read into the
1789 buffer. If not present, defaults to the size of the buffer. If
1790 larger than the size of the buffer, is reduced to the size of the
1791 buffer.
Maximilian Hils1d95dea2015-08-17 19:27:20 +02001792 :param flags: (optional) The only supported flag is ``MSG_PEEK``,
1793 all other flags are ignored.
Cory Benfield62d10332014-06-15 10:03:41 +01001794 :return: The number of bytes read into the buffer.
1795 """
1796 if nbytes is None:
1797 nbytes = len(buffer)
1798 else:
1799 nbytes = min(nbytes, len(buffer))
1800
1801 # We need to create a temporary buffer. This is annoying, it would be
1802 # better if we could pass memoryviews straight into the SSL_read call,
1803 # but right now we can't. Revisit this if CFFI gets that ability.
Cory Benfielde62840e2016-11-28 12:17:08 +00001804 buf = _no_zero_allocator("char[]", nbytes)
Maximilian Hils1d95dea2015-08-17 19:27:20 +02001805 if flags is not None and flags & socket.MSG_PEEK:
1806 result = _lib.SSL_peek(self._ssl, buf, nbytes)
1807 else:
1808 result = _lib.SSL_read(self._ssl, buf, nbytes)
Cory Benfield62d10332014-06-15 10:03:41 +01001809 self._raise_ssl_error(self._ssl, result)
1810
1811 # This strange line is all to avoid a memory copy. The buffer protocol
1812 # should allow us to assign a CFFI buffer to the LHS of this line, but
1813 # on CPython 3.3+ that segfaults. As a workaround, we can temporarily
Jeremy Lainé1ae7cb62018-03-21 14:49:42 +01001814 # wrap it in a memoryview.
1815 buffer[:result] = memoryview(_ffi.buffer(buf, result))
Cory Benfield62d10332014-06-15 10:03:41 +01001816
1817 return result
1818
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001819 def _handle_bio_errors(self, bio, result):
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001820 if _lib.BIO_should_retry(bio):
1821 if _lib.BIO_should_read(bio):
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001822 raise WantReadError()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001823 elif _lib.BIO_should_write(bio):
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001824 # TODO: This is untested.
Jean-Paul Calderoned899af02013-03-19 22:10:37 -07001825 raise WantWriteError()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001826 elif _lib.BIO_should_io_special(bio):
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001827 # TODO: This is untested. I think io_special means the socket
1828 # BIO has a not-yet connected socket.
Jean-Paul Calderoned899af02013-03-19 22:10:37 -07001829 raise ValueError("BIO_should_io_special")
1830 else:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001831 # TODO: This is untested.
Jean-Paul Calderoned899af02013-03-19 22:10:37 -07001832 raise ValueError("unknown bio failure")
1833 else:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001834 # TODO: This is untested.
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -05001835 _raise_current_error()
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001836
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001837 def bio_read(self, bufsiz):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001838 """
Alex Chand072cae2018-02-15 09:57:59 +00001839 If the Connection was created with a memory BIO, this method can be
1840 used to read bytes from the write end of that memory BIO. Many
1841 Connection methods will add bytes which must be read in this manner or
1842 the buffer will eventually fill up and the Connection will be able to
1843 take no further actions.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001844
1845 :param bufsiz: The maximum number of bytes to read
1846 :return: The string read.
1847 """
Jean-Paul Calderone97e041d2013-03-05 21:03:12 -08001848 if self._from_ssl is None:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001849 raise TypeError("Connection sock was not None")
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001850
Jean-Paul Calderonebef4f4c2014-02-02 18:13:31 -05001851 if not isinstance(bufsiz, integer_types):
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001852 raise TypeError("bufsiz must be an integer")
1853
Cory Benfielde62840e2016-11-28 12:17:08 +00001854 buf = _no_zero_allocator("char[]", bufsiz)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001855 result = _lib.BIO_read(self._from_ssl, buf, bufsiz)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001856 if result <= 0:
1857 self._handle_bio_errors(self._from_ssl, result)
1858
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001859 return _ffi.buffer(buf, result)[:]
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001860
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001861 def bio_write(self, buf):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001862 """
Alex Chand072cae2018-02-15 09:57:59 +00001863 If the Connection was created with a memory BIO, this method can be
1864 used to add bytes to the read end of that memory BIO. The Connection
1865 can then read the bytes (for example, in response to a call to
1866 :meth:`recv`).
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001867
1868 :param buf: The string to put into the memory BIO.
1869 :return: The number of bytes written
1870 """
Jean-Paul Calderone39a8d592015-04-13 20:49:50 -04001871 buf = _text_to_bytes_and_warn("buf", buf)
Abraham Martine82326c2015-02-04 10:18:10 +00001872
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001873 if self._into_ssl is None:
1874 raise TypeError("Connection sock was not None")
1875
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001876 result = _lib.BIO_write(self._into_ssl, buf, len(buf))
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001877 if result <= 0:
1878 self._handle_bio_errors(self._into_ssl, result)
1879 return result
1880
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001881 def renegotiate(self):
1882 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001883 Renegotiate the session.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001884
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001885 :return: True if the renegotiation can be started, False otherwise
1886 :rtype: bool
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001887 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001888 if not self.renegotiate_pending():
1889 _openssl_assert(_lib.SSL_renegotiate(self._ssl) == 1)
1890 return True
1891 return False
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001892
1893 def do_handshake(self):
1894 """
Alex Chand072cae2018-02-15 09:57:59 +00001895 Perform an SSL handshake (usually called after :meth:`renegotiate` or
1896 one of :meth:`set_accept_state` or :meth:`set_accept_state`). This can
1897 raise the same exceptions as :meth:`send` and :meth:`recv`.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001898
1899 :return: None.
1900 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001901 result = _lib.SSL_do_handshake(self._ssl)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001902 self._raise_ssl_error(self._ssl, result)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001903
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001904 def renegotiate_pending(self):
1905 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001906 Check if there's a renegotiation in progress, it will return False once
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001907 a renegotiation is finished.
1908
1909 :return: Whether there's a renegotiation in progress
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001910 :rtype: bool
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001911 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001912 return _lib.SSL_renegotiate_pending(self._ssl) == 1
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001913
1914 def total_renegotiations(self):
1915 """
1916 Find out the total number of renegotiations.
1917
1918 :return: The number of renegotiations.
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001919 :rtype: int
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001920 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001921 return _lib.SSL_total_renegotiations(self._ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001922
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001923 def connect(self, addr):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001924 """
Alex Chand072cae2018-02-15 09:57:59 +00001925 Call the :meth:`connect` method of the underlying socket and set up SSL
1926 on the socket, using the :class:`Context` object supplied to this
1927 :class:`Connection` object at creation.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001928
1929 :param addr: A remote address
1930 :return: What the socket's connect method returns
1931 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001932 _lib.SSL_set_connect_state(self._ssl)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001933 return self._socket.connect(addr)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001934
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001935 def connect_ex(self, addr):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001936 """
Alex Chand072cae2018-02-15 09:57:59 +00001937 Call the :meth:`connect_ex` method of the underlying socket and set up
1938 SSL on the socket, using the Context object supplied to this Connection
1939 object at creation. Note that if the :meth:`connect_ex` method of the
1940 socket doesn't return 0, SSL won't be initialized.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001941
1942 :param addr: A remove address
1943 :return: What the socket's connect_ex method returns
1944 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001945 connect_ex = self._socket.connect_ex
1946 self.set_connect_state()
1947 return connect_ex(addr)
1948
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001949 def accept(self):
1950 """
Alex Chand072cae2018-02-15 09:57:59 +00001951 Call the :meth:`accept` method of the underlying socket and set up SSL
1952 on the returned socket, using the Context object supplied to this
1953 :class:`Connection` object at creation.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001954
Alex Chand072cae2018-02-15 09:57:59 +00001955 :return: A *(conn, addr)* pair where *conn* is the new
1956 :class:`Connection` object created, and *address* is as returned by
1957 the socket's :meth:`accept`.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001958 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001959 client, addr = self._socket.accept()
1960 conn = Connection(self._context, client)
1961 conn.set_accept_state()
1962 return (conn, addr)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001963
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001964 def bio_shutdown(self):
1965 """
Alex Chand072cae2018-02-15 09:57:59 +00001966 If the Connection was created with a memory BIO, this method can be
1967 used to indicate that *end of file* has been reached on the read end of
1968 that memory BIO.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001969
1970 :return: None
1971 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001972 if self._from_ssl is None:
1973 raise TypeError("Connection sock was not None")
1974
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001975 _lib.BIO_set_mem_eof_return(self._into_ssl, 0)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001976
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001977 def shutdown(self):
1978 """
Alex Chand072cae2018-02-15 09:57:59 +00001979 Send the shutdown message to the Connection.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001980
1981 :return: True if the shutdown completed successfully (i.e. both sides
Alex Chand072cae2018-02-15 09:57:59 +00001982 have sent closure alerts), False otherwise (in which case you
1983 call :meth:`recv` or :meth:`send` when the connection becomes
1984 readable/writeable).
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001985 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001986 result = _lib.SSL_shutdown(self._ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001987 if result < 0:
Paul Aurichbff1d1a2015-01-08 08:36:53 -08001988 self._raise_ssl_error(self._ssl, result)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001989 elif result > 0:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001990 return True
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001991 else:
1992 return False
1993
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001994 def get_cipher_list(self):
1995 """
Hynek Schlawackf90e3682016-03-11 11:21:13 +01001996 Retrieve the list of ciphers used by the Connection object.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001997
Hynek Schlawackf90e3682016-03-11 11:21:13 +01001998 :return: A list of native cipher strings.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001999 """
2000 ciphers = []
2001 for i in count():
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002002 result = _lib.SSL_get_cipher_list(self._ssl, i)
2003 if result == _ffi.NULL:
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002004 break
Jean-Paul Calderone4f0467a2014-01-11 11:58:41 -05002005 ciphers.append(_native(_ffi.string(result)))
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002006 return ciphers
2007
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002008 def get_client_ca_list(self):
2009 """
2010 Get CAs whose certificates are suggested for client authentication.
2011
Alex Chand072cae2018-02-15 09:57:59 +00002012 :return: If this is a server connection, the list of certificate
2013 authorities that will be sent or has been sent to the client, as
2014 controlled by this :class:`Connection`'s :class:`Context`.
2015
2016 If this is a client connection, the list will be empty until the
2017 connection with the server is established.
2018
2019 .. versionadded:: 0.10
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002020 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002021 ca_names = _lib.SSL_get_client_CA_list(self._ssl)
2022 if ca_names == _ffi.NULL:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05002023 # TODO: This is untested.
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002024 return []
2025
2026 result = []
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002027 for i in range(_lib.sk_X509_NAME_num(ca_names)):
2028 name = _lib.sk_X509_NAME_value(ca_names, i)
2029 copy = _lib.X509_NAME_dup(name)
Alex Gaynora829e902016-06-04 18:16:01 -07002030 _openssl_assert(copy != _ffi.NULL)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002031
2032 pyname = X509Name.__new__(X509Name)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002033 pyname._name = _ffi.gc(copy, _lib.X509_NAME_free)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002034 result.append(pyname)
2035 return result
2036
Aykee7f33452018-05-16 19:18:16 +02002037 def makefile(self, *args, **kwargs):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002038 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04002039 The makefile() method is not implemented, since there is no dup
2040 semantics for SSL connections
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002041
Jean-Paul Calderone6749ec22014-04-17 16:30:21 -04002042 :raise: NotImplementedError
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002043 """
Alex Gaynor83284952015-09-05 10:43:30 -04002044 raise NotImplementedError(
2045 "Cannot make file object of OpenSSL.SSL.Connection")
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002046
2047 def get_app_data(self):
2048 """
Alex Chand072cae2018-02-15 09:57:59 +00002049 Retrieve application data as set by :meth:`set_app_data`.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002050
2051 :return: The application data
2052 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002053 return self._app_data
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002054
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002055 def set_app_data(self, data):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002056 """
2057 Set application data
2058
Alex Chand072cae2018-02-15 09:57:59 +00002059 :param data: The application data
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002060 :return: None
2061 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002062 self._app_data = data
2063
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002064 def get_shutdown(self):
2065 """
Alex Chand072cae2018-02-15 09:57:59 +00002066 Get the shutdown state of the Connection.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002067
Alex Gaynor62da94d2015-09-05 14:37:34 -04002068 :return: The shutdown state, a bitvector of SENT_SHUTDOWN,
2069 RECEIVED_SHUTDOWN.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002070 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002071 return _lib.SSL_get_shutdown(self._ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002072
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002073 def set_shutdown(self, state):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002074 """
Alex Chand072cae2018-02-15 09:57:59 +00002075 Set the shutdown state of the Connection.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002076
Alex Chand072cae2018-02-15 09:57:59 +00002077 :param state: bitvector of SENT_SHUTDOWN, RECEIVED_SHUTDOWN.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002078 :return: None
2079 """
Jean-Paul Calderonef73a3cb2014-02-09 08:49:06 -05002080 if not isinstance(state, integer_types):
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002081 raise TypeError("state must be an integer")
2082
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002083 _lib.SSL_set_shutdown(self._ssl, state)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002084
Hynek Schlawackea94f2b2016-03-13 16:17:53 +01002085 def get_state_string(self):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002086 """
Hynek Schlawackea94f2b2016-03-13 16:17:53 +01002087 Retrieve a verbose string detailing the state of the Connection.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002088
2089 :return: A string representing the state
Hynek Schlawackea94f2b2016-03-13 16:17:53 +01002090 :rtype: bytes
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002091 """
kjavc704a2e2015-09-07 12:12:27 +01002092 return _ffi.string(_lib.SSL_state_string_long(self._ssl))
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002093
2094 def server_random(self):
2095 """
Alex Chand072cae2018-02-15 09:57:59 +00002096 Retrieve the random value used with the server hello message.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002097
2098 :return: A string representing the state
2099 """
Alex Gaynor93603062016-06-01 20:13:09 -07002100 session = _lib.SSL_get_session(self._ssl)
2101 if session == _ffi.NULL:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002102 return None
Alex Gaynor93603062016-06-01 20:13:09 -07002103 length = _lib.SSL_get_server_random(self._ssl, _ffi.NULL, 0)
2104 assert length > 0
Cory Benfielde62840e2016-11-28 12:17:08 +00002105 outp = _no_zero_allocator("unsigned char[]", length)
Alex Gaynor93603062016-06-01 20:13:09 -07002106 _lib.SSL_get_server_random(self._ssl, outp, length)
2107 return _ffi.buffer(outp, length)[:]
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002108
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002109 def client_random(self):
2110 """
Alex Chand072cae2018-02-15 09:57:59 +00002111 Retrieve the random value used with the client hello message.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002112
2113 :return: A string representing the state
2114 """
Alex Gaynor93603062016-06-01 20:13:09 -07002115 session = _lib.SSL_get_session(self._ssl)
2116 if session == _ffi.NULL:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002117 return None
Alex Gaynor93603062016-06-01 20:13:09 -07002118
2119 length = _lib.SSL_get_client_random(self._ssl, _ffi.NULL, 0)
2120 assert length > 0
Cory Benfielde62840e2016-11-28 12:17:08 +00002121 outp = _no_zero_allocator("unsigned char[]", length)
Alex Gaynor93603062016-06-01 20:13:09 -07002122 _lib.SSL_get_client_random(self._ssl, outp, length)
2123 return _ffi.buffer(outp, length)[:]
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002124
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002125 def master_key(self):
2126 """
Alex Chand072cae2018-02-15 09:57:59 +00002127 Retrieve the value of the master key for this session.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002128
2129 :return: A string representing the state
2130 """
Alex Gaynor93603062016-06-01 20:13:09 -07002131 session = _lib.SSL_get_session(self._ssl)
2132 if session == _ffi.NULL:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002133 return None
Alex Gaynor93603062016-06-01 20:13:09 -07002134
2135 length = _lib.SSL_SESSION_get_master_key(session, _ffi.NULL, 0)
2136 assert length > 0
Cory Benfielde62840e2016-11-28 12:17:08 +00002137 outp = _no_zero_allocator("unsigned char[]", length)
Alex Gaynor93603062016-06-01 20:13:09 -07002138 _lib.SSL_SESSION_get_master_key(session, outp, length)
2139 return _ffi.buffer(outp, length)[:]
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002140
Paul Kehrerbdb76392017-12-01 04:54:32 +08002141 def export_keying_material(self, label, olen, context=None):
2142 """
2143 Obtain keying material for application use.
2144
Alex Chand072cae2018-02-15 09:57:59 +00002145 :param: label - a disambiguating label string as described in RFC 5705
2146 :param: olen - the length of the exported key material in bytes
2147 :param: context - a per-association context value
2148 :return: the exported key material bytes or None
Paul Kehrerbdb76392017-12-01 04:54:32 +08002149 """
2150 outp = _no_zero_allocator("unsigned char[]", olen)
2151 context_buf = _ffi.NULL
2152 context_len = 0
2153 use_context = 0
2154 if context is not None:
2155 context_buf = context
2156 context_len = len(context)
2157 use_context = 1
2158 success = _lib.SSL_export_keying_material(self._ssl, outp, olen,
2159 label, len(label),
2160 context_buf, context_len,
2161 use_context)
2162 _openssl_assert(success == 1)
2163 return _ffi.buffer(outp, olen)[:]
2164
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002165 def sock_shutdown(self, *args, **kwargs):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002166 """
Alex Chand072cae2018-02-15 09:57:59 +00002167 Call the :meth:`shutdown` method of the underlying socket.
2168 See :manpage:`shutdown(2)`.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002169
2170 :return: What the socket's shutdown() method returns
2171 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002172 return self._socket.shutdown(*args, **kwargs)
2173
Jeremy Lainé460a19d2018-05-16 19:44:19 +02002174 def get_certificate(self):
2175 """
2176 Retrieve the local certificate (if any)
2177
2178 :return: The local certificate
2179 """
2180 cert = _lib.SSL_get_certificate(self._ssl)
2181 if cert != _ffi.NULL:
2182 _lib.X509_up_ref(cert)
2183 return X509._from_raw_x509_ptr(cert)
2184 return None
2185
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002186 def get_peer_certificate(self):
2187 """
2188 Retrieve the other side's certificate (if any)
2189
2190 :return: The peer's certificate
2191 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002192 cert = _lib.SSL_get_peer_certificate(self._ssl)
2193 if cert != _ffi.NULL:
Alex Gaynor4aa52c32017-11-20 09:04:08 -05002194 return X509._from_raw_x509_ptr(cert)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002195 return None
2196
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002197 def get_peer_cert_chain(self):
2198 """
2199 Retrieve the other side's certificate (if any)
2200
2201 :return: A list of X509 instances giving the peer's certificate chain,
2202 or None if it does not have one.
2203 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002204 cert_stack = _lib.SSL_get_peer_cert_chain(self._ssl)
2205 if cert_stack == _ffi.NULL:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002206 return None
2207
2208 result = []
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002209 for i in range(_lib.sk_X509_num(cert_stack)):
Jean-Paul Calderone73b15c22013-03-05 18:30:39 -08002210 # TODO could incref instead of dup here
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002211 cert = _lib.X509_dup(_lib.sk_X509_value(cert_stack, i))
Alex Gaynor4aa52c32017-11-20 09:04:08 -05002212 pycert = X509._from_raw_x509_ptr(cert)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002213 result.append(pycert)
2214 return result
2215
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002216 def want_read(self):
2217 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04002218 Checks if more data has to be read from the transport layer to complete
2219 an operation.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002220
2221 :return: True iff more data has to be read
2222 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002223 return _lib.SSL_want_read(self._ssl)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002224
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002225 def want_write(self):
2226 """
2227 Checks if there is data to write to the transport layer to complete an
2228 operation.
2229
2230 :return: True iff there is data to write
2231 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002232 return _lib.SSL_want_write(self._ssl)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002233
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002234 def set_accept_state(self):
2235 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04002236 Set the connection to work in server mode. The handshake will be
2237 handled automatically by read/write.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002238
2239 :return: None
2240 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002241 _lib.SSL_set_accept_state(self._ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002242
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002243 def set_connect_state(self):
2244 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04002245 Set the connection to work in client mode. The handshake will be
2246 handled automatically by read/write.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002247
2248 :return: None
2249 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002250 _lib.SSL_set_connect_state(self._ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002251
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002252 def get_session(self):
2253 """
2254 Returns the Session currently used.
2255
Alex Chand072cae2018-02-15 09:57:59 +00002256 :return: An instance of :class:`OpenSSL.SSL.Session` or
2257 :obj:`None` if no session exists.
2258
2259 .. versionadded:: 0.14
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002260 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002261 session = _lib.SSL_get1_session(self._ssl)
2262 if session == _ffi.NULL:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002263 return None
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002264
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002265 pysession = Session.__new__(Session)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002266 pysession._session = _ffi.gc(session, _lib.SSL_SESSION_free)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002267 return pysession
2268
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002269 def set_session(self, session):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002270 """
2271 Set the session to be used when the TLS/SSL connection is established.
2272
2273 :param session: A Session instance representing the session to use.
2274 :returns: None
Alex Chand072cae2018-02-15 09:57:59 +00002275
2276 .. versionadded:: 0.14
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002277 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002278 if not isinstance(session, Session):
2279 raise TypeError("session must be a Session instance")
2280
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002281 result = _lib.SSL_set_session(self._ssl, session._session)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002282 if not result:
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -05002283 _raise_current_error()
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002284
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002285 def _get_finished_message(self, function):
2286 """
Alex Chand072cae2018-02-15 09:57:59 +00002287 Helper to implement :meth:`get_finished` and
2288 :meth:`get_peer_finished`.
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002289
Alex Chand072cae2018-02-15 09:57:59 +00002290 :param function: Either :data:`SSL_get_finished`: or
2291 :data:`SSL_get_peer_finished`.
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002292
Alex Chand072cae2018-02-15 09:57:59 +00002293 :return: :data:`None` if the desired message has not yet been
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002294 received, otherwise the contents of the message.
Alex Chand072cae2018-02-15 09:57:59 +00002295 :rtype: :class:`bytes` or :class:`NoneType`
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002296 """
Jean-Paul Calderone01af9042014-03-30 11:40:42 -04002297 # The OpenSSL documentation says nothing about what might happen if the
2298 # count argument given is zero. Specifically, it doesn't say whether
2299 # the output buffer may be NULL in that case or not. Inspection of the
2300 # implementation reveals that it calls memcpy() unconditionally.
2301 # Section 7.1.4, paragraph 1 of the C standard suggests that
2302 # memcpy(NULL, source, 0) is not guaranteed to produce defined (let
2303 # alone desirable) behavior (though it probably does on just about
2304 # every implementation...)
2305 #
2306 # Allocate a tiny buffer to pass in (instead of just passing NULL as
2307 # one might expect) for the initial call so as to be safe against this
2308 # potentially undefined behavior.
2309 empty = _ffi.new("char[]", 0)
2310 size = function(self._ssl, empty, 0)
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002311 if size == 0:
2312 # No Finished message so far.
2313 return None
2314
Cory Benfielde62840e2016-11-28 12:17:08 +00002315 buf = _no_zero_allocator("char[]", size)
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002316 function(self._ssl, buf, size)
2317 return _ffi.buffer(buf, size)[:]
2318
Fedor Brunner5747b932014-03-05 14:22:34 +01002319 def get_finished(self):
2320 """
Alex Chand072cae2018-02-15 09:57:59 +00002321 Obtain the latest TLS Finished message that we sent.
Fedor Brunner5747b932014-03-05 14:22:34 +01002322
Alex Chand072cae2018-02-15 09:57:59 +00002323 :return: The contents of the message or :obj:`None` if the TLS
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002324 handshake has not yet completed.
Alex Chand072cae2018-02-15 09:57:59 +00002325 :rtype: :class:`bytes` or :class:`NoneType`
2326
2327 .. versionadded:: 0.15
Fedor Brunner5747b932014-03-05 14:22:34 +01002328 """
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002329 return self._get_finished_message(_lib.SSL_get_finished)
2330
Fedor Brunner5747b932014-03-05 14:22:34 +01002331 def get_peer_finished(self):
2332 """
Alex Chand072cae2018-02-15 09:57:59 +00002333 Obtain the latest TLS Finished message that we received from the peer.
Fedor Brunner5747b932014-03-05 14:22:34 +01002334
Alex Chand072cae2018-02-15 09:57:59 +00002335 :return: The contents of the message or :obj:`None` if the TLS
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002336 handshake has not yet completed.
Alex Chand072cae2018-02-15 09:57:59 +00002337 :rtype: :class:`bytes` or :class:`NoneType`
2338
2339 .. versionadded:: 0.15
Fedor Brunner5747b932014-03-05 14:22:34 +01002340 """
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002341 return self._get_finished_message(_lib.SSL_get_peer_finished)
Fedor Brunner5747b932014-03-05 14:22:34 +01002342
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002343 def get_cipher_name(self):
2344 """
2345 Obtain the name of the currently used cipher.
Jean-Paul Calderone9e3ccd42014-03-29 18:13:36 -04002346
Alex Chand072cae2018-02-15 09:57:59 +00002347 :returns: The name of the currently used cipher or :obj:`None`
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002348 if no connection has been established.
Alex Chand072cae2018-02-15 09:57:59 +00002349 :rtype: :class:`unicode` or :class:`NoneType`
2350
2351 .. versionadded:: 0.15
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002352 """
2353 cipher = _lib.SSL_get_current_cipher(self._ssl)
2354 if cipher == _ffi.NULL:
2355 return None
2356 else:
Jean-Paul Calderone7f0ded42014-03-30 10:34:17 -04002357 name = _ffi.string(_lib.SSL_CIPHER_get_name(cipher))
2358 return name.decode("utf-8")
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002359
2360 def get_cipher_bits(self):
2361 """
2362 Obtain the number of secret bits of the currently used cipher.
Jean-Paul Calderone9e3ccd42014-03-29 18:13:36 -04002363
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002364 :returns: The number of secret bits of the currently used cipher
Alex Chand072cae2018-02-15 09:57:59 +00002365 or :obj:`None` if no connection has been established.
2366 :rtype: :class:`int` or :class:`NoneType`
2367
2368 .. versionadded:: 0.15
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002369 """
2370 cipher = _lib.SSL_get_current_cipher(self._ssl)
2371 if cipher == _ffi.NULL:
2372 return None
2373 else:
2374 return _lib.SSL_CIPHER_get_bits(cipher, _ffi.NULL)
2375
2376 def get_cipher_version(self):
2377 """
Jean-Paul Calderone9e3ccd42014-03-29 18:13:36 -04002378 Obtain the protocol version of the currently used cipher.
2379
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002380 :returns: The protocol name of the currently used cipher
Alex Chand072cae2018-02-15 09:57:59 +00002381 or :obj:`None` if no connection has been established.
2382 :rtype: :class:`unicode` or :class:`NoneType`
2383
2384 .. versionadded:: 0.15
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002385 """
2386 cipher = _lib.SSL_get_current_cipher(self._ssl)
2387 if cipher == _ffi.NULL:
2388 return None
2389 else:
Alex Gaynorc4889812015-09-04 08:43:17 -04002390 version = _ffi.string(_lib.SSL_CIPHER_get_version(cipher))
Jean-Paul Calderone7f0ded42014-03-30 10:34:17 -04002391 return version.decode("utf-8")
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002392
Jim Shaverabff1882015-05-27 09:15:55 -04002393 def get_protocol_version_name(self):
Jim Shaverba65e662015-04-26 12:23:40 -04002394 """
Alex Chand072cae2018-02-15 09:57:59 +00002395 Retrieve the protocol version of the current connection.
Jim Shaverba65e662015-04-26 12:23:40 -04002396
2397 :returns: The TLS version of the current connection, for example
Jim Shaver58d25732015-05-28 11:52:32 -04002398 the value for TLS 1.2 would be ``TLSv1.2``or ``Unknown``
Jim Shaverb5b6b0e2015-05-28 16:47:36 -04002399 for connections that were not successfully established.
Alex Chand072cae2018-02-15 09:57:59 +00002400 :rtype: :class:`unicode`
Jim Shaverba65e662015-04-26 12:23:40 -04002401 """
Jim Shaverd1c896e2015-05-27 17:50:21 -04002402 version = _ffi.string(_lib.SSL_get_version(self._ssl))
Jim Shaver58d25732015-05-28 11:52:32 -04002403 return version.decode("utf-8")
Jim Shaverb2967922015-04-26 23:58:52 -04002404
Jim Shaver208438c2015-05-28 09:52:38 -04002405 def get_protocol_version(self):
2406 """
Alex Chand072cae2018-02-15 09:57:59 +00002407 Retrieve the SSL or TLS protocol version of the current connection.
Jim Shaver208438c2015-05-28 09:52:38 -04002408
Alex Chand072cae2018-02-15 09:57:59 +00002409 :returns: The TLS version of the current connection. For example,
2410 it will return ``0x769`` for connections made over TLS version 1.
2411 :rtype: :class:`int`
Jim Shaver208438c2015-05-28 09:52:38 -04002412 """
2413 version = _lib.SSL_version(self._ssl)
2414 return version
2415
Cory Benfield10b277f2015-04-13 17:12:42 -04002416 @_requires_npn
Cory Benfield84a121e2014-03-31 20:30:25 +01002417 def get_next_proto_negotiated(self):
2418 """
2419 Get the protocol that was negotiated by NPN.
Alex Chand072cae2018-02-15 09:57:59 +00002420
2421 :returns: A bytestring of the protocol name. If no protocol has been
2422 negotiated yet, returns an empty string.
2423
2424 .. versionadded:: 0.15
Cory Benfield84a121e2014-03-31 20:30:25 +01002425 """
2426 data = _ffi.new("unsigned char **")
2427 data_len = _ffi.new("unsigned int *")
2428
2429 _lib.SSL_get0_next_proto_negotiated(self._ssl, data, data_len)
2430
Cory Benfieldcd010f62014-05-15 19:00:27 +01002431 return _ffi.buffer(data[0], data_len[0])[:]
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002432
Cory Benfield7907e332015-04-13 17:18:25 -04002433 @_requires_alpn
Cory Benfield12eae892014-06-07 15:42:56 +01002434 def set_alpn_protos(self, protos):
2435 """
Cory Benfielde8e9c382015-04-11 17:33:48 -04002436 Specify the client's ALPN protocol list.
2437
2438 These protocols are offered to the server during protocol negotiation.
Cory Benfield12eae892014-06-07 15:42:56 +01002439
2440 :param protos: A list of the protocols to be offered to the server.
2441 This list should be a Python list of bytestrings representing the
2442 protocols to offer, e.g. ``[b'http/1.1', b'spdy/2']``.
2443 """
2444 # Take the list of protocols and join them together, prefixing them
2445 # with their lengths.
2446 protostr = b''.join(
2447 chain.from_iterable((int2byte(len(p)), p) for p in protos)
2448 )
2449
2450 # Build a C string from the list. We don't need to save this off
2451 # because OpenSSL immediately copies the data out.
2452 input_str = _ffi.new("unsigned char[]", protostr)
Alex Gaynord61c46a2017-06-29 22:51:33 -07002453 _lib.SSL_set_alpn_protos(self._ssl, input_str, len(protostr))
Cory Benfield12eae892014-06-07 15:42:56 +01002454
Maximilian Hils66ded6a2015-08-26 06:02:03 +02002455 @_requires_alpn
Cory Benfield12eae892014-06-07 15:42:56 +01002456 def get_alpn_proto_negotiated(self):
Cory Benfield222f30e2015-04-13 18:10:21 -04002457 """
2458 Get the protocol that was negotiated by ALPN.
Alex Chand072cae2018-02-15 09:57:59 +00002459
2460 :returns: A bytestring of the protocol name. If no protocol has been
2461 negotiated yet, returns an empty string.
Cory Benfield222f30e2015-04-13 18:10:21 -04002462 """
Cory Benfield12eae892014-06-07 15:42:56 +01002463 data = _ffi.new("unsigned char **")
2464 data_len = _ffi.new("unsigned int *")
2465
2466 _lib.SSL_get0_alpn_selected(self._ssl, data, data_len)
2467
Cory Benfielde8e9c382015-04-11 17:33:48 -04002468 if not data_len:
2469 return b''
2470
Cory Benfield12eae892014-06-07 15:42:56 +01002471 return _ffi.buffer(data[0], data_len[0])[:]
2472
Cory Benfield496652a2017-01-24 11:42:56 +00002473 def request_ocsp(self):
2474 """
2475 Called to request that the server sends stapled OCSP data, if
2476 available. If this is not called on the client side then the server
2477 will not send OCSP data. Should be used in conjunction with
2478 :meth:`Context.set_ocsp_client_callback`.
2479 """
2480 rc = _lib.SSL_set_tlsext_status_type(
2481 self._ssl, _lib.TLSEXT_STATUSTYPE_ocsp
2482 )
2483 _openssl_assert(rc == 1)
2484
Cory Benfield12eae892014-06-07 15:42:56 +01002485
Alex Gaynor10d30832017-06-29 15:31:39 -07002486ConnectionType = deprecated(
2487 Connection, __name__,
2488 "ConnectionType has been deprecated, use Connection instead",
2489 DeprecationWarning
2490)
Jean-Paul Calderone11ed8e82014-01-18 10:21:50 -05002491
Jean-Paul Calderonefab157b2014-01-18 11:21:38 -05002492# This is similar to the initialization calls at the end of OpenSSL/crypto.py
2493# but is exercised mostly by the Context initializer.
Jean-Paul Calderone11ed8e82014-01-18 10:21:50 -05002494_lib.SSL_library_init()