summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/engine
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/engine')
-rw-r--r--src/lib/libcrypto/engine/README483
-rw-r--r--src/lib/libcrypto/engine/eng_all.c22
-rw-r--r--src/lib/libcrypto/engine/eng_fat.c3
-rw-r--r--src/lib/libcrypto/engine/eng_init.c3
-rw-r--r--src/lib/libcrypto/engine/eng_list.c2
-rw-r--r--src/lib/libcrypto/engine/engine.h650
6 files changed, 697 insertions, 466 deletions
diff --git a/src/lib/libcrypto/engine/README b/src/lib/libcrypto/engine/README
index 96595e6f35..6b69b70f57 100644
--- a/src/lib/libcrypto/engine/README
+++ b/src/lib/libcrypto/engine/README
@@ -1,278 +1,211 @@
1NOTES, THOUGHTS, and EVERYTHING 1Notes: 2001-09-24
2-------------------------------
3
4(1) Concurrency and locking ... I made a change to the ENGINE_free code
5 because I spotted a potential hold-up in proceedings (doing too
6 much inside a lock including calling a callback), there may be
7 other bits like this. What do the speed/optimisation freaks think
8 of this aspect of the code and design? There's lots of locking for
9 manipulation functions and I need that to keep things nice and
10 solid, but this manipulation is mostly (de)initialisation, I would
11 think that most run-time locking is purely in the ENGINE_init and
12 ENGINE_finish calls that might be made when getting handles for
13 RSA (and friends') structures. These would be mostly reference
14 count operations as the functional references should always be 1
15 or greater at run-time to prevent init/deinit thrashing.
16
17(2) nCipher support, via the HWCryptoHook API, is now in the code.
18 Apparently this hasn't been tested too much yet, but it looks
19 good. :-) Atalla support has been added too, but shares a lot in
20 common with Ben's original hooks in bn_exp.c (although it has been
21 ENGINE-ified, and error handling wrapped around it) and it's also
22 had some low-volume testing, so it should be usable.
23
24(3) Of more concern, we need to work out (a) how to put together usable
25 RAND_METHODs for units that just have one "get n or less random
26 bytes" function, (b) we also need to determine how to hook the code
27 in crypto/rand/ to use the ENGINE defaults in a way similar to what
28 has been done in crypto/rsa/, crypto/dsa/, etc.
29
30(4) ENGINE should really grow to encompass more than 3 public key
31 algorithms and randomness gathering. The structure/data level of
32 the engine code is hidden from code outside the crypto/engine/
33 directory so change shouldn't be too viral. More important though
34 is how things should evolve ... this needs thought and discussion.
35
36
37-----------------------------------==*==-----------------------------------
38
39More notes 2000-08-01
40---------------------
41
42Geoff Thorpe, who designed the engine part, wrote a pretty good description
43of the thoughts he had when he built it, good enough to include verbatim here
44(with his permission) -- Richard Levitte
45
46
47Date: Tue, 1 Aug 2000 16:54:08 +0100 (BST)
48From: Geoff Thorpe
49Subject: Re: The thoughts to merge BRANCH_engine into the main trunk are
50 emerging
51
52Hi there,
53
54I'm going to try and do some justice to this, but I'm a little short on
55time and the there is an endless amount that could be discussed on this
56subject. sigh ... please bear with me :-)
57
58> The changes in BRANCH_engine dig deep into the core of OpenSSL, for example
59> into the RSA and RAND routines, adding a level of indirection which is needed
60> to keep the abstraction, as far as I understand. It would be a good thing if
61> those who do play with those things took a look at the changes that have been
62> done in the branch and say out loud how much (or hopefully little) we've made
63> fools of ourselves.
64
65The point here is that the code that has emerged in the BRANCH_engine
66branch was based on some initial requirements of mine that I went in and
67addressed, and Richard has picked up the ball and run with it too. It
68would be really useful to get some review of the approach we've taken, but
69first I think I need to describe as best I can the reasons behind what has
70been done so far, in particular what issues we have tried to address when
71doing this, and what issues we have intentionally (or necessarily) tried
72to avoid.
73
74methods, engines, and evps
75--------------------------
76
77There has been some dicussion, particularly with Steve, about where this
78ENGINE stuff might fit into the conceptual picture as/when we start to
79abstract algorithms a little bit to make the library more extensible. In
80particular, it would desirable to have algorithms (symmetric, hash, pkc,
81etc) abstracted in some way that allows them to be just objects sitting in
82a list (or database) ... it'll just happen that the "DSA" object doesn't
83support encryption whereas the "RSA" object does. This requires a lot of
84consideration to begin to know how to tackle it; in particular how
85encapsulated should these things be? If the objects also understand their
86own ASN1 encodings and what-not, then it would for example be possible to
87add support for elliptic-curve DSA in as a new algorithm and automatically
88have ECC-DSA certificates supported in SSL applications. Possible, but not
89easy. :-)
90
91Whatever, it seems that the way to go (if I've grok'd Steve's comments on
92this in the past) is to amalgamate these things in EVP as is already done
93(I think) for ciphers or hashes (Steve, please correct/elaborate). I
94certainly think something should be done in this direction because right
95now we have different source directories, types, functions, and methods
96for each algorithm - even when conceptually they are very much different
97feathers of the same bird. (This is certainly all true for the public-key
98stuff, and may be partially true for the other parts.)
99
100ENGINE was *not* conceived as a way of solving this, far from it. Nor was
101it conceived as a way of replacing the various "***_METHOD"s. It was
102conceived as an abstraction of a sort of "virtual crypto device". If we
103lived in a world where "EVP_ALGO"s (or something like them) encapsulated
104particular algorithms like RSA,DSA,MD5,RC4,etc, and "***_METHOD"s
105encapsulated interfaces to algorithms (eg. some algo's might support a
106PKC_METHOD, a HASH_METHOD, or a CIPHER_METHOD, who knows?), then I would
107think that ENGINE would encapsulate an implementation of arbitrarily many
108of those algorithms - perhaps as alternatives to existing algorithms
109and/or perhaps as new previously unimplemented algorithms. An ENGINE could
110be used to contain an alternative software implementation, a wrapper for a
111hardware acceleration and/or key-management unit, a comms-wrapper for
112distributing cryptographic operations to remote machines, or any other
113"devices" your imagination can dream up.
114
115However, what has been done in the ENGINE branch so far is nothing more
116than starting to get our toes wet. I had a couple of self-imposed
117requirements when putting the initial abstraction together, and I may have
118already posed these in one form or another on the list, but briefly;
119
120 (i) only bother with public key algorithms for now, and maybe RAND too
121 (motivated by the need to get hardware support going and the fact
122 this was a comparitively easy subset to address to begin with).
123
124 (ii) don't change (if at all possible) the existing crypto code, ie. the
125 implementations, the way the ***_METHODs work, etc.
126
127 (iii) ensure that if no function from the ENGINE code is ever called then
128 things work the way they always did, and there is no memory
129 allocation (otherwise the failure to cleanup would be a problem -
130 this is part of the reason no STACKs were used, the other part of
131 the reason being I found them inappropriate).
132
133 (iv) ensure that all the built-in crypto was encapsulated by one of
134 these "ENGINE"s and that this engine was automatically selected as
135 the default.
136
137 (v) provide the minimum hooking possible in the existing crypto code
138 so that global functions (eg. RSA_public_encrypt) do not need any
139 extra parameter, yet will use whatever the current default ENGINE
140 for that RSA key is, and that the default can be set "per-key"
141 and globally (new keys will assume the global default, and keys
142 without their own default will be operated on using the global
143 default). NB: Try and make (v) conflict as little as possible with
144 (ii). :-)
145
146 (vi) wrap the ENGINE code up in duct tape so you can't even see the
147 corners. Ie. expose no structures at all, just black-box pointers.
148
149 (v) maintain internally a list of ENGINEs on which a calling
150 application can iterate, interrogate, etc. Allow a calling
151 application to hook in new ENGINEs, remove ENGINEs from the list,
152 and enforce uniqueness within the global list of each ENGINE's
153 "unique id".
154
155 (vi) keep reference counts for everything - eg. this includes storing a
156 reference inside each RSA structure to the ENGINE that it uses.
157 This is freed when the RSA structure is destroyed, or has its
158 ENGINE explicitly changed. The net effect needs to be that at any
159 time, it is deterministic to know whether an ENGINE is in use or
160 can be safely removed (or unloaded in the case of the other type
161 of reference) without invalidating function pointers that may or
162 may not be used indavertently in the future. This was actually
163 one of the biggest problems to overcome in the existing OpenSSL
164 code - implementations had always been assumed to be ever-present,
165 so there was no trivial way to get round this.
166
167 (vii) distinguish between structural references and functional
168 references.
169
170A *little* detail
171----------------- 2-----------------
172 3
173While my mind is on it; I'll illustrate the bit in item (vii). This idea 4This "description" (if one chooses to call it that) needed some major updating
174turned out to be very handy - the ENGINEs themselves need to be operated 5so here goes. This update addresses a change being made at the same time to
175on and manipulated simply as objects without necessarily trying to 6OpenSSL, and it pretty much completely restructures the underlying mechanics of
176"enable" them for use. Eg. most host machines will not have the necessary 7the "ENGINE" code. So it serves a double purpose of being a "ENGINE internals
177hardware or software to support all the engines one might compile into 8for masochists" document *and* a rather extensive commit log message. (I'd get
178OpenSSL, yet it needs to be possible to iterate across the ENGINEs, 9lynched for sticking all this in CHANGES or the commit mails :-).
179querying their names, properties, etc - all happening in a thread-safe 10
180manner that uses reference counts (if you imagine two threads iterating 11ENGINE_TABLE underlies this restructuring, as described in the internal header
181through a list and one thread removing the ENGINE the other is currently 12"eng_int.h", implemented in eng_table.c, and used in each of the "class" files;
182looking at - you can see the gotcha waiting to happen). For all of this, 13tb_rsa.c, tb_dsa.c, etc.
183*structural references* are used and operate much like the other reference 14
184counts in OpenSSL. 15However, "EVP_CIPHER" underlies the motivation and design of ENGINE_TABLE so
185 16I'll mention a bit about that first. EVP_CIPHER (and most of this applies
186The other kind of reference count is for *functional* references - these 17equally to EVP_MD for digests) is both a "method" and a algorithm/mode
187indicate a reference on which the caller can actually assume the 18identifier that, in the current API, "lingers". These cipher description +
188particular ENGINE to be initialised and usable to perform the operations 19implementation structures can be defined or obtained directly by applications,
189it implements. Any increment or decrement of the functional reference 20or can be loaded "en masse" into EVP storage so that they can be catalogued and
190count automatically invokes a corresponding change in the structural 21searched in various ways, ie. two ways of encrypting with the "des_cbc"
191reference count, as it is fairly obvious that a functional reference is a 22algorithm/mode pair are;
192restricted case of a structural reference. So struct_ref >= funct_ref at 23
193all times. NB: functional references are usually obtained by a call to 24(i) directly;
194ENGINE_init(), but can also be created implicitly by calls that require a 25 const EVP_CIPHER *cipher = EVP_des_cbc();
195new functional reference to be created, eg. ENGINE_set_default(). Either 26 EVP_EncryptInit(&ctx, cipher, key, iv);
196way the only time the underlying ENGINE's "init" function is really called 27 [ ... use EVP_EncryptUpdate() and EVP_EncryptFinal() ...]
197is when the (functional) reference count increases to 1, similarly the 28
198underlying "finish" handler is only called as the count goes down to 0. 29(ii) indirectly;
199The effect of this, for example, is that if you set the default ENGINE for 30 OpenSSL_add_all_ciphers();
200RSA operations to be "cswift", then its functional reference count will 31 cipher = EVP_get_cipherbyname("des_cbc");
201already be at least 1 so the CryptoSwift shared-library and the card will 32 EVP_EncryptInit(&ctx, cipher, key, iv);
202stay loaded and initialised until such time as all RSA keys using the 33 [ ... etc ... ]
203cswift ENGINE are changed or destroyed and the default ENGINE for RSA 34
204operations has been changed. This prevents repeated thrashing of init and 35The latter is more generally used because it also allows ciphers/digests to be
205finish handling if the count keeps getting down as far as zero. 36looked up based on other identifiers which can be useful for automatic cipher
206 37selection, eg. in SSL/TLS, or by user-controllable configuration.
207Otherwise, the way the ENGINE code has been put together I think pretty 38
208much reflects the above points. The reason for the ENGINE structure having 39The important point about this is that EVP_CIPHER definitions and structures are
209individual RSA_METHOD, DSA_METHOD, etc pointers is simply that it was the 40passed around with impunity and there is no safe way, without requiring massive
210easiest way to go about things for now, to hook it all into the raw 41rewrites of many applications, to assume that EVP_CIPHERs can be reference
211RSA,DSA,etc code, and I was trying to the keep the structure invisible 42counted. One an EVP_CIPHER is exposed to the caller, neither it nor anything it
212anyway so that the way this is internally managed could be easily changed 43comes from can "safely" be destroyed. Unless of course the way of getting to
213later on when we start to work out what's to be done about these other 44such ciphers is via entirely distinct API calls that didn't exist before.
214abstractions. 45However existing API usage cannot be made to understand when an EVP_CIPHER
215 46pointer, that has been passed to the caller, is no longer being used.
216Down the line, if some EVP-based technique emerges for adequately 47
217encapsulating algorithms and all their various bits and pieces, then I can 48The other problem with the existing API w.r.t. to hooking EVP_CIPHER support
218imagine that "ENGINE" would turn into a reference-counting database of 49into ENGINE is storage - the OBJ_NAME-based storage used by EVP to register
219these EVP things, of which the default "openssl" ENGINE would be the 50ciphers simultaneously registers cipher *types* and cipher *implementations* -
220library's own object database of pre-built software implemented algorithms 51they are effectively the same thing, an "EVP_CIPHER" pointer. The problem with
221(and such). It would also be cool to see the idea of "METHOD"s detached 52hooking in ENGINEs is that multiple ENGINEs may implement the same ciphers. The
222from the algorithms themselves ... so RSA, DSA, ElGamal, etc can all 53solution is necessarily that ENGINE-provided ciphers simply are not registered,
223expose essentially the same METHOD (aka interface), which would include 54stored, or exposed to the caller in the same manner as existing ciphers. This is
224any querying/flagging stuff to identify what the algorithm can/can't do, 55especially necessary considering the fact ENGINE uses reference counts to allow
225its name, and other stuff like max/min block sizes, key sizes, etc. This 56for cleanup, modularity, and DSO support - yet EVP_CIPHERs, as exposed to
226would result in ENGINE similarly detaching its internal database of 57callers in the current API, support no such controls.
227algorithm implementations from the function definitions that return 58
228interfaces to them. I think ... 59Another sticking point for integrating cipher support into ENGINE is linkage.
229 60Already there is a problem with the way ENGINE supports RSA, DSA, etc whereby
230As for DSOs etc. Well the DSO code is pretty handy (but could be made much 61they are available *because* they're part of a giant ENGINE called "openssl".
231more so) for loading vendor's driver-libraries and talking to them in some 62Ie. all implementations *have* to come from an ENGINE, but we get round that by
232generic way, but right now there's still big problems associated with 63having a giant ENGINE with all the software support encapsulated. This creates
233actually putting OpenSSL code (ie. new ENGINEs, or anything else for that 64linker hassles if nothing else - linking a 1-line application that calls 2 basic
234matter) in dynamically loadable libraries. These problems won't go away in 65RSA functions (eg. "RSA_free(RSA_new());") will result in large quantities of
235a hurry so I don't think we should expect to have any kind of 66ENGINE code being linked in *and* because of that DSA, DH, and RAND also. If we
236shared-library extensions any time soon - but solving the problems is a 67continue with this approach for EVP_CIPHER support (even if it *was* possible)
237good thing to aim for, and would as a side-effect probably help make 68we would lose our ability to link selectively by selectively loading certain
238OpenSSL more usable as a shared-library itself (looking at the things 69implementations of certain functionality. Touching any part of any kind of
239needed to do this will show you why). 70crypto would result in massive static linkage of everything else. So the
240 71solution is to change the way ENGINE feeds existing "classes", ie. how the
241One of the problems is that if you look at any of the ENGINE 72hooking to ENGINE works from RSA, DSA, DH, RAND, as well as adding new hooking
242implementations, eg. hw_cswift.c or hw_ncipher.c, you'll see how it needs 73for EVP_CIPHER, and EVP_MD.
243a variety of functionality and definitions from various areas of OpenSSL, 74
244including crypto/bn/, crypto/err/, crypto/ itself (locking for example), 75The way this is now being done is by mostly reverting back to how things used to
245crypto/dso/, crypto/engine/, crypto/rsa, etc etc etc. So if similar code 76work prior to ENGINE :-). Ie. RSA now has a "RSA_METHOD" pointer again - this
246were to be suctioned off into shared libraries, the shared libraries would 77was previously replaced by an "ENGINE" pointer and all RSA code that required
247either have to duplicate all the definitions and code and avoid loader 78the RSA_METHOD would call ENGINE_get_RSA() each time on its ENGINE handle to
248conflicts, or OpenSSL would have to somehow expose all that functionality 79temporarily get and use the ENGINE's RSA implementation. Apart from being more
249to the shared-library. If this isn't a big enough problem, the issue of 80efficient, switching back to each RSA having an RSA_METHOD pointer also allows
250binary compatibility will be - anyone writing Apache modules can tell you 81us to conceivably operate with *no* ENGINE. As we'll see, this removes any need
251that (Ralf? Ben? :-). However, I don't think OpenSSL would need to be 82for a fallback ENGINE that encapsulates default implementations - we can simply
252quite so forgiving as Apache should be, so OpenSSL could simply tell its 83have our RSA structure pointing its RSA_METHOD pointer to the software
253version to the DSO and leave the DSO with the problem of deciding whether 84implementation and have its ENGINE pointer set to NULL.
254to proceed or bail out for fear of binary incompatibilities. 85
255 86A look at the EVP_CIPHER hooking is most explanatory, the RSA, DSA (etc) cases
256Certainly one thing that would go a long way to addressing this is to 87turn out to be degenerate forms of the same thing. The EVP storage of ciphers,
257embark on a bit of an opaqueness mission. I've set the ENGINE code up with 88and the existing EVP API functions that return "software" implementations and
258this in mind - it's so draconian that even to declare your own ENGINE, you 89descriptions remain untouched. However, the storage takes more meaning in terms
259have to get the engine code to create the underlying ENGINE structure, and 90of "cipher description" and less meaning in terms of "implementation". When an
260then feed in the new ENGINE's function/method pointers through various 91EVP_CIPHER_CTX is actually initialised with an EVP_CIPHER method and is about to
261"set" functions. The more of the code that takes on such a black-box 92begin en/decryption, the hooking to ENGINE comes into play. What happens is that
262approach, the more of the code that will be (a) easy to expose to shared 93cipher-specific ENGINE code is asked for an ENGINE pointer (a functional
263libraries that need it, and (b) easy to expose to applications wanting to 94reference) for any ENGINE that is registered to perform the algo/mode that the
264use OpenSSL itself as a shared-library. From my own explorations in 95provided EVP_CIPHER structure represents. Under normal circumstances, that
265OpenSSL, the biggest leviathan I've seen that is a problem in this respect 96ENGINE code will return NULL because no ENGINEs will have had any cipher
266is the BIGNUM code. Trying to "expose" the bignum code through any kind of 97implementations *registered*. As such, a NULL ENGINE pointer is stored in the
267organised "METHODs", let alone do all the necessary bignum operations 98EVP_CIPHER_CTX context, and the EVP_CIPHER structure is left hooked into the
268solely through functions rather than direct access to the structures and 99context and so is used as the implementation. Pretty much how things work now
269macros, will be a massive pain in the "r"s. 100except we'd have a redundant ENGINE pointer set to NULL and doing nothing.
270 101
271Anyway, I'm done for now - hope it was readable. Thoughts? 102Conversely, if an ENGINE *has* been registered to perform the algorithm/mode
272 103combination represented by the provided EVP_CIPHER, then a functional reference
273Cheers, 104to that ENGINE will be returned to the EVP_CIPHER_CTX during initialisation.
274Geoff 105That functional reference will be stored in the context (and released on
275 106cleanup) - and having that reference provides a *safe* way to use an EVP_CIPHER
276 107definition that is private to the ENGINE. Ie. the EVP_CIPHER provided by the
277-----------------------------------==*==----------------------------------- 108application will actually be replaced by an EVP_CIPHER from the registered
109ENGINE - it will support the same algorithm/mode as the original but will be a
110completely different implementation. Because this EVP_CIPHER isn't stored in the
111EVP storage, nor is it returned to applications from traditional API functions,
112there is no associated problem with it not having reference counts. And of
113course, when one of these "private" cipher implementations is hooked into
114EVP_CIPHER_CTX, it is done whilst the EVP_CIPHER_CTX holds a functional
115reference to the ENGINE that owns it, thus the use of the ENGINE's EVP_CIPHER is
116safe.
117
118The "cipher-specific ENGINE code" I mentioned is implemented in tb_cipher.c but
119in essence it is simply an instantiation of "ENGINE_TABLE" code for use by
120EVP_CIPHER code. tb_digest.c is virtually identical but, of course, it is for
121use by EVP_MD code. Ditto for tb_rsa.c, tb_dsa.c, etc. These instantiations of
122ENGINE_TABLE essentially provide linker-separation of the classes so that even
123if ENGINEs implement *all* possible algorithms, an application using only
124EVP_CIPHER code will link at most code relating to EVP_CIPHER, tb_cipher.c, core
125ENGINE code that is independant of class, and of course the ENGINE
126implementation that the application loaded. It will *not* however link any
127class-specific ENGINE code for digests, RSA, etc nor will it bleed over into
128other APIs, such as the RSA/DSA/etc library code.
129
130ENGINE_TABLE is a little more complicated than may seem necessary but this is
131mostly to avoid a lot of "init()"-thrashing on ENGINEs (that may have to load
132DSOs, and other expensive setup that shouldn't be thrashed unnecessarily) *and*
133to duplicate "default" behaviour. Basically an ENGINE_TABLE instantiation, for
134example tb_cipher.c, implements a hash-table keyed by integer "nid" values.
135These nids provide the uniquenness of an algorithm/mode - and each nid will hash
136to a potentially NULL "ENGINE_PILE". An ENGINE_PILE is essentially a list of
137pointers to ENGINEs that implement that particular 'nid'. Each "pile" uses some
138caching tricks such that requests on that 'nid' will be cached and all future
139requests will return immediately (well, at least with minimal operation) unless
140a change is made to the pile, eg. perhaps an ENGINE was unloaded. The reason is
141that an application could have support for 10 ENGINEs statically linked
142in, and the machine in question may not have any of the hardware those 10
143ENGINEs support. If each of those ENGINEs has a "des_cbc" implementation, we
144want to avoid every EVP_CIPHER_CTX setup from trying (and failing) to initialise
145each of those 10 ENGINEs. Instead, the first such request will try to do that
146and will either return (and cache) a NULL ENGINE pointer or will return a
147functional reference to the first that successfully initialised. In the latter
148case it will also cache an extra functional reference to the ENGINE as a
149"default" for that 'nid'. The caching is acknowledged by a 'uptodate' variable
150that is unset only if un/registration takes place on that pile. Ie. if
151implementations of "des_cbc" are added or removed. This behaviour can be
152tweaked; the ENGINE_TABLE_FLAG_NOINIT value can be passed to
153ENGINE_set_table_flags(), in which case the only ENGINEs that tb_cipher.c will
154try to initialise from the "pile" will be those that are already initialised
155(ie. it's simply an increment of the functional reference count, and no real
156"initialisation" will take place).
157
158RSA, DSA, DH, and RAND all have their own ENGINE_TABLE code as well, and the
159difference is that they all use an implicit 'nid' of 1. Whereas EVP_CIPHERs are
160actually qualitatively different depending on 'nid' (the "des_cbc" EVP_CIPHER is
161not an interoperable implementation of "aes_256_cbc"), RSA_METHODs are
162necessarily interoperable and don't have different flavours, only different
163implementations. In other words, the ENGINE_TABLE for RSA will either be empty,
164or will have a single ENGING_PILE hashed to by the 'nid' 1 and that pile
165represents ENGINEs that implement the single "type" of RSA there is.
166
167Cleanup - the registration and unregistration may pose questions about how
168cleanup works with the ENGINE_PILE doing all this caching nonsense (ie. when the
169application or EVP_CIPHER code releases its last reference to an ENGINE, the
170ENGINE_PILE code may still have references and thus those ENGINEs will stay
171hooked in forever). The way this is handled is via "unregistration". With these
172new ENGINE changes, an abstract ENGINE can be loaded and initialised, but that
173is an algorithm-agnostic process. Even if initialised, it will not have
174registered any of its implementations (to do so would link all class "table"
175code despite the fact the application may use only ciphers, for example). This
176is deliberately a distinct step. Moreover, registration and unregistration has
177nothing to do with whether an ENGINE is *functional* or not (ie. you can even
178register an ENGINE and its implementations without it being operational, you may
179not even have the drivers to make it operate). What actually happens with
180respect to cleanup is managed inside eng_lib.c with the "engine_cleanup_***"
181functions. These functions are internal-only and each part of ENGINE code that
182could require cleanup will, upon performing its first allocation, register a
183callback with the "engine_cleanup" code. The other part of this that makes it
184tick is that the ENGINE_TABLE instantiations (tb_***.c) use NULL as their
185initialised state. So if RSA code asks for an ENGINE and no ENGINE has
186registered an implementation, the code will simply return NULL and the tb_rsa.c
187state will be unchanged. Thus, no cleanup is required unless registration takes
188place. ENGINE_cleanup() will simply iterate across a list of registered cleanup
189callbacks calling each in turn, and will then internally delete its own storage
190(a STACK). When a cleanup callback is next registered (eg. if the cleanup() is
191part of a gracefull restart and the application wants to cleanup all state then
192start again), the internal STACK storage will be freshly allocated. This is much
193the same as the situation in the ENGINE_TABLE instantiations ... NULL is the
194initialised state, so only modification operations (not queries) will cause that
195code to have to register a cleanup.
196
197What else? The bignum callbacks and associated ENGINE functions have been
198removed for two obvious reasons; (i) there was no way to generalise them to the
199mechanism now used by RSA/DSA/..., because there's no such thing as a BIGNUM
200method, and (ii) because of (i), there was no meaningful way for library or
201application code to automatically hook and use ENGINE supplied bignum functions
202anyway. Also, ENGINE_cpy() has been removed (although an internal-only version
203exists) - the idea of providing an ENGINE_cpy() function probably wasn't a good
204one and now certainly doesn't make sense in any generalised way. Some of the
205RSA, DSA, DH, and RAND functions that were fiddled during the original ENGINE
206changes have now, as a consequence, been reverted back. This is because the
207hooking of ENGINE is now automatic (and passive, it can interally use a NULL
208ENGINE pointer to simply ignore ENGINE from then on).
209
210Hell, that should be enough for now ... comments welcome: geoff@openssl.org
278 211
diff --git a/src/lib/libcrypto/engine/eng_all.c b/src/lib/libcrypto/engine/eng_all.c
index a35b3db9e8..b3030fe505 100644
--- a/src/lib/libcrypto/engine/eng_all.c
+++ b/src/lib/libcrypto/engine/eng_all.c
@@ -60,10 +60,6 @@
60#include <openssl/engine.h> 60#include <openssl/engine.h>
61#include "eng_int.h" 61#include "eng_int.h"
62 62
63#ifdef __OpenBSD__
64static int openbsd_default_loaded = 0;
65#endif
66
67void ENGINE_load_builtin_engines(void) 63void ENGINE_load_builtin_engines(void)
68 { 64 {
69 /* There's no longer any need for an "openssl" ENGINE unless, one day, 65 /* There's no longer any need for an "openssl" ENGINE unless, one day,
@@ -96,23 +92,11 @@ void ENGINE_load_builtin_engines(void)
96#ifndef OPENSSL_NO_HW_SUREWARE 92#ifndef OPENSSL_NO_HW_SUREWARE
97 ENGINE_load_sureware(); 93 ENGINE_load_sureware();
98#endif 94#endif
95#ifndef OPENSSL_NO_HW_4758_CCA
96 ENGINE_load_4758cca();
97#endif
99#ifdef OPENSSL_OPENBSD_DEV_CRYPTO 98#ifdef OPENSSL_OPENBSD_DEV_CRYPTO
100 ENGINE_load_openbsd_dev_crypto(); 99 ENGINE_load_openbsd_dev_crypto();
101#endif 100#endif
102#ifdef __OpenBSD__
103 ENGINE_load_cryptodev();
104#endif
105#endif 101#endif
106 } 102 }
107
108#ifdef __OpenBSD__
109void ENGINE_setup_openbsd(void) {
110 if (!openbsd_default_loaded) {
111 ENGINE_load_cryptodev();
112 ENGINE_register_all_complete();
113 }
114 openbsd_default_loaded=1;
115}
116#endif
117
118
diff --git a/src/lib/libcrypto/engine/eng_fat.c b/src/lib/libcrypto/engine/eng_fat.c
index af918b1499..d49aa7ed40 100644
--- a/src/lib/libcrypto/engine/eng_fat.c
+++ b/src/lib/libcrypto/engine/eng_fat.c
@@ -141,8 +141,7 @@ int ENGINE_register_all_complete(void)
141 { 141 {
142 ENGINE *e; 142 ENGINE *e;
143 143
144 for(e=ENGINE_get_first() ; e ; e=ENGINE_get_next(e)) { 144 for(e=ENGINE_get_first() ; e ; e=ENGINE_get_next(e))
145 ENGINE_register_complete(e); 145 ENGINE_register_complete(e);
146 }
147 return 1; 146 return 1;
148 } 147 }
diff --git a/src/lib/libcrypto/engine/eng_init.c b/src/lib/libcrypto/engine/eng_init.c
index cc9396e863..98caa21e32 100644
--- a/src/lib/libcrypto/engine/eng_init.c
+++ b/src/lib/libcrypto/engine/eng_init.c
@@ -93,7 +93,7 @@ int engine_unlocked_finish(ENGINE *e, int unlock_for_handlers)
93 * there's a chance that both threads will together take the count from 93 * there's a chance that both threads will together take the count from
94 * 2 to 0 without either calling finish(). */ 94 * 2 to 0 without either calling finish(). */
95 e->funct_ref--; 95 e->funct_ref--;
96 engine_ref_debug(e, 1, -1); 96 engine_ref_debug(e, 1, -1)
97 if((e->funct_ref == 0) && e->finish) 97 if((e->funct_ref == 0) && e->finish)
98 { 98 {
99 if(unlock_for_handlers) 99 if(unlock_for_handlers)
@@ -155,4 +155,3 @@ int ENGINE_finish(ENGINE *e)
155 } 155 }
156 return to_return; 156 return to_return;
157 } 157 }
158
diff --git a/src/lib/libcrypto/engine/eng_list.c b/src/lib/libcrypto/engine/eng_list.c
index ce48d2255a..0c220558e7 100644
--- a/src/lib/libcrypto/engine/eng_list.c
+++ b/src/lib/libcrypto/engine/eng_list.c
@@ -348,7 +348,7 @@ ENGINE *ENGINE_by_id(const char *id)
348 } 348 }
349 CRYPTO_r_lock(CRYPTO_LOCK_ENGINE); 349 CRYPTO_r_lock(CRYPTO_LOCK_ENGINE);
350 iterator = engine_list_head; 350 iterator = engine_list_head;
351 while(iterator && (strcmp(id, iterator->id) != 0)) 351 while(iterator && (strcmp(id, iterator->id) != 0))
352 iterator = iterator->next; 352 iterator = iterator->next;
353 if(iterator) 353 if(iterator)
354 { 354 {
diff --git a/src/lib/libcrypto/engine/engine.h b/src/lib/libcrypto/engine/engine.h
index 2983f47034..cf06618286 100644
--- a/src/lib/libcrypto/engine/engine.h
+++ b/src/lib/libcrypto/engine/engine.h
@@ -3,7 +3,7 @@
3 * project 2000. 3 * project 2000.
4 */ 4 */
5/* ==================================================================== 5/* ====================================================================
6 * Copyright (c) 1999 The OpenSSL Project. All rights reserved. 6 * Copyright (c) 1999-2001 The OpenSSL Project. All rights reserved.
7 * 7 *
8 * Redistribution and use in source and binary forms, with or without 8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions 9 * modification, are permitted provided that the following conditions
@@ -59,36 +59,171 @@
59#ifndef HEADER_ENGINE_H 59#ifndef HEADER_ENGINE_H
60#define HEADER_ENGINE_H 60#define HEADER_ENGINE_H
61 61
62#include <openssl/ossl_typ.h>
62#include <openssl/bn.h> 63#include <openssl/bn.h>
64#ifndef OPENSSL_NO_RSA
63#include <openssl/rsa.h> 65#include <openssl/rsa.h>
66#endif
67#ifndef OPENSSL_NO_DSA
64#include <openssl/dsa.h> 68#include <openssl/dsa.h>
69#endif
70#ifndef OPENSSL_NO_DH
65#include <openssl/dh.h> 71#include <openssl/dh.h>
72#endif
66#include <openssl/rand.h> 73#include <openssl/rand.h>
67#include <openssl/evp.h> 74#include <openssl/ui.h>
68#include <openssl/symhacks.h> 75#include <openssl/symhacks.h>
76#include <openssl/err.h>
69 77
70#ifdef __cplusplus 78#ifdef __cplusplus
71extern "C" { 79extern "C" {
72#endif 80#endif
73 81
82/* Fixups for missing algorithms */
83#ifdef OPENSSL_NO_RSA
84typedef void RSA_METHOD;
85#endif
86#ifdef OPENSSL_NO_DSA
87typedef void DSA_METHOD;
88#endif
89#ifdef OPENSSL_NO_DH
90typedef void DH_METHOD;
91#endif
92
74/* These flags are used to control combinations of algorithm (methods) 93/* These flags are used to control combinations of algorithm (methods)
75 * by bitwise "OR"ing. */ 94 * by bitwise "OR"ing. */
76#define ENGINE_METHOD_RSA (unsigned int)0x0001 95#define ENGINE_METHOD_RSA (unsigned int)0x0001
77#define ENGINE_METHOD_DSA (unsigned int)0x0002 96#define ENGINE_METHOD_DSA (unsigned int)0x0002
78#define ENGINE_METHOD_DH (unsigned int)0x0004 97#define ENGINE_METHOD_DH (unsigned int)0x0004
79#define ENGINE_METHOD_RAND (unsigned int)0x0008 98#define ENGINE_METHOD_RAND (unsigned int)0x0008
80#define ENGINE_METHOD_BN_MOD_EXP (unsigned int)0x0010 99#define ENGINE_METHOD_CIPHERS (unsigned int)0x0040
81#define ENGINE_METHOD_BN_MOD_EXP_CRT (unsigned int)0x0020 100#define ENGINE_METHOD_DIGESTS (unsigned int)0x0080
82/* Obvious all-or-nothing cases. */ 101/* Obvious all-or-nothing cases. */
83#define ENGINE_METHOD_ALL (unsigned int)0xFFFF 102#define ENGINE_METHOD_ALL (unsigned int)0xFFFF
84#define ENGINE_METHOD_NONE (unsigned int)0x0000 103#define ENGINE_METHOD_NONE (unsigned int)0x0000
85 104
105/* This(ese) flag(s) controls behaviour of the ENGINE_TABLE mechanism used
106 * internally to control registration of ENGINE implementations, and can be set
107 * by ENGINE_set_table_flags(). The "NOINIT" flag prevents attempts to
108 * initialise registered ENGINEs if they are not already initialised. */
109#define ENGINE_TABLE_FLAG_NOINIT (unsigned int)0x0001
110
111/* ENGINE flags that can be set by ENGINE_set_flags(). */
112/* #define ENGINE_FLAGS_MALLOCED 0x0001 */ /* Not used */
113
114/* This flag is for ENGINEs that wish to handle the various 'CMD'-related
115 * control commands on their own. Without this flag, ENGINE_ctrl() handles these
116 * control commands on behalf of the ENGINE using their "cmd_defns" data. */
117#define ENGINE_FLAGS_MANUAL_CMD_CTRL (int)0x0002
118
119/* This flag is for ENGINEs who return new duplicate structures when found via
120 * "ENGINE_by_id()". When an ENGINE must store state (eg. if ENGINE_ctrl()
121 * commands are called in sequence as part of some stateful process like
122 * key-generation setup and execution), it can set this flag - then each attempt
123 * to obtain the ENGINE will result in it being copied into a new structure.
124 * Normally, ENGINEs don't declare this flag so ENGINE_by_id() just increments
125 * the existing ENGINE's structural reference count. */
126#define ENGINE_FLAGS_BY_ID_COPY (int)0x0004
127
128/* ENGINEs can support their own command types, and these flags are used in
129 * ENGINE_CTRL_GET_CMD_FLAGS to indicate to the caller what kind of input each
130 * command expects. Currently only numeric and string input is supported. If a
131 * control command supports none of the _NUMERIC, _STRING, or _NO_INPUT options,
132 * then it is regarded as an "internal" control command - and not for use in
133 * config setting situations. As such, they're not available to the
134 * ENGINE_ctrl_cmd_string() function, only raw ENGINE_ctrl() access. Changes to
135 * this list of 'command types' should be reflected carefully in
136 * ENGINE_cmd_is_executable() and ENGINE_ctrl_cmd_string(). */
137
138/* accepts a 'long' input value (3rd parameter to ENGINE_ctrl) */
139#define ENGINE_CMD_FLAG_NUMERIC (unsigned int)0x0001
140/* accepts string input (cast from 'void*' to 'const char *', 4th parameter to
141 * ENGINE_ctrl) */
142#define ENGINE_CMD_FLAG_STRING (unsigned int)0x0002
143/* Indicates that the control command takes *no* input. Ie. the control command
144 * is unparameterised. */
145#define ENGINE_CMD_FLAG_NO_INPUT (unsigned int)0x0004
146/* Indicates that the control command is internal. This control command won't
147 * be shown in any output, and is only usable through the ENGINE_ctrl_cmd()
148 * function. */
149#define ENGINE_CMD_FLAG_INTERNAL (unsigned int)0x0008
150
151/* NB: These 3 control commands are deprecated and should not be used. ENGINEs
152 * relying on these commands should compile conditional support for
153 * compatibility (eg. if these symbols are defined) but should also migrate the
154 * same functionality to their own ENGINE-specific control functions that can be
155 * "discovered" by calling applications. The fact these control commands
156 * wouldn't be "executable" (ie. usable by text-based config) doesn't change the
157 * fact that application code can find and use them without requiring per-ENGINE
158 * hacking. */
159
86/* These flags are used to tell the ctrl function what should be done. 160/* These flags are used to tell the ctrl function what should be done.
87 * All command numbers are shared between all engines, even if some don't 161 * All command numbers are shared between all engines, even if some don't
88 * make sense to some engines. In such a case, they do nothing but return 162 * make sense to some engines. In such a case, they do nothing but return
89 * the error ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED. */ 163 * the error ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED. */
90#define ENGINE_CTRL_SET_LOGSTREAM 1 164#define ENGINE_CTRL_SET_LOGSTREAM 1
91#define ENGINE_CTRL_SET_PASSWORD_CALLBACK 2 165#define ENGINE_CTRL_SET_PASSWORD_CALLBACK 2
166#define ENGINE_CTRL_HUP 3 /* Close and reinitialise any
167 handles/connections etc. */
168#define ENGINE_CTRL_SET_USER_INTERFACE 4 /* Alternative to callback */
169#define ENGINE_CTRL_SET_CALLBACK_DATA 5 /* User-specific data, used
170 when calling the password
171 callback and the user
172 interface */
173
174/* These control commands allow an application to deal with an arbitrary engine
175 * in a dynamic way. Warn: Negative return values indicate errors FOR THESE
176 * COMMANDS because zero is used to indicate 'end-of-list'. Other commands,
177 * including ENGINE-specific command types, return zero for an error.
178 *
179 * An ENGINE can choose to implement these ctrl functions, and can internally
180 * manage things however it chooses - it does so by setting the
181 * ENGINE_FLAGS_MANUAL_CMD_CTRL flag (using ENGINE_set_flags()). Otherwise the
182 * ENGINE_ctrl() code handles this on the ENGINE's behalf using the cmd_defns
183 * data (set using ENGINE_set_cmd_defns()). This means an ENGINE's ctrl()
184 * handler need only implement its own commands - the above "meta" commands will
185 * be taken care of. */
186
187/* Returns non-zero if the supplied ENGINE has a ctrl() handler. If "not", then
188 * all the remaining control commands will return failure, so it is worth
189 * checking this first if the caller is trying to "discover" the engine's
190 * capabilities and doesn't want errors generated unnecessarily. */
191#define ENGINE_CTRL_HAS_CTRL_FUNCTION 10
192/* Returns a positive command number for the first command supported by the
193 * engine. Returns zero if no ctrl commands are supported. */
194#define ENGINE_CTRL_GET_FIRST_CMD_TYPE 11
195/* The 'long' argument specifies a command implemented by the engine, and the
196 * return value is the next command supported, or zero if there are no more. */
197#define ENGINE_CTRL_GET_NEXT_CMD_TYPE 12
198/* The 'void*' argument is a command name (cast from 'const char *'), and the
199 * return value is the command that corresponds to it. */
200#define ENGINE_CTRL_GET_CMD_FROM_NAME 13
201/* The next two allow a command to be converted into its corresponding string
202 * form. In each case, the 'long' argument supplies the command. In the NAME_LEN
203 * case, the return value is the length of the command name (not counting a
204 * trailing EOL). In the NAME case, the 'void*' argument must be a string buffer
205 * large enough, and it will be populated with the name of the command (WITH a
206 * trailing EOL). */
207#define ENGINE_CTRL_GET_NAME_LEN_FROM_CMD 14
208#define ENGINE_CTRL_GET_NAME_FROM_CMD 15
209/* The next two are similar but give a "short description" of a command. */
210#define ENGINE_CTRL_GET_DESC_LEN_FROM_CMD 16
211#define ENGINE_CTRL_GET_DESC_FROM_CMD 17
212/* With this command, the return value is the OR'd combination of
213 * ENGINE_CMD_FLAG_*** values that indicate what kind of input a given
214 * engine-specific ctrl command expects. */
215#define ENGINE_CTRL_GET_CMD_FLAGS 18
216
217/* ENGINE implementations should start the numbering of their own control
218 * commands from this value. (ie. ENGINE_CMD_BASE, ENGINE_CMD_BASE + 1, etc). */
219#define ENGINE_CMD_BASE 200
220
221/* NB: These 2 nCipher "chil" control commands are deprecated, and their
222 * functionality is now available through ENGINE-specific control commands
223 * (exposed through the above-mentioned 'CMD'-handling). Code using these 2
224 * commands should be migrated to the more general command handling before these
225 * are removed. */
226
92/* Flags specific to the nCipher "chil" engine */ 227/* Flags specific to the nCipher "chil" engine */
93#define ENGINE_CTRL_CHIL_SET_FORKCHECK 100 228#define ENGINE_CTRL_CHIL_SET_FORKCHECK 100
94 /* Depending on the value of the (long)i argument, this sets or 229 /* Depending on the value of the (long)i argument, this sets or
@@ -99,45 +234,55 @@ extern "C" {
99 /* This prevents the initialisation function from providing mutex 234 /* This prevents the initialisation function from providing mutex
100 * callbacks to the nCipher library. */ 235 * callbacks to the nCipher library. */
101 236
102/* As we're missing a BIGNUM_METHOD, we need a couple of locally 237/* If an ENGINE supports its own specific control commands and wishes the
103 * defined function types that engines can implement. */ 238 * framework to handle the above 'ENGINE_CMD_***'-manipulation commands on its
104 239 * behalf, it should supply a null-terminated array of ENGINE_CMD_DEFN entries
105#ifndef HEADER_ENGINE_INT_H 240 * to ENGINE_set_cmd_defns(). It should also implement a ctrl() handler that
106/* mod_exp operation, calculates; r = a ^ p mod m 241 * supports the stated commands (ie. the "cmd_num" entries as described by the
107 * NB: ctx can be NULL, but if supplied, the implementation may use 242 * array). NB: The array must be ordered in increasing order of cmd_num.
108 * it if it wishes. */ 243 * "null-terminated" means that the last ENGINE_CMD_DEFN element has cmd_num set
109typedef int (*BN_MOD_EXP)(BIGNUM *r, BIGNUM *a, const BIGNUM *p, 244 * to zero and/or cmd_name set to NULL. */
110 const BIGNUM *m, BN_CTX *ctx); 245typedef struct ENGINE_CMD_DEFN_st
111 246 {
112/* private key operation for RSA, provided seperately in case other 247 unsigned int cmd_num; /* The command number */
113 * RSA implementations wish to use it. */ 248 const char *cmd_name; /* The command name itself */
114typedef int (*BN_MOD_EXP_CRT)(BIGNUM *r, BIGNUM *a, const BIGNUM *p, 249 const char *cmd_desc; /* A short description of the command */
115 const BIGNUM *q, const BIGNUM *dmp1, const BIGNUM *dmq1, 250 unsigned int cmd_flags; /* The input the command expects */
116 const BIGNUM *iqmp, BN_CTX *ctx); 251 } ENGINE_CMD_DEFN;
117 252
118/* Generic function pointer */ 253/* Generic function pointer */
119typedef void (*ENGINE_GEN_FUNC_PTR)(); 254typedef int (*ENGINE_GEN_FUNC_PTR)();
120/* Generic function pointer taking no arguments */ 255/* Generic function pointer taking no arguments */
121typedef void (*ENGINE_GEN_INT_FUNC_PTR)(void); 256typedef int (*ENGINE_GEN_INT_FUNC_PTR)(ENGINE *);
122/* Specific control function pointer */ 257/* Specific control function pointer */
123typedef int (*ENGINE_CTRL_FUNC_PTR)(int cmd, long i, void *p, void (*f)()); 258typedef int (*ENGINE_CTRL_FUNC_PTR)(ENGINE *, int, long, void *, void (*f)());
124 259/* Generic load_key function pointer */
125/* The list of "engine" types is a static array of (const ENGINE*) 260typedef EVP_PKEY * (*ENGINE_LOAD_KEY_PTR)(ENGINE *, const char *,
126 * pointers (not dynamic because static is fine for now and we otherwise 261 UI_METHOD *ui_method, void *callback_data);
127 * have to hook an appropriate load/unload function in to initialise and 262/* These callback types are for an ENGINE's handler for cipher and digest logic.
128 * cleanup). */ 263 * These handlers have these prototypes;
129typedef struct engine_st ENGINE; 264 * int foo(ENGINE *e, const EVP_CIPHER **cipher, const int **nids, int nid);
130#endif 265 * int foo(ENGINE *e, const EVP_MD **digest, const int **nids, int nid);
266 * Looking at how to implement these handlers in the case of cipher support, if
267 * the framework wants the EVP_CIPHER for 'nid', it will call;
268 * foo(e, &p_evp_cipher, NULL, nid); (return zero for failure)
269 * If the framework wants a list of supported 'nid's, it will call;
270 * foo(e, NULL, &p_nids, 0); (returns number of 'nids' or -1 for error)
271 */
272/* Returns to a pointer to the array of supported cipher 'nid's. If the second
273 * parameter is non-NULL it is set to the size of the returned array. */
274typedef int (*ENGINE_CIPHERS_PTR)(ENGINE *, const EVP_CIPHER **, const int **, int);
275typedef int (*ENGINE_DIGESTS_PTR)(ENGINE *, const EVP_MD **, const int **, int);
131 276
132/* STRUCTURE functions ... all of these functions deal with pointers to 277/* STRUCTURE functions ... all of these functions deal with pointers to ENGINE
133 * ENGINE structures where the pointers have a "structural reference". 278 * structures where the pointers have a "structural reference". This means that
134 * This means that their reference is to allow access to the structure 279 * their reference is to allowed access to the structure but it does not imply
135 * but it does not imply that the structure is functional. To simply 280 * that the structure is functional. To simply increment or decrement the
136 * increment or decrement the structural reference count, use ENGINE_new 281 * structural reference count, use ENGINE_by_id and ENGINE_free. NB: This is not
137 * and ENGINE_free. NB: This is not required when iterating using 282 * required when iterating using ENGINE_get_next as it will automatically
138 * ENGINE_get_next as it will automatically decrement the structural 283 * decrement the structural reference count of the "current" ENGINE and
139 * reference count of the "current" ENGINE and increment the structural 284 * increment the structural reference count of the ENGINE it returns (unless it
140 * reference count of the ENGINE it returns (unless it is NULL). */ 285 * is NULL). */
141 286
142/* Get the first/last "ENGINE" type available. */ 287/* Get the first/last "ENGINE" type available. */
143ENGINE *ENGINE_get_first(void); 288ENGINE *ENGINE_get_first(void);
@@ -151,67 +296,167 @@ int ENGINE_add(ENGINE *e);
151int ENGINE_remove(ENGINE *e); 296int ENGINE_remove(ENGINE *e);
152/* Retrieve an engine from the list by its unique "id" value. */ 297/* Retrieve an engine from the list by its unique "id" value. */
153ENGINE *ENGINE_by_id(const char *id); 298ENGINE *ENGINE_by_id(const char *id);
299/* Add all the built-in engines. */
300void ENGINE_load_openssl(void);
301void ENGINE_load_dynamic(void);
302void ENGINE_load_cswift(void);
303void ENGINE_load_chil(void);
304void ENGINE_load_atalla(void);
305void ENGINE_load_nuron(void);
306void ENGINE_load_ubsec(void);
307void ENGINE_load_aep(void);
308void ENGINE_load_sureware(void);
309void ENGINE_load_4758cca(void);
310void ENGINE_load_openbsd_dev_crypto(void);
311void ENGINE_load_builtin_engines(void);
154 312
155/* These functions are useful for manufacturing new ENGINE 313/* Get and set global flags (ENGINE_TABLE_FLAG_***) for the implementation
156 * structures. They don't address reference counting at all - 314 * "registry" handling. */
157 * one uses them to populate an ENGINE structure with personalised 315unsigned int ENGINE_get_table_flags(void);
158 * implementations of things prior to using it directly or adding 316void ENGINE_set_table_flags(unsigned int flags);
159 * it to the builtin ENGINE list in OpenSSL. These are also here 317
160 * so that the ENGINE structure doesn't have to be exposed and 318/* Manage registration of ENGINEs per "table". For each type, there are 3
161 * break binary compatibility! 319 * functions;
162 * 320 * ENGINE_register_***(e) - registers the implementation from 'e' (if it has one)
163 * NB: I'm changing ENGINE_new to force the ENGINE structure to 321 * ENGINE_unregister_***(e) - unregister the implementation from 'e'
164 * be allocated from within OpenSSL. See the comment for 322 * ENGINE_register_all_***() - call ENGINE_register_***() for each 'e' in the list
165 * ENGINE_get_struct_size(). 323 * Cleanup is automatically registered from each table when required, so
166 */ 324 * ENGINE_cleanup() will reverse any "register" operations. */
167#if 0 325
168ENGINE *ENGINE_new(ENGINE *e); 326int ENGINE_register_RSA(ENGINE *e);
169#else 327void ENGINE_unregister_RSA(ENGINE *e);
328void ENGINE_register_all_RSA(void);
329
330int ENGINE_register_DSA(ENGINE *e);
331void ENGINE_unregister_DSA(ENGINE *e);
332void ENGINE_register_all_DSA(void);
333
334int ENGINE_register_DH(ENGINE *e);
335void ENGINE_unregister_DH(ENGINE *e);
336void ENGINE_register_all_DH(void);
337
338int ENGINE_register_RAND(ENGINE *e);
339void ENGINE_unregister_RAND(ENGINE *e);
340void ENGINE_register_all_RAND(void);
341
342int ENGINE_register_ciphers(ENGINE *e);
343void ENGINE_unregister_ciphers(ENGINE *e);
344void ENGINE_register_all_ciphers(void);
345
346int ENGINE_register_digests(ENGINE *e);
347void ENGINE_unregister_digests(ENGINE *e);
348void ENGINE_register_all_digests(void);
349
350/* These functions register all support from the above categories. Note, use of
351 * these functions can result in static linkage of code your application may not
352 * need. If you only need a subset of functionality, consider using more
353 * selective initialisation. */
354int ENGINE_register_complete(ENGINE *e);
355int ENGINE_register_all_complete(void);
356
357/* Send parametrised control commands to the engine. The possibilities to send
358 * down an integer, a pointer to data or a function pointer are provided. Any of
359 * the parameters may or may not be NULL, depending on the command number. In
360 * actuality, this function only requires a structural (rather than functional)
361 * reference to an engine, but many control commands may require the engine be
362 * functional. The caller should be aware of trying commands that require an
363 * operational ENGINE, and only use functional references in such situations. */
364int ENGINE_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)());
365
366/* This function tests if an ENGINE-specific command is usable as a "setting".
367 * Eg. in an application's config file that gets processed through
368 * ENGINE_ctrl_cmd_string(). If this returns zero, it is not available to
369 * ENGINE_ctrl_cmd_string(), only ENGINE_ctrl(). */
370int ENGINE_cmd_is_executable(ENGINE *e, int cmd);
371
372/* This function works like ENGINE_ctrl() with the exception of taking a
373 * command name instead of a command number, and can handle optional commands.
374 * See the comment on ENGINE_ctrl_cmd_string() for an explanation on how to
375 * use the cmd_name and cmd_optional. */
376int ENGINE_ctrl_cmd(ENGINE *e, const char *cmd_name,
377 long i, void *p, void (*f)(), int cmd_optional);
378
379/* This function passes a command-name and argument to an ENGINE. The cmd_name
380 * is converted to a command number and the control command is called using
381 * 'arg' as an argument (unless the ENGINE doesn't support such a command, in
382 * which case no control command is called). The command is checked for input
383 * flags, and if necessary the argument will be converted to a numeric value. If
384 * cmd_optional is non-zero, then if the ENGINE doesn't support the given
385 * cmd_name the return value will be success anyway. This function is intended
386 * for applications to use so that users (or config files) can supply
387 * engine-specific config data to the ENGINE at run-time to control behaviour of
388 * specific engines. As such, it shouldn't be used for calling ENGINE_ctrl()
389 * functions that return data, deal with binary data, or that are otherwise
390 * supposed to be used directly through ENGINE_ctrl() in application code. Any
391 * "return" data from an ENGINE_ctrl() operation in this function will be lost -
392 * the return value is interpreted as failure if the return value is zero,
393 * success otherwise, and this function returns a boolean value as a result. In
394 * other words, vendors of 'ENGINE'-enabled devices should write ENGINE
395 * implementations with parameterisations that work in this scheme, so that
396 * compliant ENGINE-based applications can work consistently with the same
397 * configuration for the same ENGINE-enabled devices, across applications. */
398int ENGINE_ctrl_cmd_string(ENGINE *e, const char *cmd_name, const char *arg,
399 int cmd_optional);
400
401/* These functions are useful for manufacturing new ENGINE structures. They
402 * don't address reference counting at all - one uses them to populate an ENGINE
403 * structure with personalised implementations of things prior to using it
404 * directly or adding it to the builtin ENGINE list in OpenSSL. These are also
405 * here so that the ENGINE structure doesn't have to be exposed and break binary
406 * compatibility! */
170ENGINE *ENGINE_new(void); 407ENGINE *ENGINE_new(void);
171#endif
172int ENGINE_free(ENGINE *e); 408int ENGINE_free(ENGINE *e);
173int ENGINE_set_id(ENGINE *e, const char *id); 409int ENGINE_set_id(ENGINE *e, const char *id);
174int ENGINE_set_name(ENGINE *e, const char *name); 410int ENGINE_set_name(ENGINE *e, const char *name);
175int ENGINE_set_RSA(ENGINE *e, RSA_METHOD *rsa_meth); 411int ENGINE_set_RSA(ENGINE *e, const RSA_METHOD *rsa_meth);
176int ENGINE_set_DSA(ENGINE *e, DSA_METHOD *dsa_meth); 412int ENGINE_set_DSA(ENGINE *e, const DSA_METHOD *dsa_meth);
177int ENGINE_set_DH(ENGINE *e, DH_METHOD *dh_meth); 413int ENGINE_set_DH(ENGINE *e, const DH_METHOD *dh_meth);
178int ENGINE_set_RAND(ENGINE *e, RAND_METHOD *rand_meth); 414int ENGINE_set_RAND(ENGINE *e, const RAND_METHOD *rand_meth);
179int ENGINE_set_BN_mod_exp(ENGINE *e, BN_MOD_EXP bn_mod_exp); 415int ENGINE_set_destroy_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR destroy_f);
180int ENGINE_set_BN_mod_exp_crt(ENGINE *e, BN_MOD_EXP_CRT bn_mod_exp_crt);
181int ENGINE_set_init_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR init_f); 416int ENGINE_set_init_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR init_f);
182int ENGINE_set_finish_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR finish_f); 417int ENGINE_set_finish_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR finish_f);
183int ENGINE_set_ctrl_function(ENGINE *e, ENGINE_CTRL_FUNC_PTR ctrl_f); 418int ENGINE_set_ctrl_function(ENGINE *e, ENGINE_CTRL_FUNC_PTR ctrl_f);
419int ENGINE_set_load_privkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpriv_f);
420int ENGINE_set_load_pubkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpub_f);
421int ENGINE_set_ciphers(ENGINE *e, ENGINE_CIPHERS_PTR f);
422int ENGINE_set_digests(ENGINE *e, ENGINE_DIGESTS_PTR f);
423int ENGINE_set_flags(ENGINE *e, int flags);
424int ENGINE_set_cmd_defns(ENGINE *e, const ENGINE_CMD_DEFN *defns);
425/* These functions (and the "get" function lower down) allow control over any
426 * per-structure ENGINE data. */
427int ENGINE_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
428 CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
429int ENGINE_set_ex_data(ENGINE *e, int idx, void *arg);
184 430
185/* These return values from within the ENGINE structure. These can 431/* This function cleans up anything that needs it. Eg. the ENGINE_add() function
186 * be useful with functional references as well as structural 432 * automatically ensures the list cleanup function is registered to be called
187 * references - it depends which you obtained. Using the result 433 * from ENGINE_cleanup(). Similarly, all ENGINE_register_*** functions ensure
188 * for functional purposes if you only obtained a structural 434 * ENGINE_cleanup() will clean up after them. */
189 * reference may be problematic! */ 435void ENGINE_cleanup(void);
190const char *ENGINE_get_id(ENGINE *e); 436
191const char *ENGINE_get_name(ENGINE *e); 437/* These return values from within the ENGINE structure. These can be useful
192RSA_METHOD *ENGINE_get_RSA(ENGINE *e); 438 * with functional references as well as structural references - it depends
193DSA_METHOD *ENGINE_get_DSA(ENGINE *e); 439 * which you obtained. Using the result for functional purposes if you only
194DH_METHOD *ENGINE_get_DH(ENGINE *e); 440 * obtained a structural reference may be problematic! */
195RAND_METHOD *ENGINE_get_RAND(ENGINE *e); 441const char *ENGINE_get_id(const ENGINE *e);
196BN_MOD_EXP ENGINE_get_BN_mod_exp(ENGINE *e); 442const char *ENGINE_get_name(const ENGINE *e);
197BN_MOD_EXP_CRT ENGINE_get_BN_mod_exp_crt(ENGINE *e); 443const RSA_METHOD *ENGINE_get_RSA(const ENGINE *e);
198ENGINE_GEN_INT_FUNC_PTR ENGINE_get_init_function(ENGINE *e); 444const DSA_METHOD *ENGINE_get_DSA(const ENGINE *e);
199ENGINE_GEN_INT_FUNC_PTR ENGINE_get_finish_function(ENGINE *e); 445const DH_METHOD *ENGINE_get_DH(const ENGINE *e);
200ENGINE_CTRL_FUNC_PTR ENGINE_get_ctrl_function(ENGINE *e); 446const RAND_METHOD *ENGINE_get_RAND(const ENGINE *e);
201 447ENGINE_GEN_INT_FUNC_PTR ENGINE_get_destroy_function(const ENGINE *e);
202/* ENGINE_new is normally passed a NULL in the first parameter because 448ENGINE_GEN_INT_FUNC_PTR ENGINE_get_init_function(const ENGINE *e);
203 * the calling code doesn't have access to the definition of the ENGINE 449ENGINE_GEN_INT_FUNC_PTR ENGINE_get_finish_function(const ENGINE *e);
204 * structure (for good reason). However, if the caller wishes to use 450ENGINE_CTRL_FUNC_PTR ENGINE_get_ctrl_function(const ENGINE *e);
205 * its own memory allocation or use a static array, the following call 451ENGINE_LOAD_KEY_PTR ENGINE_get_load_privkey_function(const ENGINE *e);
206 * should be used to check the amount of memory the ENGINE structure 452ENGINE_LOAD_KEY_PTR ENGINE_get_load_pubkey_function(const ENGINE *e);
207 * will occupy. This will make the code more future-proof. 453ENGINE_CIPHERS_PTR ENGINE_get_ciphers(const ENGINE *e);
208 * 454ENGINE_DIGESTS_PTR ENGINE_get_digests(const ENGINE *e);
209 * NB: I'm "#if 0"-ing this out because it's better to force the use of 455const EVP_CIPHER *ENGINE_get_cipher(ENGINE *e, int nid);
210 * internally allocated memory. See similar change in ENGINE_new(). 456const EVP_MD *ENGINE_get_digest(ENGINE *e, int nid);
211 */ 457const ENGINE_CMD_DEFN *ENGINE_get_cmd_defns(const ENGINE *e);
212#if 0 458int ENGINE_get_flags(const ENGINE *e);
213int ENGINE_get_struct_size(void); 459void *ENGINE_get_ex_data(const ENGINE *e, int idx);
214#endif
215 460
216/* FUNCTIONAL functions. These functions deal with ENGINE structures 461/* FUNCTIONAL functions. These functions deal with ENGINE structures
217 * that have (or will) be initialised for use. Broadly speaking, the 462 * that have (or will) be initialised for use. Broadly speaking, the
@@ -233,20 +478,14 @@ int ENGINE_init(ENGINE *e);
233 * a corresponding call to ENGINE_free as it also releases a structural 478 * a corresponding call to ENGINE_free as it also releases a structural
234 * reference. */ 479 * reference. */
235int ENGINE_finish(ENGINE *e); 480int ENGINE_finish(ENGINE *e);
236/* Send control parametrised commands to the engine. The possibilities
237 * to send down an integer, a pointer to data or a function pointer are
238 * provided. Any of the parameters may or may not be NULL, depending
239 * on the command number */
240/* WARNING: This is currently experimental and may change radically! */
241int ENGINE_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)());
242 481
243/* The following functions handle keys that are stored in some secondary 482/* The following functions handle keys that are stored in some secondary
244 * location, handled by the engine. The storage may be on a card or 483 * location, handled by the engine. The storage may be on a card or
245 * whatever. */ 484 * whatever. */
246EVP_PKEY *ENGINE_load_private_key(ENGINE *e, const char *key_id, 485EVP_PKEY *ENGINE_load_private_key(ENGINE *e, const char *key_id,
247 const char *passphrase); 486 UI_METHOD *ui_method, void *callback_data);
248EVP_PKEY *ENGINE_load_public_key(ENGINE *e, const char *key_id, 487EVP_PKEY *ENGINE_load_public_key(ENGINE *e, const char *key_id,
249 const char *passphrase); 488 UI_METHOD *ui_method, void *callback_data);
250 489
251/* This returns a pointer for the current ENGINE structure that 490/* This returns a pointer for the current ENGINE structure that
252 * is (by default) performing any RSA operations. The value returned 491 * is (by default) performing any RSA operations. The value returned
@@ -257,117 +496,192 @@ ENGINE *ENGINE_get_default_RSA(void);
257ENGINE *ENGINE_get_default_DSA(void); 496ENGINE *ENGINE_get_default_DSA(void);
258ENGINE *ENGINE_get_default_DH(void); 497ENGINE *ENGINE_get_default_DH(void);
259ENGINE *ENGINE_get_default_RAND(void); 498ENGINE *ENGINE_get_default_RAND(void);
260ENGINE *ENGINE_get_default_BN_mod_exp(void); 499/* These functions can be used to get a functional reference to perform
261ENGINE *ENGINE_get_default_BN_mod_exp_crt(void); 500 * ciphering or digesting corresponding to "nid". */
501ENGINE *ENGINE_get_cipher_engine(int nid);
502ENGINE *ENGINE_get_digest_engine(int nid);
262 503
263/* This sets a new default ENGINE structure for performing RSA 504/* This sets a new default ENGINE structure for performing RSA
264 * operations. If the result is non-zero (success) then the ENGINE 505 * operations. If the result is non-zero (success) then the ENGINE
265 * structure will have had its reference count up'd so the caller 506 * structure will have had its reference count up'd so the caller
266 * should still free their own reference 'e'. */ 507 * should still free their own reference 'e'. */
267int ENGINE_set_default_RSA(ENGINE *e); 508int ENGINE_set_default_RSA(ENGINE *e);
509int ENGINE_set_default_string(ENGINE *e, const char *list);
268/* Same for the other "methods" */ 510/* Same for the other "methods" */
269int ENGINE_set_default_DSA(ENGINE *e); 511int ENGINE_set_default_DSA(ENGINE *e);
270int ENGINE_set_default_DH(ENGINE *e); 512int ENGINE_set_default_DH(ENGINE *e);
271int ENGINE_set_default_RAND(ENGINE *e); 513int ENGINE_set_default_RAND(ENGINE *e);
272int ENGINE_set_default_BN_mod_exp(ENGINE *e); 514int ENGINE_set_default_ciphers(ENGINE *e);
273int ENGINE_set_default_BN_mod_exp_crt(ENGINE *e); 515int ENGINE_set_default_digests(ENGINE *e);
274 516
275/* The combination "set" - the flags are bitwise "OR"d from the 517/* The combination "set" - the flags are bitwise "OR"d from the
276 * ENGINE_METHOD_*** defines above. */ 518 * ENGINE_METHOD_*** defines above. As with the "ENGINE_register_complete()"
519 * function, this function can result in unnecessary static linkage. If your
520 * application requires only specific functionality, consider using more
521 * selective functions. */
277int ENGINE_set_default(ENGINE *e, unsigned int flags); 522int ENGINE_set_default(ENGINE *e, unsigned int flags);
278 523
279/* Obligatory error function. */ 524void ENGINE_add_conf_module(void);
280void ERR_load_ENGINE_strings(void);
281 525
282/* 526/* Deprecated functions ... */
283 * Error codes for all engine functions. NB: We use "generic" 527/* int ENGINE_clear_defaults(void); */
284 * function names instead of per-implementation ones because this 528
285 * levels the playing field for externally implemented bootstrapped 529/**************************/
286 * support code. As the filename and line number is included, it's 530/* DYNAMIC ENGINE SUPPORT */
287 * more important to indicate the type of function, so that 531/**************************/
288 * bootstrapped code (that can't easily add its own errors in) can 532
289 * use the same error codes too. 533/* Binary/behaviour compatibility levels */
290 */ 534#define OSSL_DYNAMIC_VERSION (unsigned long)0x00010100
535/* Binary versions older than this are too old for us (whether we're a loader or
536 * a loadee) */
537#define OSSL_DYNAMIC_OLDEST (unsigned long)0x00010100
538
539/* When compiling an ENGINE entirely as an external shared library, loadable by
540 * the "dynamic" ENGINE, these types are needed. The 'dynamic_fns' structure
541 * type provides the calling application's (or library's) error functionality
542 * and memory management function pointers to the loaded library. These should
543 * be used/set in the loaded library code so that the loading application's
544 * 'state' will be used/changed in all operations. */
545typedef void *(*dyn_MEM_malloc_cb)(size_t);
546typedef void *(*dyn_MEM_realloc_cb)(void *, size_t);
547typedef void (*dyn_MEM_free_cb)(void *);
548typedef struct st_dynamic_MEM_fns {
549 dyn_MEM_malloc_cb malloc_cb;
550 dyn_MEM_realloc_cb realloc_cb;
551 dyn_MEM_free_cb free_cb;
552 } dynamic_MEM_fns;
553/* FIXME: Perhaps the memory and locking code (crypto.h) should declare and use
554 * these types so we (and any other dependant code) can simplify a bit?? */
555typedef void (*dyn_lock_locking_cb)(int,int,const char *,int);
556typedef int (*dyn_lock_add_lock_cb)(int*,int,int,const char *,int);
557typedef struct CRYPTO_dynlock_value *(*dyn_dynlock_create_cb)(
558 const char *,int);
559typedef void (*dyn_dynlock_lock_cb)(int,struct CRYPTO_dynlock_value *,
560 const char *,int);
561typedef void (*dyn_dynlock_destroy_cb)(struct CRYPTO_dynlock_value *,
562 const char *,int);
563typedef struct st_dynamic_LOCK_fns {
564 dyn_lock_locking_cb lock_locking_cb;
565 dyn_lock_add_lock_cb lock_add_lock_cb;
566 dyn_dynlock_create_cb dynlock_create_cb;
567 dyn_dynlock_lock_cb dynlock_lock_cb;
568 dyn_dynlock_destroy_cb dynlock_destroy_cb;
569 } dynamic_LOCK_fns;
570/* The top-level structure */
571typedef struct st_dynamic_fns {
572 const ERR_FNS *err_fns;
573 const CRYPTO_EX_DATA_IMPL *ex_data_fns;
574 dynamic_MEM_fns mem_fns;
575 dynamic_LOCK_fns lock_fns;
576 } dynamic_fns;
577
578/* The version checking function should be of this prototype. NB: The
579 * ossl_version value passed in is the OSSL_DYNAMIC_VERSION of the loading code.
580 * If this function returns zero, it indicates a (potential) version
581 * incompatibility and the loaded library doesn't believe it can proceed.
582 * Otherwise, the returned value is the (latest) version supported by the
583 * loading library. The loader may still decide that the loaded code's version
584 * is unsatisfactory and could veto the load. The function is expected to
585 * be implemented with the symbol name "v_check", and a default implementation
586 * can be fully instantiated with IMPLEMENT_DYNAMIC_CHECK_FN(). */
587typedef unsigned long (*dynamic_v_check_fn)(unsigned long ossl_version);
588#define IMPLEMENT_DYNAMIC_CHECK_FN() \
589 unsigned long v_check(unsigned long v) { \
590 if(v >= OSSL_DYNAMIC_OLDEST) return OSSL_DYNAMIC_VERSION; \
591 return 0; }
592
593/* This function is passed the ENGINE structure to initialise with its own
594 * function and command settings. It should not adjust the structural or
595 * functional reference counts. If this function returns zero, (a) the load will
596 * be aborted, (b) the previous ENGINE state will be memcpy'd back onto the
597 * structure, and (c) the shared library will be unloaded. So implementations
598 * should do their own internal cleanup in failure circumstances otherwise they
599 * could leak. The 'id' parameter, if non-NULL, represents the ENGINE id that
600 * the loader is looking for. If this is NULL, the shared library can choose to
601 * return failure or to initialise a 'default' ENGINE. If non-NULL, the shared
602 * library must initialise only an ENGINE matching the passed 'id'. The function
603 * is expected to be implemented with the symbol name "bind_engine". A standard
604 * implementation can be instantiated with IMPLEMENT_DYNAMIC_BIND_FN(fn) where
605 * the parameter 'fn' is a callback function that populates the ENGINE structure
606 * and returns an int value (zero for failure). 'fn' should have prototype;
607 * [static] int fn(ENGINE *e, const char *id); */
608typedef int (*dynamic_bind_engine)(ENGINE *e, const char *id,
609 const dynamic_fns *fns);
610#define IMPLEMENT_DYNAMIC_BIND_FN(fn) \
611 int bind_engine(ENGINE *e, const char *id, const dynamic_fns *fns) { \
612 if(!CRYPTO_set_mem_functions(fns->mem_fns.malloc_cb, \
613 fns->mem_fns.realloc_cb, fns->mem_fns.free_cb)) \
614 return 0; \
615 CRYPTO_set_locking_callback(fns->lock_fns.lock_locking_cb); \
616 CRYPTO_set_add_lock_callback(fns->lock_fns.lock_add_lock_cb); \
617 CRYPTO_set_dynlock_create_callback(fns->lock_fns.dynlock_create_cb); \
618 CRYPTO_set_dynlock_lock_callback(fns->lock_fns.dynlock_lock_cb); \
619 CRYPTO_set_dynlock_destroy_callback(fns->lock_fns.dynlock_destroy_cb); \
620 if(!CRYPTO_set_ex_data_implementation(fns->ex_data_fns)) \
621 return 0; \
622 if(!ERR_set_implementation(fns->err_fns)) return 0; \
623 if(!fn(e,id)) return 0; \
624 return 1; }
291 625
292/* BEGIN ERROR CODES */ 626/* BEGIN ERROR CODES */
293/* The following lines are auto generated by the script mkerr.pl. Any changes 627/* The following lines are auto generated by the script mkerr.pl. Any changes
294 * made after this point may be overwritten when the script is next run. 628 * made after this point may be overwritten when the script is next run.
295 */ 629 */
630void ERR_load_ENGINE_strings(void);
296 631
297/* Error codes for the ENGINE functions. */ 632/* Error codes for the ENGINE functions. */
298 633
299/* Function codes. */ 634/* Function codes. */
300#define ENGINE_F_ATALLA_FINISH 135 635#define ENGINE_F_DYNAMIC_CTRL 180
301#define ENGINE_F_ATALLA_INIT 136 636#define ENGINE_F_DYNAMIC_GET_DATA_CTX 181
302#define ENGINE_F_ATALLA_MOD_EXP 137 637#define ENGINE_F_DYNAMIC_LOAD 182
303#define ENGINE_F_ATALLA_RSA_MOD_EXP 138
304#define ENGINE_F_CSWIFT_DSA_SIGN 133
305#define ENGINE_F_CSWIFT_DSA_VERIFY 134
306#define ENGINE_F_CSWIFT_FINISH 100
307#define ENGINE_F_CSWIFT_INIT 101
308#define ENGINE_F_CSWIFT_MOD_EXP 102
309#define ENGINE_F_CSWIFT_MOD_EXP_CRT 103
310#define ENGINE_F_CSWIFT_RSA_MOD_EXP 104
311#define ENGINE_F_ENGINE_ADD 105 638#define ENGINE_F_ENGINE_ADD 105
312#define ENGINE_F_ENGINE_BY_ID 106 639#define ENGINE_F_ENGINE_BY_ID 106
640#define ENGINE_F_ENGINE_CMD_IS_EXECUTABLE 170
313#define ENGINE_F_ENGINE_CTRL 142 641#define ENGINE_F_ENGINE_CTRL 142
642#define ENGINE_F_ENGINE_CTRL_CMD 178
643#define ENGINE_F_ENGINE_CTRL_CMD_STRING 171
314#define ENGINE_F_ENGINE_FINISH 107 644#define ENGINE_F_ENGINE_FINISH 107
315#define ENGINE_F_ENGINE_FREE 108 645#define ENGINE_F_ENGINE_FREE 108
316#define ENGINE_F_ENGINE_GET_BN_MOD_EXP 109 646#define ENGINE_F_ENGINE_GET_CIPHER 185
317#define ENGINE_F_ENGINE_GET_BN_MOD_EXP_CRT 110 647#define ENGINE_F_ENGINE_GET_DEFAULT_TYPE 177
318#define ENGINE_F_ENGINE_GET_CTRL_FUNCTION 144 648#define ENGINE_F_ENGINE_GET_DIGEST 186
319#define ENGINE_F_ENGINE_GET_DH 111
320#define ENGINE_F_ENGINE_GET_DSA 112
321#define ENGINE_F_ENGINE_GET_FINISH_FUNCTION 145
322#define ENGINE_F_ENGINE_GET_ID 113
323#define ENGINE_F_ENGINE_GET_INIT_FUNCTION 146
324#define ENGINE_F_ENGINE_GET_NAME 114
325#define ENGINE_F_ENGINE_GET_NEXT 115 649#define ENGINE_F_ENGINE_GET_NEXT 115
326#define ENGINE_F_ENGINE_GET_PREV 116 650#define ENGINE_F_ENGINE_GET_PREV 116
327#define ENGINE_F_ENGINE_GET_RAND 117
328#define ENGINE_F_ENGINE_GET_RSA 118
329#define ENGINE_F_ENGINE_INIT 119 651#define ENGINE_F_ENGINE_INIT 119
330#define ENGINE_F_ENGINE_LIST_ADD 120 652#define ENGINE_F_ENGINE_LIST_ADD 120
331#define ENGINE_F_ENGINE_LIST_REMOVE 121 653#define ENGINE_F_ENGINE_LIST_REMOVE 121
332#define ENGINE_F_ENGINE_LOAD_PRIVATE_KEY 150 654#define ENGINE_F_ENGINE_LOAD_PRIVATE_KEY 150
333#define ENGINE_F_ENGINE_LOAD_PUBLIC_KEY 151 655#define ENGINE_F_ENGINE_LOAD_PUBLIC_KEY 151
656#define ENGINE_F_ENGINE_MODULE_INIT 187
334#define ENGINE_F_ENGINE_NEW 122 657#define ENGINE_F_ENGINE_NEW 122
335#define ENGINE_F_ENGINE_REMOVE 123 658#define ENGINE_F_ENGINE_REMOVE 123
336#define ENGINE_F_ENGINE_SET_BN_MOD_EXP 124 659#define ENGINE_F_ENGINE_SET_DEFAULT_STRING 189
337#define ENGINE_F_ENGINE_SET_BN_MOD_EXP_CRT 125
338#define ENGINE_F_ENGINE_SET_CTRL_FUNCTION 147
339#define ENGINE_F_ENGINE_SET_DEFAULT_TYPE 126 660#define ENGINE_F_ENGINE_SET_DEFAULT_TYPE 126
340#define ENGINE_F_ENGINE_SET_DH 127
341#define ENGINE_F_ENGINE_SET_DSA 128
342#define ENGINE_F_ENGINE_SET_FINISH_FUNCTION 148
343#define ENGINE_F_ENGINE_SET_ID 129 661#define ENGINE_F_ENGINE_SET_ID 129
344#define ENGINE_F_ENGINE_SET_INIT_FUNCTION 149
345#define ENGINE_F_ENGINE_SET_NAME 130 662#define ENGINE_F_ENGINE_SET_NAME 130
346#define ENGINE_F_ENGINE_SET_RAND 131 663#define ENGINE_F_ENGINE_TABLE_REGISTER 184
347#define ENGINE_F_ENGINE_SET_RSA 132
348#define ENGINE_F_ENGINE_UNLOAD_KEY 152 664#define ENGINE_F_ENGINE_UNLOAD_KEY 152
349#define ENGINE_F_HWCRHK_CTRL 143 665#define ENGINE_F_INT_CTRL_HELPER 172
350#define ENGINE_F_HWCRHK_FINISH 135 666#define ENGINE_F_INT_ENGINE_CONFIGURE 188
351#define ENGINE_F_HWCRHK_GET_PASS 155
352#define ENGINE_F_HWCRHK_INIT 136
353#define ENGINE_F_HWCRHK_LOAD_PRIVKEY 153
354#define ENGINE_F_HWCRHK_LOAD_PUBKEY 154
355#define ENGINE_F_HWCRHK_MOD_EXP 137
356#define ENGINE_F_HWCRHK_MOD_EXP_CRT 138
357#define ENGINE_F_HWCRHK_RAND_BYTES 139
358#define ENGINE_F_HWCRHK_RSA_MOD_EXP 140
359#define ENGINE_F_LOG_MESSAGE 141 667#define ENGINE_F_LOG_MESSAGE 141
668#define ENGINE_F_SET_DATA_CTX 183
360 669
361/* Reason codes. */ 670/* Reason codes. */
362#define ENGINE_R_ALREADY_LOADED 100 671#define ENGINE_R_ALREADY_LOADED 100
363#define ENGINE_R_BIO_WAS_FREED 121 672#define ENGINE_R_ARGUMENT_IS_NOT_A_NUMBER 133
364#define ENGINE_R_BN_CTX_FULL 101 673#define ENGINE_R_CMD_NOT_EXECUTABLE 134
365#define ENGINE_R_BN_EXPAND_FAIL 102 674#define ENGINE_R_COMMAND_TAKES_INPUT 135
366#define ENGINE_R_CHIL_ERROR 123 675#define ENGINE_R_COMMAND_TAKES_NO_INPUT 136
367#define ENGINE_R_CONFLICTING_ENGINE_ID 103 676#define ENGINE_R_CONFLICTING_ENGINE_ID 103
368#define ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED 119 677#define ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED 119
678#define ENGINE_R_DH_NOT_IMPLEMENTED 139
679#define ENGINE_R_DSA_NOT_IMPLEMENTED 140
369#define ENGINE_R_DSO_FAILURE 104 680#define ENGINE_R_DSO_FAILURE 104
681#define ENGINE_R_DSO_NOT_FOUND 132
682#define ENGINE_R_ENGINES_SECTION_ERROR 148
370#define ENGINE_R_ENGINE_IS_NOT_IN_LIST 105 683#define ENGINE_R_ENGINE_IS_NOT_IN_LIST 105
684#define ENGINE_R_ENGINE_SECTION_ERROR 149
371#define ENGINE_R_FAILED_LOADING_PRIVATE_KEY 128 685#define ENGINE_R_FAILED_LOADING_PRIVATE_KEY 128
372#define ENGINE_R_FAILED_LOADING_PUBLIC_KEY 129 686#define ENGINE_R_FAILED_LOADING_PUBLIC_KEY 129
373#define ENGINE_R_FINISH_FAILED 106 687#define ENGINE_R_FINISH_FAILED 106
@@ -375,24 +689,26 @@ void ERR_load_ENGINE_strings(void);
375#define ENGINE_R_ID_OR_NAME_MISSING 108 689#define ENGINE_R_ID_OR_NAME_MISSING 108
376#define ENGINE_R_INIT_FAILED 109 690#define ENGINE_R_INIT_FAILED 109
377#define ENGINE_R_INTERNAL_LIST_ERROR 110 691#define ENGINE_R_INTERNAL_LIST_ERROR 110
378#define ENGINE_R_MISSING_KEY_COMPONENTS 111 692#define ENGINE_R_INVALID_ARGUMENT 143
693#define ENGINE_R_INVALID_CMD_NAME 137
694#define ENGINE_R_INVALID_CMD_NUMBER 138
695#define ENGINE_R_INVALID_INIT_VALUE 151
696#define ENGINE_R_INVALID_STRING 150
379#define ENGINE_R_NOT_INITIALISED 117 697#define ENGINE_R_NOT_INITIALISED 117
380#define ENGINE_R_NOT_LOADED 112 698#define ENGINE_R_NOT_LOADED 112
381#define ENGINE_R_NO_CALLBACK 127
382#define ENGINE_R_NO_CONTROL_FUNCTION 120 699#define ENGINE_R_NO_CONTROL_FUNCTION 120
383#define ENGINE_R_NO_KEY 124 700#define ENGINE_R_NO_INDEX 144
384#define ENGINE_R_NO_LOAD_FUNCTION 125 701#define ENGINE_R_NO_LOAD_FUNCTION 125
385#define ENGINE_R_NO_REFERENCE 130 702#define ENGINE_R_NO_REFERENCE 130
386#define ENGINE_R_NO_SUCH_ENGINE 116 703#define ENGINE_R_NO_SUCH_ENGINE 116
387#define ENGINE_R_NO_UNLOAD_FUNCTION 126 704#define ENGINE_R_NO_UNLOAD_FUNCTION 126
388#define ENGINE_R_PROVIDE_PARAMETERS 113 705#define ENGINE_R_PROVIDE_PARAMETERS 113
389#define ENGINE_R_REQUEST_FAILED 114 706#define ENGINE_R_RSA_NOT_IMPLEMENTED 141
390#define ENGINE_R_REQUEST_FALLBACK 118 707#define ENGINE_R_UNIMPLEMENTED_CIPHER 146
391#define ENGINE_R_SIZE_TOO_LARGE_OR_TOO_SMALL 122 708#define ENGINE_R_UNIMPLEMENTED_DIGEST 147
392#define ENGINE_R_UNIT_FAILURE 115 709#define ENGINE_R_VERSION_INCOMPATIBILITY 145
393 710
394#ifdef __cplusplus 711#ifdef __cplusplus
395} 712}
396#endif 713#endif
397#endif 714#endif
398