1e1051a39Sopenharmony_ciEngines
2e1051a39Sopenharmony_ci=======
3e1051a39Sopenharmony_ci
4e1051a39Sopenharmony_ciDeprecation Note
5e1051a39Sopenharmony_ci----------------
6e1051a39Sopenharmony_ci
7e1051a39Sopenharmony_ciThe ENGINE API was introduced in OpenSSL version 0.9.6 as a low level
8e1051a39Sopenharmony_ciinterface for adding alternative implementations of cryptographic
9e1051a39Sopenharmony_ciprimitives, most notably for integrating hardware crypto devices.
10e1051a39Sopenharmony_ci
11e1051a39Sopenharmony_ciThe ENGINE interface has its limitations and it has been superseeded
12e1051a39Sopenharmony_ciby the [PROVIDER API](README-PROVIDERS.md), it is deprecated in OpenSSL
13e1051a39Sopenharmony_civersion 3.0. The following documentation is retained as an aid for
14e1051a39Sopenharmony_ciusers who need to maintain or support existing ENGINE implementations.
15e1051a39Sopenharmony_ciSupport for new hardware devices or new algorithms should be added
16e1051a39Sopenharmony_civia providers, and existing engines should be converted to providers
17e1051a39Sopenharmony_cias soon as possible.
18e1051a39Sopenharmony_ci
19e1051a39Sopenharmony_ciBuilt-in ENGINE implementations
20e1051a39Sopenharmony_ci-------------------------------
21e1051a39Sopenharmony_ci
22e1051a39Sopenharmony_ciThere are currently built-in ENGINE implementations for the following
23e1051a39Sopenharmony_cicrypto devices:
24e1051a39Sopenharmony_ci
25e1051a39Sopenharmony_ci  * Microsoft CryptoAPI
26e1051a39Sopenharmony_ci  * VIA Padlock
27e1051a39Sopenharmony_ci  * nCipher CHIL
28e1051a39Sopenharmony_ci
29e1051a39Sopenharmony_ciIn addition, dynamic binding to external ENGINE implementations is now
30e1051a39Sopenharmony_ciprovided by a special ENGINE called "dynamic". See the "DYNAMIC ENGINE"
31e1051a39Sopenharmony_cisection below for details.
32e1051a39Sopenharmony_ci
33e1051a39Sopenharmony_ciAt this stage, a number of things are still needed and are being worked on:
34e1051a39Sopenharmony_ci
35e1051a39Sopenharmony_ci  1. Integration of EVP support.
36e1051a39Sopenharmony_ci  2. Configuration support.
37e1051a39Sopenharmony_ci  3. Documentation!
38e1051a39Sopenharmony_ci
39e1051a39Sopenharmony_ciIntegration of EVP support
40e1051a39Sopenharmony_ci--------------------------
41e1051a39Sopenharmony_ci
42e1051a39Sopenharmony_ciWith respect to EVP, this relates to support for ciphers and digests in
43e1051a39Sopenharmony_cithe ENGINE model so that alternative implementations of existing
44e1051a39Sopenharmony_cialgorithms/modes (or previously unimplemented ones) can be provided by
45e1051a39Sopenharmony_ciENGINE implementations.
46e1051a39Sopenharmony_ci
47e1051a39Sopenharmony_ciConfiguration support
48e1051a39Sopenharmony_ci---------------------
49e1051a39Sopenharmony_ci
50e1051a39Sopenharmony_ciConfiguration support currently exists in the ENGINE API itself, in the
51e1051a39Sopenharmony_ciform of "control commands". These allow an application to expose to the
52e1051a39Sopenharmony_ciuser/admin the set of commands and parameter types a given ENGINE
53e1051a39Sopenharmony_ciimplementation supports, and for an application to directly feed string
54e1051a39Sopenharmony_cibased input to those ENGINEs, in the form of name-value pairs. This is an
55e1051a39Sopenharmony_ciextensible way for ENGINEs to define their own "configuration" mechanisms
56e1051a39Sopenharmony_cithat are specific to a given ENGINE (eg. for a particular hardware
57e1051a39Sopenharmony_cidevice) but that should be consistent across *all* OpenSSL-based
58e1051a39Sopenharmony_ciapplications when they use that ENGINE. Work is in progress (or at least
59e1051a39Sopenharmony_ciin planning) for supporting these control commands from the CONF (or
60e1051a39Sopenharmony_ciNCONF) code so that applications using OpenSSL's existing configuration
61e1051a39Sopenharmony_cifile format can have ENGINE settings specified in much the same way.
62e1051a39Sopenharmony_ciPresently however, applications must use the ENGINE API itself to provide
63e1051a39Sopenharmony_cisuch functionality. To see first hand the types of commands available
64e1051a39Sopenharmony_ciwith the various compiled-in ENGINEs (see further down for dynamic
65e1051a39Sopenharmony_ciENGINEs), use the "engine" openssl utility with full verbosity, i.e.:
66e1051a39Sopenharmony_ci
67e1051a39Sopenharmony_ci    openssl engine -vvvv
68e1051a39Sopenharmony_ci
69e1051a39Sopenharmony_ciDocumentation
70e1051a39Sopenharmony_ci-------------
71e1051a39Sopenharmony_ci
72e1051a39Sopenharmony_ciDocumentation? Volunteers welcome! The source code is reasonably well
73e1051a39Sopenharmony_ciself-documenting, but some summaries and usage instructions are needed -
74e1051a39Sopenharmony_cimoreover, they are needed in the same POD format the existing OpenSSL
75e1051a39Sopenharmony_cidocumentation is provided in. Any complete or incomplete contributions
76e1051a39Sopenharmony_ciwould help make this happen.
77e1051a39Sopenharmony_ci
78e1051a39Sopenharmony_ciSTABILITY & BUG-REPORTS
79e1051a39Sopenharmony_ci=======================
80e1051a39Sopenharmony_ci
81e1051a39Sopenharmony_ciWhat already exists is fairly stable as far as it has been tested, but
82e1051a39Sopenharmony_cithe test base has been a bit small most of the time. For the most part,
83e1051a39Sopenharmony_cithe vendors of the devices these ENGINEs support have contributed to the
84e1051a39Sopenharmony_cidevelopment and/or testing of the implementations, and *usually* (with no
85e1051a39Sopenharmony_ciguarantees) have experience in using the ENGINE support to drive their
86e1051a39Sopenharmony_cidevices from common OpenSSL-based applications. Bugs and/or inexplicable
87e1051a39Sopenharmony_cibehaviour in using a specific ENGINE implementation should be sent to the
88e1051a39Sopenharmony_ciauthor of that implementation (if it is mentioned in the corresponding C
89e1051a39Sopenharmony_cifile), and in the case of implementations for commercial hardware
90e1051a39Sopenharmony_cidevices, also through whatever vendor support channels are available.  If
91e1051a39Sopenharmony_cinone of this is possible, or the problem seems to be something about the
92e1051a39Sopenharmony_ciENGINE API itself (ie. not necessarily specific to a particular ENGINE
93e1051a39Sopenharmony_ciimplementation) then you should mail complete details to the relevant
94e1051a39Sopenharmony_ciOpenSSL mailing list. For a definition of "complete details", refer to
95e1051a39Sopenharmony_cithe OpenSSL "README" file. As for which list to send it to:
96e1051a39Sopenharmony_ci
97e1051a39Sopenharmony_ci  * openssl-users: if you are *using* the ENGINE abstraction, either in an
98e1051a39Sopenharmony_ci    pre-compiled application or in your own application code.
99e1051a39Sopenharmony_ci
100e1051a39Sopenharmony_ci  * openssl-dev: if you are discussing problems with OpenSSL source code.
101e1051a39Sopenharmony_ci
102e1051a39Sopenharmony_ciUSAGE
103e1051a39Sopenharmony_ci=====
104e1051a39Sopenharmony_ci
105e1051a39Sopenharmony_ciThe default "openssl" ENGINE is always chosen when performing crypto
106e1051a39Sopenharmony_cioperations unless you specify otherwise. You must actively tell the
107e1051a39Sopenharmony_ciopenssl utility commands to use anything else through a new command line
108e1051a39Sopenharmony_ciswitch called "-engine". Also, if you want to use the ENGINE support in
109e1051a39Sopenharmony_ciyour own code to do something similar, you must likewise explicitly
110e1051a39Sopenharmony_ciselect the ENGINE implementation you want.
111e1051a39Sopenharmony_ci
112e1051a39Sopenharmony_ciDepending on the type of hardware, system, and configuration, "settings"
113e1051a39Sopenharmony_cimay need to be applied to an ENGINE for it to function as expected/hoped.
114e1051a39Sopenharmony_ciThe recommended way of doing this is for the application to support
115e1051a39Sopenharmony_ciENGINE "control commands" so that each ENGINE implementation can provide
116e1051a39Sopenharmony_ciwhatever configuration primitives it might require and the application
117e1051a39Sopenharmony_cican allow the user/admin (and thus the hardware vendor's support desk
118e1051a39Sopenharmony_cialso) to provide any such input directly to the ENGINE implementation.
119e1051a39Sopenharmony_ciThis way, applications do not need to know anything specific to any
120e1051a39Sopenharmony_cidevice, they only need to provide the means to carry such user/admin
121e1051a39Sopenharmony_ciinput through to the ENGINE in question. Ie. this connects *you* (and
122e1051a39Sopenharmony_ciyour helpdesk) to the specific ENGINE implementation (and device), and
123e1051a39Sopenharmony_ciallows application authors to not get buried in hassle supporting
124e1051a39Sopenharmony_ciarbitrary devices they know (and care) nothing about.
125e1051a39Sopenharmony_ci
126e1051a39Sopenharmony_ciA new "openssl" utility, "openssl engine", has been added in that allows
127e1051a39Sopenharmony_cifor testing and examination of ENGINE implementations. Basic usage
128e1051a39Sopenharmony_ciinstructions are available by specifying the "-?" command line switch.
129e1051a39Sopenharmony_ci
130e1051a39Sopenharmony_ciDYNAMIC ENGINES
131e1051a39Sopenharmony_ci===============
132e1051a39Sopenharmony_ci
133e1051a39Sopenharmony_ciThe new "dynamic" ENGINE provides a low-overhead way to support ENGINE
134e1051a39Sopenharmony_ciimplementations that aren't pre-compiled and linked into OpenSSL-based
135e1051a39Sopenharmony_ciapplications. This could be because existing compiled-in implementations
136e1051a39Sopenharmony_cihave known problems and you wish to use a newer version with an existing
137e1051a39Sopenharmony_ciapplication. It could equally be because the application (or OpenSSL
138e1051a39Sopenharmony_cilibrary) you are using simply doesn't have support for the ENGINE you
139e1051a39Sopenharmony_ciwish to use, and the ENGINE provider (eg. hardware vendor) is providing
140e1051a39Sopenharmony_ciyou with a self-contained implementation in the form of a shared-library.
141e1051a39Sopenharmony_ciThe other use-case for "dynamic" is with applications that wish to
142e1051a39Sopenharmony_cimaintain the smallest foot-print possible and so do not link in various
143e1051a39Sopenharmony_ciENGINE implementations from OpenSSL, but instead leaves you to provide
144e1051a39Sopenharmony_cithem, if you want them, in the form of "dynamic"-loadable
145e1051a39Sopenharmony_cishared-libraries. It should be possible for hardware vendors to provide
146e1051a39Sopenharmony_citheir own shared-libraries to support arbitrary hardware to work with
147e1051a39Sopenharmony_ciapplications based on OpenSSL 0.9.7 or later. If you're using an
148e1051a39Sopenharmony_ciapplication based on 0.9.7 (or later) and the support you desire is only
149e1051a39Sopenharmony_ciannounced for versions later than the one you need, ask the vendor to
150e1051a39Sopenharmony_cibackport their ENGINE to the version you need.
151e1051a39Sopenharmony_ci
152e1051a39Sopenharmony_ciHow does "dynamic" work?
153e1051a39Sopenharmony_ci------------------------
154e1051a39Sopenharmony_ci
155e1051a39Sopenharmony_ciThe dynamic ENGINE has a special flag in its implementation such that
156e1051a39Sopenharmony_cievery time application code asks for the 'dynamic' ENGINE, it in fact
157e1051a39Sopenharmony_cigets its own copy of it. As such, multi-threaded code (or code that
158e1051a39Sopenharmony_cimultiplexes multiple uses of 'dynamic' in a single application in any
159e1051a39Sopenharmony_ciway at all) does not get confused by 'dynamic' being used to do many
160e1051a39Sopenharmony_ciindependent things. Other ENGINEs typically don't do this so there is
161e1051a39Sopenharmony_cionly ever 1 ENGINE structure of its type (and reference counts are used
162e1051a39Sopenharmony_cito keep order). The dynamic ENGINE itself provides absolutely no
163e1051a39Sopenharmony_cicryptographic functionality, and any attempt to "initialise" the ENGINE
164e1051a39Sopenharmony_ciautomatically fails. All it does provide are a few "control commands"
165e1051a39Sopenharmony_cithat can be used to control how it will load an external ENGINE
166e1051a39Sopenharmony_ciimplementation from a shared-library. To see these control commands,
167e1051a39Sopenharmony_ciuse the command-line;
168e1051a39Sopenharmony_ci
169e1051a39Sopenharmony_ci    openssl engine -vvvv dynamic
170e1051a39Sopenharmony_ci
171e1051a39Sopenharmony_ciThe "SO_PATH" control command should be used to identify the
172e1051a39Sopenharmony_cishared-library that contains the ENGINE implementation, and "NO_VCHECK"
173e1051a39Sopenharmony_cimight possibly be useful if there is a minor version conflict and you
174e1051a39Sopenharmony_ci(or a vendor helpdesk) is convinced you can safely ignore it.
175e1051a39Sopenharmony_ci"ID" is probably only needed if a shared-library implements
176e1051a39Sopenharmony_cimultiple ENGINEs, but if you know the engine id you expect to be using,
177e1051a39Sopenharmony_ciit doesn't hurt to specify it (and this provides a sanity check if
178e1051a39Sopenharmony_cinothing else). "LIST_ADD" is only required if you actually wish the
179e1051a39Sopenharmony_ciloaded ENGINE to be discoverable by application code later on using the
180e1051a39Sopenharmony_ciENGINE's "id". For most applications, this isn't necessary - but some
181e1051a39Sopenharmony_ciapplication authors may have nifty reasons for using it. The "LOAD"
182e1051a39Sopenharmony_cicommand is the only one that takes no parameters and is the command
183e1051a39Sopenharmony_cithat uses the settings from any previous commands to actually *load*
184e1051a39Sopenharmony_cithe shared-library ENGINE implementation. If this command succeeds, the
185e1051a39Sopenharmony_ci(copy of the) 'dynamic' ENGINE will magically morph into the ENGINE
186e1051a39Sopenharmony_cithat has been loaded from the shared-library. As such, any control
187e1051a39Sopenharmony_cicommands supported by the loaded ENGINE could then be executed as per
188e1051a39Sopenharmony_cinormal. Eg. if ENGINE "foo" is implemented in the shared-library
189e1051a39Sopenharmony_ci"libfoo.so" and it supports some special control command "CMD_FOO", the
190e1051a39Sopenharmony_cifollowing code would load and use it (NB: obviously this code has no
191e1051a39Sopenharmony_cierror checking);
192e1051a39Sopenharmony_ci
193e1051a39Sopenharmony_ci    ENGINE *e = ENGINE_by_id("dynamic");
194e1051a39Sopenharmony_ci    ENGINE_ctrl_cmd_string(e, "SO_PATH", "/lib/libfoo.so", 0);
195e1051a39Sopenharmony_ci    ENGINE_ctrl_cmd_string(e, "ID", "foo", 0);
196e1051a39Sopenharmony_ci    ENGINE_ctrl_cmd_string(e, "LOAD", NULL, 0);
197e1051a39Sopenharmony_ci    ENGINE_ctrl_cmd_string(e, "CMD_FOO", "some input data", 0);
198e1051a39Sopenharmony_ci
199e1051a39Sopenharmony_ciFor testing, the "openssl engine" utility can be useful for this sort
200e1051a39Sopenharmony_ciof thing. For example the above code excerpt would achieve much the
201e1051a39Sopenharmony_cisame result as;
202e1051a39Sopenharmony_ci
203e1051a39Sopenharmony_ci    openssl engine dynamic \
204e1051a39Sopenharmony_ci              -pre SO_PATH:/lib/libfoo.so \
205e1051a39Sopenharmony_ci              -pre ID:foo \
206e1051a39Sopenharmony_ci              -pre LOAD \
207e1051a39Sopenharmony_ci              -pre "CMD_FOO:some input data"
208e1051a39Sopenharmony_ci
209e1051a39Sopenharmony_ciOr to simply see the list of commands supported by the "foo" ENGINE;
210e1051a39Sopenharmony_ci
211e1051a39Sopenharmony_ci    openssl engine -vvvv dynamic \
212e1051a39Sopenharmony_ci              -pre SO_PATH:/lib/libfoo.so \
213e1051a39Sopenharmony_ci              -pre ID:foo \
214e1051a39Sopenharmony_ci              -pre LOAD
215e1051a39Sopenharmony_ci
216e1051a39Sopenharmony_ciApplications that support the ENGINE API and more specifically, the
217e1051a39Sopenharmony_ci"control commands" mechanism, will provide some way for you to pass
218e1051a39Sopenharmony_cisuch commands through to ENGINEs. As such, you would select "dynamic"
219e1051a39Sopenharmony_cias the ENGINE to use, and the parameters/commands you pass would
220e1051a39Sopenharmony_cicontrol the *actual* ENGINE used. Each command is actually a name-value
221e1051a39Sopenharmony_cipair and the value can sometimes be omitted (eg. the "LOAD" command).
222e1051a39Sopenharmony_ciWhilst the syntax demonstrated in "openssl engine" uses a colon to
223e1051a39Sopenharmony_ciseparate the command name from the value, applications may provide
224e1051a39Sopenharmony_citheir own syntax for making that separation (eg. a win32 registry
225e1051a39Sopenharmony_cikey-value pair may be used by some applications). The reason for the
226e1051a39Sopenharmony_ci"-pre" syntax in the "openssl engine" utility is that some commands
227e1051a39Sopenharmony_cimight be issued to an ENGINE *after* it has been initialised for use.
228e1051a39Sopenharmony_ciEg. if an ENGINE implementation requires a smart-card to be inserted
229e1051a39Sopenharmony_ciduring initialisation (or a PIN to be typed, or whatever), there may be
230e1051a39Sopenharmony_cia control command you can issue afterwards to "forget" the smart-card
231e1051a39Sopenharmony_ciso that additional initialisation is no longer possible. In
232e1051a39Sopenharmony_ciapplications such as web-servers, where potentially volatile code may
233e1051a39Sopenharmony_cirun on the same host system, this may provide some arguable security
234e1051a39Sopenharmony_civalue. In such a case, the command would be passed to the ENGINE after
235e1051a39Sopenharmony_ciit has been initialised for use, and so the "-post" switch would be
236e1051a39Sopenharmony_ciused instead. Applications may provide a different syntax for
237e1051a39Sopenharmony_cisupporting this distinction, and some may simply not provide it at all
238e1051a39Sopenharmony_ci("-pre" is almost always what you're after, in reality).
239e1051a39Sopenharmony_ci
240e1051a39Sopenharmony_ciHow do I build a "dynamic" ENGINE?
241e1051a39Sopenharmony_ci----------------------------------
242e1051a39Sopenharmony_ci
243e1051a39Sopenharmony_ciThis question is trickier - currently OpenSSL bundles various ENGINE
244e1051a39Sopenharmony_ciimplementations that are statically built in, and any application that
245e1051a39Sopenharmony_cicalls the "ENGINE_load_builtin_engines()" function will automatically
246e1051a39Sopenharmony_cihave all such ENGINEs available (and occupying memory). Applications
247e1051a39Sopenharmony_cithat don't call that function have no ENGINEs available like that and
248e1051a39Sopenharmony_ciwould have to use "dynamic" to load any such ENGINE - but on the other
249e1051a39Sopenharmony_cihand such applications would only have the memory footprint of any
250e1051a39Sopenharmony_ciENGINEs explicitly loaded using user/admin provided control commands.
251e1051a39Sopenharmony_ciThe main advantage of not statically linking ENGINEs and only using
252e1051a39Sopenharmony_ci"dynamic" for hardware support is that any installation using no
253e1051a39Sopenharmony_ci"external" ENGINE suffers no unnecessary memory footprint from unused
254e1051a39Sopenharmony_ciENGINEs. Likewise, installations that do require an ENGINE incur the
255e1051a39Sopenharmony_cioverheads from only *that* ENGINE once it has been loaded.
256e1051a39Sopenharmony_ci
257e1051a39Sopenharmony_ciSounds good? Maybe, but currently building an ENGINE implementation as
258e1051a39Sopenharmony_cia shared-library that can be loaded by "dynamic" isn't automated in
259e1051a39Sopenharmony_ciOpenSSL's build process. It can be done manually quite easily however.
260e1051a39Sopenharmony_ciSuch a shared-library can either be built with any OpenSSL code it
261e1051a39Sopenharmony_cineeds statically linked in, or it can link dynamically against OpenSSL
262e1051a39Sopenharmony_ciif OpenSSL itself is built as a shared library. The instructions are
263e1051a39Sopenharmony_cithe same in each case, but in the former (statically linked any
264e1051a39Sopenharmony_cidependencies on OpenSSL) you must ensure OpenSSL is built with
265e1051a39Sopenharmony_ciposition-independent code ("PIC"). The default OpenSSL compilation may
266e1051a39Sopenharmony_cialready specify the relevant flags to do this, but you should consult
267e1051a39Sopenharmony_ciwith your compiler documentation if you are in any doubt.
268e1051a39Sopenharmony_ci
269e1051a39Sopenharmony_ciThis example will show building the "atalla" ENGINE in the
270e1051a39Sopenharmony_cicrypto/engine/ directory as a shared-library for use via the "dynamic"
271e1051a39Sopenharmony_ciENGINE.
272e1051a39Sopenharmony_ci
273e1051a39Sopenharmony_ci  1. "cd" to the crypto/engine/ directory of a pre-compiled OpenSSL
274e1051a39Sopenharmony_ci     source tree.
275e1051a39Sopenharmony_ci
276e1051a39Sopenharmony_ci  2. Recompile at least one source file so you can see all the compiler
277e1051a39Sopenharmony_ci     flags (and syntax) being used to build normally. Eg;
278e1051a39Sopenharmony_ci
279e1051a39Sopenharmony_ci         touch hw_atalla.c ; make
280e1051a39Sopenharmony_ci
281e1051a39Sopenharmony_ci     will rebuild "hw_atalla.o" using all such flags.
282e1051a39Sopenharmony_ci
283e1051a39Sopenharmony_ci  3. Manually enter the same compilation line to compile the
284e1051a39Sopenharmony_ci     "hw_atalla.c" file but with the following two changes;
285e1051a39Sopenharmony_ci      * add "-DENGINE_DYNAMIC_SUPPORT" to the command line switches,
286e1051a39Sopenharmony_ci      * change the output file from "hw_atalla.o" to something new,
287e1051a39Sopenharmony_ci        eg. "tmp_atalla.o"
288e1051a39Sopenharmony_ci
289e1051a39Sopenharmony_ci  4. Link "tmp_atalla.o" into a shared-library using the top-level
290e1051a39Sopenharmony_ci     OpenSSL libraries to resolve any dependencies. The syntax for doing
291e1051a39Sopenharmony_ci     this depends heavily on your system/compiler and is a nightmare
292e1051a39Sopenharmony_ci     known well to anyone who has worked with shared-library portability
293e1051a39Sopenharmony_ci     before. 'gcc' on Linux, for example, would use the following syntax;
294e1051a39Sopenharmony_ci
295e1051a39Sopenharmony_ci         gcc -shared -o dyn_atalla.so tmp_atalla.o -L../.. -lcrypto
296e1051a39Sopenharmony_ci
297e1051a39Sopenharmony_ci  5. Test your shared library using "openssl engine" as explained in the
298e1051a39Sopenharmony_ci     previous section. Eg. from the top-level directory, you might try
299e1051a39Sopenharmony_ci
300e1051a39Sopenharmony_ci         apps/openssl engine -vvvv dynamic \
301e1051a39Sopenharmony_ci               -pre SO_PATH:./crypto/engine/dyn_atalla.so -pre LOAD
302e1051a39Sopenharmony_ci
303e1051a39Sopenharmony_ciIf the shared-library loads successfully, you will see both "-pre"
304e1051a39Sopenharmony_cicommands marked as "SUCCESS" and the list of control commands
305e1051a39Sopenharmony_cidisplayed (because of "-vvvv") will be the control commands for the
306e1051a39Sopenharmony_ci*atalla* ENGINE (ie. *not* the 'dynamic' ENGINE). You can also add
307e1051a39Sopenharmony_cithe "-t" switch to the utility if you want it to try and initialise
308e1051a39Sopenharmony_cithe atalla ENGINE for use to test any possible hardware/driver issues.
309e1051a39Sopenharmony_ci
310e1051a39Sopenharmony_ciPROBLEMS
311e1051a39Sopenharmony_ci========
312e1051a39Sopenharmony_ci
313e1051a39Sopenharmony_ciIt seems like the ENGINE part doesn't work too well with CryptoSwift on Win32.
314e1051a39Sopenharmony_ciA quick test done right before the release showed that trying "openssl speed
315e1051a39Sopenharmony_ci-engine cswift" generated errors. If the DSO gets enabled, an attempt is made
316e1051a39Sopenharmony_cito write at memory address 0x00000002.
317