blob: 25308f14c85afff2edd4a6a0a8bcea9309d01f64 [file] [log] [blame]
Paul Kehrer55fb3412017-06-29 18:44:08 -05001import os
Maximilian Hils1d95dea2015-08-17 19:27:20 +02002import socket
Alex Gaynorbe2bd542019-02-21 21:41:22 -05003import warnings
Konstantinos Koukopoulos541150d2014-01-31 01:00:19 +02004from sys import platform
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -05005from functools import wraps, partial
Cory Benfieldbe3e7b82014-05-10 09:48:55 +01006from itertools import count, chain
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08007from weakref import WeakValueDictionary
8from errno import errorcode
Jean-Paul Calderone935d2da2013-03-04 08:11:19 -08009
Alex Gaynor12576002019-11-18 00:18:50 -050010from six import integer_types, int2byte, indexbytes
Jean-Paul Calderone63eab692014-01-18 10:19:56 -050011
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -050012from OpenSSL._util import (
Hynek Schlawackaa861212016-03-13 13:53:48 +010013 UNSPECIFIED as _UNSPECIFIED,
14 exception_from_error_queue as _exception_from_error_queue,
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -050015 ffi as _ffi,
Daniel Holth079c9632019-11-17 22:45:52 -050016 from_buffer as _from_buffer,
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -050017 lib as _lib,
Hynek Schlawackf90e3682016-03-11 11:21:13 +010018 make_assert as _make_assert,
Hynek Schlawackaa861212016-03-13 13:53:48 +010019 native as _native,
Jean-Paul Calderone55f9e882015-04-12 09:31:03 -040020 path_string as _path_string,
Hynek Schlawackaa861212016-03-13 13:53:48 +010021 text_to_bytes_and_warn as _text_to_bytes_and_warn,
Cory Benfielde62840e2016-11-28 12:17:08 +000022 no_zero_allocator as _no_zero_allocator,
Jean-Paul Calderone55f9e882015-04-12 09:31:03 -040023)
Jean-Paul Calderone935d2da2013-03-04 08:11:19 -080024
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -080025from OpenSSL.crypto import (
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -050026 FILETYPE_PEM, _PassphraseHelper, PKey, X509Name, X509, X509Store)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -080027
Nicolas Karolak736c6212017-11-26 14:40:28 +010028__all__ = [
29 'OPENSSL_VERSION_NUMBER',
30 'SSLEAY_VERSION',
31 'SSLEAY_CFLAGS',
32 'SSLEAY_PLATFORM',
33 'SSLEAY_DIR',
34 'SSLEAY_BUILT_ON',
35 'SENT_SHUTDOWN',
36 'RECEIVED_SHUTDOWN',
37 'SSLv2_METHOD',
38 'SSLv3_METHOD',
39 'SSLv23_METHOD',
40 'TLSv1_METHOD',
41 'TLSv1_1_METHOD',
42 'TLSv1_2_METHOD',
43 'OP_NO_SSLv2',
44 'OP_NO_SSLv3',
45 'OP_NO_TLSv1',
46 'OP_NO_TLSv1_1',
47 'OP_NO_TLSv1_2',
Nathaniel J. Smitha1813732019-08-01 21:32:13 -070048 'OP_NO_TLSv1_3',
Nicolas Karolak736c6212017-11-26 14:40:28 +010049 'MODE_RELEASE_BUFFERS',
50 'OP_SINGLE_DH_USE',
51 'OP_SINGLE_ECDH_USE',
52 'OP_EPHEMERAL_RSA',
53 'OP_MICROSOFT_SESS_ID_BUG',
54 'OP_NETSCAPE_CHALLENGE_BUG',
55 'OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG',
56 'OP_SSLREF2_REUSE_CERT_TYPE_BUG',
57 'OP_MICROSOFT_BIG_SSLV3_BUFFER',
58 'OP_MSIE_SSLV2_RSA_PADDING',
59 'OP_SSLEAY_080_CLIENT_DH_BUG',
60 'OP_TLS_D5_BUG',
61 'OP_TLS_BLOCK_PADDING_BUG',
62 'OP_DONT_INSERT_EMPTY_FRAGMENTS',
63 'OP_CIPHER_SERVER_PREFERENCE',
64 'OP_TLS_ROLLBACK_BUG',
65 'OP_PKCS1_CHECK_1',
66 'OP_PKCS1_CHECK_2',
67 'OP_NETSCAPE_CA_DN_BUG',
68 'OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG',
69 'OP_NO_COMPRESSION',
70 'OP_NO_QUERY_MTU',
71 'OP_COOKIE_EXCHANGE',
72 'OP_NO_TICKET',
73 'OP_ALL',
74 'VERIFY_PEER',
75 'VERIFY_FAIL_IF_NO_PEER_CERT',
76 'VERIFY_CLIENT_ONCE',
77 'VERIFY_NONE',
78 'SESS_CACHE_OFF',
79 'SESS_CACHE_CLIENT',
80 'SESS_CACHE_SERVER',
81 'SESS_CACHE_BOTH',
82 'SESS_CACHE_NO_AUTO_CLEAR',
83 'SESS_CACHE_NO_INTERNAL_LOOKUP',
84 'SESS_CACHE_NO_INTERNAL_STORE',
85 'SESS_CACHE_NO_INTERNAL',
86 'SSL_ST_CONNECT',
87 'SSL_ST_ACCEPT',
88 'SSL_ST_MASK',
Nicolas Karolak736c6212017-11-26 14:40:28 +010089 'SSL_CB_LOOP',
90 'SSL_CB_EXIT',
91 'SSL_CB_READ',
92 'SSL_CB_WRITE',
93 'SSL_CB_ALERT',
94 'SSL_CB_READ_ALERT',
95 'SSL_CB_WRITE_ALERT',
96 'SSL_CB_ACCEPT_LOOP',
97 'SSL_CB_ACCEPT_EXIT',
98 'SSL_CB_CONNECT_LOOP',
99 'SSL_CB_CONNECT_EXIT',
100 'SSL_CB_HANDSHAKE_START',
101 'SSL_CB_HANDSHAKE_DONE',
102 'Error',
103 'WantReadError',
104 'WantWriteError',
105 'WantX509LookupError',
106 'ZeroReturnError',
107 'SysCallError',
108 'SSLeay_version',
109 'Session',
110 'Context',
111 'Connection'
112]
113
Jean-Paul Calderone8fb53182013-12-30 08:35:49 -0500114try:
Markus Unterwaditzer8e41d022014-04-19 12:27:11 +0200115 _buffer = buffer
116except NameError:
117 class _buffer(object):
118 pass
119
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500120OPENSSL_VERSION_NUMBER = _lib.OPENSSL_VERSION_NUMBER
121SSLEAY_VERSION = _lib.SSLEAY_VERSION
122SSLEAY_CFLAGS = _lib.SSLEAY_CFLAGS
123SSLEAY_PLATFORM = _lib.SSLEAY_PLATFORM
124SSLEAY_DIR = _lib.SSLEAY_DIR
125SSLEAY_BUILT_ON = _lib.SSLEAY_BUILT_ON
Jean-Paul Calderone935d2da2013-03-04 08:11:19 -0800126
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500127SENT_SHUTDOWN = _lib.SSL_SENT_SHUTDOWN
128RECEIVED_SHUTDOWN = _lib.SSL_RECEIVED_SHUTDOWN
Jean-Paul Calderone935d2da2013-03-04 08:11:19 -0800129
130SSLv2_METHOD = 1
131SSLv3_METHOD = 2
132SSLv23_METHOD = 3
133TLSv1_METHOD = 4
Jean-Paul Calderone56bff942013-11-03 11:30:43 -0500134TLSv1_1_METHOD = 5
135TLSv1_2_METHOD = 6
Jean-Paul Calderone935d2da2013-03-04 08:11:19 -0800136
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500137OP_NO_SSLv2 = _lib.SSL_OP_NO_SSLv2
138OP_NO_SSLv3 = _lib.SSL_OP_NO_SSLv3
139OP_NO_TLSv1 = _lib.SSL_OP_NO_TLSv1
Alex Gaynor336d8022017-06-29 21:46:42 -0700140OP_NO_TLSv1_1 = _lib.SSL_OP_NO_TLSv1_1
141OP_NO_TLSv1_2 = _lib.SSL_OP_NO_TLSv1_2
Nathaniel J. Smitha1813732019-08-01 21:32:13 -0700142try:
143 OP_NO_TLSv1_3 = _lib.SSL_OP_NO_TLSv1_3
144except AttributeError:
145 pass
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -0800146
Alex Gaynorbf012872016-06-04 13:18:39 -0700147MODE_RELEASE_BUFFERS = _lib.SSL_MODE_RELEASE_BUFFERS
Jean-Paul Calderone935d2da2013-03-04 08:11:19 -0800148
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500149OP_SINGLE_DH_USE = _lib.SSL_OP_SINGLE_DH_USE
Akihiro Yamazakie64d80c2015-09-06 00:16:57 +0900150OP_SINGLE_ECDH_USE = _lib.SSL_OP_SINGLE_ECDH_USE
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500151OP_EPHEMERAL_RSA = _lib.SSL_OP_EPHEMERAL_RSA
152OP_MICROSOFT_SESS_ID_BUG = _lib.SSL_OP_MICROSOFT_SESS_ID_BUG
153OP_NETSCAPE_CHALLENGE_BUG = _lib.SSL_OP_NETSCAPE_CHALLENGE_BUG
Alex Gaynor62da94d2015-09-05 14:37:34 -0400154OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG = (
155 _lib.SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG
156)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500157OP_SSLREF2_REUSE_CERT_TYPE_BUG = _lib.SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG
158OP_MICROSOFT_BIG_SSLV3_BUFFER = _lib.SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER
Alex Gaynor5bb2bd12016-07-03 10:48:32 -0400159OP_MSIE_SSLV2_RSA_PADDING = _lib.SSL_OP_MSIE_SSLV2_RSA_PADDING
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500160OP_SSLEAY_080_CLIENT_DH_BUG = _lib.SSL_OP_SSLEAY_080_CLIENT_DH_BUG
161OP_TLS_D5_BUG = _lib.SSL_OP_TLS_D5_BUG
162OP_TLS_BLOCK_PADDING_BUG = _lib.SSL_OP_TLS_BLOCK_PADDING_BUG
163OP_DONT_INSERT_EMPTY_FRAGMENTS = _lib.SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS
164OP_CIPHER_SERVER_PREFERENCE = _lib.SSL_OP_CIPHER_SERVER_PREFERENCE
165OP_TLS_ROLLBACK_BUG = _lib.SSL_OP_TLS_ROLLBACK_BUG
166OP_PKCS1_CHECK_1 = _lib.SSL_OP_PKCS1_CHECK_1
167OP_PKCS1_CHECK_2 = _lib.SSL_OP_PKCS1_CHECK_2
168OP_NETSCAPE_CA_DN_BUG = _lib.SSL_OP_NETSCAPE_CA_DN_BUG
Alex Gaynor62da94d2015-09-05 14:37:34 -0400169OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG = (
170 _lib.SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG
171)
Alex Gaynorbf012872016-06-04 13:18:39 -0700172OP_NO_COMPRESSION = _lib.SSL_OP_NO_COMPRESSION
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -0800173
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500174OP_NO_QUERY_MTU = _lib.SSL_OP_NO_QUERY_MTU
175OP_COOKIE_EXCHANGE = _lib.SSL_OP_COOKIE_EXCHANGE
Alex Gaynor5bb2bd12016-07-03 10:48:32 -0400176OP_NO_TICKET = _lib.SSL_OP_NO_TICKET
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -0800177
Alex Gaynorc4889812015-09-04 08:43:17 -0400178OP_ALL = _lib.SSL_OP_ALL
Jean-Paul Calderone935d2da2013-03-04 08:11:19 -0800179
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500180VERIFY_PEER = _lib.SSL_VERIFY_PEER
181VERIFY_FAIL_IF_NO_PEER_CERT = _lib.SSL_VERIFY_FAIL_IF_NO_PEER_CERT
182VERIFY_CLIENT_ONCE = _lib.SSL_VERIFY_CLIENT_ONCE
183VERIFY_NONE = _lib.SSL_VERIFY_NONE
Jean-Paul Calderone935d2da2013-03-04 08:11:19 -0800184
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500185SESS_CACHE_OFF = _lib.SSL_SESS_CACHE_OFF
186SESS_CACHE_CLIENT = _lib.SSL_SESS_CACHE_CLIENT
187SESS_CACHE_SERVER = _lib.SSL_SESS_CACHE_SERVER
188SESS_CACHE_BOTH = _lib.SSL_SESS_CACHE_BOTH
189SESS_CACHE_NO_AUTO_CLEAR = _lib.SSL_SESS_CACHE_NO_AUTO_CLEAR
190SESS_CACHE_NO_INTERNAL_LOOKUP = _lib.SSL_SESS_CACHE_NO_INTERNAL_LOOKUP
191SESS_CACHE_NO_INTERNAL_STORE = _lib.SSL_SESS_CACHE_NO_INTERNAL_STORE
192SESS_CACHE_NO_INTERNAL = _lib.SSL_SESS_CACHE_NO_INTERNAL
Jean-Paul Calderoned39a3f62013-03-04 12:23:51 -0800193
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500194SSL_ST_CONNECT = _lib.SSL_ST_CONNECT
195SSL_ST_ACCEPT = _lib.SSL_ST_ACCEPT
196SSL_ST_MASK = _lib.SSL_ST_MASK
Alex Gaynor5af32d02016-09-24 01:52:21 -0400197if _lib.Cryptography_HAS_SSL_ST:
198 SSL_ST_INIT = _lib.SSL_ST_INIT
199 SSL_ST_BEFORE = _lib.SSL_ST_BEFORE
200 SSL_ST_OK = _lib.SSL_ST_OK
201 SSL_ST_RENEGOTIATE = _lib.SSL_ST_RENEGOTIATE
Ondřej Nový993c4e42018-03-01 14:09:37 +0100202 __all__.extend([
203 'SSL_ST_INIT',
204 'SSL_ST_BEFORE',
205 'SSL_ST_OK',
206 'SSL_ST_RENEGOTIATE',
207 ])
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -0800208
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500209SSL_CB_LOOP = _lib.SSL_CB_LOOP
210SSL_CB_EXIT = _lib.SSL_CB_EXIT
211SSL_CB_READ = _lib.SSL_CB_READ
212SSL_CB_WRITE = _lib.SSL_CB_WRITE
213SSL_CB_ALERT = _lib.SSL_CB_ALERT
214SSL_CB_READ_ALERT = _lib.SSL_CB_READ_ALERT
215SSL_CB_WRITE_ALERT = _lib.SSL_CB_WRITE_ALERT
216SSL_CB_ACCEPT_LOOP = _lib.SSL_CB_ACCEPT_LOOP
217SSL_CB_ACCEPT_EXIT = _lib.SSL_CB_ACCEPT_EXIT
218SSL_CB_CONNECT_LOOP = _lib.SSL_CB_CONNECT_LOOP
219SSL_CB_CONNECT_EXIT = _lib.SSL_CB_CONNECT_EXIT
220SSL_CB_HANDSHAKE_START = _lib.SSL_CB_HANDSHAKE_START
221SSL_CB_HANDSHAKE_DONE = _lib.SSL_CB_HANDSHAKE_DONE
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -0800222
Paul Kehrer55fb3412017-06-29 18:44:08 -0500223# Taken from https://golang.org/src/crypto/x509/root_linux.go
224_CERTIFICATE_FILE_LOCATIONS = [
225 "/etc/ssl/certs/ca-certificates.crt", # Debian/Ubuntu/Gentoo etc.
226 "/etc/pki/tls/certs/ca-bundle.crt", # Fedora/RHEL 6
227 "/etc/ssl/ca-bundle.pem", # OpenSUSE
228 "/etc/pki/tls/cacert.pem", # OpenELEC
229 "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem", # CentOS/RHEL 7
230]
231
232_CERTIFICATE_PATH_LOCATIONS = [
233 "/etc/ssl/certs", # SLES10/SLES11
234]
235
Paul Kehrera92a1a72017-07-19 15:53:23 +0200236# These values are compared to output from cffi's ffi.string so they must be
237# byte strings.
238_CRYPTOGRAPHY_MANYLINUX1_CA_DIR = b"/opt/pyca/cryptography/openssl/certs"
239_CRYPTOGRAPHY_MANYLINUX1_CA_FILE = b"/opt/pyca/cryptography/openssl/cert.pem"
Paul Kehrer55fb3412017-06-29 18:44:08 -0500240
Alex Gaynor83284952015-09-05 10:43:30 -0400241
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500242class Error(Exception):
Jean-Paul Calderone511cde02013-12-29 10:31:13 -0500243 """
244 An error occurred in an `OpenSSL.SSL` API.
245 """
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500246
247
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500248_raise_current_error = partial(_exception_from_error_queue, Error)
Hynek Schlawackf90e3682016-03-11 11:21:13 +0100249_openssl_assert = _make_assert(Error)
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500250
251
252class WantReadError(Error):
253 pass
254
255
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500256class WantWriteError(Error):
257 pass
258
259
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500260class WantX509LookupError(Error):
261 pass
262
263
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500264class ZeroReturnError(Error):
265 pass
266
267
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500268class SysCallError(Error):
269 pass
270
271
Cory Benfield0ea76e72015-03-22 09:05:28 +0000272class _CallbackExceptionHelper(object):
273 """
274 A base class for wrapper classes that allow for intelligent exception
275 handling in OpenSSL callbacks.
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500276
Jean-Paul Calderone1b172982015-03-22 19:37:11 -0400277 :ivar list _problems: Any exceptions that occurred while executing in a
278 context where they could not be raised in the normal way. Typically
279 this is because OpenSSL has called into some Python code and requires a
280 return value. The exceptions are saved to be raised later when it is
281 possible to do so.
Cory Benfield0ea76e72015-03-22 09:05:28 +0000282 """
Alex Gaynor62da94d2015-09-05 14:37:34 -0400283
Jean-Paul Calderone09540d72015-03-22 19:37:20 -0400284 def __init__(self):
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800285 self._problems = []
286
Cory Benfield0ea76e72015-03-22 09:05:28 +0000287 def raise_if_problem(self):
Jean-Paul Calderone1b172982015-03-22 19:37:11 -0400288 """
289 Raise an exception from the OpenSSL error queue or that was previously
290 captured whe running a callback.
291 """
Cory Benfield0ea76e72015-03-22 09:05:28 +0000292 if self._problems:
293 try:
294 _raise_current_error()
295 except Error:
296 pass
297 raise self._problems.pop(0)
298
299
300class _VerifyHelper(_CallbackExceptionHelper):
Jean-Paul Calderone1b172982015-03-22 19:37:11 -0400301 """
302 Wrap a callback such that it can be used as a certificate verification
303 callback.
304 """
Alex Gaynor62da94d2015-09-05 14:37:34 -0400305
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800306 def __init__(self, callback):
Jean-Paul Calderone837f4032015-03-22 17:38:28 -0400307 _CallbackExceptionHelper.__init__(self)
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800308
309 @wraps(callback)
310 def wrapper(ok, store_ctx):
Paul Kehrere7381862017-11-30 20:55:25 +0800311 x509 = _lib.X509_STORE_CTX_get_current_cert(store_ctx)
312 _lib.X509_up_ref(x509)
313 cert = X509._from_raw_x509_ptr(x509)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500314 error_number = _lib.X509_STORE_CTX_get_error(store_ctx)
315 error_depth = _lib.X509_STORE_CTX_get_error_depth(store_ctx)
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800316
Jean-Paul Calderone6a8cd112014-04-02 21:09:08 -0400317 index = _lib.SSL_get_ex_data_X509_STORE_CTX_idx()
318 ssl = _lib.X509_STORE_CTX_get_ex_data(store_ctx, index)
319 connection = Connection._reverse_mapping[ssl]
320
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800321 try:
Alex Gaynor62da94d2015-09-05 14:37:34 -0400322 result = callback(
323 connection, cert, error_number, error_depth, ok
324 )
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800325 except Exception as e:
326 self._problems.append(e)
327 return 0
328 else:
329 if result:
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500330 _lib.X509_STORE_CTX_set_error(store_ctx, _lib.X509_V_OK)
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800331 return 1
332 else:
333 return 0
334
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500335 self.callback = _ffi.callback(
336 "int (*)(int, X509_STORE_CTX *)", wrapper)
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800337
338
Cory Benfield0ea76e72015-03-22 09:05:28 +0000339class _NpnAdvertiseHelper(_CallbackExceptionHelper):
Jean-Paul Calderone1b172982015-03-22 19:37:11 -0400340 """
341 Wrap a callback such that it can be used as an NPN advertisement callback.
342 """
Alex Gaynor62da94d2015-09-05 14:37:34 -0400343
Cory Benfield0ea76e72015-03-22 09:05:28 +0000344 def __init__(self, callback):
Jean-Paul Calderone837f4032015-03-22 17:38:28 -0400345 _CallbackExceptionHelper.__init__(self)
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800346
Cory Benfield0ea76e72015-03-22 09:05:28 +0000347 @wraps(callback)
348 def wrapper(ssl, out, outlen, arg):
349 try:
350 conn = Connection._reverse_mapping[ssl]
351 protos = callback(conn)
352
353 # Join the protocols into a Python bytestring, length-prefixing
354 # each element.
355 protostr = b''.join(
356 chain.from_iterable((int2byte(len(p)), p) for p in protos)
357 )
358
359 # Save our callback arguments on the connection object. This is
360 # done to make sure that they don't get freed before OpenSSL
361 # uses them. Then, return them appropriately in the output
362 # parameters.
363 conn._npn_advertise_callback_args = [
364 _ffi.new("unsigned int *", len(protostr)),
365 _ffi.new("unsigned char[]", protostr),
366 ]
367 outlen[0] = conn._npn_advertise_callback_args[0][0]
368 out[0] = conn._npn_advertise_callback_args[1]
369 return 0
370 except Exception as e:
371 self._problems.append(e)
372 return 2 # SSL_TLSEXT_ERR_ALERT_FATAL
373
374 self.callback = _ffi.callback(
375 "int (*)(SSL *, const unsigned char **, unsigned int *, void *)",
376 wrapper
377 )
378
379
380class _NpnSelectHelper(_CallbackExceptionHelper):
Jean-Paul Calderone1b172982015-03-22 19:37:11 -0400381 """
382 Wrap a callback such that it can be used as an NPN selection callback.
383 """
Alex Gaynor62da94d2015-09-05 14:37:34 -0400384
Cory Benfield0ea76e72015-03-22 09:05:28 +0000385 def __init__(self, callback):
Jean-Paul Calderone837f4032015-03-22 17:38:28 -0400386 _CallbackExceptionHelper.__init__(self)
Cory Benfield0ea76e72015-03-22 09:05:28 +0000387
388 @wraps(callback)
389 def wrapper(ssl, out, outlen, in_, inlen, arg):
390 try:
391 conn = Connection._reverse_mapping[ssl]
392
393 # The string passed to us is actually made up of multiple
394 # length-prefixed bytestrings. We need to split that into a
395 # list.
396 instr = _ffi.buffer(in_, inlen)[:]
397 protolist = []
398 while instr:
Alex Gaynorc3697ad2017-11-20 08:19:32 -0500399 length = indexbytes(instr, 0)
400 proto = instr[1:length + 1]
Cory Benfield0ea76e72015-03-22 09:05:28 +0000401 protolist.append(proto)
Alex Gaynorc3697ad2017-11-20 08:19:32 -0500402 instr = instr[length + 1:]
Cory Benfield0ea76e72015-03-22 09:05:28 +0000403
404 # Call the callback
405 outstr = callback(conn, protolist)
406
407 # Save our callback arguments on the connection object. This is
408 # done to make sure that they don't get freed before OpenSSL
409 # uses them. Then, return them appropriately in the output
410 # parameters.
411 conn._npn_select_callback_args = [
412 _ffi.new("unsigned char *", len(outstr)),
413 _ffi.new("unsigned char[]", outstr),
414 ]
415 outlen[0] = conn._npn_select_callback_args[0][0]
416 out[0] = conn._npn_select_callback_args[1]
417 return 0
418 except Exception as e:
419 self._problems.append(e)
420 return 2 # SSL_TLSEXT_ERR_ALERT_FATAL
421
422 self.callback = _ffi.callback(
Alex Gaynor62da94d2015-09-05 14:37:34 -0400423 ("int (*)(SSL *, unsigned char **, unsigned char *, "
424 "const unsigned char *, unsigned int, void *)"),
Cory Benfield0ea76e72015-03-22 09:05:28 +0000425 wrapper
426 )
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800427
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800428
Mark Williams5d890a02019-11-17 19:56:26 -0800429NO_OVERLAPPING_PROTOCOLS = object()
430
431
Cory Benfield9da5ffb2015-04-13 17:20:14 -0400432class _ALPNSelectHelper(_CallbackExceptionHelper):
Cory Benfieldf1177e72015-04-12 09:11:49 -0400433 """
434 Wrap a callback such that it can be used as an ALPN selection callback.
435 """
Alex Gaynor62da94d2015-09-05 14:37:34 -0400436
Cory Benfieldf1177e72015-04-12 09:11:49 -0400437 def __init__(self, callback):
438 _CallbackExceptionHelper.__init__(self)
439
440 @wraps(callback)
441 def wrapper(ssl, out, outlen, in_, inlen, arg):
442 try:
443 conn = Connection._reverse_mapping[ssl]
444
445 # The string passed to us is made up of multiple
446 # length-prefixed bytestrings. We need to split that into a
447 # list.
448 instr = _ffi.buffer(in_, inlen)[:]
449 protolist = []
450 while instr:
Cory Benfield93134db2015-04-13 17:22:13 -0400451 encoded_len = indexbytes(instr, 0)
452 proto = instr[1:encoded_len + 1]
Cory Benfieldf1177e72015-04-12 09:11:49 -0400453 protolist.append(proto)
Cory Benfield93134db2015-04-13 17:22:13 -0400454 instr = instr[encoded_len + 1:]
Cory Benfieldf1177e72015-04-12 09:11:49 -0400455
456 # Call the callback
Mark Williams5d890a02019-11-17 19:56:26 -0800457 outbytes = callback(conn, protolist)
458 any_accepted = True
459 if outbytes is NO_OVERLAPPING_PROTOCOLS:
460 outbytes = b''
461 any_accepted = False
Alex Gaynor12576002019-11-18 00:18:50 -0500462 elif not isinstance(outbytes, bytes):
Mark Williams5d890a02019-11-17 19:56:26 -0800463 raise TypeError(
464 "ALPN callback must return a bytestring or the "
465 "special NO_OVERLAPPING_PROTOCOLS sentinel value."
466 )
Cory Benfieldf1177e72015-04-12 09:11:49 -0400467
468 # Save our callback arguments on the connection object to make
469 # sure that they don't get freed before OpenSSL can use them.
470 # Then, return them in the appropriate output parameters.
471 conn._alpn_select_callback_args = [
Mark Williams5d890a02019-11-17 19:56:26 -0800472 _ffi.new("unsigned char *", len(outbytes)),
473 _ffi.new("unsigned char[]", outbytes),
Cory Benfieldf1177e72015-04-12 09:11:49 -0400474 ]
475 outlen[0] = conn._alpn_select_callback_args[0][0]
476 out[0] = conn._alpn_select_callback_args[1]
Mark Williams5d890a02019-11-17 19:56:26 -0800477 if not any_accepted:
478 return _lib.SSL_TLSEXT_ERR_NOACK
479 return _lib.SSL_TLSEXT_ERR_OK
Cory Benfieldf1177e72015-04-12 09:11:49 -0400480 except Exception as e:
481 self._problems.append(e)
Mark Williams5d890a02019-11-17 19:56:26 -0800482 return _lib.SSL_TLSEXT_ERR_ALERT_FATAL
Cory Benfieldf1177e72015-04-12 09:11:49 -0400483
484 self.callback = _ffi.callback(
Alex Gaynor62da94d2015-09-05 14:37:34 -0400485 ("int (*)(SSL *, unsigned char **, unsigned char *, "
486 "const unsigned char *, unsigned int, void *)"),
Cory Benfieldf1177e72015-04-12 09:11:49 -0400487 wrapper
488 )
489
490
Cory Benfield496652a2017-01-24 11:42:56 +0000491class _OCSPServerCallbackHelper(_CallbackExceptionHelper):
492 """
493 Wrap a callback such that it can be used as an OCSP callback for the server
494 side.
495
496 Annoyingly, OpenSSL defines one OCSP callback but uses it in two different
497 ways. For servers, that callback is expected to retrieve some OCSP data and
498 hand it to OpenSSL, and may return only SSL_TLSEXT_ERR_OK,
499 SSL_TLSEXT_ERR_FATAL, and SSL_TLSEXT_ERR_NOACK. For clients, that callback
500 is expected to check the OCSP data, and returns a negative value on error,
501 0 if the response is not acceptable, or positive if it is. These are
502 mutually exclusive return code behaviours, and they mean that we need two
503 helpers so that we always return an appropriate error code if the user's
504 code throws an exception.
505
506 Given that we have to have two helpers anyway, these helpers are a bit more
507 helpery than most: specifically, they hide a few more of the OpenSSL
508 functions so that the user has an easier time writing these callbacks.
509
510 This helper implements the server side.
511 """
512
513 def __init__(self, callback):
514 _CallbackExceptionHelper.__init__(self)
515
516 @wraps(callback)
517 def wrapper(ssl, cdata):
518 try:
519 conn = Connection._reverse_mapping[ssl]
520
521 # Extract the data if any was provided.
522 if cdata != _ffi.NULL:
523 data = _ffi.from_handle(cdata)
524 else:
525 data = None
526
527 # Call the callback.
528 ocsp_data = callback(conn, data)
529
Alex Gaynor12576002019-11-18 00:18:50 -0500530 if not isinstance(ocsp_data, bytes):
Cory Benfield496652a2017-01-24 11:42:56 +0000531 raise TypeError("OCSP callback must return a bytestring.")
532
533 # If the OCSP data was provided, we will pass it to OpenSSL.
534 # However, we have an early exit here: if no OCSP data was
535 # provided we will just exit out and tell OpenSSL that there
536 # is nothing to do.
537 if not ocsp_data:
538 return 3 # SSL_TLSEXT_ERR_NOACK
539
David Benjamin7ac5f272018-05-21 21:24:04 -0400540 # OpenSSL takes ownership of this data and expects it to have
541 # been allocated by OPENSSL_malloc.
Cory Benfield496652a2017-01-24 11:42:56 +0000542 ocsp_data_length = len(ocsp_data)
543 data_ptr = _lib.OPENSSL_malloc(ocsp_data_length)
544 _ffi.buffer(data_ptr, ocsp_data_length)[:] = ocsp_data
545
546 _lib.SSL_set_tlsext_status_ocsp_resp(
547 ssl, data_ptr, ocsp_data_length
548 )
549
550 return 0
551 except Exception as e:
552 self._problems.append(e)
553 return 2 # SSL_TLSEXT_ERR_ALERT_FATAL
554
555 self.callback = _ffi.callback("int (*)(SSL *, void *)", wrapper)
556
557
558class _OCSPClientCallbackHelper(_CallbackExceptionHelper):
559 """
560 Wrap a callback such that it can be used as an OCSP callback for the client
561 side.
562
563 Annoyingly, OpenSSL defines one OCSP callback but uses it in two different
564 ways. For servers, that callback is expected to retrieve some OCSP data and
565 hand it to OpenSSL, and may return only SSL_TLSEXT_ERR_OK,
566 SSL_TLSEXT_ERR_FATAL, and SSL_TLSEXT_ERR_NOACK. For clients, that callback
567 is expected to check the OCSP data, and returns a negative value on error,
568 0 if the response is not acceptable, or positive if it is. These are
569 mutually exclusive return code behaviours, and they mean that we need two
570 helpers so that we always return an appropriate error code if the user's
571 code throws an exception.
572
573 Given that we have to have two helpers anyway, these helpers are a bit more
574 helpery than most: specifically, they hide a few more of the OpenSSL
575 functions so that the user has an easier time writing these callbacks.
576
577 This helper implements the client side.
578 """
579
580 def __init__(self, callback):
581 _CallbackExceptionHelper.__init__(self)
582
583 @wraps(callback)
584 def wrapper(ssl, cdata):
585 try:
586 conn = Connection._reverse_mapping[ssl]
587
588 # Extract the data if any was provided.
589 if cdata != _ffi.NULL:
590 data = _ffi.from_handle(cdata)
591 else:
592 data = None
593
594 # Get the OCSP data.
595 ocsp_ptr = _ffi.new("unsigned char **")
596 ocsp_len = _lib.SSL_get_tlsext_status_ocsp_resp(ssl, ocsp_ptr)
597 if ocsp_len < 0:
598 # No OCSP data.
599 ocsp_data = b''
600 else:
601 # Copy the OCSP data, then pass it to the callback.
602 ocsp_data = _ffi.buffer(ocsp_ptr[0], ocsp_len)[:]
603
604 valid = callback(conn, ocsp_data, data)
605
606 # Return 1 on success or 0 on error.
607 return int(bool(valid))
608
609 except Exception as e:
610 self._problems.append(e)
611 # Return negative value if an exception is hit.
612 return -1
613
614 self.callback = _ffi.callback("int (*)(SSL *, void *)", wrapper)
615
616
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800617def _asFileDescriptor(obj):
618 fd = None
Konstantinos Koukopoulosc8b13ea2014-01-28 00:21:50 -0800619 if not isinstance(obj, integer_types):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800620 meth = getattr(obj, "fileno", None)
621 if meth is not None:
622 obj = meth()
623
Konstantinos Koukopoulosc8b13ea2014-01-28 00:21:50 -0800624 if isinstance(obj, integer_types):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800625 fd = obj
626
Konstantinos Koukopoulosc8b13ea2014-01-28 00:21:50 -0800627 if not isinstance(fd, integer_types):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800628 raise TypeError("argument must be an int, or have a fileno() method.")
629 elif fd < 0:
630 raise ValueError(
631 "file descriptor cannot be a negative integer (%i)" % (fd,))
632
633 return fd
634
635
Jean-Paul Calderoned39a3f62013-03-04 12:23:51 -0800636def SSLeay_version(type):
637 """
638 Return a string describing the version of OpenSSL in use.
639
Alex Chand072cae2018-02-15 09:57:59 +0000640 :param type: One of the :const:`SSLEAY_` constants defined in this module.
Jean-Paul Calderoned39a3f62013-03-04 12:23:51 -0800641 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500642 return _ffi.string(_lib.SSLeay_version(type))
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800643
644
Alex Gaynorbe2bd542019-02-21 21:41:22 -0500645def _warn_npn():
646 warnings.warn("NPN is deprecated. Protocols should switch to using ALPN.",
647 DeprecationWarning, stacklevel=3)
648
649
Cory Benfieldef404df2016-03-29 15:32:48 +0100650def _make_requires(flag, error):
Cory Benfielda876cef2015-04-13 17:29:12 -0400651 """
Cory Benfieldef404df2016-03-29 15:32:48 +0100652 Builds a decorator that ensures that functions that rely on OpenSSL
653 functions that are not present in this build raise NotImplementedError,
654 rather than AttributeError coming out of cryptography.
655
656 :param flag: A cryptography flag that guards the functions, e.g.
657 ``Cryptography_HAS_NEXTPROTONEG``.
658 :param error: The string to be used in the exception if the flag is false.
Cory Benfielda876cef2015-04-13 17:29:12 -0400659 """
Cory Benfieldef404df2016-03-29 15:32:48 +0100660 def _requires_decorator(func):
661 if not flag:
662 @wraps(func)
663 def explode(*args, **kwargs):
664 raise NotImplementedError(error)
665 return explode
666 else:
667 return func
Cory Benfield10b277f2015-04-13 17:12:42 -0400668
Cory Benfieldef404df2016-03-29 15:32:48 +0100669 return _requires_decorator
Cory Benfield10b277f2015-04-13 17:12:42 -0400670
671
Cory Benfieldef404df2016-03-29 15:32:48 +0100672_requires_npn = _make_requires(
673 _lib.Cryptography_HAS_NEXTPROTONEG, "NPN not available"
674)
Cory Benfield7907e332015-04-13 17:18:25 -0400675
676
Cory Benfieldef404df2016-03-29 15:32:48 +0100677_requires_alpn = _make_requires(
678 _lib.Cryptography_HAS_ALPN, "ALPN not available"
679)
Cory Benfielde6f35882016-03-29 11:21:04 +0100680
Cory Benfielde6f35882016-03-29 11:21:04 +0100681
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -0800682class Session(object):
Alex Chand072cae2018-02-15 09:57:59 +0000683 """
684 A class representing an SSL session. A session defines certain connection
685 parameters which may be re-used to speed up the setup of subsequent
686 connections.
687
688 .. versionadded:: 0.14
689 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -0800690 pass
691
692
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800693class Context(object):
694 """
Hynek Schlawackf90e3682016-03-11 11:21:13 +0100695 :class:`OpenSSL.SSL.Context` instances define the parameters for setting
Alex Gaynor62da94d2015-09-05 14:37:34 -0400696 up new SSL connections.
Alex Chand072cae2018-02-15 09:57:59 +0000697
698 :param method: One of SSLv2_METHOD, SSLv3_METHOD, SSLv23_METHOD, or
699 TLSv1_METHOD.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800700 """
701 _methods = {
Andrew Dunhamec84a0a2014-02-24 12:41:37 -0800702 SSLv2_METHOD: "SSLv2_method",
Jean-Paul Calderonebe2bb422013-12-29 07:34:08 -0500703 SSLv3_METHOD: "SSLv3_method",
704 SSLv23_METHOD: "SSLv23_method",
705 TLSv1_METHOD: "TLSv1_method",
706 TLSv1_1_METHOD: "TLSv1_1_method",
707 TLSv1_2_METHOD: "TLSv1_2_method",
Alex Gaynorc4889812015-09-04 08:43:17 -0400708 }
Jean-Paul Calderonebe2bb422013-12-29 07:34:08 -0500709 _methods = dict(
710 (identifier, getattr(_lib, name))
711 for (identifier, name) in _methods.items()
712 if getattr(_lib, name, None) is not None)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800713
714 def __init__(self, method):
Jean-Paul Calderonef73a3cb2014-02-09 08:49:06 -0500715 if not isinstance(method, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800716 raise TypeError("method must be an integer")
717
718 try:
719 method_func = self._methods[method]
720 except KeyError:
721 raise ValueError("No such protocol")
722
723 method_obj = method_func()
Alex Gaynora829e902016-06-04 18:16:01 -0700724 _openssl_assert(method_obj != _ffi.NULL)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800725
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500726 context = _lib.SSL_CTX_new(method_obj)
Alex Gaynora829e902016-06-04 18:16:01 -0700727 _openssl_assert(context != _ffi.NULL)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500728 context = _ffi.gc(context, _lib.SSL_CTX_free)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800729
Alex Gaynor77debda2020-04-07 13:40:59 -0400730 # Set SSL_CTX_set_ecdh_auto so that the ECDH curve will be
731 # auto-selected. This function was added in 1.0.2 and made a noop in
732 # 1.1.0+ (where it is set automatically).
733 res = _lib.SSL_CTX_set_ecdh_auto(context, 1)
734 _openssl_assert(res == 1)
Paul Kehrer6c6bf862016-12-19 06:03:48 -0600735
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800736 self._context = context
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800737 self._passphrase_helper = None
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800738 self._passphrase_callback = None
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800739 self._passphrase_userdata = None
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800740 self._verify_helper = None
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800741 self._verify_callback = None
742 self._info_callback = None
743 self._tlsext_servername_callback = None
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800744 self._app_data = None
Cory Benfield0ea76e72015-03-22 09:05:28 +0000745 self._npn_advertise_helper = None
Cory Benfield84a121e2014-03-31 20:30:25 +0100746 self._npn_advertise_callback = None
Cory Benfield0ea76e72015-03-22 09:05:28 +0000747 self._npn_select_helper = None
Cory Benfield84a121e2014-03-31 20:30:25 +0100748 self._npn_select_callback = None
Cory Benfieldf1177e72015-04-12 09:11:49 -0400749 self._alpn_select_helper = None
Cory Benfield12eae892014-06-07 15:42:56 +0100750 self._alpn_select_callback = None
Cory Benfield496652a2017-01-24 11:42:56 +0000751 self._ocsp_helper = None
752 self._ocsp_callback = None
753 self._ocsp_data = None
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800754
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500755 self.set_mode(_lib.SSL_MODE_ENABLE_PARTIAL_WRITE)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800756
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800757 def load_verify_locations(self, cafile, capath=None):
758 """
759 Let SSL know where we can find trusted certificates for the certificate
Alex Chand072cae2018-02-15 09:57:59 +0000760 chain. Note that the certificates have to be in PEM format.
761
762 If capath is passed, it must be a directory prepared using the
763 ``c_rehash`` tool included with OpenSSL. Either, but not both, of
764 *pemfile* or *capath* may be :data:`None`.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800765
Jean-Paul Calderone55f9e882015-04-12 09:31:03 -0400766 :param cafile: In which file we can find the certificates (``bytes`` or
767 ``unicode``).
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800768 :param capath: In which directory we can find the certificates
Jean-Paul Calderone55f9e882015-04-12 09:31:03 -0400769 (``bytes`` or ``unicode``).
770
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800771 :return: None
772 """
773 if cafile is None:
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500774 cafile = _ffi.NULL
Jean-Paul Calderone55f9e882015-04-12 09:31:03 -0400775 else:
776 cafile = _path_string(cafile)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800777
778 if capath is None:
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500779 capath = _ffi.NULL
Jean-Paul Calderone55f9e882015-04-12 09:31:03 -0400780 else:
781 capath = _path_string(capath)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800782
Alex Gaynor62da94d2015-09-05 14:37:34 -0400783 load_result = _lib.SSL_CTX_load_verify_locations(
784 self._context, cafile, capath
785 )
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800786 if not load_result:
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500787 _raise_current_error()
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800788
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800789 def _wrap_callback(self, callback):
790 @wraps(callback)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800791 def wrapper(size, verify, userdata):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800792 return callback(size, verify, self._passphrase_userdata)
793 return _PassphraseHelper(
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800794 FILETYPE_PEM, wrapper, more_args=True, truncate=True)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800795
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800796 def set_passwd_cb(self, callback, userdata=None):
797 """
Alex Chand072cae2018-02-15 09:57:59 +0000798 Set the passphrase callback. This function will be called
799 when a private key with a passphrase is loaded.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800800
Alex Chand072cae2018-02-15 09:57:59 +0000801 :param callback: The Python callback to use. This must accept three
802 positional arguments. First, an integer giving the maximum length
803 of the passphrase it may return. If the returned passphrase is
804 longer than this, it will be truncated. Second, a boolean value
805 which will be true if the user should be prompted for the
806 passphrase twice and the callback should verify that the two values
807 supplied are equal. Third, the value given as the *userdata*
808 parameter to :meth:`set_passwd_cb`. The *callback* must return
809 a byte string. If an error occurs, *callback* should return a false
810 value (e.g. an empty string).
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800811 :param userdata: (optional) A Python object which will be given as
812 argument to the callback
813 :return: None
814 """
815 if not callable(callback):
816 raise TypeError("callback must be callable")
817
818 self._passphrase_helper = self._wrap_callback(callback)
819 self._passphrase_callback = self._passphrase_helper.callback
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500820 _lib.SSL_CTX_set_default_passwd_cb(
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800821 self._context, self._passphrase_callback)
822 self._passphrase_userdata = userdata
823
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800824 def set_default_verify_paths(self):
825 """
Alex Chand072cae2018-02-15 09:57:59 +0000826 Specify that the platform provided CA certificates are to be used for
827 verification purposes. This method has some caveats related to the
828 binary wheels that cryptography (pyOpenSSL's primary dependency) ships:
829
830 * macOS will only load certificates using this method if the user has
831 the ``openssl@1.1`` `Homebrew <https://brew.sh>`_ formula installed
832 in the default location.
833 * Windows will not work.
834 * manylinux1 cryptography wheels will work on most common Linux
835 distributions in pyOpenSSL 17.1.0 and above. pyOpenSSL detects the
836 manylinux1 wheel and attempts to load roots via a fallback path.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800837
838 :return: None
839 """
Paul Kehrer55fb3412017-06-29 18:44:08 -0500840 # SSL_CTX_set_default_verify_paths will attempt to load certs from
841 # both a cafile and capath that are set at compile time. However,
842 # it will first check environment variables and, if present, load
843 # those paths instead
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500844 set_result = _lib.SSL_CTX_set_default_verify_paths(self._context)
Alex Gaynor09f19f52016-07-03 09:54:09 -0400845 _openssl_assert(set_result == 1)
Paul Kehrer55fb3412017-06-29 18:44:08 -0500846 # After attempting to set default_verify_paths we need to know whether
847 # to go down the fallback path.
848 # First we'll check to see if any env vars have been set. If so,
849 # we won't try to do anything else because the user has set the path
850 # themselves.
851 dir_env_var = _ffi.string(
852 _lib.X509_get_default_cert_dir_env()
853 ).decode("ascii")
854 file_env_var = _ffi.string(
855 _lib.X509_get_default_cert_file_env()
856 ).decode("ascii")
857 if not self._check_env_vars_set(dir_env_var, file_env_var):
858 default_dir = _ffi.string(_lib.X509_get_default_cert_dir())
859 default_file = _ffi.string(_lib.X509_get_default_cert_file())
860 # Now we check to see if the default_dir and default_file are set
861 # to the exact values we use in our manylinux1 builds. If they are
862 # then we know to load the fallbacks
863 if (
864 default_dir == _CRYPTOGRAPHY_MANYLINUX1_CA_DIR and
865 default_file == _CRYPTOGRAPHY_MANYLINUX1_CA_FILE
866 ):
867 # This is manylinux1, let's load our fallback paths
868 self._fallback_default_verify_paths(
869 _CERTIFICATE_FILE_LOCATIONS,
870 _CERTIFICATE_PATH_LOCATIONS
871 )
872
873 def _check_env_vars_set(self, dir_env_var, file_env_var):
874 """
875 Check to see if the default cert dir/file environment vars are present.
876
877 :return: bool
878 """
879 return (
880 os.environ.get(file_env_var) is not None or
881 os.environ.get(dir_env_var) is not None
882 )
883
884 def _fallback_default_verify_paths(self, file_path, dir_path):
885 """
886 Default verify paths are based on the compiled version of OpenSSL.
887 However, when pyca/cryptography is compiled as a manylinux1 wheel
888 that compiled location can potentially be wrong. So, like Go, we
889 will try a predefined set of paths and attempt to load roots
890 from there.
891
892 :return: None
893 """
894 for cafile in file_path:
895 if os.path.isfile(cafile):
896 self.load_verify_locations(cafile)
897 break
898
899 for capath in dir_path:
900 if os.path.isdir(capath):
901 self.load_verify_locations(None, capath)
902 break
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800903
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800904 def use_certificate_chain_file(self, certfile):
905 """
Alex Chand072cae2018-02-15 09:57:59 +0000906 Load a certificate chain from a file.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800907
Jean-Paul Calderoneb6f8a792015-04-13 10:10:06 -0400908 :param certfile: The name of the certificate chain file (``bytes`` or
Alex Chand072cae2018-02-15 09:57:59 +0000909 ``unicode``). Must be PEM encoded.
Jean-Paul Calderoneb6f8a792015-04-13 10:10:06 -0400910
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800911 :return: None
912 """
Jean-Paul Calderoneaac43a32015-04-12 09:51:21 -0400913 certfile = _path_string(certfile)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800914
Alex Gaynor62da94d2015-09-05 14:37:34 -0400915 result = _lib.SSL_CTX_use_certificate_chain_file(
916 self._context, certfile
917 )
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800918 if not result:
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500919 _raise_current_error()
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800920
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800921 def use_certificate_file(self, certfile, filetype=FILETYPE_PEM):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800922 """
923 Load a certificate from a file
924
Jean-Paul Calderoneb6f8a792015-04-13 10:10:06 -0400925 :param certfile: The name of the certificate file (``bytes`` or
926 ``unicode``).
Alex Chand072cae2018-02-15 09:57:59 +0000927 :param filetype: (optional) The encoding of the file, which is either
928 :const:`FILETYPE_PEM` or :const:`FILETYPE_ASN1`. The default is
929 :const:`FILETYPE_PEM`.
Jean-Paul Calderoneb6f8a792015-04-13 10:10:06 -0400930
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800931 :return: None
932 """
Jean-Paul Calderoned57a7b62015-04-12 09:57:36 -0400933 certfile = _path_string(certfile)
Jean-Paul Calderonef73a3cb2014-02-09 08:49:06 -0500934 if not isinstance(filetype, integer_types):
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800935 raise TypeError("filetype must be an integer")
936
Alex Gaynor62da94d2015-09-05 14:37:34 -0400937 use_result = _lib.SSL_CTX_use_certificate_file(
938 self._context, certfile, filetype
939 )
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800940 if not use_result:
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500941 _raise_current_error()
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800942
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800943 def use_certificate(self, cert):
944 """
945 Load a certificate from a X509 object
946
947 :param cert: The X509 object
948 :return: None
949 """
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800950 if not isinstance(cert, X509):
951 raise TypeError("cert must be an X509 instance")
952
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500953 use_result = _lib.SSL_CTX_use_certificate(self._context, cert._x509)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800954 if not use_result:
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500955 _raise_current_error()
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800956
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800957 def add_extra_chain_cert(self, certobj):
958 """
959 Add certificate to chain
960
961 :param certobj: The X509 certificate object to add to the chain
962 :return: None
963 """
964 if not isinstance(certobj, X509):
965 raise TypeError("certobj must be an X509 instance")
966
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500967 copy = _lib.X509_dup(certobj._x509)
968 add_result = _lib.SSL_CTX_add_extra_chain_cert(self._context, copy)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800969 if not add_result:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -0500970 # TODO: This is untested.
971 _lib.X509_free(copy)
972 _raise_current_error()
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800973
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800974 def _raise_passphrase_exception(self):
Greg Bowser36eb2de2017-01-24 11:38:55 -0500975 if self._passphrase_helper is not None:
976 self._passphrase_helper.raise_if_problem(Error)
977
978 _raise_current_error()
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800979
Jean-Paul Calderone00f84eb2015-04-13 12:47:21 -0400980 def use_privatekey_file(self, keyfile, filetype=_UNSPECIFIED):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800981 """
982 Load a private key from a file
983
Jean-Paul Calderoneb6f8a792015-04-13 10:10:06 -0400984 :param keyfile: The name of the key file (``bytes`` or ``unicode``)
Alex Chand072cae2018-02-15 09:57:59 +0000985 :param filetype: (optional) The encoding of the file, which is either
986 :const:`FILETYPE_PEM` or :const:`FILETYPE_ASN1`. The default is
987 :const:`FILETYPE_PEM`.
Jean-Paul Calderoneb6f8a792015-04-13 10:10:06 -0400988
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800989 :return: None
990 """
Jean-Paul Calderone69a4e5b2015-04-12 10:04:28 -0400991 keyfile = _path_string(keyfile)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800992
Jean-Paul Calderone00f84eb2015-04-13 12:47:21 -0400993 if filetype is _UNSPECIFIED:
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800994 filetype = FILETYPE_PEM
Jean-Paul Calderonef73a3cb2014-02-09 08:49:06 -0500995 elif not isinstance(filetype, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800996 raise TypeError("filetype must be an integer")
997
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500998 use_result = _lib.SSL_CTX_use_PrivateKey_file(
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800999 self._context, keyfile, filetype)
1000 if not use_result:
Jean-Paul Calderone173cff92013-03-06 10:29:21 -08001001 self._raise_passphrase_exception()
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001002
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001003 def use_privatekey(self, pkey):
1004 """
1005 Load a private key from a PKey object
1006
1007 :param pkey: The PKey object
1008 :return: None
1009 """
1010 if not isinstance(pkey, PKey):
1011 raise TypeError("pkey must be a PKey instance")
1012
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001013 use_result = _lib.SSL_CTX_use_PrivateKey(self._context, pkey._pkey)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001014 if not use_result:
Jean-Paul Calderone173cff92013-03-06 10:29:21 -08001015 self._raise_passphrase_exception()
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001016
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001017 def check_privatekey(self):
1018 """
Alex Chand072cae2018-02-15 09:57:59 +00001019 Check if the private key (loaded with :meth:`use_privatekey`) matches
1020 the certificate (loaded with :meth:`use_certificate`)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001021
Alex Chand072cae2018-02-15 09:57:59 +00001022 :return: :data:`None` (raises :exc:`Error` if something's wrong)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001023 """
Jean-Paul Calderonea0344922014-12-11 14:02:31 -05001024 if not _lib.SSL_CTX_check_private_key(self._context):
1025 _raise_current_error()
1026
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001027 def load_client_ca(self, cafile):
1028 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001029 Load the trusted certificates that will be sent to the client. Does
1030 not actually imply any of the certificates are trusted; that must be
Alex Gaynor62da94d2015-09-05 14:37:34 -04001031 configured separately.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001032
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001033 :param bytes cafile: The path to a certificates file in PEM format.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001034 :return: None
1035 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001036 ca_list = _lib.SSL_load_client_CA_file(
1037 _text_to_bytes_and_warn("cafile", cafile)
1038 )
1039 _openssl_assert(ca_list != _ffi.NULL)
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001040 _lib.SSL_CTX_set_client_CA_list(self._context, ca_list)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001041
1042 def set_session_id(self, buf):
1043 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001044 Set the session id to *buf* within which a session can be reused for
1045 this Context object. This is needed when doing session resumption,
1046 because there is no way for a stored session to know which Context
1047 object it is associated with.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001048
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001049 :param bytes buf: The session id.
1050
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001051 :returns: None
1052 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001053 buf = _text_to_bytes_and_warn("buf", buf)
1054 _openssl_assert(
1055 _lib.SSL_CTX_set_session_id_context(
1056 self._context,
1057 buf,
1058 len(buf),
1059 ) == 1
1060 )
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001061
1062 def set_session_cache_mode(self, mode):
1063 """
Alex Chand072cae2018-02-15 09:57:59 +00001064 Set the behavior of the session cache used by all connections using
1065 this Context. The previously set mode is returned. See
1066 :const:`SESS_CACHE_*` for details about particular modes.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001067
1068 :param mode: One or more of the SESS_CACHE_* flags (combine using
1069 bitwise or)
1070 :returns: The previously set caching mode.
Alex Chand072cae2018-02-15 09:57:59 +00001071
1072 .. versionadded:: 0.14
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001073 """
Jean-Paul Calderonebef4f4c2014-02-02 18:13:31 -05001074 if not isinstance(mode, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001075 raise TypeError("mode must be an integer")
1076
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001077 return _lib.SSL_CTX_set_session_cache_mode(self._context, mode)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001078
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001079 def get_session_cache_mode(self):
1080 """
Alex Chand072cae2018-02-15 09:57:59 +00001081 Get the current session cache mode.
1082
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001083 :returns: The currently used cache mode.
Alex Chand072cae2018-02-15 09:57:59 +00001084
1085 .. versionadded:: 0.14
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001086 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001087 return _lib.SSL_CTX_get_session_cache_mode(self._context)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001088
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001089 def set_verify(self, mode, callback):
1090 """
Alex Chand072cae2018-02-15 09:57:59 +00001091 et the verification flags for this Context object to *mode* and specify
1092 that *callback* should be used for verification callbacks.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001093
Alex Chand072cae2018-02-15 09:57:59 +00001094 :param mode: The verify mode, this should be one of
1095 :const:`VERIFY_NONE` and :const:`VERIFY_PEER`. If
1096 :const:`VERIFY_PEER` is used, *mode* can be OR:ed with
1097 :const:`VERIFY_FAIL_IF_NO_PEER_CERT` and
1098 :const:`VERIFY_CLIENT_ONCE` to further control the behaviour.
1099 :param callback: The Python callback to use. This should take five
1100 arguments: A Connection object, an X509 object, and three integer
1101 variables, which are in turn potential error number, error depth
1102 and return code. *callback* should return True if verification
1103 passes and False otherwise.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001104 :return: None
1105
1106 See SSL_CTX_set_verify(3SSL) for further details.
1107 """
Jean-Paul Calderonebef4f4c2014-02-02 18:13:31 -05001108 if not isinstance(mode, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001109 raise TypeError("mode must be an integer")
1110
1111 if not callable(callback):
1112 raise TypeError("callback must be callable")
1113
Jean-Paul Calderone6a8cd112014-04-02 21:09:08 -04001114 self._verify_helper = _VerifyHelper(callback)
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -08001115 self._verify_callback = self._verify_helper.callback
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001116 _lib.SSL_CTX_set_verify(self._context, mode, self._verify_callback)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001117
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001118 def set_verify_depth(self, depth):
1119 """
Alex Chand072cae2018-02-15 09:57:59 +00001120 Set the maximum depth for the certificate chain verification that shall
1121 be allowed for this Context object.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001122
1123 :param depth: An integer specifying the verify depth
1124 :return: None
1125 """
Jean-Paul Calderonebef4f4c2014-02-02 18:13:31 -05001126 if not isinstance(depth, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001127 raise TypeError("depth must be an integer")
1128
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001129 _lib.SSL_CTX_set_verify_depth(self._context, depth)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001130
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001131 def get_verify_mode(self):
1132 """
Alex Chand072cae2018-02-15 09:57:59 +00001133 Retrieve the Context object's verify mode, as set by
1134 :meth:`set_verify`.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001135
1136 :return: The verify mode
1137 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001138 return _lib.SSL_CTX_get_verify_mode(self._context)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001139
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001140 def get_verify_depth(self):
1141 """
Alex Chand072cae2018-02-15 09:57:59 +00001142 Retrieve the Context object's verify depth, as set by
1143 :meth:`set_verify_depth`.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001144
1145 :return: The verify depth
1146 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001147 return _lib.SSL_CTX_get_verify_depth(self._context)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001148
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001149 def load_tmp_dh(self, dhfile):
1150 """
1151 Load parameters for Ephemeral Diffie-Hellman
1152
Jean-Paul Calderone4e0c43f2015-04-13 10:15:17 -04001153 :param dhfile: The file to load EDH parameters from (``bytes`` or
1154 ``unicode``).
1155
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001156 :return: None
1157 """
Jean-Paul Calderone9e1c1dd2015-04-12 10:13:13 -04001158 dhfile = _path_string(dhfile)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001159
Jean-Paul Calderone4f0467a2014-01-11 11:58:41 -05001160 bio = _lib.BIO_new_file(dhfile, b"r")
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001161 if bio == _ffi.NULL:
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -05001162 _raise_current_error()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001163 bio = _ffi.gc(bio, _lib.BIO_free)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001164
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001165 dh = _lib.PEM_read_bio_DHparams(bio, _ffi.NULL, _ffi.NULL, _ffi.NULL)
1166 dh = _ffi.gc(dh, _lib.DH_free)
1167 _lib.SSL_CTX_set_tmp_dh(self._context, dh)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001168
Jean-Paul Calderone3e4e3352014-04-19 09:28:28 -04001169 def set_tmp_ecdh(self, curve):
Alex Gaynor7b8d57a2014-01-17 12:08:54 -06001170 """
Andy Lutomirski76a61332014-03-12 15:02:56 -07001171 Select a curve to use for ECDHE key exchange.
Alex Gaynor7b8d57a2014-01-17 12:08:54 -06001172
Jean-Paul Calderonec09fd582014-04-18 22:00:10 -04001173 :param curve: A curve object to use as returned by either
Alex Chand072cae2018-02-15 09:57:59 +00001174 :meth:`OpenSSL.crypto.get_elliptic_curve` or
1175 :meth:`OpenSSL.crypto.get_elliptic_curves`.
Andy Lutomirskif05a2732014-03-13 17:22:25 -07001176
Alex Gaynor7b8d57a2014-01-17 12:08:54 -06001177 :return: None
1178 """
Jean-Paul Calderonec09fd582014-04-18 22:00:10 -04001179 _lib.SSL_CTX_set_tmp_ecdh(self._context, curve._to_EC_KEY())
Alex Gaynor7b8d57a2014-01-17 12:08:54 -06001180
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001181 def set_cipher_list(self, cipher_list):
1182 """
Hynek Schlawackf90e3682016-03-11 11:21:13 +01001183 Set the list of ciphers to be used in this context.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001184
Hynek Schlawackf90e3682016-03-11 11:21:13 +01001185 See the OpenSSL manual for more information (e.g.
1186 :manpage:`ciphers(1)`).
1187
1188 :param bytes cipher_list: An OpenSSL cipher string.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001189 :return: None
1190 """
Hynek Schlawackf90e3682016-03-11 11:21:13 +01001191 cipher_list = _text_to_bytes_and_warn("cipher_list", cipher_list)
Jean-Paul Calderone63eab692014-01-18 10:19:56 -05001192
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001193 if not isinstance(cipher_list, bytes):
Hynek Schlawacka7a63af2016-03-11 12:05:26 +01001194 raise TypeError("cipher_list must be a byte string.")
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001195
Hynek Schlawackf90e3682016-03-11 11:21:13 +01001196 _openssl_assert(
Hynek Schlawack22a4b662016-03-11 14:59:39 +01001197 _lib.SSL_CTX_set_cipher_list(self._context, cipher_list) == 1
Hynek Schlawackf90e3682016-03-11 11:21:13 +01001198 )
Paul Kehrer7d5a3bf2019-01-21 12:24:02 -06001199 # In OpenSSL 1.1.1 setting the cipher list will always return TLS 1.3
1200 # ciphers even if you pass an invalid cipher. Applications (like
1201 # Twisted) have tests that depend on an error being raised if an
1202 # invalid cipher string is passed, but without the following check
1203 # for the TLS 1.3 specific cipher suites it would never error.
1204 tmpconn = Connection(self, None)
Mark Williamsdf2480d2019-02-14 19:30:07 -08001205 if (
1206 tmpconn.get_cipher_list() == [
Paul Kehrer7d5a3bf2019-01-21 12:24:02 -06001207 'TLS_AES_256_GCM_SHA384',
1208 'TLS_CHACHA20_POLY1305_SHA256',
1209 'TLS_AES_128_GCM_SHA256'
1210 ]
Mark Williamsdf2480d2019-02-14 19:30:07 -08001211 ):
1212 raise Error(
1213 [
1214 (
1215 'SSL routines',
1216 'SSL_CTX_set_cipher_list',
1217 'no cipher match',
1218 ),
1219 ],
1220 )
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001221
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001222 def set_client_ca_list(self, certificate_authorities):
1223 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04001224 Set the list of preferred client certificate signers for this server
1225 context.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001226
Alex Gaynor62da94d2015-09-05 14:37:34 -04001227 This list of certificate authorities will be sent to the client when
1228 the server requests a client certificate.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001229
1230 :param certificate_authorities: a sequence of X509Names.
1231 :return: None
Alex Chand072cae2018-02-15 09:57:59 +00001232
1233 .. versionadded:: 0.10
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001234 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001235 name_stack = _lib.sk_X509_NAME_new_null()
Alex Gaynora829e902016-06-04 18:16:01 -07001236 _openssl_assert(name_stack != _ffi.NULL)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001237
1238 try:
1239 for ca_name in certificate_authorities:
1240 if not isinstance(ca_name, X509Name):
1241 raise TypeError(
Alex Gaynor62da94d2015-09-05 14:37:34 -04001242 "client CAs must be X509Name objects, not %s "
1243 "objects" % (
1244 type(ca_name).__name__,
1245 )
1246 )
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001247 copy = _lib.X509_NAME_dup(ca_name._name)
Alex Gaynora829e902016-06-04 18:16:01 -07001248 _openssl_assert(copy != _ffi.NULL)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001249 push_result = _lib.sk_X509_NAME_push(name_stack, copy)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001250 if not push_result:
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001251 _lib.X509_NAME_free(copy)
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -05001252 _raise_current_error()
Alex Gaynorc3697ad2017-11-20 08:19:32 -05001253 except Exception:
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001254 _lib.sk_X509_NAME_free(name_stack)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001255 raise
1256
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001257 _lib.SSL_CTX_set_client_CA_list(self._context, name_stack)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001258
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001259 def add_client_ca(self, certificate_authority):
1260 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04001261 Add the CA certificate to the list of preferred signers for this
1262 context.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001263
1264 The list of certificate authorities will be sent to the client when the
1265 server requests a client certificate.
1266
1267 :param certificate_authority: certificate authority's X509 certificate.
1268 :return: None
Alex Chand072cae2018-02-15 09:57:59 +00001269
1270 .. versionadded:: 0.10
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001271 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001272 if not isinstance(certificate_authority, X509):
1273 raise TypeError("certificate_authority must be an X509 instance")
1274
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001275 add_result = _lib.SSL_CTX_add_client_CA(
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001276 self._context, certificate_authority._x509)
Alex Gaynor09f19f52016-07-03 09:54:09 -04001277 _openssl_assert(add_result == 1)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001278
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001279 def set_timeout(self, timeout):
1280 """
Alex Chand072cae2018-02-15 09:57:59 +00001281 Set the timeout for newly created sessions for this Context object to
1282 *timeout*. The default value is 300 seconds. See the OpenSSL manual
1283 for more information (e.g. :manpage:`SSL_CTX_set_timeout(3)`).
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001284
Alex Chand072cae2018-02-15 09:57:59 +00001285 :param timeout: The timeout in (whole) seconds
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001286 :return: The previous session timeout
1287 """
Jean-Paul Calderonebef4f4c2014-02-02 18:13:31 -05001288 if not isinstance(timeout, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001289 raise TypeError("timeout must be an integer")
1290
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001291 return _lib.SSL_CTX_set_timeout(self._context, timeout)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001292
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001293 def get_timeout(self):
1294 """
Alex Chand072cae2018-02-15 09:57:59 +00001295 Retrieve session timeout, as set by :meth:`set_timeout`. The default
1296 is 300 seconds.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001297
1298 :return: The session timeout
1299 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001300 return _lib.SSL_CTX_get_timeout(self._context)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001301
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001302 def set_info_callback(self, callback):
1303 """
Alex Chand072cae2018-02-15 09:57:59 +00001304 Set the information callback to *callback*. This function will be
1305 called from time to time during SSL handshakes.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001306
Alex Chand072cae2018-02-15 09:57:59 +00001307 :param callback: The Python callback to use. This should take three
1308 arguments: a Connection object and two integers. The first integer
1309 specifies where in the SSL handshake the function was called, and
1310 the other the return code from a (possibly failed) internal
1311 function call.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001312 :return: None
1313 """
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001314 @wraps(callback)
1315 def wrapper(ssl, where, return_code):
Jean-Paul Calderonef2bbc9c2014-02-02 10:59:14 -05001316 callback(Connection._reverse_mapping[ssl], where, return_code)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001317 self._info_callback = _ffi.callback(
1318 "void (*)(const SSL *, int, int)", wrapper)
1319 _lib.SSL_CTX_set_info_callback(self._context, self._info_callback)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001320
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001321 def get_app_data(self):
1322 """
Alex Chand072cae2018-02-15 09:57:59 +00001323 Get the application data (supplied via :meth:`set_app_data()`)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001324
1325 :return: The application data
1326 """
1327 return self._app_data
1328
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001329 def set_app_data(self, data):
1330 """
1331 Set the application data (will be returned from get_app_data())
1332
1333 :param data: Any Python object
1334 :return: None
1335 """
1336 self._app_data = data
1337
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001338 def get_cert_store(self):
1339 """
Alex Chand072cae2018-02-15 09:57:59 +00001340 Get the certificate store for the context. This can be used to add
1341 "trusted" certificates without using the
1342 :meth:`load_verify_locations` method.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001343
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001344 :return: A X509Store object or None if it does not have one.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001345 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001346 store = _lib.SSL_CTX_get_cert_store(self._context)
1347 if store == _ffi.NULL:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001348 # TODO: This is untested.
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001349 return None
1350
1351 pystore = X509Store.__new__(X509Store)
1352 pystore._store = store
1353 return pystore
1354
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001355 def set_options(self, options):
1356 """
1357 Add options. Options set before are not cleared!
Alex Chand072cae2018-02-15 09:57:59 +00001358 This method should be used with the :const:`OP_*` constants.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001359
1360 :param options: The options to add.
1361 :return: The new option bitmask.
1362 """
Jean-Paul Calderonebef4f4c2014-02-02 18:13:31 -05001363 if not isinstance(options, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001364 raise TypeError("options must be an integer")
1365
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001366 return _lib.SSL_CTX_set_options(self._context, options)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001367
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001368 def set_mode(self, mode):
1369 """
Alex Chand072cae2018-02-15 09:57:59 +00001370 Add modes via bitmask. Modes set before are not cleared! This method
1371 should be used with the :const:`MODE_*` constants.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001372
1373 :param mode: The mode to add.
1374 :return: The new mode bitmask.
1375 """
Jean-Paul Calderonebef4f4c2014-02-02 18:13:31 -05001376 if not isinstance(mode, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001377 raise TypeError("mode must be an integer")
1378
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001379 return _lib.SSL_CTX_set_mode(self._context, mode)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001380
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001381 def set_tlsext_servername_callback(self, callback):
1382 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04001383 Specify a callback function to be called when clients specify a server
1384 name.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001385
1386 :param callback: The callback function. It will be invoked with one
1387 argument, the Connection instance.
Alex Chand072cae2018-02-15 09:57:59 +00001388
1389 .. versionadded:: 0.13
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001390 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001391 @wraps(callback)
1392 def wrapper(ssl, alert, arg):
1393 callback(Connection._reverse_mapping[ssl])
1394 return 0
1395
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001396 self._tlsext_servername_callback = _ffi.callback(
David Benjamince5c3842018-05-21 21:14:46 -04001397 "int (*)(SSL *, int *, void *)", wrapper)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001398 _lib.SSL_CTX_set_tlsext_servername_callback(
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001399 self._context, self._tlsext_servername_callback)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001400
Jeremy Lainé02261ad2018-05-16 18:33:25 +02001401 def set_tlsext_use_srtp(self, profiles):
1402 """
1403 Enable support for negotiating SRTP keying material.
1404
1405 :param bytes profiles: A colon delimited list of protection profile
1406 names, like ``b'SRTP_AES128_CM_SHA1_80:SRTP_AES128_CM_SHA1_32'``.
1407 :return: None
1408 """
1409 if not isinstance(profiles, bytes):
1410 raise TypeError("profiles must be a byte string.")
1411
1412 _openssl_assert(
1413 _lib.SSL_CTX_set_tlsext_use_srtp(self._context, profiles) == 0
1414 )
1415
Cory Benfield10b277f2015-04-13 17:12:42 -04001416 @_requires_npn
Cory Benfield84a121e2014-03-31 20:30:25 +01001417 def set_npn_advertise_callback(self, callback):
1418 """
Cory Benfieldbe3e7b82014-05-10 09:48:55 +01001419 Specify a callback function that will be called when offering `Next
1420 Protocol Negotiation
1421 <https://technotes.googlecode.com/git/nextprotoneg.html>`_ as a server.
Cory Benfield84a121e2014-03-31 20:30:25 +01001422
1423 :param callback: The callback function. It will be invoked with one
Alex Chand072cae2018-02-15 09:57:59 +00001424 argument, the :class:`Connection` instance. It should return a
1425 list of bytestrings representing the advertised protocols, like
Cory Benfieldbe3e7b82014-05-10 09:48:55 +01001426 ``[b'http/1.1', b'spdy/2']``.
Alex Chand072cae2018-02-15 09:57:59 +00001427
1428 .. versionadded:: 0.15
Cory Benfield84a121e2014-03-31 20:30:25 +01001429 """
Alex Gaynorbe2bd542019-02-21 21:41:22 -05001430 _warn_npn()
Cory Benfield0ea76e72015-03-22 09:05:28 +00001431 self._npn_advertise_helper = _NpnAdvertiseHelper(callback)
1432 self._npn_advertise_callback = self._npn_advertise_helper.callback
Cory Benfield84a121e2014-03-31 20:30:25 +01001433 _lib.SSL_CTX_set_next_protos_advertised_cb(
1434 self._context, self._npn_advertise_callback, _ffi.NULL)
1435
Cory Benfield10b277f2015-04-13 17:12:42 -04001436 @_requires_npn
Cory Benfield84a121e2014-03-31 20:30:25 +01001437 def set_npn_select_callback(self, callback):
1438 """
1439 Specify a callback function that will be called when a server offers
1440 Next Protocol Negotiation options.
1441
1442 :param callback: The callback function. It will be invoked with two
1443 arguments: the Connection, and a list of offered protocols as
Cory Benfieldbe3e7b82014-05-10 09:48:55 +01001444 bytestrings, e.g. ``[b'http/1.1', b'spdy/2']``. It should return
1445 one of those bytestrings, the chosen protocol.
Alex Chand072cae2018-02-15 09:57:59 +00001446
1447 .. versionadded:: 0.15
Cory Benfield84a121e2014-03-31 20:30:25 +01001448 """
Alex Gaynorbe2bd542019-02-21 21:41:22 -05001449 _warn_npn()
Cory Benfield0ea76e72015-03-22 09:05:28 +00001450 self._npn_select_helper = _NpnSelectHelper(callback)
1451 self._npn_select_callback = self._npn_select_helper.callback
Cory Benfield84a121e2014-03-31 20:30:25 +01001452 _lib.SSL_CTX_set_next_proto_select_cb(
1453 self._context, self._npn_select_callback, _ffi.NULL)
1454
Cory Benfield7907e332015-04-13 17:18:25 -04001455 @_requires_alpn
Cory Benfield12eae892014-06-07 15:42:56 +01001456 def set_alpn_protos(self, protos):
1457 """
Alex Chand072cae2018-02-15 09:57:59 +00001458 Specify the protocols that the client is prepared to speak after the
1459 TLS connection has been negotiated using Application Layer Protocol
1460 Negotiation.
Cory Benfield12eae892014-06-07 15:42:56 +01001461
1462 :param protos: A list of the protocols to be offered to the server.
1463 This list should be a Python list of bytestrings representing the
1464 protocols to offer, e.g. ``[b'http/1.1', b'spdy/2']``.
1465 """
1466 # Take the list of protocols and join them together, prefixing them
1467 # with their lengths.
1468 protostr = b''.join(
1469 chain.from_iterable((int2byte(len(p)), p) for p in protos)
1470 )
1471
1472 # Build a C string from the list. We don't need to save this off
1473 # because OpenSSL immediately copies the data out.
1474 input_str = _ffi.new("unsigned char[]", protostr)
Alex Gaynord61c46a2017-06-29 22:51:33 -07001475 _lib.SSL_CTX_set_alpn_protos(self._context, input_str, len(protostr))
Cory Benfield12eae892014-06-07 15:42:56 +01001476
Cory Benfield7907e332015-04-13 17:18:25 -04001477 @_requires_alpn
Cory Benfield12eae892014-06-07 15:42:56 +01001478 def set_alpn_select_callback(self, callback):
1479 """
Alex Chand072cae2018-02-15 09:57:59 +00001480 Specify a callback function that will be called on the server when a
1481 client offers protocols using ALPN.
Cory Benfield12eae892014-06-07 15:42:56 +01001482
1483 :param callback: The callback function. It will be invoked with two
1484 arguments: the Connection, and a list of offered protocols as
Mark Williams5d890a02019-11-17 19:56:26 -08001485 bytestrings, e.g ``[b'http/1.1', b'spdy/2']``. It can return
1486 one of those bytestrings to indicate the chosen protocol, the
1487 empty bytestring to terminate the TLS connection, or the
1488 :py:obj:`NO_OVERLAPPING_PROTOCOLS` to indicate that no offered
1489 protocol was selected, but that the connection should not be
1490 aborted.
Cory Benfield12eae892014-06-07 15:42:56 +01001491 """
Cory Benfield9da5ffb2015-04-13 17:20:14 -04001492 self._alpn_select_helper = _ALPNSelectHelper(callback)
Cory Benfieldf1177e72015-04-12 09:11:49 -04001493 self._alpn_select_callback = self._alpn_select_helper.callback
Cory Benfield12eae892014-06-07 15:42:56 +01001494 _lib.SSL_CTX_set_alpn_select_cb(
1495 self._context, self._alpn_select_callback, _ffi.NULL)
1496
Cory Benfield496652a2017-01-24 11:42:56 +00001497 def _set_ocsp_callback(self, helper, data):
1498 """
1499 This internal helper does the common work for
1500 ``set_ocsp_server_callback`` and ``set_ocsp_client_callback``, which is
1501 almost all of it.
1502 """
1503 self._ocsp_helper = helper
1504 self._ocsp_callback = helper.callback
1505 if data is None:
1506 self._ocsp_data = _ffi.NULL
1507 else:
1508 self._ocsp_data = _ffi.new_handle(data)
1509
1510 rc = _lib.SSL_CTX_set_tlsext_status_cb(
1511 self._context, self._ocsp_callback
1512 )
1513 _openssl_assert(rc == 1)
1514 rc = _lib.SSL_CTX_set_tlsext_status_arg(self._context, self._ocsp_data)
1515 _openssl_assert(rc == 1)
1516
1517 def set_ocsp_server_callback(self, callback, data=None):
1518 """
1519 Set a callback to provide OCSP data to be stapled to the TLS handshake
1520 on the server side.
1521
1522 :param callback: The callback function. It will be invoked with two
1523 arguments: the Connection, and the optional arbitrary data you have
1524 provided. The callback must return a bytestring that contains the
1525 OCSP data to staple to the handshake. If no OCSP data is available
1526 for this connection, return the empty bytestring.
1527 :param data: Some opaque data that will be passed into the callback
1528 function when called. This can be used to avoid needing to do
1529 complex data lookups or to keep track of what context is being
1530 used. This parameter is optional.
1531 """
1532 helper = _OCSPServerCallbackHelper(callback)
1533 self._set_ocsp_callback(helper, data)
1534
1535 def set_ocsp_client_callback(self, callback, data=None):
1536 """
1537 Set a callback to validate OCSP data stapled to the TLS handshake on
1538 the client side.
1539
1540 :param callback: The callback function. It will be invoked with three
1541 arguments: the Connection, a bytestring containing the stapled OCSP
1542 assertion, and the optional arbitrary data you have provided. The
1543 callback must return a boolean that indicates the result of
1544 validating the OCSP data: ``True`` if the OCSP data is valid and
1545 the certificate can be trusted, or ``False`` if either the OCSP
1546 data is invalid or the certificate has been revoked.
1547 :param data: Some opaque data that will be passed into the callback
1548 function when called. This can be used to avoid needing to do
1549 complex data lookups or to keep track of what context is being
1550 used. This parameter is optional.
1551 """
1552 helper = _OCSPClientCallbackHelper(callback)
1553 self._set_ocsp_callback(helper, data)
1554
Alex Chanc6077062016-11-18 13:53:39 +00001555
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001556class Connection(object):
1557 """
1558 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001559 _reverse_mapping = WeakValueDictionary()
1560
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001561 def __init__(self, context, socket=None):
1562 """
1563 Create a new Connection object, using the given OpenSSL.SSL.Context
1564 instance and socket.
1565
1566 :param context: An SSL Context to use for this connection
1567 :param socket: The socket to use for transport layer
1568 """
1569 if not isinstance(context, Context):
1570 raise TypeError("context must be a Context instance")
1571
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001572 ssl = _lib.SSL_new(context._context)
1573 self._ssl = _ffi.gc(ssl, _lib.SSL_free)
Paul Kehrer15c29352018-05-14 13:31:27 -04001574 # We set SSL_MODE_AUTO_RETRY to handle situations where OpenSSL returns
1575 # an SSL_ERROR_WANT_READ when processing a non-application data packet
1576 # even though there is still data on the underlying transport.
1577 # See https://github.com/openssl/openssl/issues/6234 for more details.
1578 _lib.SSL_set_mode(self._ssl, _lib.SSL_MODE_AUTO_RETRY)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001579 self._context = context
Todd Chapman4f73e4f2015-08-27 11:26:43 -04001580 self._app_data = None
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001581
Cory Benfieldbe3e7b82014-05-10 09:48:55 +01001582 # References to strings used for Next Protocol Negotiation. OpenSSL's
1583 # header files suggest that these might get copied at some point, but
1584 # doesn't specify when, so we store them here to make sure they don't
1585 # get freed before OpenSSL uses them.
1586 self._npn_advertise_callback_args = None
1587 self._npn_select_callback_args = None
1588
Cory Benfield12eae892014-06-07 15:42:56 +01001589 # References to strings used for Application Layer Protocol
1590 # Negotiation. These strings get copied at some point but it's well
1591 # after the callback returns, so we have to hang them somewhere to
1592 # avoid them getting freed.
1593 self._alpn_select_callback_args = None
1594
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001595 self._reverse_mapping[self._ssl] = self
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001596
1597 if socket is None:
1598 self._socket = None
Jean-Paul Calderone73b15c22013-03-05 18:30:39 -08001599 # Don't set up any gc for these, SSL_free will take care of them.
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001600 self._into_ssl = _lib.BIO_new(_lib.BIO_s_mem())
Alex Gaynora829e902016-06-04 18:16:01 -07001601 _openssl_assert(self._into_ssl != _ffi.NULL)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001602
Alex Gaynora829e902016-06-04 18:16:01 -07001603 self._from_ssl = _lib.BIO_new(_lib.BIO_s_mem())
1604 _openssl_assert(self._from_ssl != _ffi.NULL)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001605
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001606 _lib.SSL_set_bio(self._ssl, self._into_ssl, self._from_ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001607 else:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001608 self._into_ssl = None
1609 self._from_ssl = None
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001610 self._socket = socket
Alex Gaynor62da94d2015-09-05 14:37:34 -04001611 set_result = _lib.SSL_set_fd(
1612 self._ssl, _asFileDescriptor(self._socket))
Alex Gaynor09f19f52016-07-03 09:54:09 -04001613 _openssl_assert(set_result == 1)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001614
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001615 def __getattr__(self, name):
1616 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04001617 Look up attributes on the wrapped socket object if they are not found
1618 on the Connection object.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001619 """
kjav0b66fa12015-09-02 11:51:26 +01001620 if self._socket is None:
Alex Gaynor62da94d2015-09-05 14:37:34 -04001621 raise AttributeError("'%s' object has no attribute '%s'" % (
1622 self.__class__.__name__, name
1623 ))
kjav0b66fa12015-09-02 11:51:26 +01001624 else:
1625 return getattr(self._socket, name)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001626
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001627 def _raise_ssl_error(self, ssl, result):
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -08001628 if self._context._verify_helper is not None:
1629 self._context._verify_helper.raise_if_problem()
Cory Benfield0ea76e72015-03-22 09:05:28 +00001630 if self._context._npn_advertise_helper is not None:
1631 self._context._npn_advertise_helper.raise_if_problem()
1632 if self._context._npn_select_helper is not None:
1633 self._context._npn_select_helper.raise_if_problem()
Cory Benfieldf1177e72015-04-12 09:11:49 -04001634 if self._context._alpn_select_helper is not None:
1635 self._context._alpn_select_helper.raise_if_problem()
Cory Benfield496652a2017-01-24 11:42:56 +00001636 if self._context._ocsp_helper is not None:
1637 self._context._ocsp_helper.raise_if_problem()
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -08001638
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001639 error = _lib.SSL_get_error(ssl, result)
1640 if error == _lib.SSL_ERROR_WANT_READ:
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001641 raise WantReadError()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001642 elif error == _lib.SSL_ERROR_WANT_WRITE:
Jean-Paul Calderoned899af02013-03-19 22:10:37 -07001643 raise WantWriteError()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001644 elif error == _lib.SSL_ERROR_ZERO_RETURN:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001645 raise ZeroReturnError()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001646 elif error == _lib.SSL_ERROR_WANT_X509_LOOKUP:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001647 # TODO: This is untested.
Jean-Paul Calderoned899af02013-03-19 22:10:37 -07001648 raise WantX509LookupError()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001649 elif error == _lib.SSL_ERROR_SYSCALL:
1650 if _lib.ERR_peek_error() == 0:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001651 if result < 0:
Konstantinos Koukopoulos541150d2014-01-31 01:00:19 +02001652 if platform == "win32":
1653 errno = _ffi.getwinerror()[0]
1654 else:
1655 errno = _ffi.errno
Alex Gaynor5af32d02016-09-24 01:52:21 -04001656
1657 if errno != 0:
1658 raise SysCallError(errno, errorcode.get(errno))
1659 raise SysCallError(-1, "Unexpected EOF")
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001660 else:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001661 # TODO: This is untested.
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -05001662 _raise_current_error()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001663 elif error == _lib.SSL_ERROR_NONE:
Jean-Paul Calderoned899af02013-03-19 22:10:37 -07001664 pass
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001665 else:
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -05001666 _raise_current_error()
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001667
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001668 def get_context(self):
1669 """
Alex Chand072cae2018-02-15 09:57:59 +00001670 Retrieve the :class:`Context` object associated with this
1671 :class:`Connection`.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001672 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001673 return self._context
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001674
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001675 def set_context(self, context):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001676 """
Alex Chand072cae2018-02-15 09:57:59 +00001677 Switch this connection to a new session context.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001678
Alex Chand072cae2018-02-15 09:57:59 +00001679 :param context: A :class:`Context` instance giving the new session
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001680 context to use.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001681 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001682 if not isinstance(context, Context):
1683 raise TypeError("context must be a Context instance")
1684
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001685 _lib.SSL_set_SSL_CTX(self._ssl, context._context)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001686 self._context = context
1687
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001688 def get_servername(self):
1689 """
1690 Retrieve the servername extension value if provided in the client hello
1691 message, or None if there wasn't one.
1692
Alex Chand072cae2018-02-15 09:57:59 +00001693 :return: A byte string giving the server name or :data:`None`.
1694
1695 .. versionadded:: 0.13
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001696 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04001697 name = _lib.SSL_get_servername(
1698 self._ssl, _lib.TLSEXT_NAMETYPE_host_name
1699 )
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001700 if name == _ffi.NULL:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001701 return None
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001702
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001703 return _ffi.string(name)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001704
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001705 def set_tlsext_host_name(self, name):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001706 """
1707 Set the value of the servername extension to send in the client hello.
1708
1709 :param name: A byte string giving the name.
Alex Chand072cae2018-02-15 09:57:59 +00001710
1711 .. versionadded:: 0.13
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001712 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001713 if not isinstance(name, bytes):
1714 raise TypeError("name must be a byte string")
Jean-Paul Calderone4f0467a2014-01-11 11:58:41 -05001715 elif b"\0" in name:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001716 raise TypeError("name must not contain NUL byte")
1717
1718 # XXX I guess this can fail sometimes?
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001719 _lib.SSL_set_tlsext_host_name(self._ssl, name)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001720
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001721 def pending(self):
1722 """
Alex Chand072cae2018-02-15 09:57:59 +00001723 Get the number of bytes that can be safely read from the SSL buffer
1724 (**not** the underlying transport buffer).
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001725
1726 :return: The number of bytes available in the receive buffer.
1727 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001728 return _lib.SSL_pending(self._ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001729
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001730 def send(self, buf, flags=0):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001731 """
1732 Send data on the connection. NOTE: If you get one of the WantRead,
1733 WantWrite or WantX509Lookup exceptions on this, you have to call the
1734 method again with the SAME buffer.
1735
Markus Unterwaditzer8e41d022014-04-19 12:27:11 +02001736 :param buf: The string, buffer or memoryview to send
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001737 :param flags: (optional) Included for compatibility with the socket
1738 API, the value is ignored
1739 :return: The number of bytes written
1740 """
Abraham Martine82326c2015-02-04 10:18:10 +00001741 # Backward compatibility
Jean-Paul Calderone39a8d592015-04-13 20:49:50 -04001742 buf = _text_to_bytes_and_warn("buf", buf)
Abraham Martine82326c2015-02-04 10:18:10 +00001743
Daniel Holth079c9632019-11-17 22:45:52 -05001744 with _from_buffer(buf) as data:
1745 # check len(buf) instead of len(data) for testability
1746 if len(buf) > 2147483647:
1747 raise ValueError(
1748 "Cannot send more than 2**31-1 bytes at once."
1749 )
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001750
Daniel Holth079c9632019-11-17 22:45:52 -05001751 result = _lib.SSL_write(self._ssl, data, len(data))
1752 self._raise_ssl_error(self._ssl, result)
1753
1754 return result
1755
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001756 write = send
1757
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001758 def sendall(self, buf, flags=0):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001759 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001760 Send "all" data on the connection. This calls send() repeatedly until
1761 all data is sent. If an error occurs, it's impossible to tell how much
1762 data has been sent.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001763
Markus Unterwaditzer8e41d022014-04-19 12:27:11 +02001764 :param buf: The string, buffer or memoryview to send
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001765 :param flags: (optional) Included for compatibility with the socket
1766 API, the value is ignored
1767 :return: The number of bytes written
1768 """
Jean-Paul Calderone39a8d592015-04-13 20:49:50 -04001769 buf = _text_to_bytes_and_warn("buf", buf)
Abraham Martine82326c2015-02-04 10:18:10 +00001770
Daniel Holth079c9632019-11-17 22:45:52 -05001771 with _from_buffer(buf) as data:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001772
Daniel Holth079c9632019-11-17 22:45:52 -05001773 left_to_send = len(buf)
1774 total_sent = 0
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001775
Daniel Holth079c9632019-11-17 22:45:52 -05001776 while left_to_send:
1777 # SSL_write's num arg is an int,
1778 # so we cannot send more than 2**31-1 bytes at once.
1779 result = _lib.SSL_write(
1780 self._ssl,
1781 data + total_sent,
1782 min(left_to_send, 2147483647)
1783 )
1784 self._raise_ssl_error(self._ssl, result)
1785 total_sent += result
1786 left_to_send -= result
1787
1788 return total_sent
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001789
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001790 def recv(self, bufsiz, flags=None):
1791 """
Alex Gaynor67fc8c92016-05-27 08:27:19 -04001792 Receive data on the connection.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001793
1794 :param bufsiz: The maximum number of bytes to read
Maximilian Hils1d95dea2015-08-17 19:27:20 +02001795 :param flags: (optional) The only supported flag is ``MSG_PEEK``,
1796 all other flags are ignored.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001797 :return: The string read from the Connection
1798 """
Cory Benfielde62840e2016-11-28 12:17:08 +00001799 buf = _no_zero_allocator("char[]", bufsiz)
Maximilian Hils1d95dea2015-08-17 19:27:20 +02001800 if flags is not None and flags & socket.MSG_PEEK:
1801 result = _lib.SSL_peek(self._ssl, buf, bufsiz)
1802 else:
1803 result = _lib.SSL_read(self._ssl, buf, bufsiz)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001804 self._raise_ssl_error(self._ssl, result)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001805 return _ffi.buffer(buf, result)[:]
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001806 read = recv
1807
Cory Benfield62d10332014-06-15 10:03:41 +01001808 def recv_into(self, buffer, nbytes=None, flags=None):
1809 """
Alex Chand072cae2018-02-15 09:57:59 +00001810 Receive data on the connection and copy it directly into the provided
1811 buffer, rather than creating a new string.
Cory Benfield62d10332014-06-15 10:03:41 +01001812
1813 :param buffer: The buffer to copy into.
1814 :param nbytes: (optional) The maximum number of bytes to read into the
1815 buffer. If not present, defaults to the size of the buffer. If
1816 larger than the size of the buffer, is reduced to the size of the
1817 buffer.
Maximilian Hils1d95dea2015-08-17 19:27:20 +02001818 :param flags: (optional) The only supported flag is ``MSG_PEEK``,
1819 all other flags are ignored.
Cory Benfield62d10332014-06-15 10:03:41 +01001820 :return: The number of bytes read into the buffer.
1821 """
1822 if nbytes is None:
1823 nbytes = len(buffer)
1824 else:
1825 nbytes = min(nbytes, len(buffer))
1826
1827 # We need to create a temporary buffer. This is annoying, it would be
1828 # better if we could pass memoryviews straight into the SSL_read call,
1829 # but right now we can't. Revisit this if CFFI gets that ability.
Cory Benfielde62840e2016-11-28 12:17:08 +00001830 buf = _no_zero_allocator("char[]", nbytes)
Maximilian Hils1d95dea2015-08-17 19:27:20 +02001831 if flags is not None and flags & socket.MSG_PEEK:
1832 result = _lib.SSL_peek(self._ssl, buf, nbytes)
1833 else:
1834 result = _lib.SSL_read(self._ssl, buf, nbytes)
Cory Benfield62d10332014-06-15 10:03:41 +01001835 self._raise_ssl_error(self._ssl, result)
1836
1837 # This strange line is all to avoid a memory copy. The buffer protocol
1838 # should allow us to assign a CFFI buffer to the LHS of this line, but
1839 # on CPython 3.3+ that segfaults. As a workaround, we can temporarily
Jeremy Lainé1ae7cb62018-03-21 14:49:42 +01001840 # wrap it in a memoryview.
1841 buffer[:result] = memoryview(_ffi.buffer(buf, result))
Cory Benfield62d10332014-06-15 10:03:41 +01001842
1843 return result
1844
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001845 def _handle_bio_errors(self, bio, result):
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001846 if _lib.BIO_should_retry(bio):
1847 if _lib.BIO_should_read(bio):
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001848 raise WantReadError()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001849 elif _lib.BIO_should_write(bio):
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001850 # TODO: This is untested.
Jean-Paul Calderoned899af02013-03-19 22:10:37 -07001851 raise WantWriteError()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001852 elif _lib.BIO_should_io_special(bio):
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001853 # TODO: This is untested. I think io_special means the socket
1854 # BIO has a not-yet connected socket.
Jean-Paul Calderoned899af02013-03-19 22:10:37 -07001855 raise ValueError("BIO_should_io_special")
1856 else:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001857 # TODO: This is untested.
Jean-Paul Calderoned899af02013-03-19 22:10:37 -07001858 raise ValueError("unknown bio failure")
1859 else:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001860 # TODO: This is untested.
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -05001861 _raise_current_error()
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001862
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001863 def bio_read(self, bufsiz):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001864 """
Alex Chand072cae2018-02-15 09:57:59 +00001865 If the Connection was created with a memory BIO, this method can be
1866 used to read bytes from the write end of that memory BIO. Many
1867 Connection methods will add bytes which must be read in this manner or
1868 the buffer will eventually fill up and the Connection will be able to
1869 take no further actions.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001870
1871 :param bufsiz: The maximum number of bytes to read
1872 :return: The string read.
1873 """
Jean-Paul Calderone97e041d2013-03-05 21:03:12 -08001874 if self._from_ssl is None:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001875 raise TypeError("Connection sock was not None")
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001876
Jean-Paul Calderonebef4f4c2014-02-02 18:13:31 -05001877 if not isinstance(bufsiz, integer_types):
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001878 raise TypeError("bufsiz must be an integer")
1879
Cory Benfielde62840e2016-11-28 12:17:08 +00001880 buf = _no_zero_allocator("char[]", bufsiz)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001881 result = _lib.BIO_read(self._from_ssl, buf, bufsiz)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001882 if result <= 0:
1883 self._handle_bio_errors(self._from_ssl, result)
1884
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001885 return _ffi.buffer(buf, result)[:]
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001886
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001887 def bio_write(self, buf):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001888 """
Alex Chand072cae2018-02-15 09:57:59 +00001889 If the Connection was created with a memory BIO, this method can be
1890 used to add bytes to the read end of that memory BIO. The Connection
1891 can then read the bytes (for example, in response to a call to
1892 :meth:`recv`).
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001893
1894 :param buf: The string to put into the memory BIO.
1895 :return: The number of bytes written
1896 """
Jean-Paul Calderone39a8d592015-04-13 20:49:50 -04001897 buf = _text_to_bytes_and_warn("buf", buf)
Abraham Martine82326c2015-02-04 10:18:10 +00001898
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001899 if self._into_ssl is None:
1900 raise TypeError("Connection sock was not None")
1901
Daniel Holth079c9632019-11-17 22:45:52 -05001902 with _from_buffer(buf) as data:
1903 result = _lib.BIO_write(self._into_ssl, data, len(data))
1904 if result <= 0:
1905 self._handle_bio_errors(self._into_ssl, result)
1906 return result
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001907
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001908 def renegotiate(self):
1909 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001910 Renegotiate the session.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001911
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001912 :return: True if the renegotiation can be started, False otherwise
1913 :rtype: bool
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001914 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001915 if not self.renegotiate_pending():
1916 _openssl_assert(_lib.SSL_renegotiate(self._ssl) == 1)
1917 return True
1918 return False
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001919
1920 def do_handshake(self):
1921 """
Alex Chand072cae2018-02-15 09:57:59 +00001922 Perform an SSL handshake (usually called after :meth:`renegotiate` or
Daniel Holth3efa98c2019-07-05 14:50:57 -04001923 one of :meth:`set_accept_state` or :meth:`set_connect_state`). This can
Alex Chand072cae2018-02-15 09:57:59 +00001924 raise the same exceptions as :meth:`send` and :meth:`recv`.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001925
1926 :return: None.
1927 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001928 result = _lib.SSL_do_handshake(self._ssl)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001929 self._raise_ssl_error(self._ssl, result)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001930
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001931 def renegotiate_pending(self):
1932 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001933 Check if there's a renegotiation in progress, it will return False once
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001934 a renegotiation is finished.
1935
1936 :return: Whether there's a renegotiation in progress
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001937 :rtype: bool
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001938 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001939 return _lib.SSL_renegotiate_pending(self._ssl) == 1
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001940
1941 def total_renegotiations(self):
1942 """
1943 Find out the total number of renegotiations.
1944
1945 :return: The number of renegotiations.
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001946 :rtype: int
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001947 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001948 return _lib.SSL_total_renegotiations(self._ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001949
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001950 def connect(self, addr):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001951 """
Alex Chand072cae2018-02-15 09:57:59 +00001952 Call the :meth:`connect` method of the underlying socket and set up SSL
1953 on the socket, using the :class:`Context` object supplied to this
1954 :class:`Connection` object at creation.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001955
1956 :param addr: A remote address
1957 :return: What the socket's connect method returns
1958 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001959 _lib.SSL_set_connect_state(self._ssl)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001960 return self._socket.connect(addr)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001961
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001962 def connect_ex(self, addr):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001963 """
Alex Chand072cae2018-02-15 09:57:59 +00001964 Call the :meth:`connect_ex` method of the underlying socket and set up
1965 SSL on the socket, using the Context object supplied to this Connection
1966 object at creation. Note that if the :meth:`connect_ex` method of the
1967 socket doesn't return 0, SSL won't be initialized.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001968
1969 :param addr: A remove address
1970 :return: What the socket's connect_ex method returns
1971 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001972 connect_ex = self._socket.connect_ex
1973 self.set_connect_state()
1974 return connect_ex(addr)
1975
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001976 def accept(self):
1977 """
Alex Chand072cae2018-02-15 09:57:59 +00001978 Call the :meth:`accept` method of the underlying socket and set up SSL
1979 on the returned socket, using the Context object supplied to this
1980 :class:`Connection` object at creation.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001981
Alex Chand072cae2018-02-15 09:57:59 +00001982 :return: A *(conn, addr)* pair where *conn* is the new
1983 :class:`Connection` object created, and *address* is as returned by
1984 the socket's :meth:`accept`.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001985 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001986 client, addr = self._socket.accept()
1987 conn = Connection(self._context, client)
1988 conn.set_accept_state()
1989 return (conn, addr)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001990
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001991 def bio_shutdown(self):
1992 """
Alex Chand072cae2018-02-15 09:57:59 +00001993 If the Connection was created with a memory BIO, this method can be
1994 used to indicate that *end of file* has been reached on the read end of
1995 that memory BIO.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001996
1997 :return: None
1998 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001999 if self._from_ssl is None:
2000 raise TypeError("Connection sock was not None")
2001
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002002 _lib.BIO_set_mem_eof_return(self._into_ssl, 0)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002003
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002004 def shutdown(self):
2005 """
Alex Chand072cae2018-02-15 09:57:59 +00002006 Send the shutdown message to the Connection.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002007
2008 :return: True if the shutdown completed successfully (i.e. both sides
Alex Chand072cae2018-02-15 09:57:59 +00002009 have sent closure alerts), False otherwise (in which case you
2010 call :meth:`recv` or :meth:`send` when the connection becomes
2011 readable/writeable).
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002012 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002013 result = _lib.SSL_shutdown(self._ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002014 if result < 0:
Paul Aurichbff1d1a2015-01-08 08:36:53 -08002015 self._raise_ssl_error(self._ssl, result)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002016 elif result > 0:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002017 return True
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002018 else:
2019 return False
2020
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002021 def get_cipher_list(self):
2022 """
Hynek Schlawackf90e3682016-03-11 11:21:13 +01002023 Retrieve the list of ciphers used by the Connection object.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002024
Hynek Schlawackf90e3682016-03-11 11:21:13 +01002025 :return: A list of native cipher strings.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002026 """
2027 ciphers = []
2028 for i in count():
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002029 result = _lib.SSL_get_cipher_list(self._ssl, i)
2030 if result == _ffi.NULL:
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002031 break
Jean-Paul Calderone4f0467a2014-01-11 11:58:41 -05002032 ciphers.append(_native(_ffi.string(result)))
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002033 return ciphers
2034
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002035 def get_client_ca_list(self):
2036 """
2037 Get CAs whose certificates are suggested for client authentication.
2038
Alex Chand072cae2018-02-15 09:57:59 +00002039 :return: If this is a server connection, the list of certificate
2040 authorities that will be sent or has been sent to the client, as
2041 controlled by this :class:`Connection`'s :class:`Context`.
2042
2043 If this is a client connection, the list will be empty until the
2044 connection with the server is established.
2045
2046 .. versionadded:: 0.10
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002047 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002048 ca_names = _lib.SSL_get_client_CA_list(self._ssl)
2049 if ca_names == _ffi.NULL:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05002050 # TODO: This is untested.
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002051 return []
2052
2053 result = []
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002054 for i in range(_lib.sk_X509_NAME_num(ca_names)):
2055 name = _lib.sk_X509_NAME_value(ca_names, i)
2056 copy = _lib.X509_NAME_dup(name)
Alex Gaynora829e902016-06-04 18:16:01 -07002057 _openssl_assert(copy != _ffi.NULL)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002058
2059 pyname = X509Name.__new__(X509Name)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002060 pyname._name = _ffi.gc(copy, _lib.X509_NAME_free)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002061 result.append(pyname)
2062 return result
2063
Aykee7f33452018-05-16 19:18:16 +02002064 def makefile(self, *args, **kwargs):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002065 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04002066 The makefile() method is not implemented, since there is no dup
2067 semantics for SSL connections
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002068
Jean-Paul Calderone6749ec22014-04-17 16:30:21 -04002069 :raise: NotImplementedError
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002070 """
Alex Gaynor83284952015-09-05 10:43:30 -04002071 raise NotImplementedError(
2072 "Cannot make file object of OpenSSL.SSL.Connection")
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002073
2074 def get_app_data(self):
2075 """
Alex Chand072cae2018-02-15 09:57:59 +00002076 Retrieve application data as set by :meth:`set_app_data`.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002077
2078 :return: The application data
2079 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002080 return self._app_data
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002081
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002082 def set_app_data(self, data):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002083 """
2084 Set application data
2085
Alex Chand072cae2018-02-15 09:57:59 +00002086 :param data: The application data
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002087 :return: None
2088 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002089 self._app_data = data
2090
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002091 def get_shutdown(self):
2092 """
Alex Chand072cae2018-02-15 09:57:59 +00002093 Get the shutdown state of the Connection.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002094
Alex Gaynor62da94d2015-09-05 14:37:34 -04002095 :return: The shutdown state, a bitvector of SENT_SHUTDOWN,
2096 RECEIVED_SHUTDOWN.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002097 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002098 return _lib.SSL_get_shutdown(self._ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002099
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002100 def set_shutdown(self, state):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002101 """
Alex Chand072cae2018-02-15 09:57:59 +00002102 Set the shutdown state of the Connection.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002103
Alex Chand072cae2018-02-15 09:57:59 +00002104 :param state: bitvector of SENT_SHUTDOWN, RECEIVED_SHUTDOWN.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002105 :return: None
2106 """
Jean-Paul Calderonef73a3cb2014-02-09 08:49:06 -05002107 if not isinstance(state, integer_types):
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002108 raise TypeError("state must be an integer")
2109
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002110 _lib.SSL_set_shutdown(self._ssl, state)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002111
Hynek Schlawackea94f2b2016-03-13 16:17:53 +01002112 def get_state_string(self):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002113 """
Hynek Schlawackea94f2b2016-03-13 16:17:53 +01002114 Retrieve a verbose string detailing the state of the Connection.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002115
2116 :return: A string representing the state
Hynek Schlawackea94f2b2016-03-13 16:17:53 +01002117 :rtype: bytes
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002118 """
kjavc704a2e2015-09-07 12:12:27 +01002119 return _ffi.string(_lib.SSL_state_string_long(self._ssl))
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002120
2121 def server_random(self):
2122 """
Alex Chand072cae2018-02-15 09:57:59 +00002123 Retrieve the random value used with the server hello message.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002124
2125 :return: A string representing the state
2126 """
Alex Gaynor93603062016-06-01 20:13:09 -07002127 session = _lib.SSL_get_session(self._ssl)
2128 if session == _ffi.NULL:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002129 return None
Alex Gaynor93603062016-06-01 20:13:09 -07002130 length = _lib.SSL_get_server_random(self._ssl, _ffi.NULL, 0)
Adrián Chaves98c57be2020-03-31 16:14:50 +02002131 _openssl_assert(length > 0)
Cory Benfielde62840e2016-11-28 12:17:08 +00002132 outp = _no_zero_allocator("unsigned char[]", length)
Alex Gaynor93603062016-06-01 20:13:09 -07002133 _lib.SSL_get_server_random(self._ssl, outp, length)
2134 return _ffi.buffer(outp, length)[:]
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002135
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002136 def client_random(self):
2137 """
Alex Chand072cae2018-02-15 09:57:59 +00002138 Retrieve the random value used with the client hello message.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002139
2140 :return: A string representing the state
2141 """
Alex Gaynor93603062016-06-01 20:13:09 -07002142 session = _lib.SSL_get_session(self._ssl)
2143 if session == _ffi.NULL:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002144 return None
Alex Gaynor93603062016-06-01 20:13:09 -07002145
2146 length = _lib.SSL_get_client_random(self._ssl, _ffi.NULL, 0)
Adrián Chaves98c57be2020-03-31 16:14:50 +02002147 _openssl_assert(length > 0)
Cory Benfielde62840e2016-11-28 12:17:08 +00002148 outp = _no_zero_allocator("unsigned char[]", length)
Alex Gaynor93603062016-06-01 20:13:09 -07002149 _lib.SSL_get_client_random(self._ssl, outp, length)
2150 return _ffi.buffer(outp, length)[:]
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002151
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002152 def master_key(self):
2153 """
Alex Chand072cae2018-02-15 09:57:59 +00002154 Retrieve the value of the master key for this session.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002155
2156 :return: A string representing the state
2157 """
Alex Gaynor93603062016-06-01 20:13:09 -07002158 session = _lib.SSL_get_session(self._ssl)
2159 if session == _ffi.NULL:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002160 return None
Alex Gaynor93603062016-06-01 20:13:09 -07002161
2162 length = _lib.SSL_SESSION_get_master_key(session, _ffi.NULL, 0)
Adrián Chaves98c57be2020-03-31 16:14:50 +02002163 _openssl_assert(length > 0)
Cory Benfielde62840e2016-11-28 12:17:08 +00002164 outp = _no_zero_allocator("unsigned char[]", length)
Alex Gaynor93603062016-06-01 20:13:09 -07002165 _lib.SSL_SESSION_get_master_key(session, outp, length)
2166 return _ffi.buffer(outp, length)[:]
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002167
Paul Kehrerbdb76392017-12-01 04:54:32 +08002168 def export_keying_material(self, label, olen, context=None):
2169 """
2170 Obtain keying material for application use.
2171
Alex Chand072cae2018-02-15 09:57:59 +00002172 :param: label - a disambiguating label string as described in RFC 5705
2173 :param: olen - the length of the exported key material in bytes
2174 :param: context - a per-association context value
2175 :return: the exported key material bytes or None
Paul Kehrerbdb76392017-12-01 04:54:32 +08002176 """
2177 outp = _no_zero_allocator("unsigned char[]", olen)
2178 context_buf = _ffi.NULL
2179 context_len = 0
2180 use_context = 0
2181 if context is not None:
2182 context_buf = context
2183 context_len = len(context)
2184 use_context = 1
2185 success = _lib.SSL_export_keying_material(self._ssl, outp, olen,
2186 label, len(label),
2187 context_buf, context_len,
2188 use_context)
2189 _openssl_assert(success == 1)
2190 return _ffi.buffer(outp, olen)[:]
2191
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002192 def sock_shutdown(self, *args, **kwargs):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002193 """
Alex Chand072cae2018-02-15 09:57:59 +00002194 Call the :meth:`shutdown` method of the underlying socket.
2195 See :manpage:`shutdown(2)`.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002196
2197 :return: What the socket's shutdown() method returns
2198 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002199 return self._socket.shutdown(*args, **kwargs)
2200
Jeremy Lainé460a19d2018-05-16 19:44:19 +02002201 def get_certificate(self):
2202 """
2203 Retrieve the local certificate (if any)
2204
2205 :return: The local certificate
2206 """
2207 cert = _lib.SSL_get_certificate(self._ssl)
2208 if cert != _ffi.NULL:
2209 _lib.X509_up_ref(cert)
2210 return X509._from_raw_x509_ptr(cert)
2211 return None
2212
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002213 def get_peer_certificate(self):
2214 """
2215 Retrieve the other side's certificate (if any)
2216
2217 :return: The peer's certificate
2218 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002219 cert = _lib.SSL_get_peer_certificate(self._ssl)
2220 if cert != _ffi.NULL:
Alex Gaynor4aa52c32017-11-20 09:04:08 -05002221 return X509._from_raw_x509_ptr(cert)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002222 return None
2223
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002224 def get_peer_cert_chain(self):
2225 """
2226 Retrieve the other side's certificate (if any)
2227
2228 :return: A list of X509 instances giving the peer's certificate chain,
2229 or None if it does not have one.
2230 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002231 cert_stack = _lib.SSL_get_peer_cert_chain(self._ssl)
2232 if cert_stack == _ffi.NULL:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002233 return None
2234
2235 result = []
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002236 for i in range(_lib.sk_X509_num(cert_stack)):
Jean-Paul Calderone73b15c22013-03-05 18:30:39 -08002237 # TODO could incref instead of dup here
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002238 cert = _lib.X509_dup(_lib.sk_X509_value(cert_stack, i))
Alex Gaynor4aa52c32017-11-20 09:04:08 -05002239 pycert = X509._from_raw_x509_ptr(cert)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002240 result.append(pycert)
2241 return result
2242
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002243 def want_read(self):
2244 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04002245 Checks if more data has to be read from the transport layer to complete
2246 an operation.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002247
2248 :return: True iff more data has to be read
2249 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002250 return _lib.SSL_want_read(self._ssl)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002251
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002252 def want_write(self):
2253 """
2254 Checks if there is data to write to the transport layer to complete an
2255 operation.
2256
2257 :return: True iff there is data to write
2258 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002259 return _lib.SSL_want_write(self._ssl)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002260
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002261 def set_accept_state(self):
2262 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04002263 Set the connection to work in server mode. The handshake will be
2264 handled automatically by read/write.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002265
2266 :return: None
2267 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002268 _lib.SSL_set_accept_state(self._ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002269
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002270 def set_connect_state(self):
2271 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04002272 Set the connection to work in client mode. The handshake will be
2273 handled automatically by read/write.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002274
2275 :return: None
2276 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002277 _lib.SSL_set_connect_state(self._ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002278
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002279 def get_session(self):
2280 """
2281 Returns the Session currently used.
2282
Alex Chand072cae2018-02-15 09:57:59 +00002283 :return: An instance of :class:`OpenSSL.SSL.Session` or
2284 :obj:`None` if no session exists.
2285
2286 .. versionadded:: 0.14
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002287 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002288 session = _lib.SSL_get1_session(self._ssl)
2289 if session == _ffi.NULL:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002290 return None
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002291
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002292 pysession = Session.__new__(Session)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002293 pysession._session = _ffi.gc(session, _lib.SSL_SESSION_free)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002294 return pysession
2295
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002296 def set_session(self, session):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002297 """
2298 Set the session to be used when the TLS/SSL connection is established.
2299
2300 :param session: A Session instance representing the session to use.
2301 :returns: None
Alex Chand072cae2018-02-15 09:57:59 +00002302
2303 .. versionadded:: 0.14
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002304 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002305 if not isinstance(session, Session):
2306 raise TypeError("session must be a Session instance")
2307
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002308 result = _lib.SSL_set_session(self._ssl, session._session)
Alex Gaynor77debda2020-04-07 13:40:59 -04002309 _openssl_assert(result == 1)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002310
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002311 def _get_finished_message(self, function):
2312 """
Alex Chand072cae2018-02-15 09:57:59 +00002313 Helper to implement :meth:`get_finished` and
2314 :meth:`get_peer_finished`.
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002315
Alex Chand072cae2018-02-15 09:57:59 +00002316 :param function: Either :data:`SSL_get_finished`: or
2317 :data:`SSL_get_peer_finished`.
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002318
Alex Chand072cae2018-02-15 09:57:59 +00002319 :return: :data:`None` if the desired message has not yet been
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002320 received, otherwise the contents of the message.
Alex Chand072cae2018-02-15 09:57:59 +00002321 :rtype: :class:`bytes` or :class:`NoneType`
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002322 """
Jean-Paul Calderone01af9042014-03-30 11:40:42 -04002323 # The OpenSSL documentation says nothing about what might happen if the
2324 # count argument given is zero. Specifically, it doesn't say whether
2325 # the output buffer may be NULL in that case or not. Inspection of the
2326 # implementation reveals that it calls memcpy() unconditionally.
2327 # Section 7.1.4, paragraph 1 of the C standard suggests that
2328 # memcpy(NULL, source, 0) is not guaranteed to produce defined (let
2329 # alone desirable) behavior (though it probably does on just about
2330 # every implementation...)
2331 #
2332 # Allocate a tiny buffer to pass in (instead of just passing NULL as
2333 # one might expect) for the initial call so as to be safe against this
2334 # potentially undefined behavior.
2335 empty = _ffi.new("char[]", 0)
2336 size = function(self._ssl, empty, 0)
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002337 if size == 0:
2338 # No Finished message so far.
2339 return None
2340
Cory Benfielde62840e2016-11-28 12:17:08 +00002341 buf = _no_zero_allocator("char[]", size)
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002342 function(self._ssl, buf, size)
2343 return _ffi.buffer(buf, size)[:]
2344
Fedor Brunner5747b932014-03-05 14:22:34 +01002345 def get_finished(self):
2346 """
Alex Chand072cae2018-02-15 09:57:59 +00002347 Obtain the latest TLS Finished message that we sent.
Fedor Brunner5747b932014-03-05 14:22:34 +01002348
Alex Chand072cae2018-02-15 09:57:59 +00002349 :return: The contents of the message or :obj:`None` if the TLS
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002350 handshake has not yet completed.
Alex Chand072cae2018-02-15 09:57:59 +00002351 :rtype: :class:`bytes` or :class:`NoneType`
2352
2353 .. versionadded:: 0.15
Fedor Brunner5747b932014-03-05 14:22:34 +01002354 """
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002355 return self._get_finished_message(_lib.SSL_get_finished)
2356
Fedor Brunner5747b932014-03-05 14:22:34 +01002357 def get_peer_finished(self):
2358 """
Alex Chand072cae2018-02-15 09:57:59 +00002359 Obtain the latest TLS Finished message that we received from the peer.
Fedor Brunner5747b932014-03-05 14:22:34 +01002360
Alex Chand072cae2018-02-15 09:57:59 +00002361 :return: The contents of the message or :obj:`None` if the TLS
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002362 handshake has not yet completed.
Alex Chand072cae2018-02-15 09:57:59 +00002363 :rtype: :class:`bytes` or :class:`NoneType`
2364
2365 .. versionadded:: 0.15
Fedor Brunner5747b932014-03-05 14:22:34 +01002366 """
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002367 return self._get_finished_message(_lib.SSL_get_peer_finished)
Fedor Brunner5747b932014-03-05 14:22:34 +01002368
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002369 def get_cipher_name(self):
2370 """
2371 Obtain the name of the currently used cipher.
Jean-Paul Calderone9e3ccd42014-03-29 18:13:36 -04002372
Alex Chand072cae2018-02-15 09:57:59 +00002373 :returns: The name of the currently used cipher or :obj:`None`
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002374 if no connection has been established.
Alex Chand072cae2018-02-15 09:57:59 +00002375 :rtype: :class:`unicode` or :class:`NoneType`
2376
2377 .. versionadded:: 0.15
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002378 """
2379 cipher = _lib.SSL_get_current_cipher(self._ssl)
2380 if cipher == _ffi.NULL:
2381 return None
2382 else:
Jean-Paul Calderone7f0ded42014-03-30 10:34:17 -04002383 name = _ffi.string(_lib.SSL_CIPHER_get_name(cipher))
2384 return name.decode("utf-8")
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002385
2386 def get_cipher_bits(self):
2387 """
2388 Obtain the number of secret bits of the currently used cipher.
Jean-Paul Calderone9e3ccd42014-03-29 18:13:36 -04002389
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002390 :returns: The number of secret bits of the currently used cipher
Alex Chand072cae2018-02-15 09:57:59 +00002391 or :obj:`None` if no connection has been established.
2392 :rtype: :class:`int` or :class:`NoneType`
2393
2394 .. versionadded:: 0.15
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002395 """
2396 cipher = _lib.SSL_get_current_cipher(self._ssl)
2397 if cipher == _ffi.NULL:
2398 return None
2399 else:
2400 return _lib.SSL_CIPHER_get_bits(cipher, _ffi.NULL)
2401
2402 def get_cipher_version(self):
2403 """
Jean-Paul Calderone9e3ccd42014-03-29 18:13:36 -04002404 Obtain the protocol version of the currently used cipher.
2405
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002406 :returns: The protocol name of the currently used cipher
Alex Chand072cae2018-02-15 09:57:59 +00002407 or :obj:`None` if no connection has been established.
2408 :rtype: :class:`unicode` or :class:`NoneType`
2409
2410 .. versionadded:: 0.15
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002411 """
2412 cipher = _lib.SSL_get_current_cipher(self._ssl)
2413 if cipher == _ffi.NULL:
2414 return None
2415 else:
Alex Gaynorc4889812015-09-04 08:43:17 -04002416 version = _ffi.string(_lib.SSL_CIPHER_get_version(cipher))
Jean-Paul Calderone7f0ded42014-03-30 10:34:17 -04002417 return version.decode("utf-8")
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002418
Jim Shaverabff1882015-05-27 09:15:55 -04002419 def get_protocol_version_name(self):
Jim Shaverba65e662015-04-26 12:23:40 -04002420 """
Alex Chand072cae2018-02-15 09:57:59 +00002421 Retrieve the protocol version of the current connection.
Jim Shaverba65e662015-04-26 12:23:40 -04002422
2423 :returns: The TLS version of the current connection, for example
Jim Shaver58d25732015-05-28 11:52:32 -04002424 the value for TLS 1.2 would be ``TLSv1.2``or ``Unknown``
Jim Shaverb5b6b0e2015-05-28 16:47:36 -04002425 for connections that were not successfully established.
Alex Chand072cae2018-02-15 09:57:59 +00002426 :rtype: :class:`unicode`
Jim Shaverba65e662015-04-26 12:23:40 -04002427 """
Jim Shaverd1c896e2015-05-27 17:50:21 -04002428 version = _ffi.string(_lib.SSL_get_version(self._ssl))
Jim Shaver58d25732015-05-28 11:52:32 -04002429 return version.decode("utf-8")
Jim Shaverb2967922015-04-26 23:58:52 -04002430
Jim Shaver208438c2015-05-28 09:52:38 -04002431 def get_protocol_version(self):
2432 """
Alex Chand072cae2018-02-15 09:57:59 +00002433 Retrieve the SSL or TLS protocol version of the current connection.
Jim Shaver208438c2015-05-28 09:52:38 -04002434
Alex Chand072cae2018-02-15 09:57:59 +00002435 :returns: The TLS version of the current connection. For example,
2436 it will return ``0x769`` for connections made over TLS version 1.
2437 :rtype: :class:`int`
Jim Shaver208438c2015-05-28 09:52:38 -04002438 """
2439 version = _lib.SSL_version(self._ssl)
2440 return version
2441
Cory Benfield10b277f2015-04-13 17:12:42 -04002442 @_requires_npn
Cory Benfield84a121e2014-03-31 20:30:25 +01002443 def get_next_proto_negotiated(self):
2444 """
2445 Get the protocol that was negotiated by NPN.
Alex Chand072cae2018-02-15 09:57:59 +00002446
2447 :returns: A bytestring of the protocol name. If no protocol has been
2448 negotiated yet, returns an empty string.
2449
2450 .. versionadded:: 0.15
Cory Benfield84a121e2014-03-31 20:30:25 +01002451 """
Alex Gaynorbe2bd542019-02-21 21:41:22 -05002452 _warn_npn()
Cory Benfield84a121e2014-03-31 20:30:25 +01002453 data = _ffi.new("unsigned char **")
2454 data_len = _ffi.new("unsigned int *")
2455
2456 _lib.SSL_get0_next_proto_negotiated(self._ssl, data, data_len)
2457
Cory Benfieldcd010f62014-05-15 19:00:27 +01002458 return _ffi.buffer(data[0], data_len[0])[:]
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002459
Cory Benfield7907e332015-04-13 17:18:25 -04002460 @_requires_alpn
Cory Benfield12eae892014-06-07 15:42:56 +01002461 def set_alpn_protos(self, protos):
2462 """
Cory Benfielde8e9c382015-04-11 17:33:48 -04002463 Specify the client's ALPN protocol list.
2464
2465 These protocols are offered to the server during protocol negotiation.
Cory Benfield12eae892014-06-07 15:42:56 +01002466
2467 :param protos: A list of the protocols to be offered to the server.
2468 This list should be a Python list of bytestrings representing the
2469 protocols to offer, e.g. ``[b'http/1.1', b'spdy/2']``.
2470 """
2471 # Take the list of protocols and join them together, prefixing them
2472 # with their lengths.
2473 protostr = b''.join(
2474 chain.from_iterable((int2byte(len(p)), p) for p in protos)
2475 )
2476
2477 # Build a C string from the list. We don't need to save this off
2478 # because OpenSSL immediately copies the data out.
2479 input_str = _ffi.new("unsigned char[]", protostr)
Alex Gaynord61c46a2017-06-29 22:51:33 -07002480 _lib.SSL_set_alpn_protos(self._ssl, input_str, len(protostr))
Cory Benfield12eae892014-06-07 15:42:56 +01002481
Maximilian Hils66ded6a2015-08-26 06:02:03 +02002482 @_requires_alpn
Cory Benfield12eae892014-06-07 15:42:56 +01002483 def get_alpn_proto_negotiated(self):
Cory Benfield222f30e2015-04-13 18:10:21 -04002484 """
2485 Get the protocol that was negotiated by ALPN.
Alex Chand072cae2018-02-15 09:57:59 +00002486
2487 :returns: A bytestring of the protocol name. If no protocol has been
2488 negotiated yet, returns an empty string.
Cory Benfield222f30e2015-04-13 18:10:21 -04002489 """
Cory Benfield12eae892014-06-07 15:42:56 +01002490 data = _ffi.new("unsigned char **")
2491 data_len = _ffi.new("unsigned int *")
2492
2493 _lib.SSL_get0_alpn_selected(self._ssl, data, data_len)
2494
Cory Benfielde8e9c382015-04-11 17:33:48 -04002495 if not data_len:
2496 return b''
2497
Cory Benfield12eae892014-06-07 15:42:56 +01002498 return _ffi.buffer(data[0], data_len[0])[:]
2499
Cory Benfield496652a2017-01-24 11:42:56 +00002500 def request_ocsp(self):
2501 """
2502 Called to request that the server sends stapled OCSP data, if
2503 available. If this is not called on the client side then the server
2504 will not send OCSP data. Should be used in conjunction with
2505 :meth:`Context.set_ocsp_client_callback`.
2506 """
2507 rc = _lib.SSL_set_tlsext_status_type(
2508 self._ssl, _lib.TLSEXT_STATUSTYPE_ocsp
2509 )
2510 _openssl_assert(rc == 1)
2511
Cory Benfield12eae892014-06-07 15:42:56 +01002512
Jean-Paul Calderonefab157b2014-01-18 11:21:38 -05002513# This is similar to the initialization calls at the end of OpenSSL/crypto.py
2514# but is exercised mostly by the Context initializer.
Jean-Paul Calderone11ed8e82014-01-18 10:21:50 -05002515_lib.SSL_library_init()