blob: 0687fc31811fdd5e92c285057650fe46c61b1cf3 [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 )
Paul Kehrer7d5a3bf2019-01-21 12:24:02 -06001188 # In OpenSSL 1.1.1 setting the cipher list will always return TLS 1.3
1189 # ciphers even if you pass an invalid cipher. Applications (like
1190 # Twisted) have tests that depend on an error being raised if an
1191 # invalid cipher string is passed, but without the following check
1192 # for the TLS 1.3 specific cipher suites it would never error.
1193 tmpconn = Connection(self, None)
1194 _openssl_assert(
1195 tmpconn.get_cipher_list() != [
1196 'TLS_AES_256_GCM_SHA384',
1197 'TLS_CHACHA20_POLY1305_SHA256',
1198 'TLS_AES_128_GCM_SHA256'
1199 ]
1200 )
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001201
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001202 def set_client_ca_list(self, certificate_authorities):
1203 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04001204 Set the list of preferred client certificate signers for this server
1205 context.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001206
Alex Gaynor62da94d2015-09-05 14:37:34 -04001207 This list of certificate authorities will be sent to the client when
1208 the server requests a client certificate.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001209
1210 :param certificate_authorities: a sequence of X509Names.
1211 :return: None
Alex Chand072cae2018-02-15 09:57:59 +00001212
1213 .. versionadded:: 0.10
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001214 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001215 name_stack = _lib.sk_X509_NAME_new_null()
Alex Gaynora829e902016-06-04 18:16:01 -07001216 _openssl_assert(name_stack != _ffi.NULL)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001217
1218 try:
1219 for ca_name in certificate_authorities:
1220 if not isinstance(ca_name, X509Name):
1221 raise TypeError(
Alex Gaynor62da94d2015-09-05 14:37:34 -04001222 "client CAs must be X509Name objects, not %s "
1223 "objects" % (
1224 type(ca_name).__name__,
1225 )
1226 )
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001227 copy = _lib.X509_NAME_dup(ca_name._name)
Alex Gaynora829e902016-06-04 18:16:01 -07001228 _openssl_assert(copy != _ffi.NULL)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001229 push_result = _lib.sk_X509_NAME_push(name_stack, copy)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001230 if not push_result:
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001231 _lib.X509_NAME_free(copy)
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -05001232 _raise_current_error()
Alex Gaynorc3697ad2017-11-20 08:19:32 -05001233 except Exception:
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001234 _lib.sk_X509_NAME_free(name_stack)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001235 raise
1236
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001237 _lib.SSL_CTX_set_client_CA_list(self._context, name_stack)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001238
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001239 def add_client_ca(self, certificate_authority):
1240 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04001241 Add the CA certificate to the list of preferred signers for this
1242 context.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001243
1244 The list of certificate authorities will be sent to the client when the
1245 server requests a client certificate.
1246
1247 :param certificate_authority: certificate authority's X509 certificate.
1248 :return: None
Alex Chand072cae2018-02-15 09:57:59 +00001249
1250 .. versionadded:: 0.10
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001251 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001252 if not isinstance(certificate_authority, X509):
1253 raise TypeError("certificate_authority must be an X509 instance")
1254
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001255 add_result = _lib.SSL_CTX_add_client_CA(
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001256 self._context, certificate_authority._x509)
Alex Gaynor09f19f52016-07-03 09:54:09 -04001257 _openssl_assert(add_result == 1)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001258
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001259 def set_timeout(self, timeout):
1260 """
Alex Chand072cae2018-02-15 09:57:59 +00001261 Set the timeout for newly created sessions for this Context object to
1262 *timeout*. The default value is 300 seconds. See the OpenSSL manual
1263 for more information (e.g. :manpage:`SSL_CTX_set_timeout(3)`).
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001264
Alex Chand072cae2018-02-15 09:57:59 +00001265 :param timeout: The timeout in (whole) seconds
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001266 :return: The previous session timeout
1267 """
Jean-Paul Calderonebef4f4c2014-02-02 18:13:31 -05001268 if not isinstance(timeout, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001269 raise TypeError("timeout must be an integer")
1270
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001271 return _lib.SSL_CTX_set_timeout(self._context, timeout)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001272
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001273 def get_timeout(self):
1274 """
Alex Chand072cae2018-02-15 09:57:59 +00001275 Retrieve session timeout, as set by :meth:`set_timeout`. The default
1276 is 300 seconds.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001277
1278 :return: The session timeout
1279 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001280 return _lib.SSL_CTX_get_timeout(self._context)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001281
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001282 def set_info_callback(self, callback):
1283 """
Alex Chand072cae2018-02-15 09:57:59 +00001284 Set the information callback to *callback*. This function will be
1285 called from time to time during SSL handshakes.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001286
Alex Chand072cae2018-02-15 09:57:59 +00001287 :param callback: The Python callback to use. This should take three
1288 arguments: a Connection object and two integers. The first integer
1289 specifies where in the SSL handshake the function was called, and
1290 the other the return code from a (possibly failed) internal
1291 function call.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001292 :return: None
1293 """
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001294 @wraps(callback)
1295 def wrapper(ssl, where, return_code):
Jean-Paul Calderonef2bbc9c2014-02-02 10:59:14 -05001296 callback(Connection._reverse_mapping[ssl], where, return_code)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001297 self._info_callback = _ffi.callback(
1298 "void (*)(const SSL *, int, int)", wrapper)
1299 _lib.SSL_CTX_set_info_callback(self._context, self._info_callback)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001300
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001301 def get_app_data(self):
1302 """
Alex Chand072cae2018-02-15 09:57:59 +00001303 Get the application data (supplied via :meth:`set_app_data()`)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001304
1305 :return: The application data
1306 """
1307 return self._app_data
1308
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001309 def set_app_data(self, data):
1310 """
1311 Set the application data (will be returned from get_app_data())
1312
1313 :param data: Any Python object
1314 :return: None
1315 """
1316 self._app_data = data
1317
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001318 def get_cert_store(self):
1319 """
Alex Chand072cae2018-02-15 09:57:59 +00001320 Get the certificate store for the context. This can be used to add
1321 "trusted" certificates without using the
1322 :meth:`load_verify_locations` method.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001323
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001324 :return: A X509Store object or None if it does not have one.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001325 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001326 store = _lib.SSL_CTX_get_cert_store(self._context)
1327 if store == _ffi.NULL:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001328 # TODO: This is untested.
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001329 return None
1330
1331 pystore = X509Store.__new__(X509Store)
1332 pystore._store = store
1333 return pystore
1334
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001335 def set_options(self, options):
1336 """
1337 Add options. Options set before are not cleared!
Alex Chand072cae2018-02-15 09:57:59 +00001338 This method should be used with the :const:`OP_*` constants.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001339
1340 :param options: The options to add.
1341 :return: The new option bitmask.
1342 """
Jean-Paul Calderonebef4f4c2014-02-02 18:13:31 -05001343 if not isinstance(options, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001344 raise TypeError("options must be an integer")
1345
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001346 return _lib.SSL_CTX_set_options(self._context, options)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001347
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001348 def set_mode(self, mode):
1349 """
Alex Chand072cae2018-02-15 09:57:59 +00001350 Add modes via bitmask. Modes set before are not cleared! This method
1351 should be used with the :const:`MODE_*` constants.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001352
1353 :param mode: The mode to add.
1354 :return: The new mode bitmask.
1355 """
Jean-Paul Calderonebef4f4c2014-02-02 18:13:31 -05001356 if not isinstance(mode, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001357 raise TypeError("mode must be an integer")
1358
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001359 return _lib.SSL_CTX_set_mode(self._context, mode)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001360
Cory Benfielde6f35882016-03-29 11:21:04 +01001361 @_requires_sni
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001362 def set_tlsext_servername_callback(self, callback):
1363 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04001364 Specify a callback function to be called when clients specify a server
1365 name.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001366
1367 :param callback: The callback function. It will be invoked with one
1368 argument, the Connection instance.
Alex Chand072cae2018-02-15 09:57:59 +00001369
1370 .. versionadded:: 0.13
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001371 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001372 @wraps(callback)
1373 def wrapper(ssl, alert, arg):
1374 callback(Connection._reverse_mapping[ssl])
1375 return 0
1376
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001377 self._tlsext_servername_callback = _ffi.callback(
David Benjamince5c3842018-05-21 21:14:46 -04001378 "int (*)(SSL *, int *, void *)", wrapper)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001379 _lib.SSL_CTX_set_tlsext_servername_callback(
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001380 self._context, self._tlsext_servername_callback)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001381
Jeremy Lainé02261ad2018-05-16 18:33:25 +02001382 def set_tlsext_use_srtp(self, profiles):
1383 """
1384 Enable support for negotiating SRTP keying material.
1385
1386 :param bytes profiles: A colon delimited list of protection profile
1387 names, like ``b'SRTP_AES128_CM_SHA1_80:SRTP_AES128_CM_SHA1_32'``.
1388 :return: None
1389 """
1390 if not isinstance(profiles, bytes):
1391 raise TypeError("profiles must be a byte string.")
1392
1393 _openssl_assert(
1394 _lib.SSL_CTX_set_tlsext_use_srtp(self._context, profiles) == 0
1395 )
1396
Cory Benfield10b277f2015-04-13 17:12:42 -04001397 @_requires_npn
Cory Benfield84a121e2014-03-31 20:30:25 +01001398 def set_npn_advertise_callback(self, callback):
1399 """
Cory Benfieldbe3e7b82014-05-10 09:48:55 +01001400 Specify a callback function that will be called when offering `Next
1401 Protocol Negotiation
1402 <https://technotes.googlecode.com/git/nextprotoneg.html>`_ as a server.
Cory Benfield84a121e2014-03-31 20:30:25 +01001403
1404 :param callback: The callback function. It will be invoked with one
Alex Chand072cae2018-02-15 09:57:59 +00001405 argument, the :class:`Connection` instance. It should return a
1406 list of bytestrings representing the advertised protocols, like
Cory Benfieldbe3e7b82014-05-10 09:48:55 +01001407 ``[b'http/1.1', b'spdy/2']``.
Alex Chand072cae2018-02-15 09:57:59 +00001408
1409 .. versionadded:: 0.15
Cory Benfield84a121e2014-03-31 20:30:25 +01001410 """
Cory Benfield0ea76e72015-03-22 09:05:28 +00001411 self._npn_advertise_helper = _NpnAdvertiseHelper(callback)
1412 self._npn_advertise_callback = self._npn_advertise_helper.callback
Cory Benfield84a121e2014-03-31 20:30:25 +01001413 _lib.SSL_CTX_set_next_protos_advertised_cb(
1414 self._context, self._npn_advertise_callback, _ffi.NULL)
1415
Cory Benfield10b277f2015-04-13 17:12:42 -04001416 @_requires_npn
Cory Benfield84a121e2014-03-31 20:30:25 +01001417 def set_npn_select_callback(self, callback):
1418 """
1419 Specify a callback function that will be called when a server offers
1420 Next Protocol Negotiation options.
1421
1422 :param callback: The callback function. It will be invoked with two
1423 arguments: the Connection, and a list of offered protocols as
Cory Benfieldbe3e7b82014-05-10 09:48:55 +01001424 bytestrings, e.g. ``[b'http/1.1', b'spdy/2']``. It should return
1425 one of those bytestrings, the chosen protocol.
Alex Chand072cae2018-02-15 09:57:59 +00001426
1427 .. versionadded:: 0.15
Cory Benfield84a121e2014-03-31 20:30:25 +01001428 """
Cory Benfield0ea76e72015-03-22 09:05:28 +00001429 self._npn_select_helper = _NpnSelectHelper(callback)
1430 self._npn_select_callback = self._npn_select_helper.callback
Cory Benfield84a121e2014-03-31 20:30:25 +01001431 _lib.SSL_CTX_set_next_proto_select_cb(
1432 self._context, self._npn_select_callback, _ffi.NULL)
1433
Cory Benfield7907e332015-04-13 17:18:25 -04001434 @_requires_alpn
Cory Benfield12eae892014-06-07 15:42:56 +01001435 def set_alpn_protos(self, protos):
1436 """
Alex Chand072cae2018-02-15 09:57:59 +00001437 Specify the protocols that the client is prepared to speak after the
1438 TLS connection has been negotiated using Application Layer Protocol
1439 Negotiation.
Cory Benfield12eae892014-06-07 15:42:56 +01001440
1441 :param protos: A list of the protocols to be offered to the server.
1442 This list should be a Python list of bytestrings representing the
1443 protocols to offer, e.g. ``[b'http/1.1', b'spdy/2']``.
1444 """
1445 # Take the list of protocols and join them together, prefixing them
1446 # with their lengths.
1447 protostr = b''.join(
1448 chain.from_iterable((int2byte(len(p)), p) for p in protos)
1449 )
1450
1451 # Build a C string from the list. We don't need to save this off
1452 # because OpenSSL immediately copies the data out.
1453 input_str = _ffi.new("unsigned char[]", protostr)
Alex Gaynord61c46a2017-06-29 22:51:33 -07001454 _lib.SSL_CTX_set_alpn_protos(self._context, input_str, len(protostr))
Cory Benfield12eae892014-06-07 15:42:56 +01001455
Cory Benfield7907e332015-04-13 17:18:25 -04001456 @_requires_alpn
Cory Benfield12eae892014-06-07 15:42:56 +01001457 def set_alpn_select_callback(self, callback):
1458 """
Alex Chand072cae2018-02-15 09:57:59 +00001459 Specify a callback function that will be called on the server when a
1460 client offers protocols using ALPN.
Cory Benfield12eae892014-06-07 15:42:56 +01001461
1462 :param callback: The callback function. It will be invoked with two
1463 arguments: the Connection, and a list of offered protocols as
1464 bytestrings, e.g ``[b'http/1.1', b'spdy/2']``. It should return
Cory Benfielde8e9c382015-04-11 17:33:48 -04001465 one of those bytestrings, the chosen protocol.
Cory Benfield12eae892014-06-07 15:42:56 +01001466 """
Cory Benfield9da5ffb2015-04-13 17:20:14 -04001467 self._alpn_select_helper = _ALPNSelectHelper(callback)
Cory Benfieldf1177e72015-04-12 09:11:49 -04001468 self._alpn_select_callback = self._alpn_select_helper.callback
Cory Benfield12eae892014-06-07 15:42:56 +01001469 _lib.SSL_CTX_set_alpn_select_cb(
1470 self._context, self._alpn_select_callback, _ffi.NULL)
1471
Cory Benfield496652a2017-01-24 11:42:56 +00001472 def _set_ocsp_callback(self, helper, data):
1473 """
1474 This internal helper does the common work for
1475 ``set_ocsp_server_callback`` and ``set_ocsp_client_callback``, which is
1476 almost all of it.
1477 """
1478 self._ocsp_helper = helper
1479 self._ocsp_callback = helper.callback
1480 if data is None:
1481 self._ocsp_data = _ffi.NULL
1482 else:
1483 self._ocsp_data = _ffi.new_handle(data)
1484
1485 rc = _lib.SSL_CTX_set_tlsext_status_cb(
1486 self._context, self._ocsp_callback
1487 )
1488 _openssl_assert(rc == 1)
1489 rc = _lib.SSL_CTX_set_tlsext_status_arg(self._context, self._ocsp_data)
1490 _openssl_assert(rc == 1)
1491
1492 def set_ocsp_server_callback(self, callback, data=None):
1493 """
1494 Set a callback to provide OCSP data to be stapled to the TLS handshake
1495 on the server side.
1496
1497 :param callback: The callback function. It will be invoked with two
1498 arguments: the Connection, and the optional arbitrary data you have
1499 provided. The callback must return a bytestring that contains the
1500 OCSP data to staple to the handshake. If no OCSP data is available
1501 for this connection, return the empty bytestring.
1502 :param data: Some opaque data that will be passed into the callback
1503 function when called. This can be used to avoid needing to do
1504 complex data lookups or to keep track of what context is being
1505 used. This parameter is optional.
1506 """
1507 helper = _OCSPServerCallbackHelper(callback)
1508 self._set_ocsp_callback(helper, data)
1509
1510 def set_ocsp_client_callback(self, callback, data=None):
1511 """
1512 Set a callback to validate OCSP data stapled to the TLS handshake on
1513 the client side.
1514
1515 :param callback: The callback function. It will be invoked with three
1516 arguments: the Connection, a bytestring containing the stapled OCSP
1517 assertion, and the optional arbitrary data you have provided. The
1518 callback must return a boolean that indicates the result of
1519 validating the OCSP data: ``True`` if the OCSP data is valid and
1520 the certificate can be trusted, or ``False`` if either the OCSP
1521 data is invalid or the certificate has been revoked.
1522 :param data: Some opaque data that will be passed into the callback
1523 function when called. This can be used to avoid needing to do
1524 complex data lookups or to keep track of what context is being
1525 used. This parameter is optional.
1526 """
1527 helper = _OCSPClientCallbackHelper(callback)
1528 self._set_ocsp_callback(helper, data)
1529
Alex Chanc6077062016-11-18 13:53:39 +00001530
Alex Gaynor10d30832017-06-29 15:31:39 -07001531ContextType = deprecated(
1532 Context, __name__,
1533 "ContextType has been deprecated, use Context instead", DeprecationWarning
1534)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001535
1536
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001537class Connection(object):
1538 """
1539 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001540 _reverse_mapping = WeakValueDictionary()
1541
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001542 def __init__(self, context, socket=None):
1543 """
1544 Create a new Connection object, using the given OpenSSL.SSL.Context
1545 instance and socket.
1546
1547 :param context: An SSL Context to use for this connection
1548 :param socket: The socket to use for transport layer
1549 """
1550 if not isinstance(context, Context):
1551 raise TypeError("context must be a Context instance")
1552
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001553 ssl = _lib.SSL_new(context._context)
1554 self._ssl = _ffi.gc(ssl, _lib.SSL_free)
Paul Kehrer15c29352018-05-14 13:31:27 -04001555 # We set SSL_MODE_AUTO_RETRY to handle situations where OpenSSL returns
1556 # an SSL_ERROR_WANT_READ when processing a non-application data packet
1557 # even though there is still data on the underlying transport.
1558 # See https://github.com/openssl/openssl/issues/6234 for more details.
1559 _lib.SSL_set_mode(self._ssl, _lib.SSL_MODE_AUTO_RETRY)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001560 self._context = context
Todd Chapman4f73e4f2015-08-27 11:26:43 -04001561 self._app_data = None
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001562
Cory Benfieldbe3e7b82014-05-10 09:48:55 +01001563 # References to strings used for Next Protocol Negotiation. OpenSSL's
1564 # header files suggest that these might get copied at some point, but
1565 # doesn't specify when, so we store them here to make sure they don't
1566 # get freed before OpenSSL uses them.
1567 self._npn_advertise_callback_args = None
1568 self._npn_select_callback_args = None
1569
Cory Benfield12eae892014-06-07 15:42:56 +01001570 # References to strings used for Application Layer Protocol
1571 # Negotiation. These strings get copied at some point but it's well
1572 # after the callback returns, so we have to hang them somewhere to
1573 # avoid them getting freed.
1574 self._alpn_select_callback_args = None
1575
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001576 self._reverse_mapping[self._ssl] = self
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001577
1578 if socket is None:
1579 self._socket = None
Jean-Paul Calderone73b15c22013-03-05 18:30:39 -08001580 # Don't set up any gc for these, SSL_free will take care of them.
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001581 self._into_ssl = _lib.BIO_new(_lib.BIO_s_mem())
Alex Gaynora829e902016-06-04 18:16:01 -07001582 _openssl_assert(self._into_ssl != _ffi.NULL)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001583
Alex Gaynora829e902016-06-04 18:16:01 -07001584 self._from_ssl = _lib.BIO_new(_lib.BIO_s_mem())
1585 _openssl_assert(self._from_ssl != _ffi.NULL)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001586
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001587 _lib.SSL_set_bio(self._ssl, self._into_ssl, self._from_ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001588 else:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001589 self._into_ssl = None
1590 self._from_ssl = None
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001591 self._socket = socket
Alex Gaynor62da94d2015-09-05 14:37:34 -04001592 set_result = _lib.SSL_set_fd(
1593 self._ssl, _asFileDescriptor(self._socket))
Alex Gaynor09f19f52016-07-03 09:54:09 -04001594 _openssl_assert(set_result == 1)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001595
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001596 def __getattr__(self, name):
1597 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04001598 Look up attributes on the wrapped socket object if they are not found
1599 on the Connection object.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001600 """
kjav0b66fa12015-09-02 11:51:26 +01001601 if self._socket is None:
Alex Gaynor62da94d2015-09-05 14:37:34 -04001602 raise AttributeError("'%s' object has no attribute '%s'" % (
1603 self.__class__.__name__, name
1604 ))
kjav0b66fa12015-09-02 11:51:26 +01001605 else:
1606 return getattr(self._socket, name)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001607
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001608 def _raise_ssl_error(self, ssl, result):
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -08001609 if self._context._verify_helper is not None:
1610 self._context._verify_helper.raise_if_problem()
Cory Benfield0ea76e72015-03-22 09:05:28 +00001611 if self._context._npn_advertise_helper is not None:
1612 self._context._npn_advertise_helper.raise_if_problem()
1613 if self._context._npn_select_helper is not None:
1614 self._context._npn_select_helper.raise_if_problem()
Cory Benfieldf1177e72015-04-12 09:11:49 -04001615 if self._context._alpn_select_helper is not None:
1616 self._context._alpn_select_helper.raise_if_problem()
Cory Benfield496652a2017-01-24 11:42:56 +00001617 if self._context._ocsp_helper is not None:
1618 self._context._ocsp_helper.raise_if_problem()
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -08001619
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001620 error = _lib.SSL_get_error(ssl, result)
1621 if error == _lib.SSL_ERROR_WANT_READ:
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001622 raise WantReadError()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001623 elif error == _lib.SSL_ERROR_WANT_WRITE:
Jean-Paul Calderoned899af02013-03-19 22:10:37 -07001624 raise WantWriteError()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001625 elif error == _lib.SSL_ERROR_ZERO_RETURN:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001626 raise ZeroReturnError()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001627 elif error == _lib.SSL_ERROR_WANT_X509_LOOKUP:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001628 # TODO: This is untested.
Jean-Paul Calderoned899af02013-03-19 22:10:37 -07001629 raise WantX509LookupError()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001630 elif error == _lib.SSL_ERROR_SYSCALL:
1631 if _lib.ERR_peek_error() == 0:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001632 if result < 0:
Konstantinos Koukopoulos541150d2014-01-31 01:00:19 +02001633 if platform == "win32":
1634 errno = _ffi.getwinerror()[0]
1635 else:
1636 errno = _ffi.errno
Alex Gaynor5af32d02016-09-24 01:52:21 -04001637
1638 if errno != 0:
1639 raise SysCallError(errno, errorcode.get(errno))
1640 raise SysCallError(-1, "Unexpected EOF")
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001641 else:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001642 # TODO: This is untested.
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -05001643 _raise_current_error()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001644 elif error == _lib.SSL_ERROR_NONE:
Jean-Paul Calderoned899af02013-03-19 22:10:37 -07001645 pass
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001646 else:
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -05001647 _raise_current_error()
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001648
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001649 def get_context(self):
1650 """
Alex Chand072cae2018-02-15 09:57:59 +00001651 Retrieve the :class:`Context` object associated with this
1652 :class:`Connection`.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001653 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001654 return self._context
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001655
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001656 def set_context(self, context):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001657 """
Alex Chand072cae2018-02-15 09:57:59 +00001658 Switch this connection to a new session context.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001659
Alex Chand072cae2018-02-15 09:57:59 +00001660 :param context: A :class:`Context` instance giving the new session
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001661 context to use.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001662 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001663 if not isinstance(context, Context):
1664 raise TypeError("context must be a Context instance")
1665
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001666 _lib.SSL_set_SSL_CTX(self._ssl, context._context)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001667 self._context = context
1668
Cory Benfielde6f35882016-03-29 11:21:04 +01001669 @_requires_sni
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001670 def get_servername(self):
1671 """
1672 Retrieve the servername extension value if provided in the client hello
1673 message, or None if there wasn't one.
1674
Alex Chand072cae2018-02-15 09:57:59 +00001675 :return: A byte string giving the server name or :data:`None`.
1676
1677 .. versionadded:: 0.13
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001678 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04001679 name = _lib.SSL_get_servername(
1680 self._ssl, _lib.TLSEXT_NAMETYPE_host_name
1681 )
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001682 if name == _ffi.NULL:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001683 return None
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001684
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001685 return _ffi.string(name)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001686
Cory Benfielde6f35882016-03-29 11:21:04 +01001687 @_requires_sni
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001688 def set_tlsext_host_name(self, name):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001689 """
1690 Set the value of the servername extension to send in the client hello.
1691
1692 :param name: A byte string giving the name.
Alex Chand072cae2018-02-15 09:57:59 +00001693
1694 .. versionadded:: 0.13
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001695 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001696 if not isinstance(name, bytes):
1697 raise TypeError("name must be a byte string")
Jean-Paul Calderone4f0467a2014-01-11 11:58:41 -05001698 elif b"\0" in name:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001699 raise TypeError("name must not contain NUL byte")
1700
1701 # XXX I guess this can fail sometimes?
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001702 _lib.SSL_set_tlsext_host_name(self._ssl, name)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001703
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001704 def pending(self):
1705 """
Alex Chand072cae2018-02-15 09:57:59 +00001706 Get the number of bytes that can be safely read from the SSL buffer
1707 (**not** the underlying transport buffer).
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001708
1709 :return: The number of bytes available in the receive buffer.
1710 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001711 return _lib.SSL_pending(self._ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001712
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001713 def send(self, buf, flags=0):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001714 """
1715 Send data on the connection. NOTE: If you get one of the WantRead,
1716 WantWrite or WantX509Lookup exceptions on this, you have to call the
1717 method again with the SAME buffer.
1718
Markus Unterwaditzer8e41d022014-04-19 12:27:11 +02001719 :param buf: The string, buffer or memoryview to send
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001720 :param flags: (optional) Included for compatibility with the socket
1721 API, the value is ignored
1722 :return: The number of bytes written
1723 """
Abraham Martine82326c2015-02-04 10:18:10 +00001724 # Backward compatibility
Jean-Paul Calderone39a8d592015-04-13 20:49:50 -04001725 buf = _text_to_bytes_and_warn("buf", buf)
Abraham Martine82326c2015-02-04 10:18:10 +00001726
Jeremy Lainé1ae7cb62018-03-21 14:49:42 +01001727 if isinstance(buf, memoryview):
Jean-Paul Calderone1aba4162013-03-05 18:50:00 -08001728 buf = buf.tobytes()
Markus Unterwaditzer8e41d022014-04-19 12:27:11 +02001729 if isinstance(buf, _buffer):
1730 buf = str(buf)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001731 if not isinstance(buf, bytes):
Markus Unterwaditzer8e41d022014-04-19 12:27:11 +02001732 raise TypeError("data must be a memoryview, buffer or byte string")
Maximilian Hils868dc3c2017-02-10 14:56:55 +01001733 if len(buf) > 2147483647:
1734 raise ValueError("Cannot send more than 2**31-1 bytes at once.")
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001735
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001736 result = _lib.SSL_write(self._ssl, buf, len(buf))
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001737 self._raise_ssl_error(self._ssl, result)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001738 return result
1739 write = send
1740
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001741 def sendall(self, buf, flags=0):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001742 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001743 Send "all" data on the connection. This calls send() repeatedly until
1744 all data is sent. If an error occurs, it's impossible to tell how much
1745 data has been sent.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001746
Markus Unterwaditzer8e41d022014-04-19 12:27:11 +02001747 :param buf: The string, buffer or memoryview to send
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001748 :param flags: (optional) Included for compatibility with the socket
1749 API, the value is ignored
1750 :return: The number of bytes written
1751 """
Jean-Paul Calderone39a8d592015-04-13 20:49:50 -04001752 buf = _text_to_bytes_and_warn("buf", buf)
Abraham Martine82326c2015-02-04 10:18:10 +00001753
Jeremy Lainé1ae7cb62018-03-21 14:49:42 +01001754 if isinstance(buf, memoryview):
Jean-Paul Calderone1aba4162013-03-05 18:50:00 -08001755 buf = buf.tobytes()
Markus Unterwaditzer8e41d022014-04-19 12:27:11 +02001756 if isinstance(buf, _buffer):
1757 buf = str(buf)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001758 if not isinstance(buf, bytes):
Markus Unterwaditzer8e41d022014-04-19 12:27:11 +02001759 raise TypeError("buf must be a memoryview, buffer or byte string")
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001760
1761 left_to_send = len(buf)
1762 total_sent = 0
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001763 data = _ffi.new("char[]", buf)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001764
1765 while left_to_send:
Maximilian Hils868dc3c2017-02-10 14:56:55 +01001766 # SSL_write's num arg is an int,
1767 # so we cannot send more than 2**31-1 bytes at once.
1768 result = _lib.SSL_write(
1769 self._ssl,
1770 data + total_sent,
1771 min(left_to_send, 2147483647)
1772 )
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001773 self._raise_ssl_error(self._ssl, result)
1774 total_sent += result
1775 left_to_send -= result
1776
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001777 def recv(self, bufsiz, flags=None):
1778 """
Alex Gaynor67fc8c92016-05-27 08:27:19 -04001779 Receive data on the connection.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001780
1781 :param bufsiz: The maximum number of bytes to read
Maximilian Hils1d95dea2015-08-17 19:27:20 +02001782 :param flags: (optional) The only supported flag is ``MSG_PEEK``,
1783 all other flags are ignored.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001784 :return: The string read from the Connection
1785 """
Cory Benfielde62840e2016-11-28 12:17:08 +00001786 buf = _no_zero_allocator("char[]", bufsiz)
Maximilian Hils1d95dea2015-08-17 19:27:20 +02001787 if flags is not None and flags & socket.MSG_PEEK:
1788 result = _lib.SSL_peek(self._ssl, buf, bufsiz)
1789 else:
1790 result = _lib.SSL_read(self._ssl, buf, bufsiz)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001791 self._raise_ssl_error(self._ssl, result)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001792 return _ffi.buffer(buf, result)[:]
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001793 read = recv
1794
Cory Benfield62d10332014-06-15 10:03:41 +01001795 def recv_into(self, buffer, nbytes=None, flags=None):
1796 """
Alex Chand072cae2018-02-15 09:57:59 +00001797 Receive data on the connection and copy it directly into the provided
1798 buffer, rather than creating a new string.
Cory Benfield62d10332014-06-15 10:03:41 +01001799
1800 :param buffer: The buffer to copy into.
1801 :param nbytes: (optional) The maximum number of bytes to read into the
1802 buffer. If not present, defaults to the size of the buffer. If
1803 larger than the size of the buffer, is reduced to the size of the
1804 buffer.
Maximilian Hils1d95dea2015-08-17 19:27:20 +02001805 :param flags: (optional) The only supported flag is ``MSG_PEEK``,
1806 all other flags are ignored.
Cory Benfield62d10332014-06-15 10:03:41 +01001807 :return: The number of bytes read into the buffer.
1808 """
1809 if nbytes is None:
1810 nbytes = len(buffer)
1811 else:
1812 nbytes = min(nbytes, len(buffer))
1813
1814 # We need to create a temporary buffer. This is annoying, it would be
1815 # better if we could pass memoryviews straight into the SSL_read call,
1816 # but right now we can't. Revisit this if CFFI gets that ability.
Cory Benfielde62840e2016-11-28 12:17:08 +00001817 buf = _no_zero_allocator("char[]", nbytes)
Maximilian Hils1d95dea2015-08-17 19:27:20 +02001818 if flags is not None and flags & socket.MSG_PEEK:
1819 result = _lib.SSL_peek(self._ssl, buf, nbytes)
1820 else:
1821 result = _lib.SSL_read(self._ssl, buf, nbytes)
Cory Benfield62d10332014-06-15 10:03:41 +01001822 self._raise_ssl_error(self._ssl, result)
1823
1824 # This strange line is all to avoid a memory copy. The buffer protocol
1825 # should allow us to assign a CFFI buffer to the LHS of this line, but
1826 # on CPython 3.3+ that segfaults. As a workaround, we can temporarily
Jeremy Lainé1ae7cb62018-03-21 14:49:42 +01001827 # wrap it in a memoryview.
1828 buffer[:result] = memoryview(_ffi.buffer(buf, result))
Cory Benfield62d10332014-06-15 10:03:41 +01001829
1830 return result
1831
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001832 def _handle_bio_errors(self, bio, result):
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001833 if _lib.BIO_should_retry(bio):
1834 if _lib.BIO_should_read(bio):
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001835 raise WantReadError()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001836 elif _lib.BIO_should_write(bio):
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001837 # TODO: This is untested.
Jean-Paul Calderoned899af02013-03-19 22:10:37 -07001838 raise WantWriteError()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001839 elif _lib.BIO_should_io_special(bio):
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001840 # TODO: This is untested. I think io_special means the socket
1841 # BIO has a not-yet connected socket.
Jean-Paul Calderoned899af02013-03-19 22:10:37 -07001842 raise ValueError("BIO_should_io_special")
1843 else:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001844 # TODO: This is untested.
Jean-Paul Calderoned899af02013-03-19 22:10:37 -07001845 raise ValueError("unknown bio failure")
1846 else:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001847 # TODO: This is untested.
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -05001848 _raise_current_error()
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001849
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001850 def bio_read(self, bufsiz):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001851 """
Alex Chand072cae2018-02-15 09:57:59 +00001852 If the Connection was created with a memory BIO, this method can be
1853 used to read bytes from the write end of that memory BIO. Many
1854 Connection methods will add bytes which must be read in this manner or
1855 the buffer will eventually fill up and the Connection will be able to
1856 take no further actions.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001857
1858 :param bufsiz: The maximum number of bytes to read
1859 :return: The string read.
1860 """
Jean-Paul Calderone97e041d2013-03-05 21:03:12 -08001861 if self._from_ssl is None:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001862 raise TypeError("Connection sock was not None")
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001863
Jean-Paul Calderonebef4f4c2014-02-02 18:13:31 -05001864 if not isinstance(bufsiz, integer_types):
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001865 raise TypeError("bufsiz must be an integer")
1866
Cory Benfielde62840e2016-11-28 12:17:08 +00001867 buf = _no_zero_allocator("char[]", bufsiz)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001868 result = _lib.BIO_read(self._from_ssl, buf, bufsiz)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001869 if result <= 0:
1870 self._handle_bio_errors(self._from_ssl, result)
1871
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001872 return _ffi.buffer(buf, result)[:]
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001873
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001874 def bio_write(self, buf):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001875 """
Alex Chand072cae2018-02-15 09:57:59 +00001876 If the Connection was created with a memory BIO, this method can be
1877 used to add bytes to the read end of that memory BIO. The Connection
1878 can then read the bytes (for example, in response to a call to
1879 :meth:`recv`).
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001880
1881 :param buf: The string to put into the memory BIO.
1882 :return: The number of bytes written
1883 """
Jean-Paul Calderone39a8d592015-04-13 20:49:50 -04001884 buf = _text_to_bytes_and_warn("buf", buf)
Abraham Martine82326c2015-02-04 10:18:10 +00001885
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001886 if self._into_ssl is None:
1887 raise TypeError("Connection sock was not None")
1888
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001889 result = _lib.BIO_write(self._into_ssl, buf, len(buf))
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001890 if result <= 0:
1891 self._handle_bio_errors(self._into_ssl, result)
1892 return result
1893
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001894 def renegotiate(self):
1895 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001896 Renegotiate the session.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001897
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001898 :return: True if the renegotiation can be started, False otherwise
1899 :rtype: bool
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001900 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001901 if not self.renegotiate_pending():
1902 _openssl_assert(_lib.SSL_renegotiate(self._ssl) == 1)
1903 return True
1904 return False
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001905
1906 def do_handshake(self):
1907 """
Alex Chand072cae2018-02-15 09:57:59 +00001908 Perform an SSL handshake (usually called after :meth:`renegotiate` or
1909 one of :meth:`set_accept_state` or :meth:`set_accept_state`). This can
1910 raise the same exceptions as :meth:`send` and :meth:`recv`.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001911
1912 :return: None.
1913 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001914 result = _lib.SSL_do_handshake(self._ssl)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001915 self._raise_ssl_error(self._ssl, result)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001916
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001917 def renegotiate_pending(self):
1918 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001919 Check if there's a renegotiation in progress, it will return False once
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001920 a renegotiation is finished.
1921
1922 :return: Whether there's a renegotiation in progress
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001923 :rtype: bool
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001924 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001925 return _lib.SSL_renegotiate_pending(self._ssl) == 1
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001926
1927 def total_renegotiations(self):
1928 """
1929 Find out the total number of renegotiations.
1930
1931 :return: The number of renegotiations.
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001932 :rtype: int
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001933 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001934 return _lib.SSL_total_renegotiations(self._ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001935
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001936 def connect(self, addr):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001937 """
Alex Chand072cae2018-02-15 09:57:59 +00001938 Call the :meth:`connect` method of the underlying socket and set up SSL
1939 on the socket, using the :class:`Context` object supplied to this
1940 :class:`Connection` object at creation.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001941
1942 :param addr: A remote address
1943 :return: What the socket's connect method returns
1944 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001945 _lib.SSL_set_connect_state(self._ssl)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001946 return self._socket.connect(addr)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001947
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001948 def connect_ex(self, addr):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001949 """
Alex Chand072cae2018-02-15 09:57:59 +00001950 Call the :meth:`connect_ex` method of the underlying socket and set up
1951 SSL on the socket, using the Context object supplied to this Connection
1952 object at creation. Note that if the :meth:`connect_ex` method of the
1953 socket doesn't return 0, SSL won't be initialized.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001954
1955 :param addr: A remove address
1956 :return: What the socket's connect_ex method returns
1957 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001958 connect_ex = self._socket.connect_ex
1959 self.set_connect_state()
1960 return connect_ex(addr)
1961
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001962 def accept(self):
1963 """
Alex Chand072cae2018-02-15 09:57:59 +00001964 Call the :meth:`accept` method of the underlying socket and set up SSL
1965 on the returned socket, using the Context object supplied to this
1966 :class:`Connection` object at creation.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001967
Alex Chand072cae2018-02-15 09:57:59 +00001968 :return: A *(conn, addr)* pair where *conn* is the new
1969 :class:`Connection` object created, and *address* is as returned by
1970 the socket's :meth:`accept`.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001971 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001972 client, addr = self._socket.accept()
1973 conn = Connection(self._context, client)
1974 conn.set_accept_state()
1975 return (conn, addr)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001976
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001977 def bio_shutdown(self):
1978 """
Alex Chand072cae2018-02-15 09:57:59 +00001979 If the Connection was created with a memory BIO, this method can be
1980 used to indicate that *end of file* has been reached on the read end of
1981 that memory BIO.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001982
1983 :return: None
1984 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001985 if self._from_ssl is None:
1986 raise TypeError("Connection sock was not None")
1987
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001988 _lib.BIO_set_mem_eof_return(self._into_ssl, 0)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001989
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001990 def shutdown(self):
1991 """
Alex Chand072cae2018-02-15 09:57:59 +00001992 Send the shutdown message to the Connection.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001993
1994 :return: True if the shutdown completed successfully (i.e. both sides
Alex Chand072cae2018-02-15 09:57:59 +00001995 have sent closure alerts), False otherwise (in which case you
1996 call :meth:`recv` or :meth:`send` when the connection becomes
1997 readable/writeable).
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001998 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001999 result = _lib.SSL_shutdown(self._ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002000 if result < 0:
Paul Aurichbff1d1a2015-01-08 08:36:53 -08002001 self._raise_ssl_error(self._ssl, result)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002002 elif result > 0:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002003 return True
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002004 else:
2005 return False
2006
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002007 def get_cipher_list(self):
2008 """
Hynek Schlawackf90e3682016-03-11 11:21:13 +01002009 Retrieve the list of ciphers used by the Connection object.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002010
Hynek Schlawackf90e3682016-03-11 11:21:13 +01002011 :return: A list of native cipher strings.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002012 """
2013 ciphers = []
2014 for i in count():
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002015 result = _lib.SSL_get_cipher_list(self._ssl, i)
2016 if result == _ffi.NULL:
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002017 break
Jean-Paul Calderone4f0467a2014-01-11 11:58:41 -05002018 ciphers.append(_native(_ffi.string(result)))
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002019 return ciphers
2020
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002021 def get_client_ca_list(self):
2022 """
2023 Get CAs whose certificates are suggested for client authentication.
2024
Alex Chand072cae2018-02-15 09:57:59 +00002025 :return: If this is a server connection, the list of certificate
2026 authorities that will be sent or has been sent to the client, as
2027 controlled by this :class:`Connection`'s :class:`Context`.
2028
2029 If this is a client connection, the list will be empty until the
2030 connection with the server is established.
2031
2032 .. versionadded:: 0.10
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002033 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002034 ca_names = _lib.SSL_get_client_CA_list(self._ssl)
2035 if ca_names == _ffi.NULL:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05002036 # TODO: This is untested.
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002037 return []
2038
2039 result = []
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002040 for i in range(_lib.sk_X509_NAME_num(ca_names)):
2041 name = _lib.sk_X509_NAME_value(ca_names, i)
2042 copy = _lib.X509_NAME_dup(name)
Alex Gaynora829e902016-06-04 18:16:01 -07002043 _openssl_assert(copy != _ffi.NULL)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002044
2045 pyname = X509Name.__new__(X509Name)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002046 pyname._name = _ffi.gc(copy, _lib.X509_NAME_free)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002047 result.append(pyname)
2048 return result
2049
Aykee7f33452018-05-16 19:18:16 +02002050 def makefile(self, *args, **kwargs):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002051 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04002052 The makefile() method is not implemented, since there is no dup
2053 semantics for SSL connections
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002054
Jean-Paul Calderone6749ec22014-04-17 16:30:21 -04002055 :raise: NotImplementedError
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002056 """
Alex Gaynor83284952015-09-05 10:43:30 -04002057 raise NotImplementedError(
2058 "Cannot make file object of OpenSSL.SSL.Connection")
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002059
2060 def get_app_data(self):
2061 """
Alex Chand072cae2018-02-15 09:57:59 +00002062 Retrieve application data as set by :meth:`set_app_data`.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002063
2064 :return: The application data
2065 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002066 return self._app_data
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002067
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002068 def set_app_data(self, data):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002069 """
2070 Set application data
2071
Alex Chand072cae2018-02-15 09:57:59 +00002072 :param data: The application data
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002073 :return: None
2074 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002075 self._app_data = data
2076
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002077 def get_shutdown(self):
2078 """
Alex Chand072cae2018-02-15 09:57:59 +00002079 Get the shutdown state of the Connection.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002080
Alex Gaynor62da94d2015-09-05 14:37:34 -04002081 :return: The shutdown state, a bitvector of SENT_SHUTDOWN,
2082 RECEIVED_SHUTDOWN.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002083 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002084 return _lib.SSL_get_shutdown(self._ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002085
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002086 def set_shutdown(self, state):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002087 """
Alex Chand072cae2018-02-15 09:57:59 +00002088 Set the shutdown state of the Connection.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002089
Alex Chand072cae2018-02-15 09:57:59 +00002090 :param state: bitvector of SENT_SHUTDOWN, RECEIVED_SHUTDOWN.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002091 :return: None
2092 """
Jean-Paul Calderonef73a3cb2014-02-09 08:49:06 -05002093 if not isinstance(state, integer_types):
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002094 raise TypeError("state must be an integer")
2095
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002096 _lib.SSL_set_shutdown(self._ssl, state)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002097
Hynek Schlawackea94f2b2016-03-13 16:17:53 +01002098 def get_state_string(self):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002099 """
Hynek Schlawackea94f2b2016-03-13 16:17:53 +01002100 Retrieve a verbose string detailing the state of the Connection.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002101
2102 :return: A string representing the state
Hynek Schlawackea94f2b2016-03-13 16:17:53 +01002103 :rtype: bytes
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002104 """
kjavc704a2e2015-09-07 12:12:27 +01002105 return _ffi.string(_lib.SSL_state_string_long(self._ssl))
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002106
2107 def server_random(self):
2108 """
Alex Chand072cae2018-02-15 09:57:59 +00002109 Retrieve the random value used with the server hello message.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002110
2111 :return: A string representing the state
2112 """
Alex Gaynor93603062016-06-01 20:13:09 -07002113 session = _lib.SSL_get_session(self._ssl)
2114 if session == _ffi.NULL:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002115 return None
Alex Gaynor93603062016-06-01 20:13:09 -07002116 length = _lib.SSL_get_server_random(self._ssl, _ffi.NULL, 0)
2117 assert length > 0
Cory Benfielde62840e2016-11-28 12:17:08 +00002118 outp = _no_zero_allocator("unsigned char[]", length)
Alex Gaynor93603062016-06-01 20:13:09 -07002119 _lib.SSL_get_server_random(self._ssl, outp, length)
2120 return _ffi.buffer(outp, length)[:]
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002121
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002122 def client_random(self):
2123 """
Alex Chand072cae2018-02-15 09:57:59 +00002124 Retrieve the random value used with the client hello message.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002125
2126 :return: A string representing the state
2127 """
Alex Gaynor93603062016-06-01 20:13:09 -07002128 session = _lib.SSL_get_session(self._ssl)
2129 if session == _ffi.NULL:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002130 return None
Alex Gaynor93603062016-06-01 20:13:09 -07002131
2132 length = _lib.SSL_get_client_random(self._ssl, _ffi.NULL, 0)
2133 assert length > 0
Cory Benfielde62840e2016-11-28 12:17:08 +00002134 outp = _no_zero_allocator("unsigned char[]", length)
Alex Gaynor93603062016-06-01 20:13:09 -07002135 _lib.SSL_get_client_random(self._ssl, outp, length)
2136 return _ffi.buffer(outp, length)[:]
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002137
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002138 def master_key(self):
2139 """
Alex Chand072cae2018-02-15 09:57:59 +00002140 Retrieve the value of the master key for this session.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002141
2142 :return: A string representing the state
2143 """
Alex Gaynor93603062016-06-01 20:13:09 -07002144 session = _lib.SSL_get_session(self._ssl)
2145 if session == _ffi.NULL:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002146 return None
Alex Gaynor93603062016-06-01 20:13:09 -07002147
2148 length = _lib.SSL_SESSION_get_master_key(session, _ffi.NULL, 0)
2149 assert length > 0
Cory Benfielde62840e2016-11-28 12:17:08 +00002150 outp = _no_zero_allocator("unsigned char[]", length)
Alex Gaynor93603062016-06-01 20:13:09 -07002151 _lib.SSL_SESSION_get_master_key(session, outp, length)
2152 return _ffi.buffer(outp, length)[:]
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002153
Paul Kehrerbdb76392017-12-01 04:54:32 +08002154 def export_keying_material(self, label, olen, context=None):
2155 """
2156 Obtain keying material for application use.
2157
Alex Chand072cae2018-02-15 09:57:59 +00002158 :param: label - a disambiguating label string as described in RFC 5705
2159 :param: olen - the length of the exported key material in bytes
2160 :param: context - a per-association context value
2161 :return: the exported key material bytes or None
Paul Kehrerbdb76392017-12-01 04:54:32 +08002162 """
2163 outp = _no_zero_allocator("unsigned char[]", olen)
2164 context_buf = _ffi.NULL
2165 context_len = 0
2166 use_context = 0
2167 if context is not None:
2168 context_buf = context
2169 context_len = len(context)
2170 use_context = 1
2171 success = _lib.SSL_export_keying_material(self._ssl, outp, olen,
2172 label, len(label),
2173 context_buf, context_len,
2174 use_context)
2175 _openssl_assert(success == 1)
2176 return _ffi.buffer(outp, olen)[:]
2177
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002178 def sock_shutdown(self, *args, **kwargs):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002179 """
Alex Chand072cae2018-02-15 09:57:59 +00002180 Call the :meth:`shutdown` method of the underlying socket.
2181 See :manpage:`shutdown(2)`.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002182
2183 :return: What the socket's shutdown() method returns
2184 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002185 return self._socket.shutdown(*args, **kwargs)
2186
Jeremy Lainé460a19d2018-05-16 19:44:19 +02002187 def get_certificate(self):
2188 """
2189 Retrieve the local certificate (if any)
2190
2191 :return: The local certificate
2192 """
2193 cert = _lib.SSL_get_certificate(self._ssl)
2194 if cert != _ffi.NULL:
2195 _lib.X509_up_ref(cert)
2196 return X509._from_raw_x509_ptr(cert)
2197 return None
2198
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002199 def get_peer_certificate(self):
2200 """
2201 Retrieve the other side's certificate (if any)
2202
2203 :return: The peer's certificate
2204 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002205 cert = _lib.SSL_get_peer_certificate(self._ssl)
2206 if cert != _ffi.NULL:
Alex Gaynor4aa52c32017-11-20 09:04:08 -05002207 return X509._from_raw_x509_ptr(cert)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002208 return None
2209
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002210 def get_peer_cert_chain(self):
2211 """
2212 Retrieve the other side's certificate (if any)
2213
2214 :return: A list of X509 instances giving the peer's certificate chain,
2215 or None if it does not have one.
2216 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002217 cert_stack = _lib.SSL_get_peer_cert_chain(self._ssl)
2218 if cert_stack == _ffi.NULL:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002219 return None
2220
2221 result = []
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002222 for i in range(_lib.sk_X509_num(cert_stack)):
Jean-Paul Calderone73b15c22013-03-05 18:30:39 -08002223 # TODO could incref instead of dup here
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002224 cert = _lib.X509_dup(_lib.sk_X509_value(cert_stack, i))
Alex Gaynor4aa52c32017-11-20 09:04:08 -05002225 pycert = X509._from_raw_x509_ptr(cert)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002226 result.append(pycert)
2227 return result
2228
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002229 def want_read(self):
2230 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04002231 Checks if more data has to be read from the transport layer to complete
2232 an operation.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002233
2234 :return: True iff more data has to be read
2235 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002236 return _lib.SSL_want_read(self._ssl)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002237
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002238 def want_write(self):
2239 """
2240 Checks if there is data to write to the transport layer to complete an
2241 operation.
2242
2243 :return: True iff there is data to write
2244 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002245 return _lib.SSL_want_write(self._ssl)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002246
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002247 def set_accept_state(self):
2248 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04002249 Set the connection to work in server mode. The handshake will be
2250 handled automatically by read/write.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002251
2252 :return: None
2253 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002254 _lib.SSL_set_accept_state(self._ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002255
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002256 def set_connect_state(self):
2257 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04002258 Set the connection to work in client mode. The handshake will be
2259 handled automatically by read/write.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002260
2261 :return: None
2262 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002263 _lib.SSL_set_connect_state(self._ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002264
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002265 def get_session(self):
2266 """
2267 Returns the Session currently used.
2268
Alex Chand072cae2018-02-15 09:57:59 +00002269 :return: An instance of :class:`OpenSSL.SSL.Session` or
2270 :obj:`None` if no session exists.
2271
2272 .. versionadded:: 0.14
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002273 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002274 session = _lib.SSL_get1_session(self._ssl)
2275 if session == _ffi.NULL:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002276 return None
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002277
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002278 pysession = Session.__new__(Session)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002279 pysession._session = _ffi.gc(session, _lib.SSL_SESSION_free)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002280 return pysession
2281
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002282 def set_session(self, session):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002283 """
2284 Set the session to be used when the TLS/SSL connection is established.
2285
2286 :param session: A Session instance representing the session to use.
2287 :returns: None
Alex Chand072cae2018-02-15 09:57:59 +00002288
2289 .. versionadded:: 0.14
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002290 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002291 if not isinstance(session, Session):
2292 raise TypeError("session must be a Session instance")
2293
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002294 result = _lib.SSL_set_session(self._ssl, session._session)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002295 if not result:
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -05002296 _raise_current_error()
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002297
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002298 def _get_finished_message(self, function):
2299 """
Alex Chand072cae2018-02-15 09:57:59 +00002300 Helper to implement :meth:`get_finished` and
2301 :meth:`get_peer_finished`.
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002302
Alex Chand072cae2018-02-15 09:57:59 +00002303 :param function: Either :data:`SSL_get_finished`: or
2304 :data:`SSL_get_peer_finished`.
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002305
Alex Chand072cae2018-02-15 09:57:59 +00002306 :return: :data:`None` if the desired message has not yet been
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002307 received, otherwise the contents of the message.
Alex Chand072cae2018-02-15 09:57:59 +00002308 :rtype: :class:`bytes` or :class:`NoneType`
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002309 """
Jean-Paul Calderone01af9042014-03-30 11:40:42 -04002310 # The OpenSSL documentation says nothing about what might happen if the
2311 # count argument given is zero. Specifically, it doesn't say whether
2312 # the output buffer may be NULL in that case or not. Inspection of the
2313 # implementation reveals that it calls memcpy() unconditionally.
2314 # Section 7.1.4, paragraph 1 of the C standard suggests that
2315 # memcpy(NULL, source, 0) is not guaranteed to produce defined (let
2316 # alone desirable) behavior (though it probably does on just about
2317 # every implementation...)
2318 #
2319 # Allocate a tiny buffer to pass in (instead of just passing NULL as
2320 # one might expect) for the initial call so as to be safe against this
2321 # potentially undefined behavior.
2322 empty = _ffi.new("char[]", 0)
2323 size = function(self._ssl, empty, 0)
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002324 if size == 0:
2325 # No Finished message so far.
2326 return None
2327
Cory Benfielde62840e2016-11-28 12:17:08 +00002328 buf = _no_zero_allocator("char[]", size)
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002329 function(self._ssl, buf, size)
2330 return _ffi.buffer(buf, size)[:]
2331
Fedor Brunner5747b932014-03-05 14:22:34 +01002332 def get_finished(self):
2333 """
Alex Chand072cae2018-02-15 09:57:59 +00002334 Obtain the latest TLS Finished message that we sent.
Fedor Brunner5747b932014-03-05 14:22:34 +01002335
Alex Chand072cae2018-02-15 09:57:59 +00002336 :return: The contents of the message or :obj:`None` if the TLS
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002337 handshake has not yet completed.
Alex Chand072cae2018-02-15 09:57:59 +00002338 :rtype: :class:`bytes` or :class:`NoneType`
2339
2340 .. versionadded:: 0.15
Fedor Brunner5747b932014-03-05 14:22:34 +01002341 """
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002342 return self._get_finished_message(_lib.SSL_get_finished)
2343
Fedor Brunner5747b932014-03-05 14:22:34 +01002344 def get_peer_finished(self):
2345 """
Alex Chand072cae2018-02-15 09:57:59 +00002346 Obtain the latest TLS Finished message that we received from the peer.
Fedor Brunner5747b932014-03-05 14:22:34 +01002347
Alex Chand072cae2018-02-15 09:57:59 +00002348 :return: The contents of the message or :obj:`None` if the TLS
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002349 handshake has not yet completed.
Alex Chand072cae2018-02-15 09:57:59 +00002350 :rtype: :class:`bytes` or :class:`NoneType`
2351
2352 .. versionadded:: 0.15
Fedor Brunner5747b932014-03-05 14:22:34 +01002353 """
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002354 return self._get_finished_message(_lib.SSL_get_peer_finished)
Fedor Brunner5747b932014-03-05 14:22:34 +01002355
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002356 def get_cipher_name(self):
2357 """
2358 Obtain the name of the currently used cipher.
Jean-Paul Calderone9e3ccd42014-03-29 18:13:36 -04002359
Alex Chand072cae2018-02-15 09:57:59 +00002360 :returns: The name of the currently used cipher or :obj:`None`
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002361 if no connection has been established.
Alex Chand072cae2018-02-15 09:57:59 +00002362 :rtype: :class:`unicode` or :class:`NoneType`
2363
2364 .. versionadded:: 0.15
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002365 """
2366 cipher = _lib.SSL_get_current_cipher(self._ssl)
2367 if cipher == _ffi.NULL:
2368 return None
2369 else:
Jean-Paul Calderone7f0ded42014-03-30 10:34:17 -04002370 name = _ffi.string(_lib.SSL_CIPHER_get_name(cipher))
2371 return name.decode("utf-8")
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002372
2373 def get_cipher_bits(self):
2374 """
2375 Obtain the number of secret bits of the currently used cipher.
Jean-Paul Calderone9e3ccd42014-03-29 18:13:36 -04002376
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002377 :returns: The number of secret bits of the currently used cipher
Alex Chand072cae2018-02-15 09:57:59 +00002378 or :obj:`None` if no connection has been established.
2379 :rtype: :class:`int` or :class:`NoneType`
2380
2381 .. versionadded:: 0.15
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002382 """
2383 cipher = _lib.SSL_get_current_cipher(self._ssl)
2384 if cipher == _ffi.NULL:
2385 return None
2386 else:
2387 return _lib.SSL_CIPHER_get_bits(cipher, _ffi.NULL)
2388
2389 def get_cipher_version(self):
2390 """
Jean-Paul Calderone9e3ccd42014-03-29 18:13:36 -04002391 Obtain the protocol version of the currently used cipher.
2392
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002393 :returns: The protocol name of the currently used cipher
Alex Chand072cae2018-02-15 09:57:59 +00002394 or :obj:`None` if no connection has been established.
2395 :rtype: :class:`unicode` or :class:`NoneType`
2396
2397 .. versionadded:: 0.15
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002398 """
2399 cipher = _lib.SSL_get_current_cipher(self._ssl)
2400 if cipher == _ffi.NULL:
2401 return None
2402 else:
Alex Gaynorc4889812015-09-04 08:43:17 -04002403 version = _ffi.string(_lib.SSL_CIPHER_get_version(cipher))
Jean-Paul Calderone7f0ded42014-03-30 10:34:17 -04002404 return version.decode("utf-8")
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002405
Jim Shaverabff1882015-05-27 09:15:55 -04002406 def get_protocol_version_name(self):
Jim Shaverba65e662015-04-26 12:23:40 -04002407 """
Alex Chand072cae2018-02-15 09:57:59 +00002408 Retrieve the protocol version of the current connection.
Jim Shaverba65e662015-04-26 12:23:40 -04002409
2410 :returns: The TLS version of the current connection, for example
Jim Shaver58d25732015-05-28 11:52:32 -04002411 the value for TLS 1.2 would be ``TLSv1.2``or ``Unknown``
Jim Shaverb5b6b0e2015-05-28 16:47:36 -04002412 for connections that were not successfully established.
Alex Chand072cae2018-02-15 09:57:59 +00002413 :rtype: :class:`unicode`
Jim Shaverba65e662015-04-26 12:23:40 -04002414 """
Jim Shaverd1c896e2015-05-27 17:50:21 -04002415 version = _ffi.string(_lib.SSL_get_version(self._ssl))
Jim Shaver58d25732015-05-28 11:52:32 -04002416 return version.decode("utf-8")
Jim Shaverb2967922015-04-26 23:58:52 -04002417
Jim Shaver208438c2015-05-28 09:52:38 -04002418 def get_protocol_version(self):
2419 """
Alex Chand072cae2018-02-15 09:57:59 +00002420 Retrieve the SSL or TLS protocol version of the current connection.
Jim Shaver208438c2015-05-28 09:52:38 -04002421
Alex Chand072cae2018-02-15 09:57:59 +00002422 :returns: The TLS version of the current connection. For example,
2423 it will return ``0x769`` for connections made over TLS version 1.
2424 :rtype: :class:`int`
Jim Shaver208438c2015-05-28 09:52:38 -04002425 """
2426 version = _lib.SSL_version(self._ssl)
2427 return version
2428
Cory Benfield10b277f2015-04-13 17:12:42 -04002429 @_requires_npn
Cory Benfield84a121e2014-03-31 20:30:25 +01002430 def get_next_proto_negotiated(self):
2431 """
2432 Get the protocol that was negotiated by NPN.
Alex Chand072cae2018-02-15 09:57:59 +00002433
2434 :returns: A bytestring of the protocol name. If no protocol has been
2435 negotiated yet, returns an empty string.
2436
2437 .. versionadded:: 0.15
Cory Benfield84a121e2014-03-31 20:30:25 +01002438 """
2439 data = _ffi.new("unsigned char **")
2440 data_len = _ffi.new("unsigned int *")
2441
2442 _lib.SSL_get0_next_proto_negotiated(self._ssl, data, data_len)
2443
Cory Benfieldcd010f62014-05-15 19:00:27 +01002444 return _ffi.buffer(data[0], data_len[0])[:]
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002445
Cory Benfield7907e332015-04-13 17:18:25 -04002446 @_requires_alpn
Cory Benfield12eae892014-06-07 15:42:56 +01002447 def set_alpn_protos(self, protos):
2448 """
Cory Benfielde8e9c382015-04-11 17:33:48 -04002449 Specify the client's ALPN protocol list.
2450
2451 These protocols are offered to the server during protocol negotiation.
Cory Benfield12eae892014-06-07 15:42:56 +01002452
2453 :param protos: A list of the protocols to be offered to the server.
2454 This list should be a Python list of bytestrings representing the
2455 protocols to offer, e.g. ``[b'http/1.1', b'spdy/2']``.
2456 """
2457 # Take the list of protocols and join them together, prefixing them
2458 # with their lengths.
2459 protostr = b''.join(
2460 chain.from_iterable((int2byte(len(p)), p) for p in protos)
2461 )
2462
2463 # Build a C string from the list. We don't need to save this off
2464 # because OpenSSL immediately copies the data out.
2465 input_str = _ffi.new("unsigned char[]", protostr)
Alex Gaynord61c46a2017-06-29 22:51:33 -07002466 _lib.SSL_set_alpn_protos(self._ssl, input_str, len(protostr))
Cory Benfield12eae892014-06-07 15:42:56 +01002467
Maximilian Hils66ded6a2015-08-26 06:02:03 +02002468 @_requires_alpn
Cory Benfield12eae892014-06-07 15:42:56 +01002469 def get_alpn_proto_negotiated(self):
Cory Benfield222f30e2015-04-13 18:10:21 -04002470 """
2471 Get the protocol that was negotiated by ALPN.
Alex Chand072cae2018-02-15 09:57:59 +00002472
2473 :returns: A bytestring of the protocol name. If no protocol has been
2474 negotiated yet, returns an empty string.
Cory Benfield222f30e2015-04-13 18:10:21 -04002475 """
Cory Benfield12eae892014-06-07 15:42:56 +01002476 data = _ffi.new("unsigned char **")
2477 data_len = _ffi.new("unsigned int *")
2478
2479 _lib.SSL_get0_alpn_selected(self._ssl, data, data_len)
2480
Cory Benfielde8e9c382015-04-11 17:33:48 -04002481 if not data_len:
2482 return b''
2483
Cory Benfield12eae892014-06-07 15:42:56 +01002484 return _ffi.buffer(data[0], data_len[0])[:]
2485
Cory Benfield496652a2017-01-24 11:42:56 +00002486 def request_ocsp(self):
2487 """
2488 Called to request that the server sends stapled OCSP data, if
2489 available. If this is not called on the client side then the server
2490 will not send OCSP data. Should be used in conjunction with
2491 :meth:`Context.set_ocsp_client_callback`.
2492 """
2493 rc = _lib.SSL_set_tlsext_status_type(
2494 self._ssl, _lib.TLSEXT_STATUSTYPE_ocsp
2495 )
2496 _openssl_assert(rc == 1)
2497
Cory Benfield12eae892014-06-07 15:42:56 +01002498
Alex Gaynor10d30832017-06-29 15:31:39 -07002499ConnectionType = deprecated(
2500 Connection, __name__,
2501 "ConnectionType has been deprecated, use Connection instead",
2502 DeprecationWarning
2503)
Jean-Paul Calderone11ed8e82014-01-18 10:21:50 -05002504
Jean-Paul Calderonefab157b2014-01-18 11:21:38 -05002505# This is similar to the initialization calls at the end of OpenSSL/crypto.py
2506# but is exercised mostly by the Context initializer.
Jean-Paul Calderone11ed8e82014-01-18 10:21:50 -05002507_lib.SSL_library_init()