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