OpenSSL exposes an Engine API, which makes it possible to plug in alternative implementations for some or all of the cryptographic operations implemented by OpenSSL. When configured appropriately, OpenSSL calls the engine's implementation of these operations instead of its own.
Typically, OpenSSL engines provide a hardware implementation of specific cryptographic operations. The hardware implementation usually offers improved performance over its software-based counterpart, which is known as cryptographic acceleration.
If the engine is located in the OpenSSL/LibreSSL installation
1> {ok, Engine} = crypto:engine_load(<<"otp_test_engine">>, [], []).
{ok, #Ref}
The file name requirement on the engine dynamic library can differ between SSL versions.
Load an engine with the help of the dynamic engine by giving the path to the library.
2> {ok, Engine} = crypto:engine_load(<<"dynamic">>,
[{<<"SO_PATH">>,
<<"/some/path/otp_test_engine.so">>},
{<<"ID">>, <<"MD5">>},
<<"LOAD">>],
[]).
{ok, #Ref}
The dynamic engine is not supported in LibreSSL from version 2.2.1
Load an engine with the help of the dynamic engine and just replace some engine methods.
3> Methods = crypto:engine_get_all_methods() -- [engine_method_dh,engine_method_rand,
engine_method_ciphers,engine_method_digests, engine_method_store,
engine_method_pkey_meths, engine_method_pkey_asn1_meths].
[engine_method_rsa,engine_method_dsa,
engine_method_ecdh,engine_method_ecdsa]
4> {ok, Engine} = crypto:engine_load(<<"dynamic">>,
[{<<"SO_PATH">>,
<<"/some/path/otp_test_engine.so">>},
{<<"ID">>, <<"MD5">>},
<<"LOAD">>],
[],
Methods).
{ok, #Ref}
5> crypto:engine_list().
[<<"dynamic">>, <<"MD5">>]