aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cryptography/hazmat/backends/openssl/backend.py33
-rw-r--r--docs/hazmat/backends/openssl.rst7
-rw-r--r--tests/hazmat/backends/test_openssl.py160
3 files changed, 21 insertions, 179 deletions
diff --git a/cryptography/hazmat/backends/openssl/backend.py b/cryptography/hazmat/backends/openssl/backend.py
index f4b5c3ac..83a65b32 100644
--- a/cryptography/hazmat/backends/openssl/backend.py
+++ b/cryptography/hazmat/backends/openssl/backend.py
@@ -60,41 +60,20 @@ class Backend(object):
self._register_default_ciphers()
self.activate_osrandom_engine()
- def deactivate_osrandom_engine(self):
+ def activate_builtin_random(self):
# obtains a new structural reference
e = self._lib.ENGINE_get_default_RAND()
if e != self._ffi.NULL:
- # this obtains the name of the engine but does not obtain a
- # structural or functional reference
- name = self._lib.ENGINE_get_name(e)
- assert name != self._ffi.NULL
- if name == self._lib.Cryptography_osrandom_engine_name:
- # removes the engine provided from the list of available RAND
- # engines.
- self._lib.ENGINE_unregister_RAND(e)
- # this resets the RNG to use the new engine
- self._lib.RAND_cleanup()
+ self._lib.ENGINE_unregister_RAND(e)
+ # this resets the RNG to use the new engine
+ self._lib.RAND_cleanup()
# decrement the structural reference from get_default_RAND
res = self._lib.ENGINE_finish(e)
assert res == 1
def activate_osrandom_engine(self):
- # obtains a new structural reference
- current_rand = self._lib.ENGINE_get_default_RAND()
- if current_rand != self._ffi.NULL:
- # this obtains the name of the engine but does not obtain a
- # structural or functional reference
- name = self._lib.ENGINE_get_name(current_rand)
- assert name != self._ffi.NULL
- if name != self._lib.Cryptography_osrandom_engine_name:
- self._activate_osrandom_engine()
- # decrement the structural reference from get_default_RAND
- res = self._lib.ENGINE_finish(current_rand)
- assert res == 1
- else:
- self._activate_osrandom_engine()
-
- def _activate_osrandom_engine(self):
+ # Unregister and free the current engine.
+ self.activate_builtin_random()
# Fetches an engine by id and returns it. This creates a structural
# reference.
e = self._lib.ENGINE_by_id(self._lib.Cryptography_osrandom_engine_id)
diff --git a/docs/hazmat/backends/openssl.rst b/docs/hazmat/backends/openssl.rst
index f7d6b710..ea72af96 100644
--- a/docs/hazmat/backends/openssl.rst
+++ b/docs/hazmat/backends/openssl.rst
@@ -27,12 +27,9 @@ The `OpenSSL`_ C library.
Activates the OS random engine. This will effectively disable OpenSSL's
default CSPRNG.
- .. method:: deactivate_osrandom_engine()
+ .. method:: activate_builtin_random()
- Deactivates the OS random engine if it is default. This will restore
- the default OpenSSL CSPRNG. If the OS random engine is not the default
- engine (e.g. if another engine is set as default) nothing will be
- changed.
+ This will activate the default OpenSSL CSPRNG.
OS Random Engine
----------------
diff --git a/tests/hazmat/backends/test_openssl.py b/tests/hazmat/backends/test_openssl.py
index 1fd513d5..b24808df 100644
--- a/tests/hazmat/backends/test_openssl.py
+++ b/tests/hazmat/backends/test_openssl.py
@@ -11,10 +11,6 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-import sys
-
-import cffi
-
import pytest
from cryptography import utils
@@ -26,101 +22,6 @@ from cryptography.hazmat.primitives.ciphers.algorithms import AES
from cryptography.hazmat.primitives.ciphers.modes import CBC
-if sys.platform != "win32":
- libraries = ["crypto", "ssl"]
-else: # pragma: no cover
- libraries = ["libeay32", "ssleay32", "advapi32"]
-
-ffi = cffi.FFI()
-
-ffi.cdef("""
-static const char *const Cryptography_faux_engine_name;
-static const char *const Cryptography_faux_engine_id;
-int Cryptography_add_faux_engine(void);
-""")
-dummy_engine = ffi.verify(
- source="""
- #include <openssl/engine.h>
- #include <string.h>
- static const char *const Cryptography_faux_engine_name="faux_engine";
- static const char *const Cryptography_faux_engine_id="faux";
- static int faux_bytes(unsigned char *buffer, int size) {
- memset(buffer, 1, size);
- return 1;
- }
- static int faux_status(void) { return 1; }
- static int faux_init(ENGINE *e) { return 1; }
- static int faux_finish(ENGINE *e) { return 1; }
- static RAND_METHOD faux_rand = {
- NULL,
- faux_bytes,
- NULL,
- NULL,
- faux_bytes,
- faux_status,
- };
-
- int Cryptography_add_faux_engine(void) {
- ENGINE *e = ENGINE_new();
- if (e == NULL) {
- return 0;
- }
- if(!ENGINE_set_id(e, Cryptography_faux_engine_id) ||
- !ENGINE_set_name(e, Cryptography_faux_engine_name) ||
- !ENGINE_set_RAND(e, &faux_rand) ||
- !ENGINE_set_init_function(e, faux_init) ||
- !ENGINE_set_finish_function(e, faux_finish)) {
- return 0;
- }
- if (!ENGINE_add(e)) {
- ENGINE_free(e);
- return 0;
- }
- if (!ENGINE_free(e)) {
- return 0;
- }
-
- return 1;
- }
- """,
- libraries=libraries
-)
-
-
-def activate_dummy_engine():
- current_rand = backend._lib.ENGINE_get_default_RAND()
- assert current_rand != backend._ffi.NULL
- name = backend._lib.ENGINE_get_name(current_rand)
- assert name != backend._ffi.NULL
- assert name != dummy_engine.Cryptography_faux_engine_name
- res = backend._lib.ENGINE_finish(current_rand)
- assert res == 1
- e = backend._lib.ENGINE_by_id(dummy_engine.Cryptography_faux_engine_id)
- assert e != backend._ffi.NULL
- res = backend._lib.ENGINE_init(e)
- assert res == 1
- res = backend._lib.ENGINE_set_default_RAND(e)
- assert res == 1
- res = backend._lib.ENGINE_finish(e)
- assert res == 1
- res = backend._lib.ENGINE_free(e)
- assert res == 1
- # this resets the RNG to use the new engine
- backend._lib.RAND_cleanup()
-
-
-def deactivate_dummy_engine():
- e = backend._lib.ENGINE_get_default_RAND()
- if e != backend._ffi.NULL:
- name = backend._lib.ENGINE_get_name(e)
- assert name != backend._ffi.NULL
- if name == dummy_engine.Cryptography_faux_engine_name:
- backend._lib.ENGINE_unregister_RAND(e)
- backend._lib.RAND_cleanup()
- res = backend._lib.ENGINE_finish(e)
- assert res == 1
-
-
@utils.register_interface(interfaces.Mode)
class DummyMode(object):
name = "dummy-mode"
@@ -263,16 +164,9 @@ class TestOpenSSL(object):
class TestOpenSSLRandomEngine(object):
- @classmethod
- def setup_class(cls):
- # add the faux engine to the list of available engines
- res = dummy_engine.Cryptography_add_faux_engine()
- assert res == 1
-
def teardown_method(self, method):
# we need to reset state to being default. backend is a shared global
# for all these tests.
- deactivate_dummy_engine()
backend.activate_osrandom_engine()
current_default = backend._lib.ENGINE_get_default_RAND()
name = backend._lib.ENGINE_get_name(current_default)
@@ -298,60 +192,32 @@ class TestOpenSSLRandomEngine(object):
res = backend._lib.ENGINE_free(e)
assert res == 1
- def test_deactivate_osrandom_engine_nothing_registered(self):
- backend.deactivate_osrandom_engine()
+ def test_activate_osrandom_no_default(self):
+ backend.activate_builtin_random()
e = backend._lib.ENGINE_get_default_RAND()
assert e == backend._ffi.NULL
- backend.deactivate_osrandom_engine()
+ backend.activate_osrandom_engine()
e = backend._lib.ENGINE_get_default_RAND()
- assert e == backend._ffi.NULL
+ name = backend._lib.ENGINE_get_name(e)
+ assert name == backend._lib.Cryptography_osrandom_engine_name
+ res = backend._lib.ENGINE_free(e)
+ assert res == 1
- def test_deactivate_osrandom_engine(self):
+ def test_activate_builtin_random(self):
e = backend._lib.ENGINE_get_default_RAND()
assert e != backend._ffi.NULL
name = backend._lib.ENGINE_get_name(e)
assert name == backend._lib.Cryptography_osrandom_engine_name
res = backend._lib.ENGINE_free(e)
assert res == 1
- backend.deactivate_osrandom_engine()
+ backend.activate_builtin_random()
e = backend._lib.ENGINE_get_default_RAND()
assert e == backend._ffi.NULL
- def test_activate_osrandom_no_default(self):
- backend.deactivate_osrandom_engine()
+ def test_activate_builtin_random_already_active(self):
+ backend.activate_builtin_random()
e = backend._lib.ENGINE_get_default_RAND()
assert e == backend._ffi.NULL
- backend.activate_osrandom_engine()
+ backend.activate_builtin_random()
e = backend._lib.ENGINE_get_default_RAND()
- name = backend._lib.ENGINE_get_name(e)
- assert name == backend._lib.Cryptography_osrandom_engine_name
- res = backend._lib.ENGINE_free(e)
- assert res == 1
-
- def test_deactivate_osrandom_other_engine_default(self):
- activate_dummy_engine()
- default = backend._lib.ENGINE_get_default_RAND()
- default_name = backend._lib.ENGINE_get_name(default)
- assert default_name == dummy_engine.Cryptography_faux_engine_name
- res = backend._lib.ENGINE_finish(default)
- assert res == 1
- backend.deactivate_osrandom_engine()
- current_default = backend._lib.ENGINE_get_default_RAND()
- name = backend._lib.ENGINE_get_name(current_default)
- assert name == dummy_engine.Cryptography_faux_engine_name
- res = backend._lib.ENGINE_finish(current_default)
- assert res == 1
-
- def test_activate_osrandom_other_engine_default(self):
- activate_dummy_engine()
- default = backend._lib.ENGINE_get_default_RAND()
- default_name = backend._lib.ENGINE_get_name(default)
- assert default_name == dummy_engine.Cryptography_faux_engine_name
- res = backend._lib.ENGINE_finish(default)
- assert res == 1
- backend.activate_osrandom_engine()
- current_default = backend._lib.ENGINE_get_default_RAND()
- name = backend._lib.ENGINE_get_name(current_default)
- assert name == backend._lib.Cryptography_osrandom_engine_name
- res = backend._lib.ENGINE_finish(current_default)
- assert res == 1
+ assert e == backend._ffi.NULL