blob: 6ad0d0454ad4e74fee21f36ef7a0b0bd310745f2 [file] [log] [blame]
Alex Gaynoraf82d5e2013-10-29 17:07:24 -07001.. hazmat::
Alex Gaynor0f7f7812013-09-30 10:52:36 -07002
Alex Stapletonc5fffd32014-03-18 15:29:00 +00003OpenSSL backend
Alex Gaynor8f42fe42013-12-24 13:15:52 -08004===============
Donald Stuffte51fb932013-10-27 17:26:17 -04005
Paul Kehrer12649af2014-03-10 12:45:19 -04006The `OpenSSL`_ C library. Cryptography supports version ``0.9.8e`` (present in
7Red Hat Enterprise Linux 5) and greater. Earlier versions may work but are
8**not tested or supported**.
Alex Gaynor6d02e2d2013-09-30 10:37:22 -07009
Alex Gaynorf8796b12013-12-13 20:28:55 -080010.. data:: cryptography.hazmat.backends.openssl.backend
Alex Gaynor6d02e2d2013-09-30 10:37:22 -070011
Paul Kehrer3f17c7c2014-01-20 16:32:26 -060012 This is the exposed API for the OpenSSL backend.
Paul Kehrer2502ce52014-01-18 09:32:47 -060013
Alex Gaynor031c2cb2014-01-31 11:44:53 -080014 It implements the following interfaces:
15
16 * :class:`~cryptography.hazmat.backends.interfaces.CipherBackend`
Paul Kehrer3d754292014-05-01 09:09:34 -050017 * :class:`~cryptography.hazmat.backends.interfaces.CMACBackend`
Mohammed Attia59edb612014-04-25 22:44:40 +020018 * :class:`~cryptography.hazmat.backends.interfaces.DSABackend`
Alex Gaynor031c2cb2014-01-31 11:44:53 -080019 * :class:`~cryptography.hazmat.backends.interfaces.HashBackend`
20 * :class:`~cryptography.hazmat.backends.interfaces.HMACBackend`
21 * :class:`~cryptography.hazmat.backends.interfaces.PBKDF2HMACBackend`
Alex Stapleton8f2250f2014-02-08 12:24:02 +000022 * :class:`~cryptography.hazmat.backends.interfaces.RSABackend`
Alex Gaynor031c2cb2014-01-31 11:44:53 -080023
Paul Kehrere4acd5d2014-02-03 21:59:29 -060024 It also exposes the following:
Paul Kehrer2502ce52014-01-18 09:32:47 -060025
Paul Kehrercfa2d622014-01-19 14:01:25 -060026 .. attribute:: name
Paul Kehrer2502ce52014-01-18 09:32:47 -060027
Paul Kehrercfa2d622014-01-19 14:01:25 -060028 The string name of this backend: ``"openssl"``
Alex Gaynor6d02e2d2013-09-30 10:37:22 -070029
Paul Kehrerd52b89b2014-01-31 10:57:17 -060030 .. method:: activate_osrandom_engine()
Paul Kehrer3f17c7c2014-01-20 16:32:26 -060031
Paul Kehrerd52b89b2014-01-31 10:57:17 -060032 Activates the OS random engine. This will effectively disable OpenSSL's
33 default CSPRNG.
Paul Kehrer3f17c7c2014-01-20 16:32:26 -060034
Paul Kehrerd2582222014-02-05 16:21:19 -060035 .. method:: activate_builtin_random()
Paul Kehrer3f17c7c2014-01-20 16:32:26 -060036
Paul Kehrerd2582222014-02-05 16:21:19 -060037 This will activate the default OpenSSL CSPRNG.
Paul Kehrer3f17c7c2014-01-20 16:32:26 -060038
Alex Stapletonc5fffd32014-03-18 15:29:00 +000039OS random engine
Paul Kehrer3f17c7c2014-01-20 16:32:26 -060040----------------
41
Paul Kehrerae2138a2014-01-29 22:19:47 -060042OpenSSL uses a user-space CSPRNG that is seeded from system random (
Paul Kehrer136ff172014-01-29 21:23:11 -060043``/dev/urandom`` or ``CryptGenRandom``). This CSPRNG is not reseeded
44automatically when a process calls ``fork()``. This can result in situations
45where two different processes can return similar or identical keys and
46compromise the security of the system.
Paul Kehrer3f17c7c2014-01-20 16:32:26 -060047
Paul Kehrer136ff172014-01-29 21:23:11 -060048The approach this project has chosen to mitigate this vulnerability is to
Alex Gaynor969f18e2014-05-17 20:07:35 -070049include an engine that replaces the OpenSSL default CSPRNG with one that
50sources its entropy from ``/dev/urandom`` on UNIX-like operating systems and
51uses ``CryptGenRandom`` on Windows. This method of pulling from the system pool
Paul Kehrer136ff172014-01-29 21:23:11 -060052allows us to avoid potential issues with `initializing the RNG`_ as well as
53protecting us from the ``fork()`` weakness.
54
Paul Kehrer8042b292014-01-31 10:44:36 -060055This engine is **active** by default when importing the OpenSSL backend. When
56active this engine will be used to generate all the random data OpenSSL
57requests.
58
Paul Kehrer8042b292014-01-31 10:44:36 -060059When importing only the binding it is added to the engine list but
60**not activated**.
61
Paul Kehrer3f17c7c2014-01-20 16:32:26 -060062
Alex Stapletonc5fffd32014-03-18 15:29:00 +000063OS random sources
Paul Kehrer55809a12014-01-29 21:41:16 -060064-----------------
Paul Kehrer9967bc52014-01-29 21:39:13 -060065
66On OS X and FreeBSD ``/dev/urandom`` is an alias for ``/dev/random`` and
67utilizes the `Yarrow`_ algorithm.
68
Paul Kehrer012bfbc2014-02-11 23:37:51 -060069On Windows the implementation of ``CryptGenRandom`` depends on which version of
Paul Kehrer039b4782014-02-11 23:50:56 -060070the operation system you are using. See the `Microsoft documentation`_ for more
Paul Kehrer012bfbc2014-02-11 23:37:51 -060071details.
Paul Kehrer9967bc52014-01-29 21:39:13 -060072
Alex Gaynor969f18e2014-05-17 20:07:35 -070073Linux uses its own PRNG design. ``/dev/urandom`` is a non-blocking source
74seeded from the same pool as ``/dev/random``.
Paul Kehrer9967bc52014-01-29 21:39:13 -060075
76
Alex Gaynor6d02e2d2013-09-30 10:37:22 -070077.. _`OpenSSL`: https://www.openssl.org/
Alex Gaynor2332c192014-04-23 08:07:27 -070078.. _`initializing the RNG`: https://en.wikipedia.org/wiki/OpenSSL#Predictable_keys_.28Debian-specific.29
Paul Kehrer136ff172014-01-29 21:23:11 -060079.. _`Yarrow`: http://en.wikipedia.org/wiki/Yarrow_algorithm
Paul Kehrerb4f7d882014-02-11 23:29:51 -060080.. _`Microsoft documentation`: http://msdn.microsoft.com/en-us/library/windows/desktop/aa379942(v=vs.85).aspx