blob: b6642544f38c2254587c6bb59b0089d2f70b05a2 [file] [log] [blame]
Paul Kehrer55fb3412017-06-29 18:44:08 -05001import os
Maximilian Hils1d95dea2015-08-17 19:27:20 +02002import socket
Konstantinos Koukopoulos541150d2014-01-31 01:00:19 +02003from sys import platform
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -05004from functools import wraps, partial
Cory Benfieldbe3e7b82014-05-10 09:48:55 +01005from itertools import count, chain
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08006from weakref import WeakValueDictionary
7from errno import errorcode
Jean-Paul Calderone935d2da2013-03-04 08:11:19 -08008
Alex Gaynor10d30832017-06-29 15:31:39 -07009from cryptography.utils import deprecated
10
Alex Gaynor336d8022017-06-29 21:46:42 -070011from six import (
12 binary_type as _binary_type, integer_types as integer_types, int2byte,
13 indexbytes)
Jean-Paul Calderone63eab692014-01-18 10:19:56 -050014
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -050015from OpenSSL._util import (
Hynek Schlawackaa861212016-03-13 13:53:48 +010016 UNSPECIFIED as _UNSPECIFIED,
17 exception_from_error_queue as _exception_from_error_queue,
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -050018 ffi as _ffi,
19 lib as _lib,
Hynek Schlawackf90e3682016-03-11 11:21:13 +010020 make_assert as _make_assert,
Hynek Schlawackaa861212016-03-13 13:53:48 +010021 native as _native,
Jean-Paul Calderone55f9e882015-04-12 09:31:03 -040022 path_string as _path_string,
Hynek Schlawackaa861212016-03-13 13:53:48 +010023 text_to_bytes_and_warn as _text_to_bytes_and_warn,
Cory Benfielde62840e2016-11-28 12:17:08 +000024 no_zero_allocator as _no_zero_allocator,
Jean-Paul Calderone55f9e882015-04-12 09:31:03 -040025)
Jean-Paul Calderone935d2da2013-03-04 08:11:19 -080026
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -080027from OpenSSL.crypto import (
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -050028 FILETYPE_PEM, _PassphraseHelper, PKey, X509Name, X509, X509Store)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -080029
Nicolas Karolak736c6212017-11-26 14:40:28 +010030__all__ = [
31 'OPENSSL_VERSION_NUMBER',
32 'SSLEAY_VERSION',
33 'SSLEAY_CFLAGS',
34 'SSLEAY_PLATFORM',
35 'SSLEAY_DIR',
36 'SSLEAY_BUILT_ON',
37 'SENT_SHUTDOWN',
38 'RECEIVED_SHUTDOWN',
39 'SSLv2_METHOD',
40 'SSLv3_METHOD',
41 'SSLv23_METHOD',
42 'TLSv1_METHOD',
43 'TLSv1_1_METHOD',
44 'TLSv1_2_METHOD',
45 'OP_NO_SSLv2',
46 'OP_NO_SSLv3',
47 'OP_NO_TLSv1',
48 'OP_NO_TLSv1_1',
49 'OP_NO_TLSv1_2',
50 'MODE_RELEASE_BUFFERS',
51 'OP_SINGLE_DH_USE',
52 'OP_SINGLE_ECDH_USE',
53 'OP_EPHEMERAL_RSA',
54 'OP_MICROSOFT_SESS_ID_BUG',
55 'OP_NETSCAPE_CHALLENGE_BUG',
56 'OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG',
57 'OP_SSLREF2_REUSE_CERT_TYPE_BUG',
58 'OP_MICROSOFT_BIG_SSLV3_BUFFER',
59 'OP_MSIE_SSLV2_RSA_PADDING',
60 'OP_SSLEAY_080_CLIENT_DH_BUG',
61 'OP_TLS_D5_BUG',
62 'OP_TLS_BLOCK_PADDING_BUG',
63 'OP_DONT_INSERT_EMPTY_FRAGMENTS',
64 'OP_CIPHER_SERVER_PREFERENCE',
65 'OP_TLS_ROLLBACK_BUG',
66 'OP_PKCS1_CHECK_1',
67 'OP_PKCS1_CHECK_2',
68 'OP_NETSCAPE_CA_DN_BUG',
69 'OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG',
70 'OP_NO_COMPRESSION',
71 'OP_NO_QUERY_MTU',
72 'OP_COOKIE_EXCHANGE',
73 'OP_NO_TICKET',
74 'OP_ALL',
75 'VERIFY_PEER',
76 'VERIFY_FAIL_IF_NO_PEER_CERT',
77 'VERIFY_CLIENT_ONCE',
78 'VERIFY_NONE',
79 'SESS_CACHE_OFF',
80 'SESS_CACHE_CLIENT',
81 'SESS_CACHE_SERVER',
82 'SESS_CACHE_BOTH',
83 'SESS_CACHE_NO_AUTO_CLEAR',
84 'SESS_CACHE_NO_INTERNAL_LOOKUP',
85 'SESS_CACHE_NO_INTERNAL_STORE',
86 'SESS_CACHE_NO_INTERNAL',
87 'SSL_ST_CONNECT',
88 'SSL_ST_ACCEPT',
89 'SSL_ST_MASK',
90 'SSL_ST_INIT',
91 'SSL_ST_BEFORE',
92 'SSL_ST_OK',
93 'SSL_ST_RENEGOTIATE',
94 'SSL_CB_LOOP',
95 'SSL_CB_EXIT',
96 'SSL_CB_READ',
97 'SSL_CB_WRITE',
98 'SSL_CB_ALERT',
99 'SSL_CB_READ_ALERT',
100 'SSL_CB_WRITE_ALERT',
101 'SSL_CB_ACCEPT_LOOP',
102 'SSL_CB_ACCEPT_EXIT',
103 'SSL_CB_CONNECT_LOOP',
104 'SSL_CB_CONNECT_EXIT',
105 'SSL_CB_HANDSHAKE_START',
106 'SSL_CB_HANDSHAKE_DONE',
107 'Error',
108 'WantReadError',
109 'WantWriteError',
110 'WantX509LookupError',
111 'ZeroReturnError',
112 'SysCallError',
113 'SSLeay_version',
114 'Session',
115 'Context',
116 'Connection'
117]
118
Jean-Paul Calderone8fb53182013-12-30 08:35:49 -0500119try:
120 _memoryview = memoryview
121except NameError:
122 class _memoryview(object):
123 pass
124
Markus Unterwaditzer8e41d022014-04-19 12:27:11 +0200125try:
126 _buffer = buffer
127except NameError:
128 class _buffer(object):
129 pass
130
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500131OPENSSL_VERSION_NUMBER = _lib.OPENSSL_VERSION_NUMBER
132SSLEAY_VERSION = _lib.SSLEAY_VERSION
133SSLEAY_CFLAGS = _lib.SSLEAY_CFLAGS
134SSLEAY_PLATFORM = _lib.SSLEAY_PLATFORM
135SSLEAY_DIR = _lib.SSLEAY_DIR
136SSLEAY_BUILT_ON = _lib.SSLEAY_BUILT_ON
Jean-Paul Calderone935d2da2013-03-04 08:11:19 -0800137
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500138SENT_SHUTDOWN = _lib.SSL_SENT_SHUTDOWN
139RECEIVED_SHUTDOWN = _lib.SSL_RECEIVED_SHUTDOWN
Jean-Paul Calderone935d2da2013-03-04 08:11:19 -0800140
141SSLv2_METHOD = 1
142SSLv3_METHOD = 2
143SSLv23_METHOD = 3
144TLSv1_METHOD = 4
Jean-Paul Calderone56bff942013-11-03 11:30:43 -0500145TLSv1_1_METHOD = 5
146TLSv1_2_METHOD = 6
Jean-Paul Calderone935d2da2013-03-04 08:11:19 -0800147
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500148OP_NO_SSLv2 = _lib.SSL_OP_NO_SSLv2
149OP_NO_SSLv3 = _lib.SSL_OP_NO_SSLv3
150OP_NO_TLSv1 = _lib.SSL_OP_NO_TLSv1
Alex Gaynor336d8022017-06-29 21:46:42 -0700151OP_NO_TLSv1_1 = _lib.SSL_OP_NO_TLSv1_1
152OP_NO_TLSv1_2 = _lib.SSL_OP_NO_TLSv1_2
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -0800153
Alex Gaynorbf012872016-06-04 13:18:39 -0700154MODE_RELEASE_BUFFERS = _lib.SSL_MODE_RELEASE_BUFFERS
Jean-Paul Calderone935d2da2013-03-04 08:11:19 -0800155
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500156OP_SINGLE_DH_USE = _lib.SSL_OP_SINGLE_DH_USE
Akihiro Yamazakie64d80c2015-09-06 00:16:57 +0900157OP_SINGLE_ECDH_USE = _lib.SSL_OP_SINGLE_ECDH_USE
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500158OP_EPHEMERAL_RSA = _lib.SSL_OP_EPHEMERAL_RSA
159OP_MICROSOFT_SESS_ID_BUG = _lib.SSL_OP_MICROSOFT_SESS_ID_BUG
160OP_NETSCAPE_CHALLENGE_BUG = _lib.SSL_OP_NETSCAPE_CHALLENGE_BUG
Alex Gaynor62da94d2015-09-05 14:37:34 -0400161OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG = (
162 _lib.SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG
163)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500164OP_SSLREF2_REUSE_CERT_TYPE_BUG = _lib.SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG
165OP_MICROSOFT_BIG_SSLV3_BUFFER = _lib.SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER
Alex Gaynor5bb2bd12016-07-03 10:48:32 -0400166OP_MSIE_SSLV2_RSA_PADDING = _lib.SSL_OP_MSIE_SSLV2_RSA_PADDING
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500167OP_SSLEAY_080_CLIENT_DH_BUG = _lib.SSL_OP_SSLEAY_080_CLIENT_DH_BUG
168OP_TLS_D5_BUG = _lib.SSL_OP_TLS_D5_BUG
169OP_TLS_BLOCK_PADDING_BUG = _lib.SSL_OP_TLS_BLOCK_PADDING_BUG
170OP_DONT_INSERT_EMPTY_FRAGMENTS = _lib.SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS
171OP_CIPHER_SERVER_PREFERENCE = _lib.SSL_OP_CIPHER_SERVER_PREFERENCE
172OP_TLS_ROLLBACK_BUG = _lib.SSL_OP_TLS_ROLLBACK_BUG
173OP_PKCS1_CHECK_1 = _lib.SSL_OP_PKCS1_CHECK_1
174OP_PKCS1_CHECK_2 = _lib.SSL_OP_PKCS1_CHECK_2
175OP_NETSCAPE_CA_DN_BUG = _lib.SSL_OP_NETSCAPE_CA_DN_BUG
Alex Gaynor62da94d2015-09-05 14:37:34 -0400176OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG = (
177 _lib.SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG
178)
Alex Gaynorbf012872016-06-04 13:18:39 -0700179OP_NO_COMPRESSION = _lib.SSL_OP_NO_COMPRESSION
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -0800180
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500181OP_NO_QUERY_MTU = _lib.SSL_OP_NO_QUERY_MTU
182OP_COOKIE_EXCHANGE = _lib.SSL_OP_COOKIE_EXCHANGE
Alex Gaynor5bb2bd12016-07-03 10:48:32 -0400183OP_NO_TICKET = _lib.SSL_OP_NO_TICKET
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -0800184
Alex Gaynorc4889812015-09-04 08:43:17 -0400185OP_ALL = _lib.SSL_OP_ALL
Jean-Paul Calderone935d2da2013-03-04 08:11:19 -0800186
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500187VERIFY_PEER = _lib.SSL_VERIFY_PEER
188VERIFY_FAIL_IF_NO_PEER_CERT = _lib.SSL_VERIFY_FAIL_IF_NO_PEER_CERT
189VERIFY_CLIENT_ONCE = _lib.SSL_VERIFY_CLIENT_ONCE
190VERIFY_NONE = _lib.SSL_VERIFY_NONE
Jean-Paul Calderone935d2da2013-03-04 08:11:19 -0800191
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500192SESS_CACHE_OFF = _lib.SSL_SESS_CACHE_OFF
193SESS_CACHE_CLIENT = _lib.SSL_SESS_CACHE_CLIENT
194SESS_CACHE_SERVER = _lib.SSL_SESS_CACHE_SERVER
195SESS_CACHE_BOTH = _lib.SSL_SESS_CACHE_BOTH
196SESS_CACHE_NO_AUTO_CLEAR = _lib.SSL_SESS_CACHE_NO_AUTO_CLEAR
197SESS_CACHE_NO_INTERNAL_LOOKUP = _lib.SSL_SESS_CACHE_NO_INTERNAL_LOOKUP
198SESS_CACHE_NO_INTERNAL_STORE = _lib.SSL_SESS_CACHE_NO_INTERNAL_STORE
199SESS_CACHE_NO_INTERNAL = _lib.SSL_SESS_CACHE_NO_INTERNAL
Jean-Paul Calderoned39a3f62013-03-04 12:23:51 -0800200
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500201SSL_ST_CONNECT = _lib.SSL_ST_CONNECT
202SSL_ST_ACCEPT = _lib.SSL_ST_ACCEPT
203SSL_ST_MASK = _lib.SSL_ST_MASK
Alex Gaynor5af32d02016-09-24 01:52:21 -0400204if _lib.Cryptography_HAS_SSL_ST:
205 SSL_ST_INIT = _lib.SSL_ST_INIT
206 SSL_ST_BEFORE = _lib.SSL_ST_BEFORE
207 SSL_ST_OK = _lib.SSL_ST_OK
208 SSL_ST_RENEGOTIATE = _lib.SSL_ST_RENEGOTIATE
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -0800209
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500210SSL_CB_LOOP = _lib.SSL_CB_LOOP
211SSL_CB_EXIT = _lib.SSL_CB_EXIT
212SSL_CB_READ = _lib.SSL_CB_READ
213SSL_CB_WRITE = _lib.SSL_CB_WRITE
214SSL_CB_ALERT = _lib.SSL_CB_ALERT
215SSL_CB_READ_ALERT = _lib.SSL_CB_READ_ALERT
216SSL_CB_WRITE_ALERT = _lib.SSL_CB_WRITE_ALERT
217SSL_CB_ACCEPT_LOOP = _lib.SSL_CB_ACCEPT_LOOP
218SSL_CB_ACCEPT_EXIT = _lib.SSL_CB_ACCEPT_EXIT
219SSL_CB_CONNECT_LOOP = _lib.SSL_CB_CONNECT_LOOP
220SSL_CB_CONNECT_EXIT = _lib.SSL_CB_CONNECT_EXIT
221SSL_CB_HANDSHAKE_START = _lib.SSL_CB_HANDSHAKE_START
222SSL_CB_HANDSHAKE_DONE = _lib.SSL_CB_HANDSHAKE_DONE
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -0800223
Paul Kehrer55fb3412017-06-29 18:44:08 -0500224# Taken from https://golang.org/src/crypto/x509/root_linux.go
225_CERTIFICATE_FILE_LOCATIONS = [
226 "/etc/ssl/certs/ca-certificates.crt", # Debian/Ubuntu/Gentoo etc.
227 "/etc/pki/tls/certs/ca-bundle.crt", # Fedora/RHEL 6
228 "/etc/ssl/ca-bundle.pem", # OpenSUSE
229 "/etc/pki/tls/cacert.pem", # OpenELEC
230 "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem", # CentOS/RHEL 7
231]
232
233_CERTIFICATE_PATH_LOCATIONS = [
234 "/etc/ssl/certs", # SLES10/SLES11
235]
236
Paul Kehrera92a1a72017-07-19 15:53:23 +0200237# These values are compared to output from cffi's ffi.string so they must be
238# byte strings.
239_CRYPTOGRAPHY_MANYLINUX1_CA_DIR = b"/opt/pyca/cryptography/openssl/certs"
240_CRYPTOGRAPHY_MANYLINUX1_CA_FILE = b"/opt/pyca/cryptography/openssl/cert.pem"
Paul Kehrer55fb3412017-06-29 18:44:08 -0500241
Alex Gaynor83284952015-09-05 10:43:30 -0400242
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500243class Error(Exception):
Jean-Paul Calderone511cde02013-12-29 10:31:13 -0500244 """
245 An error occurred in an `OpenSSL.SSL` API.
246 """
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500247
248
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500249_raise_current_error = partial(_exception_from_error_queue, Error)
Hynek Schlawackf90e3682016-03-11 11:21:13 +0100250_openssl_assert = _make_assert(Error)
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500251
252
253class WantReadError(Error):
254 pass
255
256
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500257class WantWriteError(Error):
258 pass
259
260
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500261class WantX509LookupError(Error):
262 pass
263
264
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500265class ZeroReturnError(Error):
266 pass
267
268
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500269class SysCallError(Error):
270 pass
271
272
Cory Benfield0ea76e72015-03-22 09:05:28 +0000273class _CallbackExceptionHelper(object):
274 """
275 A base class for wrapper classes that allow for intelligent exception
276 handling in OpenSSL callbacks.
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500277
Jean-Paul Calderone1b172982015-03-22 19:37:11 -0400278 :ivar list _problems: Any exceptions that occurred while executing in a
279 context where they could not be raised in the normal way. Typically
280 this is because OpenSSL has called into some Python code and requires a
281 return value. The exceptions are saved to be raised later when it is
282 possible to do so.
Cory Benfield0ea76e72015-03-22 09:05:28 +0000283 """
Alex Gaynor62da94d2015-09-05 14:37:34 -0400284
Jean-Paul Calderone09540d72015-03-22 19:37:20 -0400285 def __init__(self):
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800286 self._problems = []
287
Cory Benfield0ea76e72015-03-22 09:05:28 +0000288 def raise_if_problem(self):
Jean-Paul Calderone1b172982015-03-22 19:37:11 -0400289 """
290 Raise an exception from the OpenSSL error queue or that was previously
291 captured whe running a callback.
292 """
Cory Benfield0ea76e72015-03-22 09:05:28 +0000293 if self._problems:
294 try:
295 _raise_current_error()
296 except Error:
297 pass
298 raise self._problems.pop(0)
299
300
301class _VerifyHelper(_CallbackExceptionHelper):
Jean-Paul Calderone1b172982015-03-22 19:37:11 -0400302 """
303 Wrap a callback such that it can be used as a certificate verification
304 callback.
305 """
Alex Gaynor62da94d2015-09-05 14:37:34 -0400306
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800307 def __init__(self, callback):
Jean-Paul Calderone837f4032015-03-22 17:38:28 -0400308 _CallbackExceptionHelper.__init__(self)
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800309
310 @wraps(callback)
311 def wrapper(ok, store_ctx):
Paul Kehrere7381862017-11-30 20:55:25 +0800312 x509 = _lib.X509_STORE_CTX_get_current_cert(store_ctx)
313 _lib.X509_up_ref(x509)
314 cert = X509._from_raw_x509_ptr(x509)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500315 error_number = _lib.X509_STORE_CTX_get_error(store_ctx)
316 error_depth = _lib.X509_STORE_CTX_get_error_depth(store_ctx)
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800317
Jean-Paul Calderone6a8cd112014-04-02 21:09:08 -0400318 index = _lib.SSL_get_ex_data_X509_STORE_CTX_idx()
319 ssl = _lib.X509_STORE_CTX_get_ex_data(store_ctx, index)
320 connection = Connection._reverse_mapping[ssl]
321
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800322 try:
Alex Gaynor62da94d2015-09-05 14:37:34 -0400323 result = callback(
324 connection, cert, error_number, error_depth, ok
325 )
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800326 except Exception as e:
327 self._problems.append(e)
328 return 0
329 else:
330 if result:
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500331 _lib.X509_STORE_CTX_set_error(store_ctx, _lib.X509_V_OK)
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800332 return 1
333 else:
334 return 0
335
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500336 self.callback = _ffi.callback(
337 "int (*)(int, X509_STORE_CTX *)", wrapper)
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800338
339
Cory Benfield0ea76e72015-03-22 09:05:28 +0000340class _NpnAdvertiseHelper(_CallbackExceptionHelper):
Jean-Paul Calderone1b172982015-03-22 19:37:11 -0400341 """
342 Wrap a callback such that it can be used as an NPN advertisement callback.
343 """
Alex Gaynor62da94d2015-09-05 14:37:34 -0400344
Cory Benfield0ea76e72015-03-22 09:05:28 +0000345 def __init__(self, callback):
Jean-Paul Calderone837f4032015-03-22 17:38:28 -0400346 _CallbackExceptionHelper.__init__(self)
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800347
Cory Benfield0ea76e72015-03-22 09:05:28 +0000348 @wraps(callback)
349 def wrapper(ssl, out, outlen, arg):
350 try:
351 conn = Connection._reverse_mapping[ssl]
352 protos = callback(conn)
353
354 # Join the protocols into a Python bytestring, length-prefixing
355 # each element.
356 protostr = b''.join(
357 chain.from_iterable((int2byte(len(p)), p) for p in protos)
358 )
359
360 # Save our callback arguments on the connection object. This is
361 # done to make sure that they don't get freed before OpenSSL
362 # uses them. Then, return them appropriately in the output
363 # parameters.
364 conn._npn_advertise_callback_args = [
365 _ffi.new("unsigned int *", len(protostr)),
366 _ffi.new("unsigned char[]", protostr),
367 ]
368 outlen[0] = conn._npn_advertise_callback_args[0][0]
369 out[0] = conn._npn_advertise_callback_args[1]
370 return 0
371 except Exception as e:
372 self._problems.append(e)
373 return 2 # SSL_TLSEXT_ERR_ALERT_FATAL
374
375 self.callback = _ffi.callback(
376 "int (*)(SSL *, const unsigned char **, unsigned int *, void *)",
377 wrapper
378 )
379
380
381class _NpnSelectHelper(_CallbackExceptionHelper):
Jean-Paul Calderone1b172982015-03-22 19:37:11 -0400382 """
383 Wrap a callback such that it can be used as an NPN selection callback.
384 """
Alex Gaynor62da94d2015-09-05 14:37:34 -0400385
Cory Benfield0ea76e72015-03-22 09:05:28 +0000386 def __init__(self, callback):
Jean-Paul Calderone837f4032015-03-22 17:38:28 -0400387 _CallbackExceptionHelper.__init__(self)
Cory Benfield0ea76e72015-03-22 09:05:28 +0000388
389 @wraps(callback)
390 def wrapper(ssl, out, outlen, in_, inlen, arg):
391 try:
392 conn = Connection._reverse_mapping[ssl]
393
394 # The string passed to us is actually made up of multiple
395 # length-prefixed bytestrings. We need to split that into a
396 # list.
397 instr = _ffi.buffer(in_, inlen)[:]
398 protolist = []
399 while instr:
Alex Gaynorc3697ad2017-11-20 08:19:32 -0500400 length = indexbytes(instr, 0)
401 proto = instr[1:length + 1]
Cory Benfield0ea76e72015-03-22 09:05:28 +0000402 protolist.append(proto)
Alex Gaynorc3697ad2017-11-20 08:19:32 -0500403 instr = instr[length + 1:]
Cory Benfield0ea76e72015-03-22 09:05:28 +0000404
405 # Call the callback
406 outstr = callback(conn, protolist)
407
408 # Save our callback arguments on the connection object. This is
409 # done to make sure that they don't get freed before OpenSSL
410 # uses them. Then, return them appropriately in the output
411 # parameters.
412 conn._npn_select_callback_args = [
413 _ffi.new("unsigned char *", len(outstr)),
414 _ffi.new("unsigned char[]", outstr),
415 ]
416 outlen[0] = conn._npn_select_callback_args[0][0]
417 out[0] = conn._npn_select_callback_args[1]
418 return 0
419 except Exception as e:
420 self._problems.append(e)
421 return 2 # SSL_TLSEXT_ERR_ALERT_FATAL
422
423 self.callback = _ffi.callback(
Alex Gaynor62da94d2015-09-05 14:37:34 -0400424 ("int (*)(SSL *, unsigned char **, unsigned char *, "
425 "const unsigned char *, unsigned int, void *)"),
Cory Benfield0ea76e72015-03-22 09:05:28 +0000426 wrapper
427 )
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800428
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800429
Cory Benfield9da5ffb2015-04-13 17:20:14 -0400430class _ALPNSelectHelper(_CallbackExceptionHelper):
Cory Benfieldf1177e72015-04-12 09:11:49 -0400431 """
432 Wrap a callback such that it can be used as an ALPN selection callback.
433 """
Alex Gaynor62da94d2015-09-05 14:37:34 -0400434
Cory Benfieldf1177e72015-04-12 09:11:49 -0400435 def __init__(self, callback):
436 _CallbackExceptionHelper.__init__(self)
437
438 @wraps(callback)
439 def wrapper(ssl, out, outlen, in_, inlen, arg):
440 try:
441 conn = Connection._reverse_mapping[ssl]
442
443 # The string passed to us is made up of multiple
444 # length-prefixed bytestrings. We need to split that into a
445 # list.
446 instr = _ffi.buffer(in_, inlen)[:]
447 protolist = []
448 while instr:
Cory Benfield93134db2015-04-13 17:22:13 -0400449 encoded_len = indexbytes(instr, 0)
450 proto = instr[1:encoded_len + 1]
Cory Benfieldf1177e72015-04-12 09:11:49 -0400451 protolist.append(proto)
Cory Benfield93134db2015-04-13 17:22:13 -0400452 instr = instr[encoded_len + 1:]
Cory Benfieldf1177e72015-04-12 09:11:49 -0400453
454 # Call the callback
455 outstr = callback(conn, protolist)
456
457 if not isinstance(outstr, _binary_type):
458 raise TypeError("ALPN callback must return a bytestring.")
459
460 # Save our callback arguments on the connection object to make
461 # sure that they don't get freed before OpenSSL can use them.
462 # Then, return them in the appropriate output parameters.
463 conn._alpn_select_callback_args = [
464 _ffi.new("unsigned char *", len(outstr)),
465 _ffi.new("unsigned char[]", outstr),
466 ]
467 outlen[0] = conn._alpn_select_callback_args[0][0]
468 out[0] = conn._alpn_select_callback_args[1]
469 return 0
470 except Exception as e:
471 self._problems.append(e)
472 return 2 # SSL_TLSEXT_ERR_ALERT_FATAL
473
474 self.callback = _ffi.callback(
Alex Gaynor62da94d2015-09-05 14:37:34 -0400475 ("int (*)(SSL *, unsigned char **, unsigned char *, "
476 "const unsigned char *, unsigned int, void *)"),
Cory Benfieldf1177e72015-04-12 09:11:49 -0400477 wrapper
478 )
479
480
Cory Benfield496652a2017-01-24 11:42:56 +0000481class _OCSPServerCallbackHelper(_CallbackExceptionHelper):
482 """
483 Wrap a callback such that it can be used as an OCSP callback for the server
484 side.
485
486 Annoyingly, OpenSSL defines one OCSP callback but uses it in two different
487 ways. For servers, that callback is expected to retrieve some OCSP data and
488 hand it to OpenSSL, and may return only SSL_TLSEXT_ERR_OK,
489 SSL_TLSEXT_ERR_FATAL, and SSL_TLSEXT_ERR_NOACK. For clients, that callback
490 is expected to check the OCSP data, and returns a negative value on error,
491 0 if the response is not acceptable, or positive if it is. These are
492 mutually exclusive return code behaviours, and they mean that we need two
493 helpers so that we always return an appropriate error code if the user's
494 code throws an exception.
495
496 Given that we have to have two helpers anyway, these helpers are a bit more
497 helpery than most: specifically, they hide a few more of the OpenSSL
498 functions so that the user has an easier time writing these callbacks.
499
500 This helper implements the server side.
501 """
502
503 def __init__(self, callback):
504 _CallbackExceptionHelper.__init__(self)
505
506 @wraps(callback)
507 def wrapper(ssl, cdata):
508 try:
509 conn = Connection._reverse_mapping[ssl]
510
511 # Extract the data if any was provided.
512 if cdata != _ffi.NULL:
513 data = _ffi.from_handle(cdata)
514 else:
515 data = None
516
517 # Call the callback.
518 ocsp_data = callback(conn, data)
519
520 if not isinstance(ocsp_data, _binary_type):
521 raise TypeError("OCSP callback must return a bytestring.")
522
523 # If the OCSP data was provided, we will pass it to OpenSSL.
524 # However, we have an early exit here: if no OCSP data was
525 # provided we will just exit out and tell OpenSSL that there
526 # is nothing to do.
527 if not ocsp_data:
528 return 3 # SSL_TLSEXT_ERR_NOACK
529
530 # Pass the data to OpenSSL. Insanely, OpenSSL doesn't make a
531 # private copy of this data, so we need to keep it alive, but
532 # it *does* want to free it itself if it gets replaced. This
533 # somewhat bonkers behaviour means we need to use
534 # OPENSSL_malloc directly, which is a pain in the butt to work
535 # with. It's ok for us to "leak" the memory here because
536 # OpenSSL now owns it and will free it.
537 ocsp_data_length = len(ocsp_data)
538 data_ptr = _lib.OPENSSL_malloc(ocsp_data_length)
539 _ffi.buffer(data_ptr, ocsp_data_length)[:] = ocsp_data
540
541 _lib.SSL_set_tlsext_status_ocsp_resp(
542 ssl, data_ptr, ocsp_data_length
543 )
544
545 return 0
546 except Exception as e:
547 self._problems.append(e)
548 return 2 # SSL_TLSEXT_ERR_ALERT_FATAL
549
550 self.callback = _ffi.callback("int (*)(SSL *, void *)", wrapper)
551
552
553class _OCSPClientCallbackHelper(_CallbackExceptionHelper):
554 """
555 Wrap a callback such that it can be used as an OCSP callback for the client
556 side.
557
558 Annoyingly, OpenSSL defines one OCSP callback but uses it in two different
559 ways. For servers, that callback is expected to retrieve some OCSP data and
560 hand it to OpenSSL, and may return only SSL_TLSEXT_ERR_OK,
561 SSL_TLSEXT_ERR_FATAL, and SSL_TLSEXT_ERR_NOACK. For clients, that callback
562 is expected to check the OCSP data, and returns a negative value on error,
563 0 if the response is not acceptable, or positive if it is. These are
564 mutually exclusive return code behaviours, and they mean that we need two
565 helpers so that we always return an appropriate error code if the user's
566 code throws an exception.
567
568 Given that we have to have two helpers anyway, these helpers are a bit more
569 helpery than most: specifically, they hide a few more of the OpenSSL
570 functions so that the user has an easier time writing these callbacks.
571
572 This helper implements the client side.
573 """
574
575 def __init__(self, callback):
576 _CallbackExceptionHelper.__init__(self)
577
578 @wraps(callback)
579 def wrapper(ssl, cdata):
580 try:
581 conn = Connection._reverse_mapping[ssl]
582
583 # Extract the data if any was provided.
584 if cdata != _ffi.NULL:
585 data = _ffi.from_handle(cdata)
586 else:
587 data = None
588
589 # Get the OCSP data.
590 ocsp_ptr = _ffi.new("unsigned char **")
591 ocsp_len = _lib.SSL_get_tlsext_status_ocsp_resp(ssl, ocsp_ptr)
592 if ocsp_len < 0:
593 # No OCSP data.
594 ocsp_data = b''
595 else:
596 # Copy the OCSP data, then pass it to the callback.
597 ocsp_data = _ffi.buffer(ocsp_ptr[0], ocsp_len)[:]
598
599 valid = callback(conn, ocsp_data, data)
600
601 # Return 1 on success or 0 on error.
602 return int(bool(valid))
603
604 except Exception as e:
605 self._problems.append(e)
606 # Return negative value if an exception is hit.
607 return -1
608
609 self.callback = _ffi.callback("int (*)(SSL *, void *)", wrapper)
610
611
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800612def _asFileDescriptor(obj):
613 fd = None
Konstantinos Koukopoulosc8b13ea2014-01-28 00:21:50 -0800614 if not isinstance(obj, integer_types):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800615 meth = getattr(obj, "fileno", None)
616 if meth is not None:
617 obj = meth()
618
Konstantinos Koukopoulosc8b13ea2014-01-28 00:21:50 -0800619 if isinstance(obj, integer_types):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800620 fd = obj
621
Konstantinos Koukopoulosc8b13ea2014-01-28 00:21:50 -0800622 if not isinstance(fd, integer_types):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800623 raise TypeError("argument must be an int, or have a fileno() method.")
624 elif fd < 0:
625 raise ValueError(
626 "file descriptor cannot be a negative integer (%i)" % (fd,))
627
628 return fd
629
630
Jean-Paul Calderoned39a3f62013-03-04 12:23:51 -0800631def SSLeay_version(type):
632 """
633 Return a string describing the version of OpenSSL in use.
634
635 :param type: One of the SSLEAY_ constants defined in this module.
636 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500637 return _ffi.string(_lib.SSLeay_version(type))
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800638
639
Cory Benfieldef404df2016-03-29 15:32:48 +0100640def _make_requires(flag, error):
Cory Benfielda876cef2015-04-13 17:29:12 -0400641 """
Cory Benfieldef404df2016-03-29 15:32:48 +0100642 Builds a decorator that ensures that functions that rely on OpenSSL
643 functions that are not present in this build raise NotImplementedError,
644 rather than AttributeError coming out of cryptography.
645
646 :param flag: A cryptography flag that guards the functions, e.g.
647 ``Cryptography_HAS_NEXTPROTONEG``.
648 :param error: The string to be used in the exception if the flag is false.
Cory Benfielda876cef2015-04-13 17:29:12 -0400649 """
Cory Benfieldef404df2016-03-29 15:32:48 +0100650 def _requires_decorator(func):
651 if not flag:
652 @wraps(func)
653 def explode(*args, **kwargs):
654 raise NotImplementedError(error)
655 return explode
656 else:
657 return func
Cory Benfield10b277f2015-04-13 17:12:42 -0400658
Cory Benfieldef404df2016-03-29 15:32:48 +0100659 return _requires_decorator
Cory Benfield10b277f2015-04-13 17:12:42 -0400660
661
Cory Benfieldef404df2016-03-29 15:32:48 +0100662_requires_npn = _make_requires(
663 _lib.Cryptography_HAS_NEXTPROTONEG, "NPN not available"
664)
Cory Benfield7907e332015-04-13 17:18:25 -0400665
666
Cory Benfieldef404df2016-03-29 15:32:48 +0100667_requires_alpn = _make_requires(
668 _lib.Cryptography_HAS_ALPN, "ALPN not available"
669)
Cory Benfielde6f35882016-03-29 11:21:04 +0100670
Cory Benfielde6f35882016-03-29 11:21:04 +0100671
Cory Benfieldef404df2016-03-29 15:32:48 +0100672_requires_sni = _make_requires(
673 _lib.Cryptography_HAS_TLSEXT_HOSTNAME, "SNI not available"
674)
Cory Benfielde6f35882016-03-29 11:21:04 +0100675
676
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -0800677class Session(object):
678 pass
679
680
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800681class Context(object):
682 """
Hynek Schlawackf90e3682016-03-11 11:21:13 +0100683 :class:`OpenSSL.SSL.Context` instances define the parameters for setting
Alex Gaynor62da94d2015-09-05 14:37:34 -0400684 up new SSL connections.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800685 """
686 _methods = {
Andrew Dunhamec84a0a2014-02-24 12:41:37 -0800687 SSLv2_METHOD: "SSLv2_method",
Jean-Paul Calderonebe2bb422013-12-29 07:34:08 -0500688 SSLv3_METHOD: "SSLv3_method",
689 SSLv23_METHOD: "SSLv23_method",
690 TLSv1_METHOD: "TLSv1_method",
691 TLSv1_1_METHOD: "TLSv1_1_method",
692 TLSv1_2_METHOD: "TLSv1_2_method",
Alex Gaynorc4889812015-09-04 08:43:17 -0400693 }
Jean-Paul Calderonebe2bb422013-12-29 07:34:08 -0500694 _methods = dict(
695 (identifier, getattr(_lib, name))
696 for (identifier, name) in _methods.items()
697 if getattr(_lib, name, None) is not None)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800698
699 def __init__(self, method):
700 """
701 :param method: One of SSLv2_METHOD, SSLv3_METHOD, SSLv23_METHOD, or
702 TLSv1_METHOD.
703 """
Jean-Paul Calderonef73a3cb2014-02-09 08:49:06 -0500704 if not isinstance(method, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800705 raise TypeError("method must be an integer")
706
707 try:
708 method_func = self._methods[method]
709 except KeyError:
710 raise ValueError("No such protocol")
711
712 method_obj = method_func()
Alex Gaynora829e902016-06-04 18:16:01 -0700713 _openssl_assert(method_obj != _ffi.NULL)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800714
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500715 context = _lib.SSL_CTX_new(method_obj)
Alex Gaynora829e902016-06-04 18:16:01 -0700716 _openssl_assert(context != _ffi.NULL)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500717 context = _ffi.gc(context, _lib.SSL_CTX_free)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800718
Paul Kehrer6c6bf862016-12-19 06:03:48 -0600719 # If SSL_CTX_set_ecdh_auto is available then set it so the ECDH curve
720 # will be auto-selected. This function was added in 1.0.2 and made a
721 # noop in 1.1.0+ (where it is set automatically).
722 try:
723 res = _lib.SSL_CTX_set_ecdh_auto(context, 1)
724 _openssl_assert(res == 1)
725 except AttributeError:
726 pass
727
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800728 self._context = context
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800729 self._passphrase_helper = None
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800730 self._passphrase_callback = None
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800731 self._passphrase_userdata = None
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -0800732 self._verify_helper = None
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800733 self._verify_callback = None
734 self._info_callback = None
735 self._tlsext_servername_callback = None
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800736 self._app_data = None
Cory Benfield0ea76e72015-03-22 09:05:28 +0000737 self._npn_advertise_helper = None
Cory Benfield84a121e2014-03-31 20:30:25 +0100738 self._npn_advertise_callback = None
Cory Benfield0ea76e72015-03-22 09:05:28 +0000739 self._npn_select_helper = None
Cory Benfield84a121e2014-03-31 20:30:25 +0100740 self._npn_select_callback = None
Cory Benfieldf1177e72015-04-12 09:11:49 -0400741 self._alpn_select_helper = None
Cory Benfield12eae892014-06-07 15:42:56 +0100742 self._alpn_select_callback = None
Cory Benfield496652a2017-01-24 11:42:56 +0000743 self._ocsp_helper = None
744 self._ocsp_callback = None
745 self._ocsp_data = None
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800746
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500747 self.set_mode(_lib.SSL_MODE_ENABLE_PARTIAL_WRITE)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800748
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800749 def load_verify_locations(self, cafile, capath=None):
750 """
751 Let SSL know where we can find trusted certificates for the certificate
752 chain
753
Jean-Paul Calderone55f9e882015-04-12 09:31:03 -0400754 :param cafile: In which file we can find the certificates (``bytes`` or
755 ``unicode``).
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800756 :param capath: In which directory we can find the certificates
Jean-Paul Calderone55f9e882015-04-12 09:31:03 -0400757 (``bytes`` or ``unicode``).
758
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800759 :return: None
760 """
761 if cafile is None:
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500762 cafile = _ffi.NULL
Jean-Paul Calderone55f9e882015-04-12 09:31:03 -0400763 else:
764 cafile = _path_string(cafile)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800765
766 if capath is None:
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500767 capath = _ffi.NULL
Jean-Paul Calderone55f9e882015-04-12 09:31:03 -0400768 else:
769 capath = _path_string(capath)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800770
Alex Gaynor62da94d2015-09-05 14:37:34 -0400771 load_result = _lib.SSL_CTX_load_verify_locations(
772 self._context, cafile, capath
773 )
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800774 if not load_result:
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500775 _raise_current_error()
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800776
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800777 def _wrap_callback(self, callback):
778 @wraps(callback)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800779 def wrapper(size, verify, userdata):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800780 return callback(size, verify, self._passphrase_userdata)
781 return _PassphraseHelper(
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800782 FILETYPE_PEM, wrapper, more_args=True, truncate=True)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800783
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800784 def set_passwd_cb(self, callback, userdata=None):
785 """
786 Set the passphrase callback
787
Diego Fernandezfe0120f2017-10-11 23:51:52 -0600788 :param callback: The Python callback to use; must return a byte string
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800789 :param userdata: (optional) A Python object which will be given as
790 argument to the callback
791 :return: None
792 """
793 if not callable(callback):
794 raise TypeError("callback must be callable")
795
796 self._passphrase_helper = self._wrap_callback(callback)
797 self._passphrase_callback = self._passphrase_helper.callback
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500798 _lib.SSL_CTX_set_default_passwd_cb(
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800799 self._context, self._passphrase_callback)
800 self._passphrase_userdata = userdata
801
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800802 def set_default_verify_paths(self):
803 """
804 Use the platform-specific CA certificate locations
805
806 :return: None
807 """
Paul Kehrer55fb3412017-06-29 18:44:08 -0500808 # SSL_CTX_set_default_verify_paths will attempt to load certs from
809 # both a cafile and capath that are set at compile time. However,
810 # it will first check environment variables and, if present, load
811 # those paths instead
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500812 set_result = _lib.SSL_CTX_set_default_verify_paths(self._context)
Alex Gaynor09f19f52016-07-03 09:54:09 -0400813 _openssl_assert(set_result == 1)
Paul Kehrer55fb3412017-06-29 18:44:08 -0500814 # After attempting to set default_verify_paths we need to know whether
815 # to go down the fallback path.
816 # First we'll check to see if any env vars have been set. If so,
817 # we won't try to do anything else because the user has set the path
818 # themselves.
819 dir_env_var = _ffi.string(
820 _lib.X509_get_default_cert_dir_env()
821 ).decode("ascii")
822 file_env_var = _ffi.string(
823 _lib.X509_get_default_cert_file_env()
824 ).decode("ascii")
825 if not self._check_env_vars_set(dir_env_var, file_env_var):
826 default_dir = _ffi.string(_lib.X509_get_default_cert_dir())
827 default_file = _ffi.string(_lib.X509_get_default_cert_file())
828 # Now we check to see if the default_dir and default_file are set
829 # to the exact values we use in our manylinux1 builds. If they are
830 # then we know to load the fallbacks
831 if (
832 default_dir == _CRYPTOGRAPHY_MANYLINUX1_CA_DIR and
833 default_file == _CRYPTOGRAPHY_MANYLINUX1_CA_FILE
834 ):
835 # This is manylinux1, let's load our fallback paths
836 self._fallback_default_verify_paths(
837 _CERTIFICATE_FILE_LOCATIONS,
838 _CERTIFICATE_PATH_LOCATIONS
839 )
840
841 def _check_env_vars_set(self, dir_env_var, file_env_var):
842 """
843 Check to see if the default cert dir/file environment vars are present.
844
845 :return: bool
846 """
847 return (
848 os.environ.get(file_env_var) is not None or
849 os.environ.get(dir_env_var) is not None
850 )
851
852 def _fallback_default_verify_paths(self, file_path, dir_path):
853 """
854 Default verify paths are based on the compiled version of OpenSSL.
855 However, when pyca/cryptography is compiled as a manylinux1 wheel
856 that compiled location can potentially be wrong. So, like Go, we
857 will try a predefined set of paths and attempt to load roots
858 from there.
859
860 :return: None
861 """
862 for cafile in file_path:
863 if os.path.isfile(cafile):
864 self.load_verify_locations(cafile)
865 break
866
867 for capath in dir_path:
868 if os.path.isdir(capath):
869 self.load_verify_locations(None, capath)
870 break
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800871
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800872 def use_certificate_chain_file(self, certfile):
873 """
874 Load a certificate chain from a file
875
Jean-Paul Calderoneb6f8a792015-04-13 10:10:06 -0400876 :param certfile: The name of the certificate chain file (``bytes`` or
877 ``unicode``).
878
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800879 :return: None
880 """
Jean-Paul Calderoneaac43a32015-04-12 09:51:21 -0400881 certfile = _path_string(certfile)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800882
Alex Gaynor62da94d2015-09-05 14:37:34 -0400883 result = _lib.SSL_CTX_use_certificate_chain_file(
884 self._context, certfile
885 )
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800886 if not result:
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500887 _raise_current_error()
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800888
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800889 def use_certificate_file(self, certfile, filetype=FILETYPE_PEM):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800890 """
891 Load a certificate from a file
892
Jean-Paul Calderoneb6f8a792015-04-13 10:10:06 -0400893 :param certfile: The name of the certificate file (``bytes`` or
894 ``unicode``).
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800895 :param filetype: (optional) The encoding of the file, default is PEM
Jean-Paul Calderoneb6f8a792015-04-13 10:10:06 -0400896
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800897 :return: None
898 """
Jean-Paul Calderoned57a7b62015-04-12 09:57:36 -0400899 certfile = _path_string(certfile)
Jean-Paul Calderonef73a3cb2014-02-09 08:49:06 -0500900 if not isinstance(filetype, integer_types):
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800901 raise TypeError("filetype must be an integer")
902
Alex Gaynor62da94d2015-09-05 14:37:34 -0400903 use_result = _lib.SSL_CTX_use_certificate_file(
904 self._context, certfile, filetype
905 )
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800906 if not use_result:
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500907 _raise_current_error()
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800908
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800909 def use_certificate(self, cert):
910 """
911 Load a certificate from a X509 object
912
913 :param cert: The X509 object
914 :return: None
915 """
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800916 if not isinstance(cert, X509):
917 raise TypeError("cert must be an X509 instance")
918
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500919 use_result = _lib.SSL_CTX_use_certificate(self._context, cert._x509)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800920 if not use_result:
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -0500921 _raise_current_error()
Jean-Paul Calderone131052e2013-03-05 11:56:19 -0800922
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800923 def add_extra_chain_cert(self, certobj):
924 """
925 Add certificate to chain
926
927 :param certobj: The X509 certificate object to add to the chain
928 :return: None
929 """
930 if not isinstance(certobj, X509):
931 raise TypeError("certobj must be an X509 instance")
932
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500933 copy = _lib.X509_dup(certobj._x509)
934 add_result = _lib.SSL_CTX_add_extra_chain_cert(self._context, copy)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800935 if not add_result:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -0500936 # TODO: This is untested.
937 _lib.X509_free(copy)
938 _raise_current_error()
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800939
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800940 def _raise_passphrase_exception(self):
Greg Bowser36eb2de2017-01-24 11:38:55 -0500941 if self._passphrase_helper is not None:
942 self._passphrase_helper.raise_if_problem(Error)
943
944 _raise_current_error()
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800945
Jean-Paul Calderone00f84eb2015-04-13 12:47:21 -0400946 def use_privatekey_file(self, keyfile, filetype=_UNSPECIFIED):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800947 """
948 Load a private key from a file
949
Jean-Paul Calderoneb6f8a792015-04-13 10:10:06 -0400950 :param keyfile: The name of the key file (``bytes`` or ``unicode``)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800951 :param filetype: (optional) The encoding of the file, default is PEM
Jean-Paul Calderoneb6f8a792015-04-13 10:10:06 -0400952
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800953 :return: None
954 """
Jean-Paul Calderone69a4e5b2015-04-12 10:04:28 -0400955 keyfile = _path_string(keyfile)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800956
Jean-Paul Calderone00f84eb2015-04-13 12:47:21 -0400957 if filetype is _UNSPECIFIED:
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800958 filetype = FILETYPE_PEM
Jean-Paul Calderonef73a3cb2014-02-09 08:49:06 -0500959 elif not isinstance(filetype, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800960 raise TypeError("filetype must be an integer")
961
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500962 use_result = _lib.SSL_CTX_use_PrivateKey_file(
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800963 self._context, keyfile, filetype)
964 if not use_result:
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800965 self._raise_passphrase_exception()
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800966
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800967 def use_privatekey(self, pkey):
968 """
969 Load a private key from a PKey object
970
971 :param pkey: The PKey object
972 :return: None
973 """
974 if not isinstance(pkey, PKey):
975 raise TypeError("pkey must be a PKey instance")
976
Jean-Paul Calderone6037d072013-12-28 18:04:00 -0500977 use_result = _lib.SSL_CTX_use_PrivateKey(self._context, pkey._pkey)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800978 if not use_result:
Jean-Paul Calderone173cff92013-03-06 10:29:21 -0800979 self._raise_passphrase_exception()
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800980
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800981 def check_privatekey(self):
982 """
983 Check that the private key and certificate match up
984
985 :return: None (raises an exception if something's wrong)
986 """
Jean-Paul Calderonea0344922014-12-11 14:02:31 -0500987 if not _lib.SSL_CTX_check_private_key(self._context):
988 _raise_current_error()
989
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800990 def load_client_ca(self, cafile):
991 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +0100992 Load the trusted certificates that will be sent to the client. Does
993 not actually imply any of the certificates are trusted; that must be
Alex Gaynor62da94d2015-09-05 14:37:34 -0400994 configured separately.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800995
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +0100996 :param bytes cafile: The path to a certificates file in PEM format.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -0800997 :return: None
998 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +0100999 ca_list = _lib.SSL_load_client_CA_file(
1000 _text_to_bytes_and_warn("cafile", cafile)
1001 )
1002 _openssl_assert(ca_list != _ffi.NULL)
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001003 _lib.SSL_CTX_set_client_CA_list(self._context, ca_list)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001004
1005 def set_session_id(self, buf):
1006 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001007 Set the session id to *buf* within which a session can be reused for
1008 this Context object. This is needed when doing session resumption,
1009 because there is no way for a stored session to know which Context
1010 object it is associated with.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001011
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001012 :param bytes buf: The session id.
1013
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001014 :returns: None
1015 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001016 buf = _text_to_bytes_and_warn("buf", buf)
1017 _openssl_assert(
1018 _lib.SSL_CTX_set_session_id_context(
1019 self._context,
1020 buf,
1021 len(buf),
1022 ) == 1
1023 )
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001024
1025 def set_session_cache_mode(self, mode):
1026 """
1027 Enable/disable session caching and specify the mode used.
1028
1029 :param mode: One or more of the SESS_CACHE_* flags (combine using
1030 bitwise or)
1031 :returns: The previously set caching mode.
1032 """
Jean-Paul Calderonebef4f4c2014-02-02 18:13:31 -05001033 if not isinstance(mode, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001034 raise TypeError("mode must be an integer")
1035
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001036 return _lib.SSL_CTX_set_session_cache_mode(self._context, mode)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001037
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001038 def get_session_cache_mode(self):
1039 """
1040 :returns: The currently used cache mode.
1041 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001042 return _lib.SSL_CTX_get_session_cache_mode(self._context)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001043
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001044 def set_verify(self, mode, callback):
1045 """
1046 Set the verify mode and verify callback
1047
1048 :param mode: The verify mode, this is either VERIFY_NONE or
1049 VERIFY_PEER combined with possible other flags
1050 :param callback: The Python callback to use
1051 :return: None
1052
1053 See SSL_CTX_set_verify(3SSL) for further details.
1054 """
Jean-Paul Calderonebef4f4c2014-02-02 18:13:31 -05001055 if not isinstance(mode, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001056 raise TypeError("mode must be an integer")
1057
1058 if not callable(callback):
1059 raise TypeError("callback must be callable")
1060
Jean-Paul Calderone6a8cd112014-04-02 21:09:08 -04001061 self._verify_helper = _VerifyHelper(callback)
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -08001062 self._verify_callback = self._verify_helper.callback
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001063 _lib.SSL_CTX_set_verify(self._context, mode, self._verify_callback)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001064
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001065 def set_verify_depth(self, depth):
1066 """
1067 Set the verify depth
1068
1069 :param depth: An integer specifying the verify depth
1070 :return: None
1071 """
Jean-Paul Calderonebef4f4c2014-02-02 18:13:31 -05001072 if not isinstance(depth, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001073 raise TypeError("depth must be an integer")
1074
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001075 _lib.SSL_CTX_set_verify_depth(self._context, depth)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001076
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001077 def get_verify_mode(self):
1078 """
1079 Get the verify mode
1080
1081 :return: The verify mode
1082 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001083 return _lib.SSL_CTX_get_verify_mode(self._context)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001084
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001085 def get_verify_depth(self):
1086 """
1087 Get the verify depth
1088
1089 :return: The verify depth
1090 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001091 return _lib.SSL_CTX_get_verify_depth(self._context)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001092
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001093 def load_tmp_dh(self, dhfile):
1094 """
1095 Load parameters for Ephemeral Diffie-Hellman
1096
Jean-Paul Calderone4e0c43f2015-04-13 10:15:17 -04001097 :param dhfile: The file to load EDH parameters from (``bytes`` or
1098 ``unicode``).
1099
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001100 :return: None
1101 """
Jean-Paul Calderone9e1c1dd2015-04-12 10:13:13 -04001102 dhfile = _path_string(dhfile)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001103
Jean-Paul Calderone4f0467a2014-01-11 11:58:41 -05001104 bio = _lib.BIO_new_file(dhfile, b"r")
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001105 if bio == _ffi.NULL:
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -05001106 _raise_current_error()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001107 bio = _ffi.gc(bio, _lib.BIO_free)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001108
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001109 dh = _lib.PEM_read_bio_DHparams(bio, _ffi.NULL, _ffi.NULL, _ffi.NULL)
1110 dh = _ffi.gc(dh, _lib.DH_free)
1111 _lib.SSL_CTX_set_tmp_dh(self._context, dh)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001112
Jean-Paul Calderone3e4e3352014-04-19 09:28:28 -04001113 def set_tmp_ecdh(self, curve):
Alex Gaynor7b8d57a2014-01-17 12:08:54 -06001114 """
Andy Lutomirski76a61332014-03-12 15:02:56 -07001115 Select a curve to use for ECDHE key exchange.
Alex Gaynor7b8d57a2014-01-17 12:08:54 -06001116
Jean-Paul Calderonec09fd582014-04-18 22:00:10 -04001117 :param curve: A curve object to use as returned by either
1118 :py:meth:`OpenSSL.crypto.get_elliptic_curve` or
1119 :py:meth:`OpenSSL.crypto.get_elliptic_curves`.
Andy Lutomirskif05a2732014-03-13 17:22:25 -07001120
Alex Gaynor7b8d57a2014-01-17 12:08:54 -06001121 :return: None
1122 """
Jean-Paul Calderonec09fd582014-04-18 22:00:10 -04001123 _lib.SSL_CTX_set_tmp_ecdh(self._context, curve._to_EC_KEY())
Alex Gaynor7b8d57a2014-01-17 12:08:54 -06001124
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001125 def set_cipher_list(self, cipher_list):
1126 """
Hynek Schlawackf90e3682016-03-11 11:21:13 +01001127 Set the list of ciphers to be used in this context.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001128
Hynek Schlawackf90e3682016-03-11 11:21:13 +01001129 See the OpenSSL manual for more information (e.g.
1130 :manpage:`ciphers(1)`).
1131
1132 :param bytes cipher_list: An OpenSSL cipher string.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001133 :return: None
1134 """
Hynek Schlawackf90e3682016-03-11 11:21:13 +01001135 cipher_list = _text_to_bytes_and_warn("cipher_list", cipher_list)
Jean-Paul Calderone63eab692014-01-18 10:19:56 -05001136
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001137 if not isinstance(cipher_list, bytes):
Hynek Schlawacka7a63af2016-03-11 12:05:26 +01001138 raise TypeError("cipher_list must be a byte string.")
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001139
Hynek Schlawackf90e3682016-03-11 11:21:13 +01001140 _openssl_assert(
Hynek Schlawack22a4b662016-03-11 14:59:39 +01001141 _lib.SSL_CTX_set_cipher_list(self._context, cipher_list) == 1
Hynek Schlawackf90e3682016-03-11 11:21:13 +01001142 )
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001143
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001144 def set_client_ca_list(self, certificate_authorities):
1145 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04001146 Set the list of preferred client certificate signers for this server
1147 context.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001148
Alex Gaynor62da94d2015-09-05 14:37:34 -04001149 This list of certificate authorities will be sent to the client when
1150 the server requests a client certificate.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001151
1152 :param certificate_authorities: a sequence of X509Names.
1153 :return: None
1154 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001155 name_stack = _lib.sk_X509_NAME_new_null()
Alex Gaynora829e902016-06-04 18:16:01 -07001156 _openssl_assert(name_stack != _ffi.NULL)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001157
1158 try:
1159 for ca_name in certificate_authorities:
1160 if not isinstance(ca_name, X509Name):
1161 raise TypeError(
Alex Gaynor62da94d2015-09-05 14:37:34 -04001162 "client CAs must be X509Name objects, not %s "
1163 "objects" % (
1164 type(ca_name).__name__,
1165 )
1166 )
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001167 copy = _lib.X509_NAME_dup(ca_name._name)
Alex Gaynora829e902016-06-04 18:16:01 -07001168 _openssl_assert(copy != _ffi.NULL)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001169 push_result = _lib.sk_X509_NAME_push(name_stack, copy)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001170 if not push_result:
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001171 _lib.X509_NAME_free(copy)
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -05001172 _raise_current_error()
Alex Gaynorc3697ad2017-11-20 08:19:32 -05001173 except Exception:
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001174 _lib.sk_X509_NAME_free(name_stack)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001175 raise
1176
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001177 _lib.SSL_CTX_set_client_CA_list(self._context, name_stack)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001178
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001179 def add_client_ca(self, certificate_authority):
1180 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04001181 Add the CA certificate to the list of preferred signers for this
1182 context.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001183
1184 The list of certificate authorities will be sent to the client when the
1185 server requests a client certificate.
1186
1187 :param certificate_authority: certificate authority's X509 certificate.
1188 :return: None
1189 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001190 if not isinstance(certificate_authority, X509):
1191 raise TypeError("certificate_authority must be an X509 instance")
1192
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001193 add_result = _lib.SSL_CTX_add_client_CA(
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001194 self._context, certificate_authority._x509)
Alex Gaynor09f19f52016-07-03 09:54:09 -04001195 _openssl_assert(add_result == 1)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001196
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001197 def set_timeout(self, timeout):
1198 """
1199 Set session timeout
1200
1201 :param timeout: The timeout in seconds
1202 :return: The previous session timeout
1203 """
Jean-Paul Calderonebef4f4c2014-02-02 18:13:31 -05001204 if not isinstance(timeout, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001205 raise TypeError("timeout must be an integer")
1206
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001207 return _lib.SSL_CTX_set_timeout(self._context, timeout)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001208
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001209 def get_timeout(self):
1210 """
1211 Get the session timeout
1212
1213 :return: The session timeout
1214 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001215 return _lib.SSL_CTX_get_timeout(self._context)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001216
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001217 def set_info_callback(self, callback):
1218 """
1219 Set the info callback
1220
1221 :param callback: The Python callback to use
1222 :return: None
1223 """
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001224 @wraps(callback)
1225 def wrapper(ssl, where, return_code):
Jean-Paul Calderonef2bbc9c2014-02-02 10:59:14 -05001226 callback(Connection._reverse_mapping[ssl], where, return_code)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001227 self._info_callback = _ffi.callback(
1228 "void (*)(const SSL *, int, int)", wrapper)
1229 _lib.SSL_CTX_set_info_callback(self._context, self._info_callback)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001230
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001231 def get_app_data(self):
1232 """
1233 Get the application data (supplied via set_app_data())
1234
1235 :return: The application data
1236 """
1237 return self._app_data
1238
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001239 def set_app_data(self, data):
1240 """
1241 Set the application data (will be returned from get_app_data())
1242
1243 :param data: Any Python object
1244 :return: None
1245 """
1246 self._app_data = data
1247
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001248 def get_cert_store(self):
1249 """
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001250 Get the certificate store for the context.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001251
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001252 :return: A X509Store object or None if it does not have one.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001253 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001254 store = _lib.SSL_CTX_get_cert_store(self._context)
1255 if store == _ffi.NULL:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001256 # TODO: This is untested.
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001257 return None
1258
1259 pystore = X509Store.__new__(X509Store)
1260 pystore._store = store
1261 return pystore
1262
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001263 def set_options(self, options):
1264 """
1265 Add options. Options set before are not cleared!
1266
1267 :param options: The options to add.
1268 :return: The new option bitmask.
1269 """
Jean-Paul Calderonebef4f4c2014-02-02 18:13:31 -05001270 if not isinstance(options, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001271 raise TypeError("options must be an integer")
1272
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001273 return _lib.SSL_CTX_set_options(self._context, options)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001274
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001275 def set_mode(self, mode):
1276 """
1277 Add modes via bitmask. Modes set before are not cleared!
1278
1279 :param mode: The mode to add.
1280 :return: The new mode bitmask.
1281 """
Jean-Paul Calderonebef4f4c2014-02-02 18:13:31 -05001282 if not isinstance(mode, integer_types):
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001283 raise TypeError("mode must be an integer")
1284
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001285 return _lib.SSL_CTX_set_mode(self._context, mode)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001286
Cory Benfielde6f35882016-03-29 11:21:04 +01001287 @_requires_sni
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001288 def set_tlsext_servername_callback(self, callback):
1289 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04001290 Specify a callback function to be called when clients specify a server
1291 name.
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001292
1293 :param callback: The callback function. It will be invoked with one
1294 argument, the Connection instance.
1295 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001296 @wraps(callback)
1297 def wrapper(ssl, alert, arg):
1298 callback(Connection._reverse_mapping[ssl])
1299 return 0
1300
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001301 self._tlsext_servername_callback = _ffi.callback(
1302 "int (*)(const SSL *, int *, void *)", wrapper)
1303 _lib.SSL_CTX_set_tlsext_servername_callback(
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001304 self._context, self._tlsext_servername_callback)
Jean-Paul Calderone8a1bea52013-03-05 07:57:57 -08001305
Cory Benfield10b277f2015-04-13 17:12:42 -04001306 @_requires_npn
Cory Benfield84a121e2014-03-31 20:30:25 +01001307 def set_npn_advertise_callback(self, callback):
1308 """
Cory Benfieldbe3e7b82014-05-10 09:48:55 +01001309 Specify a callback function that will be called when offering `Next
1310 Protocol Negotiation
1311 <https://technotes.googlecode.com/git/nextprotoneg.html>`_ as a server.
Cory Benfield84a121e2014-03-31 20:30:25 +01001312
1313 :param callback: The callback function. It will be invoked with one
Cory Benfieldbe3e7b82014-05-10 09:48:55 +01001314 argument, the Connection instance. It should return a list of
1315 bytestrings representing the advertised protocols, like
1316 ``[b'http/1.1', b'spdy/2']``.
Cory Benfield84a121e2014-03-31 20:30:25 +01001317 """
Cory Benfield0ea76e72015-03-22 09:05:28 +00001318 self._npn_advertise_helper = _NpnAdvertiseHelper(callback)
1319 self._npn_advertise_callback = self._npn_advertise_helper.callback
Cory Benfield84a121e2014-03-31 20:30:25 +01001320 _lib.SSL_CTX_set_next_protos_advertised_cb(
1321 self._context, self._npn_advertise_callback, _ffi.NULL)
1322
Cory Benfield10b277f2015-04-13 17:12:42 -04001323 @_requires_npn
Cory Benfield84a121e2014-03-31 20:30:25 +01001324 def set_npn_select_callback(self, callback):
1325 """
1326 Specify a callback function that will be called when a server offers
1327 Next Protocol Negotiation options.
1328
1329 :param callback: The callback function. It will be invoked with two
1330 arguments: the Connection, and a list of offered protocols as
Cory Benfieldbe3e7b82014-05-10 09:48:55 +01001331 bytestrings, e.g. ``[b'http/1.1', b'spdy/2']``. It should return
1332 one of those bytestrings, the chosen protocol.
Cory Benfield84a121e2014-03-31 20:30:25 +01001333 """
Cory Benfield0ea76e72015-03-22 09:05:28 +00001334 self._npn_select_helper = _NpnSelectHelper(callback)
1335 self._npn_select_callback = self._npn_select_helper.callback
Cory Benfield84a121e2014-03-31 20:30:25 +01001336 _lib.SSL_CTX_set_next_proto_select_cb(
1337 self._context, self._npn_select_callback, _ffi.NULL)
1338
Cory Benfield7907e332015-04-13 17:18:25 -04001339 @_requires_alpn
Cory Benfield12eae892014-06-07 15:42:56 +01001340 def set_alpn_protos(self, protos):
1341 """
Cory Benfielde8e9c382015-04-11 17:33:48 -04001342 Specify the clients ALPN protocol list.
1343
1344 These protocols are offered to the server during protocol negotiation.
Cory Benfield12eae892014-06-07 15:42:56 +01001345
1346 :param protos: A list of the protocols to be offered to the server.
1347 This list should be a Python list of bytestrings representing the
1348 protocols to offer, e.g. ``[b'http/1.1', b'spdy/2']``.
1349 """
1350 # Take the list of protocols and join them together, prefixing them
1351 # with their lengths.
1352 protostr = b''.join(
1353 chain.from_iterable((int2byte(len(p)), p) for p in protos)
1354 )
1355
1356 # Build a C string from the list. We don't need to save this off
1357 # because OpenSSL immediately copies the data out.
1358 input_str = _ffi.new("unsigned char[]", protostr)
Alex Gaynord61c46a2017-06-29 22:51:33 -07001359 _lib.SSL_CTX_set_alpn_protos(self._context, input_str, len(protostr))
Cory Benfield12eae892014-06-07 15:42:56 +01001360
Cory Benfield7907e332015-04-13 17:18:25 -04001361 @_requires_alpn
Cory Benfield12eae892014-06-07 15:42:56 +01001362 def set_alpn_select_callback(self, callback):
1363 """
Cory Benfielde8e9c382015-04-11 17:33:48 -04001364 Set the callback to handle ALPN protocol choice.
Cory Benfield12eae892014-06-07 15:42:56 +01001365
1366 :param callback: The callback function. It will be invoked with two
1367 arguments: the Connection, and a list of offered protocols as
1368 bytestrings, e.g ``[b'http/1.1', b'spdy/2']``. It should return
Cory Benfielde8e9c382015-04-11 17:33:48 -04001369 one of those bytestrings, the chosen protocol.
Cory Benfield12eae892014-06-07 15:42:56 +01001370 """
Cory Benfield9da5ffb2015-04-13 17:20:14 -04001371 self._alpn_select_helper = _ALPNSelectHelper(callback)
Cory Benfieldf1177e72015-04-12 09:11:49 -04001372 self._alpn_select_callback = self._alpn_select_helper.callback
Cory Benfield12eae892014-06-07 15:42:56 +01001373 _lib.SSL_CTX_set_alpn_select_cb(
1374 self._context, self._alpn_select_callback, _ffi.NULL)
1375
Cory Benfield496652a2017-01-24 11:42:56 +00001376 def _set_ocsp_callback(self, helper, data):
1377 """
1378 This internal helper does the common work for
1379 ``set_ocsp_server_callback`` and ``set_ocsp_client_callback``, which is
1380 almost all of it.
1381 """
1382 self._ocsp_helper = helper
1383 self._ocsp_callback = helper.callback
1384 if data is None:
1385 self._ocsp_data = _ffi.NULL
1386 else:
1387 self._ocsp_data = _ffi.new_handle(data)
1388
1389 rc = _lib.SSL_CTX_set_tlsext_status_cb(
1390 self._context, self._ocsp_callback
1391 )
1392 _openssl_assert(rc == 1)
1393 rc = _lib.SSL_CTX_set_tlsext_status_arg(self._context, self._ocsp_data)
1394 _openssl_assert(rc == 1)
1395
1396 def set_ocsp_server_callback(self, callback, data=None):
1397 """
1398 Set a callback to provide OCSP data to be stapled to the TLS handshake
1399 on the server side.
1400
1401 :param callback: The callback function. It will be invoked with two
1402 arguments: the Connection, and the optional arbitrary data you have
1403 provided. The callback must return a bytestring that contains the
1404 OCSP data to staple to the handshake. If no OCSP data is available
1405 for this connection, return the empty bytestring.
1406 :param data: Some opaque data that will be passed into the callback
1407 function when called. This can be used to avoid needing to do
1408 complex data lookups or to keep track of what context is being
1409 used. This parameter is optional.
1410 """
1411 helper = _OCSPServerCallbackHelper(callback)
1412 self._set_ocsp_callback(helper, data)
1413
1414 def set_ocsp_client_callback(self, callback, data=None):
1415 """
1416 Set a callback to validate OCSP data stapled to the TLS handshake on
1417 the client side.
1418
1419 :param callback: The callback function. It will be invoked with three
1420 arguments: the Connection, a bytestring containing the stapled OCSP
1421 assertion, and the optional arbitrary data you have provided. The
1422 callback must return a boolean that indicates the result of
1423 validating the OCSP data: ``True`` if the OCSP data is valid and
1424 the certificate can be trusted, or ``False`` if either the OCSP
1425 data is invalid or the certificate has been revoked.
1426 :param data: Some opaque data that will be passed into the callback
1427 function when called. This can be used to avoid needing to do
1428 complex data lookups or to keep track of what context is being
1429 used. This parameter is optional.
1430 """
1431 helper = _OCSPClientCallbackHelper(callback)
1432 self._set_ocsp_callback(helper, data)
1433
Alex Chanc6077062016-11-18 13:53:39 +00001434
Alex Gaynor10d30832017-06-29 15:31:39 -07001435ContextType = deprecated(
1436 Context, __name__,
1437 "ContextType has been deprecated, use Context instead", DeprecationWarning
1438)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001439
1440
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001441class Connection(object):
1442 """
1443 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001444 _reverse_mapping = WeakValueDictionary()
1445
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001446 def __init__(self, context, socket=None):
1447 """
1448 Create a new Connection object, using the given OpenSSL.SSL.Context
1449 instance and socket.
1450
1451 :param context: An SSL Context to use for this connection
1452 :param socket: The socket to use for transport layer
1453 """
1454 if not isinstance(context, Context):
1455 raise TypeError("context must be a Context instance")
1456
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001457 ssl = _lib.SSL_new(context._context)
1458 self._ssl = _ffi.gc(ssl, _lib.SSL_free)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001459 self._context = context
Todd Chapman4f73e4f2015-08-27 11:26:43 -04001460 self._app_data = None
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001461
Cory Benfieldbe3e7b82014-05-10 09:48:55 +01001462 # References to strings used for Next Protocol Negotiation. OpenSSL's
1463 # header files suggest that these might get copied at some point, but
1464 # doesn't specify when, so we store them here to make sure they don't
1465 # get freed before OpenSSL uses them.
1466 self._npn_advertise_callback_args = None
1467 self._npn_select_callback_args = None
1468
Cory Benfield12eae892014-06-07 15:42:56 +01001469 # References to strings used for Application Layer Protocol
1470 # Negotiation. These strings get copied at some point but it's well
1471 # after the callback returns, so we have to hang them somewhere to
1472 # avoid them getting freed.
1473 self._alpn_select_callback_args = None
1474
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001475 self._reverse_mapping[self._ssl] = self
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001476
1477 if socket is None:
1478 self._socket = None
Jean-Paul Calderone73b15c22013-03-05 18:30:39 -08001479 # Don't set up any gc for these, SSL_free will take care of them.
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001480 self._into_ssl = _lib.BIO_new(_lib.BIO_s_mem())
Alex Gaynora829e902016-06-04 18:16:01 -07001481 _openssl_assert(self._into_ssl != _ffi.NULL)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001482
Alex Gaynora829e902016-06-04 18:16:01 -07001483 self._from_ssl = _lib.BIO_new(_lib.BIO_s_mem())
1484 _openssl_assert(self._from_ssl != _ffi.NULL)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001485
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001486 _lib.SSL_set_bio(self._ssl, self._into_ssl, self._from_ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001487 else:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001488 self._into_ssl = None
1489 self._from_ssl = None
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001490 self._socket = socket
Alex Gaynor62da94d2015-09-05 14:37:34 -04001491 set_result = _lib.SSL_set_fd(
1492 self._ssl, _asFileDescriptor(self._socket))
Alex Gaynor09f19f52016-07-03 09:54:09 -04001493 _openssl_assert(set_result == 1)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001494
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001495 def __getattr__(self, name):
1496 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04001497 Look up attributes on the wrapped socket object if they are not found
1498 on the Connection object.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001499 """
kjav0b66fa12015-09-02 11:51:26 +01001500 if self._socket is None:
Alex Gaynor62da94d2015-09-05 14:37:34 -04001501 raise AttributeError("'%s' object has no attribute '%s'" % (
1502 self.__class__.__name__, name
1503 ))
kjav0b66fa12015-09-02 11:51:26 +01001504 else:
1505 return getattr(self._socket, name)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001506
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001507 def _raise_ssl_error(self, ssl, result):
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -08001508 if self._context._verify_helper is not None:
1509 self._context._verify_helper.raise_if_problem()
Cory Benfield0ea76e72015-03-22 09:05:28 +00001510 if self._context._npn_advertise_helper is not None:
1511 self._context._npn_advertise_helper.raise_if_problem()
1512 if self._context._npn_select_helper is not None:
1513 self._context._npn_select_helper.raise_if_problem()
Cory Benfieldf1177e72015-04-12 09:11:49 -04001514 if self._context._alpn_select_helper is not None:
1515 self._context._alpn_select_helper.raise_if_problem()
Cory Benfield496652a2017-01-24 11:42:56 +00001516 if self._context._ocsp_helper is not None:
1517 self._context._ocsp_helper.raise_if_problem()
Jean-Paul Calderone7e166fe2013-03-06 20:54:38 -08001518
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001519 error = _lib.SSL_get_error(ssl, result)
1520 if error == _lib.SSL_ERROR_WANT_READ:
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001521 raise WantReadError()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001522 elif error == _lib.SSL_ERROR_WANT_WRITE:
Jean-Paul Calderoned899af02013-03-19 22:10:37 -07001523 raise WantWriteError()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001524 elif error == _lib.SSL_ERROR_ZERO_RETURN:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001525 raise ZeroReturnError()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001526 elif error == _lib.SSL_ERROR_WANT_X509_LOOKUP:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001527 # TODO: This is untested.
Jean-Paul Calderoned899af02013-03-19 22:10:37 -07001528 raise WantX509LookupError()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001529 elif error == _lib.SSL_ERROR_SYSCALL:
1530 if _lib.ERR_peek_error() == 0:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001531 if result < 0:
Konstantinos Koukopoulos541150d2014-01-31 01:00:19 +02001532 if platform == "win32":
1533 errno = _ffi.getwinerror()[0]
1534 else:
1535 errno = _ffi.errno
Alex Gaynor5af32d02016-09-24 01:52:21 -04001536
1537 if errno != 0:
1538 raise SysCallError(errno, errorcode.get(errno))
1539 raise SysCallError(-1, "Unexpected EOF")
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001540 else:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001541 # TODO: This is untested.
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -05001542 _raise_current_error()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001543 elif error == _lib.SSL_ERROR_NONE:
Jean-Paul Calderoned899af02013-03-19 22:10:37 -07001544 pass
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001545 else:
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -05001546 _raise_current_error()
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001547
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001548 def get_context(self):
1549 """
1550 Get session context
1551 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001552 return self._context
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001553
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001554 def set_context(self, context):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001555 """
1556 Switch this connection to a new session context
1557
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001558 :param context: A :py:class:`Context` instance giving the new session
1559 context to use.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001560 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001561 if not isinstance(context, Context):
1562 raise TypeError("context must be a Context instance")
1563
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001564 _lib.SSL_set_SSL_CTX(self._ssl, context._context)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001565 self._context = context
1566
Cory Benfielde6f35882016-03-29 11:21:04 +01001567 @_requires_sni
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001568 def get_servername(self):
1569 """
1570 Retrieve the servername extension value if provided in the client hello
1571 message, or None if there wasn't one.
1572
1573 :return: A byte string giving the server name or :py:data:`None`.
1574 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04001575 name = _lib.SSL_get_servername(
1576 self._ssl, _lib.TLSEXT_NAMETYPE_host_name
1577 )
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001578 if name == _ffi.NULL:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001579 return None
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001580
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001581 return _ffi.string(name)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001582
Cory Benfielde6f35882016-03-29 11:21:04 +01001583 @_requires_sni
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001584 def set_tlsext_host_name(self, name):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001585 """
1586 Set the value of the servername extension to send in the client hello.
1587
1588 :param name: A byte string giving the name.
1589 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001590 if not isinstance(name, bytes):
1591 raise TypeError("name must be a byte string")
Jean-Paul Calderone4f0467a2014-01-11 11:58:41 -05001592 elif b"\0" in name:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001593 raise TypeError("name must not contain NUL byte")
1594
1595 # XXX I guess this can fail sometimes?
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001596 _lib.SSL_set_tlsext_host_name(self._ssl, name)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001597
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001598 def pending(self):
1599 """
1600 Get the number of bytes that can be safely read from the connection
1601
1602 :return: The number of bytes available in the receive buffer.
1603 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001604 return _lib.SSL_pending(self._ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001605
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001606 def send(self, buf, flags=0):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001607 """
1608 Send data on the connection. NOTE: If you get one of the WantRead,
1609 WantWrite or WantX509Lookup exceptions on this, you have to call the
1610 method again with the SAME buffer.
1611
Markus Unterwaditzer8e41d022014-04-19 12:27:11 +02001612 :param buf: The string, buffer or memoryview to send
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001613 :param flags: (optional) Included for compatibility with the socket
1614 API, the value is ignored
1615 :return: The number of bytes written
1616 """
Abraham Martine82326c2015-02-04 10:18:10 +00001617 # Backward compatibility
Jean-Paul Calderone39a8d592015-04-13 20:49:50 -04001618 buf = _text_to_bytes_and_warn("buf", buf)
Abraham Martine82326c2015-02-04 10:18:10 +00001619
Jean-Paul Calderone8fb53182013-12-30 08:35:49 -05001620 if isinstance(buf, _memoryview):
Jean-Paul Calderone1aba4162013-03-05 18:50:00 -08001621 buf = buf.tobytes()
Markus Unterwaditzer8e41d022014-04-19 12:27:11 +02001622 if isinstance(buf, _buffer):
1623 buf = str(buf)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001624 if not isinstance(buf, bytes):
Markus Unterwaditzer8e41d022014-04-19 12:27:11 +02001625 raise TypeError("data must be a memoryview, buffer or byte string")
Maximilian Hils868dc3c2017-02-10 14:56:55 +01001626 if len(buf) > 2147483647:
1627 raise ValueError("Cannot send more than 2**31-1 bytes at once.")
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001628
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001629 result = _lib.SSL_write(self._ssl, buf, len(buf))
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001630 self._raise_ssl_error(self._ssl, result)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001631 return result
1632 write = send
1633
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001634 def sendall(self, buf, flags=0):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001635 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001636 Send "all" data on the connection. This calls send() repeatedly until
1637 all data is sent. If an error occurs, it's impossible to tell how much
1638 data has been sent.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001639
Markus Unterwaditzer8e41d022014-04-19 12:27:11 +02001640 :param buf: The string, buffer or memoryview to send
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001641 :param flags: (optional) Included for compatibility with the socket
1642 API, the value is ignored
1643 :return: The number of bytes written
1644 """
Jean-Paul Calderone39a8d592015-04-13 20:49:50 -04001645 buf = _text_to_bytes_and_warn("buf", buf)
Abraham Martine82326c2015-02-04 10:18:10 +00001646
Jean-Paul Calderone8fb53182013-12-30 08:35:49 -05001647 if isinstance(buf, _memoryview):
Jean-Paul Calderone1aba4162013-03-05 18:50:00 -08001648 buf = buf.tobytes()
Markus Unterwaditzer8e41d022014-04-19 12:27:11 +02001649 if isinstance(buf, _buffer):
1650 buf = str(buf)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001651 if not isinstance(buf, bytes):
Markus Unterwaditzer8e41d022014-04-19 12:27:11 +02001652 raise TypeError("buf must be a memoryview, buffer or byte string")
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001653
1654 left_to_send = len(buf)
1655 total_sent = 0
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001656 data = _ffi.new("char[]", buf)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001657
1658 while left_to_send:
Maximilian Hils868dc3c2017-02-10 14:56:55 +01001659 # SSL_write's num arg is an int,
1660 # so we cannot send more than 2**31-1 bytes at once.
1661 result = _lib.SSL_write(
1662 self._ssl,
1663 data + total_sent,
1664 min(left_to_send, 2147483647)
1665 )
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001666 self._raise_ssl_error(self._ssl, result)
1667 total_sent += result
1668 left_to_send -= result
1669
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001670 def recv(self, bufsiz, flags=None):
1671 """
Alex Gaynor67fc8c92016-05-27 08:27:19 -04001672 Receive data on the connection.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001673
1674 :param bufsiz: The maximum number of bytes to read
Maximilian Hils1d95dea2015-08-17 19:27:20 +02001675 :param flags: (optional) The only supported flag is ``MSG_PEEK``,
1676 all other flags are ignored.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001677 :return: The string read from the Connection
1678 """
Cory Benfielde62840e2016-11-28 12:17:08 +00001679 buf = _no_zero_allocator("char[]", bufsiz)
Maximilian Hils1d95dea2015-08-17 19:27:20 +02001680 if flags is not None and flags & socket.MSG_PEEK:
1681 result = _lib.SSL_peek(self._ssl, buf, bufsiz)
1682 else:
1683 result = _lib.SSL_read(self._ssl, buf, bufsiz)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001684 self._raise_ssl_error(self._ssl, result)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001685 return _ffi.buffer(buf, result)[:]
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001686 read = recv
1687
Cory Benfield62d10332014-06-15 10:03:41 +01001688 def recv_into(self, buffer, nbytes=None, flags=None):
1689 """
1690 Receive data on the connection and store the data into a buffer rather
1691 than creating a new string.
1692
1693 :param buffer: The buffer to copy into.
1694 :param nbytes: (optional) The maximum number of bytes to read into the
1695 buffer. If not present, defaults to the size of the buffer. If
1696 larger than the size of the buffer, is reduced to the size of the
1697 buffer.
Maximilian Hils1d95dea2015-08-17 19:27:20 +02001698 :param flags: (optional) The only supported flag is ``MSG_PEEK``,
1699 all other flags are ignored.
Cory Benfield62d10332014-06-15 10:03:41 +01001700 :return: The number of bytes read into the buffer.
1701 """
1702 if nbytes is None:
1703 nbytes = len(buffer)
1704 else:
1705 nbytes = min(nbytes, len(buffer))
1706
1707 # We need to create a temporary buffer. This is annoying, it would be
1708 # better if we could pass memoryviews straight into the SSL_read call,
1709 # but right now we can't. Revisit this if CFFI gets that ability.
Cory Benfielde62840e2016-11-28 12:17:08 +00001710 buf = _no_zero_allocator("char[]", nbytes)
Maximilian Hils1d95dea2015-08-17 19:27:20 +02001711 if flags is not None and flags & socket.MSG_PEEK:
1712 result = _lib.SSL_peek(self._ssl, buf, nbytes)
1713 else:
1714 result = _lib.SSL_read(self._ssl, buf, nbytes)
Cory Benfield62d10332014-06-15 10:03:41 +01001715 self._raise_ssl_error(self._ssl, result)
1716
1717 # This strange line is all to avoid a memory copy. The buffer protocol
1718 # should allow us to assign a CFFI buffer to the LHS of this line, but
1719 # on CPython 3.3+ that segfaults. As a workaround, we can temporarily
1720 # wrap it in a memoryview, except on Python 2.6 which doesn't have a
1721 # memoryview type.
1722 try:
1723 buffer[:result] = memoryview(_ffi.buffer(buf, result))
1724 except NameError:
1725 buffer[:result] = _ffi.buffer(buf, result)
1726
1727 return result
1728
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001729 def _handle_bio_errors(self, bio, result):
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001730 if _lib.BIO_should_retry(bio):
1731 if _lib.BIO_should_read(bio):
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001732 raise WantReadError()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001733 elif _lib.BIO_should_write(bio):
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001734 # TODO: This is untested.
Jean-Paul Calderoned899af02013-03-19 22:10:37 -07001735 raise WantWriteError()
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001736 elif _lib.BIO_should_io_special(bio):
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001737 # TODO: This is untested. I think io_special means the socket
1738 # BIO has a not-yet connected socket.
Jean-Paul Calderoned899af02013-03-19 22:10:37 -07001739 raise ValueError("BIO_should_io_special")
1740 else:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001741 # TODO: This is untested.
Jean-Paul Calderoned899af02013-03-19 22:10:37 -07001742 raise ValueError("unknown bio failure")
1743 else:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001744 # TODO: This is untested.
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -05001745 _raise_current_error()
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001746
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001747 def bio_read(self, bufsiz):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001748 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001749 When using non-socket connections this function reads the "dirty" data
1750 that would have traveled away on the network.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001751
1752 :param bufsiz: The maximum number of bytes to read
1753 :return: The string read.
1754 """
Jean-Paul Calderone97e041d2013-03-05 21:03:12 -08001755 if self._from_ssl is None:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001756 raise TypeError("Connection sock was not None")
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001757
Jean-Paul Calderonebef4f4c2014-02-02 18:13:31 -05001758 if not isinstance(bufsiz, integer_types):
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001759 raise TypeError("bufsiz must be an integer")
1760
Cory Benfielde62840e2016-11-28 12:17:08 +00001761 buf = _no_zero_allocator("char[]", bufsiz)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001762 result = _lib.BIO_read(self._from_ssl, buf, bufsiz)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001763 if result <= 0:
1764 self._handle_bio_errors(self._from_ssl, result)
1765
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001766 return _ffi.buffer(buf, result)[:]
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001767
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001768 def bio_write(self, buf):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001769 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001770 When using non-socket connections this function sends "dirty" data that
1771 would have traveled in on the network.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001772
1773 :param buf: The string to put into the memory BIO.
1774 :return: The number of bytes written
1775 """
Jean-Paul Calderone39a8d592015-04-13 20:49:50 -04001776 buf = _text_to_bytes_and_warn("buf", buf)
Abraham Martine82326c2015-02-04 10:18:10 +00001777
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001778 if self._into_ssl is None:
1779 raise TypeError("Connection sock was not None")
1780
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001781 result = _lib.BIO_write(self._into_ssl, buf, len(buf))
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001782 if result <= 0:
1783 self._handle_bio_errors(self._into_ssl, result)
1784 return result
1785
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001786 def renegotiate(self):
1787 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001788 Renegotiate the session.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001789
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001790 :return: True if the renegotiation can be started, False otherwise
1791 :rtype: bool
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001792 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001793 if not self.renegotiate_pending():
1794 _openssl_assert(_lib.SSL_renegotiate(self._ssl) == 1)
1795 return True
1796 return False
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001797
1798 def do_handshake(self):
1799 """
1800 Perform an SSL handshake (usually called after renegotiate() or one of
1801 set_*_state()). This can raise the same exceptions as send and recv.
1802
1803 :return: None.
1804 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001805 result = _lib.SSL_do_handshake(self._ssl)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001806 self._raise_ssl_error(self._ssl, result)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001807
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001808 def renegotiate_pending(self):
1809 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001810 Check if there's a renegotiation in progress, it will return False once
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001811 a renegotiation is finished.
1812
1813 :return: Whether there's a renegotiation in progress
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001814 :rtype: bool
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001815 """
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001816 return _lib.SSL_renegotiate_pending(self._ssl) == 1
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001817
1818 def total_renegotiations(self):
1819 """
1820 Find out the total number of renegotiations.
1821
1822 :return: The number of renegotiations.
Hynek Schlawackb1f3ca82016-02-13 09:10:04 +01001823 :rtype: int
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001824 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001825 return _lib.SSL_total_renegotiations(self._ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001826
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001827 def connect(self, addr):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001828 """
1829 Connect to remote host and set up client-side SSL
1830
1831 :param addr: A remote address
1832 :return: What the socket's connect method returns
1833 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001834 _lib.SSL_set_connect_state(self._ssl)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001835 return self._socket.connect(addr)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001836
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001837 def connect_ex(self, addr):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001838 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04001839 Connect to remote host and set up client-side SSL. Note that if the
1840 socket's connect_ex method doesn't return 0, SSL won't be initialized.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001841
1842 :param addr: A remove address
1843 :return: What the socket's connect_ex method returns
1844 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001845 connect_ex = self._socket.connect_ex
1846 self.set_connect_state()
1847 return connect_ex(addr)
1848
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001849 def accept(self):
1850 """
1851 Accept incoming connection and set up SSL on it
1852
1853 :return: A (conn,addr) pair where conn is a Connection and addr is an
1854 address
1855 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001856 client, addr = self._socket.accept()
1857 conn = Connection(self._context, client)
1858 conn.set_accept_state()
1859 return (conn, addr)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001860
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001861 def bio_shutdown(self):
1862 """
1863 When using non-socket connections this function signals end of
1864 data on the input for this connection.
1865
1866 :return: None
1867 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001868 if self._from_ssl is None:
1869 raise TypeError("Connection sock was not None")
1870
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001871 _lib.BIO_set_mem_eof_return(self._into_ssl, 0)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001872
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001873 def shutdown(self):
1874 """
1875 Send closure alert
1876
1877 :return: True if the shutdown completed successfully (i.e. both sides
1878 have sent closure alerts), false otherwise (i.e. you have to
1879 wait for a ZeroReturnError on a recv() method call
1880 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001881 result = _lib.SSL_shutdown(self._ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001882 if result < 0:
Paul Aurichbff1d1a2015-01-08 08:36:53 -08001883 self._raise_ssl_error(self._ssl, result)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001884 elif result > 0:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001885 return True
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001886 else:
1887 return False
1888
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001889 def get_cipher_list(self):
1890 """
Hynek Schlawackf90e3682016-03-11 11:21:13 +01001891 Retrieve the list of ciphers used by the Connection object.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001892
Hynek Schlawackf90e3682016-03-11 11:21:13 +01001893 :return: A list of native cipher strings.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001894 """
1895 ciphers = []
1896 for i in count():
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001897 result = _lib.SSL_get_cipher_list(self._ssl, i)
1898 if result == _ffi.NULL:
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001899 break
Jean-Paul Calderone4f0467a2014-01-11 11:58:41 -05001900 ciphers.append(_native(_ffi.string(result)))
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001901 return ciphers
1902
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001903 def get_client_ca_list(self):
1904 """
1905 Get CAs whose certificates are suggested for client authentication.
1906
Alex Gaynor62da94d2015-09-05 14:37:34 -04001907 :return: If this is a server connection, a list of X509Names
1908 representing the acceptable CAs as set by
1909 :py:meth:`OpenSSL.SSL.Context.set_client_ca_list` or
1910 :py:meth:`OpenSSL.SSL.Context.add_client_ca`. If this is a client
1911 connection, the list of such X509Names sent by the server, or an
1912 empty list if that has not yet happened.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001913 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001914 ca_names = _lib.SSL_get_client_CA_list(self._ssl)
1915 if ca_names == _ffi.NULL:
Jean-Paul Calderonea9f84ad2013-12-29 17:06:11 -05001916 # TODO: This is untested.
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001917 return []
1918
1919 result = []
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001920 for i in range(_lib.sk_X509_NAME_num(ca_names)):
1921 name = _lib.sk_X509_NAME_value(ca_names, i)
1922 copy = _lib.X509_NAME_dup(name)
Alex Gaynora829e902016-06-04 18:16:01 -07001923 _openssl_assert(copy != _ffi.NULL)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001924
1925 pyname = X509Name.__new__(X509Name)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001926 pyname._name = _ffi.gc(copy, _lib.X509_NAME_free)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001927 result.append(pyname)
1928 return result
1929
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001930 def makefile(self):
1931 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04001932 The makefile() method is not implemented, since there is no dup
1933 semantics for SSL connections
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001934
Jean-Paul Calderone6749ec22014-04-17 16:30:21 -04001935 :raise: NotImplementedError
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001936 """
Alex Gaynor83284952015-09-05 10:43:30 -04001937 raise NotImplementedError(
1938 "Cannot make file object of OpenSSL.SSL.Connection")
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001939
1940 def get_app_data(self):
1941 """
1942 Get application data
1943
1944 :return: The application data
1945 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001946 return self._app_data
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001947
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001948 def set_app_data(self, data):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001949 """
1950 Set application data
1951
1952 :param data - The application data
1953 :return: None
1954 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001955 self._app_data = data
1956
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001957 def get_shutdown(self):
1958 """
1959 Get shutdown state
1960
Alex Gaynor62da94d2015-09-05 14:37:34 -04001961 :return: The shutdown state, a bitvector of SENT_SHUTDOWN,
1962 RECEIVED_SHUTDOWN.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001963 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001964 return _lib.SSL_get_shutdown(self._ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001965
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001966 def set_shutdown(self, state):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001967 """
1968 Set shutdown state
1969
1970 :param state - bitvector of SENT_SHUTDOWN, RECEIVED_SHUTDOWN.
1971 :return: None
1972 """
Jean-Paul Calderonef73a3cb2014-02-09 08:49:06 -05001973 if not isinstance(state, integer_types):
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001974 raise TypeError("state must be an integer")
1975
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05001976 _lib.SSL_set_shutdown(self._ssl, state)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001977
Hynek Schlawackea94f2b2016-03-13 16:17:53 +01001978 def get_state_string(self):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001979 """
Hynek Schlawackea94f2b2016-03-13 16:17:53 +01001980 Retrieve a verbose string detailing the state of the Connection.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001981
1982 :return: A string representing the state
Hynek Schlawackea94f2b2016-03-13 16:17:53 +01001983 :rtype: bytes
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001984 """
kjavc704a2e2015-09-07 12:12:27 +01001985 return _ffi.string(_lib.SSL_state_string_long(self._ssl))
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08001986
1987 def server_random(self):
1988 """
1989 Get a copy of the server hello nonce.
1990
1991 :return: A string representing the state
1992 """
Alex Gaynor93603062016-06-01 20:13:09 -07001993 session = _lib.SSL_get_session(self._ssl)
1994 if session == _ffi.NULL:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08001995 return None
Alex Gaynor93603062016-06-01 20:13:09 -07001996 length = _lib.SSL_get_server_random(self._ssl, _ffi.NULL, 0)
1997 assert length > 0
Cory Benfielde62840e2016-11-28 12:17:08 +00001998 outp = _no_zero_allocator("unsigned char[]", length)
Alex Gaynor93603062016-06-01 20:13:09 -07001999 _lib.SSL_get_server_random(self._ssl, outp, length)
2000 return _ffi.buffer(outp, length)[:]
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002001
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002002 def client_random(self):
2003 """
2004 Get a copy of the client hello nonce.
2005
2006 :return: A string representing the state
2007 """
Alex Gaynor93603062016-06-01 20:13:09 -07002008 session = _lib.SSL_get_session(self._ssl)
2009 if session == _ffi.NULL:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002010 return None
Alex Gaynor93603062016-06-01 20:13:09 -07002011
2012 length = _lib.SSL_get_client_random(self._ssl, _ffi.NULL, 0)
2013 assert length > 0
Cory Benfielde62840e2016-11-28 12:17:08 +00002014 outp = _no_zero_allocator("unsigned char[]", length)
Alex Gaynor93603062016-06-01 20:13:09 -07002015 _lib.SSL_get_client_random(self._ssl, outp, length)
2016 return _ffi.buffer(outp, length)[:]
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002017
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002018 def master_key(self):
2019 """
2020 Get a copy of the master key.
2021
2022 :return: A string representing the state
2023 """
Alex Gaynor93603062016-06-01 20:13:09 -07002024 session = _lib.SSL_get_session(self._ssl)
2025 if session == _ffi.NULL:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002026 return None
Alex Gaynor93603062016-06-01 20:13:09 -07002027
2028 length = _lib.SSL_SESSION_get_master_key(session, _ffi.NULL, 0)
2029 assert length > 0
Cory Benfielde62840e2016-11-28 12:17:08 +00002030 outp = _no_zero_allocator("unsigned char[]", length)
Alex Gaynor93603062016-06-01 20:13:09 -07002031 _lib.SSL_SESSION_get_master_key(session, outp, length)
2032 return _ffi.buffer(outp, length)[:]
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002033
Paul Kehrerbdb76392017-12-01 04:54:32 +08002034 def export_keying_material(self, label, olen, context=None):
2035 """
2036 Obtain keying material for application use.
2037
2038 :param label - a disambiguating label string as described in RFC 5705
2039 :param olen - the length of the exported key material in bytes
2040 :param context - a per-association context value
2041 :return the exported key material bytes or None
2042 """
2043 outp = _no_zero_allocator("unsigned char[]", olen)
2044 context_buf = _ffi.NULL
2045 context_len = 0
2046 use_context = 0
2047 if context is not None:
2048 context_buf = context
2049 context_len = len(context)
2050 use_context = 1
2051 success = _lib.SSL_export_keying_material(self._ssl, outp, olen,
2052 label, len(label),
2053 context_buf, context_len,
2054 use_context)
2055 _openssl_assert(success == 1)
2056 return _ffi.buffer(outp, olen)[:]
2057
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002058 def sock_shutdown(self, *args, **kwargs):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002059 """
2060 See shutdown(2)
2061
2062 :return: What the socket's shutdown() method returns
2063 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002064 return self._socket.shutdown(*args, **kwargs)
2065
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002066 def get_peer_certificate(self):
2067 """
2068 Retrieve the other side's certificate (if any)
2069
2070 :return: The peer's certificate
2071 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002072 cert = _lib.SSL_get_peer_certificate(self._ssl)
2073 if cert != _ffi.NULL:
Alex Gaynor4aa52c32017-11-20 09:04:08 -05002074 return X509._from_raw_x509_ptr(cert)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002075 return None
2076
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002077 def get_peer_cert_chain(self):
2078 """
2079 Retrieve the other side's certificate (if any)
2080
2081 :return: A list of X509 instances giving the peer's certificate chain,
2082 or None if it does not have one.
2083 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002084 cert_stack = _lib.SSL_get_peer_cert_chain(self._ssl)
2085 if cert_stack == _ffi.NULL:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002086 return None
2087
2088 result = []
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002089 for i in range(_lib.sk_X509_num(cert_stack)):
Jean-Paul Calderone73b15c22013-03-05 18:30:39 -08002090 # TODO could incref instead of dup here
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002091 cert = _lib.X509_dup(_lib.sk_X509_value(cert_stack, i))
Alex Gaynor4aa52c32017-11-20 09:04:08 -05002092 pycert = X509._from_raw_x509_ptr(cert)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002093 result.append(pycert)
2094 return result
2095
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002096 def want_read(self):
2097 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04002098 Checks if more data has to be read from the transport layer to complete
2099 an operation.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002100
2101 :return: True iff more data has to be read
2102 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002103 return _lib.SSL_want_read(self._ssl)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002104
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002105 def want_write(self):
2106 """
2107 Checks if there is data to write to the transport layer to complete an
2108 operation.
2109
2110 :return: True iff there is data to write
2111 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002112 return _lib.SSL_want_write(self._ssl)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002113
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002114 def set_accept_state(self):
2115 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04002116 Set the connection to work in server mode. The handshake will be
2117 handled automatically by read/write.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002118
2119 :return: None
2120 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002121 _lib.SSL_set_accept_state(self._ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002122
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002123 def set_connect_state(self):
2124 """
Alex Gaynor62da94d2015-09-05 14:37:34 -04002125 Set the connection to work in client mode. The handshake will be
2126 handled automatically by read/write.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002127
2128 :return: None
2129 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002130 _lib.SSL_set_connect_state(self._ssl)
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002131
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002132 def get_session(self):
2133 """
2134 Returns the Session currently used.
2135
Alex Gaynor62da94d2015-09-05 14:37:34 -04002136 @return: An instance of :py:class:`OpenSSL.SSL.Session` or
2137 :py:obj:`None` if no session exists.
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002138 """
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002139 session = _lib.SSL_get1_session(self._ssl)
2140 if session == _ffi.NULL:
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002141 return None
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002142
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002143 pysession = Session.__new__(Session)
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002144 pysession._session = _ffi.gc(session, _lib.SSL_SESSION_free)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002145 return pysession
2146
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002147 def set_session(self, session):
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002148 """
2149 Set the session to be used when the TLS/SSL connection is established.
2150
2151 :param session: A Session instance representing the session to use.
2152 :returns: None
2153 """
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002154 if not isinstance(session, Session):
2155 raise TypeError("session must be a Session instance")
2156
Jean-Paul Calderone6037d072013-12-28 18:04:00 -05002157 result = _lib.SSL_set_session(self._ssl, session._session)
Jean-Paul Calderonea63714c2013-03-05 17:02:26 -08002158 if not result:
Jean-Paul Calderonec86bb7d2013-12-29 10:25:59 -05002159 _raise_current_error()
Jean-Paul Calderone131052e2013-03-05 11:56:19 -08002160
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002161 def _get_finished_message(self, function):
2162 """
2163 Helper to implement :py:meth:`get_finished` and
2164 :py:meth:`get_peer_finished`.
2165
2166 :param function: Either :py:data:`SSL_get_finished`: or
2167 :py:data:`SSL_get_peer_finished`.
2168
2169 :return: :py:data:`None` if the desired message has not yet been
2170 received, otherwise the contents of the message.
2171 :rtype: :py:class:`bytes` or :py:class:`NoneType`
2172 """
Jean-Paul Calderone01af9042014-03-30 11:40:42 -04002173 # The OpenSSL documentation says nothing about what might happen if the
2174 # count argument given is zero. Specifically, it doesn't say whether
2175 # the output buffer may be NULL in that case or not. Inspection of the
2176 # implementation reveals that it calls memcpy() unconditionally.
2177 # Section 7.1.4, paragraph 1 of the C standard suggests that
2178 # memcpy(NULL, source, 0) is not guaranteed to produce defined (let
2179 # alone desirable) behavior (though it probably does on just about
2180 # every implementation...)
2181 #
2182 # Allocate a tiny buffer to pass in (instead of just passing NULL as
2183 # one might expect) for the initial call so as to be safe against this
2184 # potentially undefined behavior.
2185 empty = _ffi.new("char[]", 0)
2186 size = function(self._ssl, empty, 0)
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002187 if size == 0:
2188 # No Finished message so far.
2189 return None
2190
Cory Benfielde62840e2016-11-28 12:17:08 +00002191 buf = _no_zero_allocator("char[]", size)
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002192 function(self._ssl, buf, size)
2193 return _ffi.buffer(buf, size)[:]
2194
Fedor Brunner5747b932014-03-05 14:22:34 +01002195 def get_finished(self):
2196 """
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002197 Obtain the latest `handshake finished` message sent to the peer.
Fedor Brunner5747b932014-03-05 14:22:34 +01002198
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002199 :return: The contents of the message or :py:obj:`None` if the TLS
2200 handshake has not yet completed.
2201 :rtype: :py:class:`bytes` or :py:class:`NoneType`
Fedor Brunner5747b932014-03-05 14:22:34 +01002202 """
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002203 return self._get_finished_message(_lib.SSL_get_finished)
2204
Fedor Brunner5747b932014-03-05 14:22:34 +01002205 def get_peer_finished(self):
2206 """
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002207 Obtain the latest `handshake finished` message received from the peer.
Fedor Brunner5747b932014-03-05 14:22:34 +01002208
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002209 :return: The contents of the message or :py:obj:`None` if the TLS
2210 handshake has not yet completed.
2211 :rtype: :py:class:`bytes` or :py:class:`NoneType`
Fedor Brunner5747b932014-03-05 14:22:34 +01002212 """
Jean-Paul Calderoneac209562014-03-30 11:26:32 -04002213 return self._get_finished_message(_lib.SSL_get_peer_finished)
Fedor Brunner5747b932014-03-05 14:22:34 +01002214
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002215 def get_cipher_name(self):
2216 """
2217 Obtain the name of the currently used cipher.
Jean-Paul Calderone9e3ccd42014-03-29 18:13:36 -04002218
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002219 :returns: The name of the currently used cipher or :py:obj:`None`
2220 if no connection has been established.
Jean-Paul Calderone7f0ded42014-03-30 10:34:17 -04002221 :rtype: :py:class:`unicode` or :py:class:`NoneType`
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002222 """
2223 cipher = _lib.SSL_get_current_cipher(self._ssl)
2224 if cipher == _ffi.NULL:
2225 return None
2226 else:
Jean-Paul Calderone7f0ded42014-03-30 10:34:17 -04002227 name = _ffi.string(_lib.SSL_CIPHER_get_name(cipher))
2228 return name.decode("utf-8")
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002229
2230 def get_cipher_bits(self):
2231 """
2232 Obtain the number of secret bits of the currently used cipher.
Jean-Paul Calderone9e3ccd42014-03-29 18:13:36 -04002233
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002234 :returns: The number of secret bits of the currently used cipher
2235 or :py:obj:`None` if no connection has been established.
Jean-Paul Calderone9e3ccd42014-03-29 18:13:36 -04002236 :rtype: :py:class:`int` or :py:class:`NoneType`
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002237 """
2238 cipher = _lib.SSL_get_current_cipher(self._ssl)
2239 if cipher == _ffi.NULL:
2240 return None
2241 else:
2242 return _lib.SSL_CIPHER_get_bits(cipher, _ffi.NULL)
2243
2244 def get_cipher_version(self):
2245 """
Jean-Paul Calderone9e3ccd42014-03-29 18:13:36 -04002246 Obtain the protocol version of the currently used cipher.
2247
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002248 :returns: The protocol name of the currently used cipher
2249 or :py:obj:`None` if no connection has been established.
Jean-Paul Calderone7f0ded42014-03-30 10:34:17 -04002250 :rtype: :py:class:`unicode` or :py:class:`NoneType`
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002251 """
2252 cipher = _lib.SSL_get_current_cipher(self._ssl)
2253 if cipher == _ffi.NULL:
2254 return None
2255 else:
Alex Gaynorc4889812015-09-04 08:43:17 -04002256 version = _ffi.string(_lib.SSL_CIPHER_get_version(cipher))
Jean-Paul Calderone7f0ded42014-03-30 10:34:17 -04002257 return version.decode("utf-8")
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002258
Jim Shaverabff1882015-05-27 09:15:55 -04002259 def get_protocol_version_name(self):
Jim Shaverba65e662015-04-26 12:23:40 -04002260 """
2261 Obtain the protocol version of the current connection.
2262
2263 :returns: The TLS version of the current connection, for example
Jim Shaver58d25732015-05-28 11:52:32 -04002264 the value for TLS 1.2 would be ``TLSv1.2``or ``Unknown``
Jim Shaverb5b6b0e2015-05-28 16:47:36 -04002265 for connections that were not successfully established.
Jim Shaver58d25732015-05-28 11:52:32 -04002266 :rtype: :py:class:`unicode`
Jim Shaverba65e662015-04-26 12:23:40 -04002267 """
Jim Shaverd1c896e2015-05-27 17:50:21 -04002268 version = _ffi.string(_lib.SSL_get_version(self._ssl))
Jim Shaver58d25732015-05-28 11:52:32 -04002269 return version.decode("utf-8")
Jim Shaverb2967922015-04-26 23:58:52 -04002270
Jim Shaver208438c2015-05-28 09:52:38 -04002271 def get_protocol_version(self):
2272 """
2273 Obtain the protocol version of the current connection.
2274
2275 :returns: The TLS version of the current connection, for example
2276 the value for TLS 1 would be 0x769.
2277 :rtype: :py:class:`int`
2278 """
2279 version = _lib.SSL_version(self._ssl)
2280 return version
2281
Cory Benfield10b277f2015-04-13 17:12:42 -04002282 @_requires_npn
Cory Benfield84a121e2014-03-31 20:30:25 +01002283 def get_next_proto_negotiated(self):
2284 """
2285 Get the protocol that was negotiated by NPN.
2286 """
2287 data = _ffi.new("unsigned char **")
2288 data_len = _ffi.new("unsigned int *")
2289
2290 _lib.SSL_get0_next_proto_negotiated(self._ssl, data, data_len)
2291
Cory Benfieldcd010f62014-05-15 19:00:27 +01002292 return _ffi.buffer(data[0], data_len[0])[:]
Fedor Brunnerd95014a2014-03-03 17:34:41 +01002293
Cory Benfield7907e332015-04-13 17:18:25 -04002294 @_requires_alpn
Cory Benfield12eae892014-06-07 15:42:56 +01002295 def set_alpn_protos(self, protos):
2296 """
Cory Benfielde8e9c382015-04-11 17:33:48 -04002297 Specify the client's ALPN protocol list.
2298
2299 These protocols are offered to the server during protocol negotiation.
Cory Benfield12eae892014-06-07 15:42:56 +01002300
2301 :param protos: A list of the protocols to be offered to the server.
2302 This list should be a Python list of bytestrings representing the
2303 protocols to offer, e.g. ``[b'http/1.1', b'spdy/2']``.
2304 """
2305 # Take the list of protocols and join them together, prefixing them
2306 # with their lengths.
2307 protostr = b''.join(
2308 chain.from_iterable((int2byte(len(p)), p) for p in protos)
2309 )
2310
2311 # Build a C string from the list. We don't need to save this off
2312 # because OpenSSL immediately copies the data out.
2313 input_str = _ffi.new("unsigned char[]", protostr)
Alex Gaynord61c46a2017-06-29 22:51:33 -07002314 _lib.SSL_set_alpn_protos(self._ssl, input_str, len(protostr))
Cory Benfield12eae892014-06-07 15:42:56 +01002315
Maximilian Hils66ded6a2015-08-26 06:02:03 +02002316 @_requires_alpn
Cory Benfield12eae892014-06-07 15:42:56 +01002317 def get_alpn_proto_negotiated(self):
Cory Benfield222f30e2015-04-13 18:10:21 -04002318 """
2319 Get the protocol that was negotiated by ALPN.
2320 """
Cory Benfield12eae892014-06-07 15:42:56 +01002321 data = _ffi.new("unsigned char **")
2322 data_len = _ffi.new("unsigned int *")
2323
2324 _lib.SSL_get0_alpn_selected(self._ssl, data, data_len)
2325
Cory Benfielde8e9c382015-04-11 17:33:48 -04002326 if not data_len:
2327 return b''
2328
Cory Benfield12eae892014-06-07 15:42:56 +01002329 return _ffi.buffer(data[0], data_len[0])[:]
2330
Cory Benfield496652a2017-01-24 11:42:56 +00002331 def request_ocsp(self):
2332 """
2333 Called to request that the server sends stapled OCSP data, if
2334 available. If this is not called on the client side then the server
2335 will not send OCSP data. Should be used in conjunction with
2336 :meth:`Context.set_ocsp_client_callback`.
2337 """
2338 rc = _lib.SSL_set_tlsext_status_type(
2339 self._ssl, _lib.TLSEXT_STATUSTYPE_ocsp
2340 )
2341 _openssl_assert(rc == 1)
2342
Cory Benfield12eae892014-06-07 15:42:56 +01002343
Alex Gaynor10d30832017-06-29 15:31:39 -07002344ConnectionType = deprecated(
2345 Connection, __name__,
2346 "ConnectionType has been deprecated, use Connection instead",
2347 DeprecationWarning
2348)
Jean-Paul Calderone11ed8e82014-01-18 10:21:50 -05002349
Jean-Paul Calderonefab157b2014-01-18 11:21:38 -05002350# This is similar to the initialization calls at the end of OpenSSL/crypto.py
2351# but is exercised mostly by the Context initializer.
Jean-Paul Calderone11ed8e82014-01-18 10:21:50 -05002352_lib.SSL_library_init()