blob: 1d40b93c1196d1d31a875dff479f596b8d6ad757 [file] [log] [blame]
Alex Gaynoraf82d5e2013-10-29 17:07:24 -07001.. hazmat::
Alex Gaynor0f7f7812013-09-30 10:52:36 -07002
Alex Gaynor8f42fe42013-12-24 13:15:52 -08003OpenSSL Backend
4===============
Donald Stuffte51fb932013-10-27 17:26:17 -04005
Alex Stapletonc368ac22013-12-31 13:43:38 +00006The `OpenSSL`_ C library.
Alex Gaynor6d02e2d2013-09-30 10:37:22 -07007
Alex Gaynorf8796b12013-12-13 20:28:55 -08008.. data:: cryptography.hazmat.backends.openssl.backend
Alex Gaynor6d02e2d2013-09-30 10:37:22 -07009
Paul Kehrer3f17c7c2014-01-20 16:32:26 -060010 This is the exposed API for the OpenSSL backend.
Paul Kehrer2502ce52014-01-18 09:32:47 -060011
Paul Kehrercfa2d622014-01-19 14:01:25 -060012 .. attribute:: name
Paul Kehrer2502ce52014-01-18 09:32:47 -060013
Paul Kehrercfa2d622014-01-19 14:01:25 -060014 The string name of this backend: ``"openssl"``
Alex Gaynor6d02e2d2013-09-30 10:37:22 -070015
Paul Kehrerd52b89b2014-01-31 10:57:17 -060016 .. method:: activate_osrandom_engine()
Paul Kehrer3f17c7c2014-01-20 16:32:26 -060017
Paul Kehrerd52b89b2014-01-31 10:57:17 -060018 Activates the OS random engine. This will effectively disable OpenSSL's
19 default CSPRNG.
Paul Kehrer3f17c7c2014-01-20 16:32:26 -060020
Paul Kehrerd52b89b2014-01-31 10:57:17 -060021 .. method:: deactivate_osrandom_engine()
Paul Kehrer3f17c7c2014-01-20 16:32:26 -060022
Paul Kehrerd52b89b2014-01-31 10:57:17 -060023 Deactivates the OS random engine if it is default. This will restore
Paul Kehrer3f17c7c2014-01-20 16:32:26 -060024 the default OpenSSL CSPRNG. If the OS random engine is not the default
25 engine (e.g. if another engine is set as default) nothing will be
26 changed.
27
28OS Random Engine
29----------------
30
Paul Kehrerae2138a2014-01-29 22:19:47 -060031OpenSSL uses a user-space CSPRNG that is seeded from system random (
Paul Kehrer136ff172014-01-29 21:23:11 -060032``/dev/urandom`` or ``CryptGenRandom``). This CSPRNG is not reseeded
33automatically when a process calls ``fork()``. This can result in situations
34where two different processes can return similar or identical keys and
35compromise the security of the system.
Paul Kehrer3f17c7c2014-01-20 16:32:26 -060036
Paul Kehrer136ff172014-01-29 21:23:11 -060037The approach this project has chosen to mitigate this vulnerability is to
38include an engine that replaces the OpenSSL default CSPRNG with one that sources
39its entropy from ``/dev/urandom`` on UNIX-like operating systems and uses
40``CryptGenRandom`` on Windows. This method of pulling from the system pool
41allows us to avoid potential issues with `initializing the RNG`_ as well as
42protecting us from the ``fork()`` weakness.
43
Paul Kehrer8042b292014-01-31 10:44:36 -060044This engine is **active** by default when importing the OpenSSL backend. When
45active this engine will be used to generate all the random data OpenSSL
46requests.
47
Paul Kehrer8042b292014-01-31 10:44:36 -060048When importing only the binding it is added to the engine list but
49**not activated**.
50
Paul Kehrer3f17c7c2014-01-20 16:32:26 -060051
Paul Kehrer9967bc52014-01-29 21:39:13 -060052OS Random Sources
Paul Kehrer55809a12014-01-29 21:41:16 -060053-----------------
Paul Kehrer9967bc52014-01-29 21:39:13 -060054
55On OS X and FreeBSD ``/dev/urandom`` is an alias for ``/dev/random`` and
56utilizes the `Yarrow`_ algorithm.
57
58On Windows ``CryptGenRandom`` is backed by `Fortuna`_.
59
60Linux uses its own PRNG design. ``/dev/urandom`` is a non-blocking source seeded
Paul Kehrer16e5e4d2014-01-30 09:43:30 -060061from the same pool as ``/dev/random``.
Paul Kehrer9967bc52014-01-29 21:39:13 -060062
63
Alex Gaynor6d02e2d2013-09-30 10:37:22 -070064.. _`OpenSSL`: https://www.openssl.org/
Paul Kehrer136ff172014-01-29 21:23:11 -060065.. _`initializing the RNG`: http://en.wikipedia.org/wiki/OpenSSL#Vulnerability_in_the_Debian_implementation
66.. _`Yarrow`: http://en.wikipedia.org/wiki/Yarrow_algorithm
67.. _`Fortuna`: http://en.wikipedia.org/wiki/Fortuna_(PRNG)