
1: ENGINE 2: ====== 3: 4: With OpenSSL 0.9.6, a new component was added to support alternative 5: cryptography implementations, most commonly for interfacing with external 6: crypto devices (eg. accelerator cards). This component is called ENGINE, 7: and its presence in OpenSSL 0.9.6 (and subsequent bug-fix releases) 8: caused a little confusion as 0.9.6** releases were rolled in two 9: versions, a "standard" and an "engine" version. In development for 0.9.7, 10: the ENGINE code has been merged into the main branch and will be present 11: in the standard releases from 0.9.7 forwards. 12: 13: There are currently built-in ENGINE implementations for the following 14: crypto devices: 15: 16: o CryptoSwift 17: o Compaq Atalla 18: o nCipher CHIL 19: o Nuron 20: o Broadcom uBSec 21: 22: In addition, dynamic binding to external ENGINE implementations is now 23: provided by a special ENGINE called "dynamic". See the "DYNAMIC ENGINE" 24: section below for details. 25: 26: At this stage, a number of things are still needed and are being worked on: 27: 28: 1 Integration of EVP support. 29: 2 Configuration support. 30: 3 Documentation! 31: 32: 1 With respect to EVP, this relates to support for ciphers and digests in 33: the ENGINE model so that alternative implementations of existing 34: algorithms/modes (or previously unimplemented ones) can be provided by 35: ENGINE implementations. 36: 37: 2 Configuration support currently exists in the ENGINE API itself, in the 38: form of "control commands". These allow an application to expose to the 39: user/admin the set of commands and parameter types a given ENGINE 40: implementation supports, and for an application to directly feed string 41: based input to those ENGINEs, in the form of name-value pairs. This is an 42: extensible way for ENGINEs to define their own "configuration" mechanisms 43: that are specific to a given ENGINE (eg. for a particular hardware 44: device) but that should be consistent across *all* OpenSSL-based 45: applications when they use that ENGINE. Work is in progress (or at least 46: in planning) for supporting these control commands from the CONF (or 47: NCONF) code so that applications using OpenSSL's existing configuration 48: file format can have ENGINE settings specified in much the same way. 49: Presently however, applications must use the ENGINE API itself to provide 50: such functionality. To see first hand the types of commands available 51: with the various compiled-in ENGINEs (see further down for dynamic 52: ENGINEs), use the "engine" openssl utility with full verbosity, ie; 53: openssl engine -vvvv 54: 55: 3 Documentation? Volunteers welcome! The source code is reasonably well 56: self-documenting, but some summaries and usage instructions are needed - 57: moreover, they are needed in the same POD format the existing OpenSSL 58: documentation is provided in. Any complete or incomplete contributions 59: would help make this happen. 60: 61: STABILITY & BUG-REPORTS 62: ======================= 63: 64: What already exists is fairly stable as far as it has been tested, but 65: the test base has been a bit small most of the time. For the most part, 66: the vendors of the devices these ENGINEs support have contributed to the 67: development and/or testing of the implementations, and *usually* (with no 68: guarantees) have experience in using the ENGINE support to drive their 69: devices from common OpenSSL-based applications. Bugs and/or inexplicable 70: behaviour in using a specific ENGINE implementation should be sent to the 71: author of that implementation (if it is mentioned in the corresponding C 72: file), and in the case of implementations for commercial hardware 73: devices, also through whatever vendor support channels are available. If 74: none of this is possible, or the problem seems to be something about the 75: ENGINE API itself (ie. not necessarily specific to a particular ENGINE 76: implementation) then you should mail complete details to the relevant 77: OpenSSL mailing list. For a definition of "complete details", refer to 78: the OpenSSL "README" file. As for which list to send it to; 79: 80: openssl-users: if you are *using* the ENGINE abstraction, either in an 81: pre-compiled application or in your own application code. 82: 83: openssl-dev: if you are discussing problems with OpenSSL source code. 84: 85: USAGE 86: ===== 87: 88: The default "openssl" ENGINE is always chosen when performing crypto 89: operations unless you specify otherwise. You must actively tell the 90: openssl utility commands to use anything else through a new command line 91: switch called "-engine". Also, if you want to use the ENGINE support in 92: your own code to do something similar, you must likewise explicitly 93: select the ENGINE implementation you want. 94: 95: Depending on the type of hardware, system, and configuration, "settings" 96: may need to be applied to an ENGINE for it to function as expected/hoped. 97: The recommended way of doing this is for the application to support 98: ENGINE "control commands" so that each ENGINE implementation can provide 99: whatever configuration primitives it might require and the application 100: can allow the user/admin (and thus the hardware vendor's support desk 101: also) to provide any such input directly to the ENGINE implementation. 102: This way, applications do not need to know anything specific to any 103: device, they only need to provide the means to carry such user/admin 104: input through to the ENGINE in question. Ie. this connects *you* (and 105: your helpdesk) to the specific ENGINE implementation (and device), and 106: allows application authors to not get buried in hassle supporting 107: arbitrary devices they know (and care) nothing about. 108: 109: A new "openssl" utility, "openssl engine", has been added in that allows 110: for testing and examination of ENGINE implementations. Basic usage 111: instructions are available by specifying the "-?" command line switch. 112: 113: DYNAMIC ENGINES 114: =============== 115: 116: The new "dynamic" ENGINE provides a low-overhead way to support ENGINE 117: implementations that aren't pre-compiled and linked into OpenSSL-based 118: applications. This could be because existing compiled-in implementations 119: have known problems and you wish to use a newer version with an existing 120: application. It could equally be because the application (or OpenSSL 121: library) you are using simply doesn't have support for the ENGINE you 122: wish to use, and the ENGINE provider (eg. hardware vendor) is providing 123: you with a self-contained implementation in the form of a shared-library. 124: The other use-case for "dynamic" is with applications that wish to 125: maintain the smallest foot-print possible and so do not link in various 126: ENGINE implementations from OpenSSL, but instead leaves you to provide 127: them, if you want them, in the form of "dynamic"-loadable 128: shared-libraries. It should be possible for hardware vendors to provide 129: their own shared-libraries to support arbitrary hardware to work with 130: applications based on OpenSSL 0.9.7 or later. If you're using an 131: application based on 0.9.7 (or later) and the support you desire is only 132: announced for versions later than the one you need, ask the vendor to 133: backport their ENGINE to the version you need. 134: 135: How does "dynamic" work? 136: ------------------------ 137: The dynamic ENGINE has a special flag in its implementation such that 138: every time application code asks for the 'dynamic' ENGINE, it in fact 139: gets its own copy of it. As such, multi-threaded code (or code that 140: multiplexes multiple uses of 'dynamic' in a single application in any 141: way at all) does not get confused by 'dynamic' being used to do many 142: independent things. Other ENGINEs typically don't do this so there is 143: only ever 1 ENGINE structure of its type (and reference counts are used 144: to keep order). The dynamic ENGINE itself provides absolutely no 145: cryptographic functionality, and any attempt to "initialise" the ENGINE 146: automatically fails. All it does provide are a few "control commands" 147: that can be used to control how it will load an external ENGINE 148: implementation from a shared-library. To see these control commands, 149: use the command-line; 150: 151: openssl engine -vvvv dynamic 152: 153: The "SO_PATH" control command should be used to identify the 154: shared-library that contains the ENGINE implementation, and "NO_VCHECK" 155: might possibly be useful if there is a minor version conflict and you 156: (or a vendor helpdesk) is convinced you can safely ignore it. 157: "ID" is probably only needed if a shared-library implements 158: multiple ENGINEs, but if you know the engine id you expect to be using, 159: it doesn't hurt to specify it (and this provides a sanity check if 160: nothing else). "LIST_ADD" is only required if you actually wish the 161: loaded ENGINE to be discoverable by application code later on using the 162: ENGINE's "id". For most applications, this isn't necessary - but some 163: application authors may have nifty reasons for using it. The "LOAD" 164: command is the only one that takes no parameters and is the command 165: that uses the settings from any previous commands to actually *load* 166: the shared-library ENGINE implementation. If this command succeeds, the 167: (copy of the) 'dynamic' ENGINE will magically morph into the ENGINE 168: that has been loaded from the shared-library. As such, any control 169: commands supported by the loaded ENGINE could then be executed as per 170: normal. Eg. if ENGINE "foo" is implemented in the shared-library 171: "libfoo.so" and it supports some special control command "CMD_FOO", the 172: following code would load and use it (NB: obviously this code has no 173: error checking); 174: 175: ENGINE *e = ENGINE_by_id("dynamic"); 176: ENGINE_ctrl_cmd_string(e, "SO_PATH", "/lib/libfoo.so", 0); 177: ENGINE_ctrl_cmd_string(e, "ID", "foo", 0); 178: ENGINE_ctrl_cmd_string(e, "LOAD", NULL, 0); 179: ENGINE_ctrl_cmd_string(e, "CMD_FOO", "some input data", 0); 180: 181: For testing, the "openssl engine" utility can be useful for this sort 182: of thing. For example the above code excerpt would achieve much the 183: same result as; 184: 185: openssl engine dynamic \ 186: -pre SO_PATH:/lib/libfoo.so \ 187: -pre ID:foo \ 188: -pre LOAD \ 189: -pre "CMD_FOO:some input data" 190: 191: Or to simply see the list of commands supported by the "foo" ENGINE; 192: 193: openssl engine -vvvv dynamic \ 194: -pre SO_PATH:/lib/libfoo.so \ 195: -pre ID:foo \ 196: -pre LOAD 197: 198: Applications that support the ENGINE API and more specifically, the 199: "control commands" mechanism, will provide some way for you to pass 200: such commands through to ENGINEs. As such, you would select "dynamic" 201: as the ENGINE to use, and the parameters/commands you pass would 202: control the *actual* ENGINE used. Each command is actually a name-value 203: pair and the value can sometimes be omitted (eg. the "LOAD" command). 204: Whilst the syntax demonstrated in "openssl engine" uses a colon to 205: separate the command name from the value, applications may provide 206: their own syntax for making that separation (eg. a win32 registry 207: key-value pair may be used by some applications). The reason for the 208: "-pre" syntax in the "openssl engine" utility is that some commands 209: might be issued to an ENGINE *after* it has been initialised for use. 210: Eg. if an ENGINE implementation requires a smart-card to be inserted 211: during initialisation (or a PIN to be typed, or whatever), there may be 212: a control command you can issue afterwards to "forget" the smart-card 213: so that additional initialisation is no longer possible. In 214: applications such as web-servers, where potentially volatile code may 215: run on the same host system, this may provide some arguable security 216: value. In such a case, the command would be passed to the ENGINE after 217: it has been initialised for use, and so the "-post" switch would be 218: used instead. Applications may provide a different syntax for 219: supporting this distinction, and some may simply not provide it at all 220: ("-pre" is almost always what you're after, in reality). 221: 222: How do I build a "dynamic" ENGINE? 223: ---------------------------------- 224: This question is trickier - currently OpenSSL bundles various ENGINE 225: implementations that are statically built in, and any application that 226: calls the "ENGINE_load_builtin_engines()" function will automatically 227: have all such ENGINEs available (and occupying memory). Applications 228: that don't call that function have no ENGINEs available like that and 229: would have to use "dynamic" to load any such ENGINE - but on the other 230: hand such applications would only have the memory footprint of any 231: ENGINEs explicitly loaded using user/admin provided control commands. 232: The main advantage of not statically linking ENGINEs and only using 233: "dynamic" for hardware support is that any installation using no 234: "external" ENGINE suffers no unnecessary memory footprint from unused 235: ENGINEs. Likewise, installations that do require an ENGINE incur the 236: overheads from only *that* ENGINE once it has been loaded. 237: 238: Sounds good? Maybe, but currently building an ENGINE implementation as 239: a shared-library that can be loaded by "dynamic" isn't automated in 240: OpenSSL's build process. It can be done manually quite easily however. 241: Such a shared-library can either be built with any OpenSSL code it 242: needs statically linked in, or it can link dynamically against OpenSSL 243: if OpenSSL itself is built as a shared library. The instructions are 244: the same in each case, but in the former (statically linked any 245: dependencies on OpenSSL) you must ensure OpenSSL is built with 246: position-independent code ("PIC"). The default OpenSSL compilation may 247: already specify the relevant flags to do this, but you should consult 248: with your compiler documentation if you are in any doubt. 249: 250: This example will show building the "atalla" ENGINE in the 251: crypto/engine/ directory as a shared-library for use via the "dynamic" 252: ENGINE. 253: 1) "cd" to the crypto/engine/ directory of a pre-compiled OpenSSL 254: source tree. 255: 2) Recompile at least one source file so you can see all the compiler 256: flags (and syntax) being used to build normally. Eg; 257: touch hw_atalla.c ; make 258: will rebuild "hw_atalla.o" using all such flags. 259: 3) Manually enter the same compilation line to compile the 260: "hw_atalla.c" file but with the following two changes; 261: (a) add "-DENGINE_DYNAMIC_SUPPORT" to the command line switches, 262: (b) change the output file from "hw_atalla.o" to something new, 263: eg. "tmp_atalla.o" 264: 4) Link "tmp_atalla.o" into a shared-library using the top-level 265: OpenSSL libraries to resolve any dependencies. The syntax for doing 266: this depends heavily on your system/compiler and is a nightmare 267: known well to anyone who has worked with shared-library portability 268: before. 'gcc' on Linux, for example, would use the following syntax; 269: gcc -shared -o dyn_atalla.so tmp_atalla.o -L../.. -lcrypto 270: 5) Test your shared library using "openssl engine" as explained in the 271: previous section. Eg. from the top-level directory, you might try; 272: apps/openssl engine -vvvv dynamic \ 273: -pre SO_PATH:./crypto/engine/dyn_atalla.so -pre LOAD 274: If the shared-library loads successfully, you will see both "-pre" 275: commands marked as "SUCCESS" and the list of control commands 276: displayed (because of "-vvvv") will be the control commands for the 277: *atalla* ENGINE (ie. *not* the 'dynamic' ENGINE). You can also add 278: the "-t" switch to the utility if you want it to try and initialise 279: the atalla ENGINE for use to test any possible hardware/driver 280: issues. 281: 282: PROBLEMS 283: ======== 284: 285: It seems like the ENGINE part doesn't work too well with CryptoSwift on Win32. 286: A quick test done right before the release showed that trying "openssl speed 287: -engine cswift" generated errors. If the DSO gets enabled, an attempt is made 288: to write at memory address 0x00000002. 289: