openssl_rsa_pss_verify 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. data/.gitignore +5 -0
  2. data/.rspec +2 -0
  3. data/.ruby-gemset +1 -0
  4. data/.ruby-version +1 -0
  5. data/Gemfile +4 -0
  6. data/Gemfile.lock +35 -0
  7. data/README +1 -0
  8. data/Rakefile +4 -0
  9. data/ext/openssl_rsa_pss_verify/extconf.rb +15 -0
  10. data/ext/openssl_rsa_pss_verify/openssl_rsa_pss_verify_ext.c +56 -0
  11. data/lib/openssl_rsa_pss_verify/version.rb +3 -0
  12. data/lib/openssl_rsa_pss_verify.rb +2 -0
  13. data/openssl_rsa_pss_verify.gemspec +26 -0
  14. data/tasks/compile.rake +12 -0
  15. data/tasks/rspec.rake +12 -0
  16. data/vendor/openssl/include/openssl/aes.h +147 -0
  17. data/vendor/openssl/include/openssl/asn1.h +1404 -0
  18. data/vendor/openssl/include/openssl/asn1_mac.h +578 -0
  19. data/vendor/openssl/include/openssl/asn1t.h +960 -0
  20. data/vendor/openssl/include/openssl/bio.h +847 -0
  21. data/vendor/openssl/include/openssl/blowfish.h +129 -0
  22. data/vendor/openssl/include/openssl/bn.h +891 -0
  23. data/vendor/openssl/include/openssl/buffer.h +119 -0
  24. data/vendor/openssl/include/openssl/camellia.h +130 -0
  25. data/vendor/openssl/include/openssl/cast.h +107 -0
  26. data/vendor/openssl/include/openssl/cmac.h +82 -0
  27. data/vendor/openssl/include/openssl/cms.h +501 -0
  28. data/vendor/openssl/include/openssl/comp.h +80 -0
  29. data/vendor/openssl/include/openssl/conf.h +263 -0
  30. data/vendor/openssl/include/openssl/conf_api.h +89 -0
  31. data/vendor/openssl/include/openssl/crypto.h +611 -0
  32. data/vendor/openssl/include/openssl/des.h +248 -0
  33. data/vendor/openssl/include/openssl/des_old.h +446 -0
  34. data/vendor/openssl/include/openssl/dh.h +280 -0
  35. data/vendor/openssl/include/openssl/dsa.h +327 -0
  36. data/vendor/openssl/include/openssl/dso.h +409 -0
  37. data/vendor/openssl/include/openssl/dtls1.h +287 -0
  38. data/vendor/openssl/include/openssl/e_os2.h +315 -0
  39. data/vendor/openssl/include/openssl/ebcdic.h +19 -0
  40. data/vendor/openssl/include/openssl/ec.h +1167 -0
  41. data/vendor/openssl/include/openssl/ecdh.h +125 -0
  42. data/vendor/openssl/include/openssl/ecdsa.h +260 -0
  43. data/vendor/openssl/include/openssl/engine.h +842 -0
  44. data/vendor/openssl/include/openssl/err.h +386 -0
  45. data/vendor/openssl/include/openssl/evp.h +1409 -0
  46. data/vendor/openssl/include/openssl/hmac.h +110 -0
  47. data/vendor/openssl/include/openssl/idea.h +103 -0
  48. data/vendor/openssl/include/openssl/krb5_asn.h +256 -0
  49. data/vendor/openssl/include/openssl/kssl.h +183 -0
  50. data/vendor/openssl/include/openssl/lhash.h +241 -0
  51. data/vendor/openssl/include/openssl/md4.h +120 -0
  52. data/vendor/openssl/include/openssl/md5.h +120 -0
  53. data/vendor/openssl/include/openssl/mdc2.h +98 -0
  54. data/vendor/openssl/include/openssl/modes.h +135 -0
  55. data/vendor/openssl/include/openssl/obj_mac.h +4032 -0
  56. data/vendor/openssl/include/openssl/objects.h +1138 -0
  57. data/vendor/openssl/include/openssl/ocsp.h +623 -0
  58. data/vendor/openssl/include/openssl/opensslconf.h +234 -0
  59. data/vendor/openssl/include/openssl/opensslv.h +89 -0
  60. data/vendor/openssl/include/openssl/ossl_typ.h +202 -0
  61. data/vendor/openssl/include/openssl/pem.h +641 -0
  62. data/vendor/openssl/include/openssl/pem2.h +70 -0
  63. data/vendor/openssl/include/openssl/pkcs12.h +331 -0
  64. data/vendor/openssl/include/openssl/pkcs7.h +499 -0
  65. data/vendor/openssl/include/openssl/pqueue.h +94 -0
  66. data/vendor/openssl/include/openssl/rand.h +149 -0
  67. data/vendor/openssl/include/openssl/rc2.h +103 -0
  68. data/vendor/openssl/include/openssl/rc4.h +90 -0
  69. data/vendor/openssl/include/openssl/ripemd.h +107 -0
  70. data/vendor/openssl/include/openssl/rsa.h +582 -0
  71. data/vendor/openssl/include/openssl/safestack.h +2663 -0
  72. data/vendor/openssl/include/openssl/seed.h +139 -0
  73. data/vendor/openssl/include/openssl/sha.h +214 -0
  74. data/vendor/openssl/include/openssl/srp.h +172 -0
  75. data/vendor/openssl/include/openssl/srtp.h +145 -0
  76. data/vendor/openssl/include/openssl/ssl.h +2579 -0
  77. data/vendor/openssl/include/openssl/ssl2.h +272 -0
  78. data/vendor/openssl/include/openssl/ssl23.h +83 -0
  79. data/vendor/openssl/include/openssl/ssl3.h +684 -0
  80. data/vendor/openssl/include/openssl/stack.h +108 -0
  81. data/vendor/openssl/include/openssl/symhacks.h +475 -0
  82. data/vendor/openssl/include/openssl/tls1.h +735 -0
  83. data/vendor/openssl/include/openssl/ts.h +858 -0
  84. data/vendor/openssl/include/openssl/txt_db.h +112 -0
  85. data/vendor/openssl/include/openssl/ui.h +383 -0
  86. data/vendor/openssl/include/openssl/ui_compat.h +83 -0
  87. data/vendor/openssl/include/openssl/whrlpool.h +41 -0
  88. data/vendor/openssl/include/openssl/x509.h +1297 -0
  89. data/vendor/openssl/include/openssl/x509_vfy.h +567 -0
  90. data/vendor/openssl/include/openssl/x509v3.h +1007 -0
  91. data/vendor/openssl/lib/engines/lib4758cca.so +0 -0
  92. data/vendor/openssl/lib/engines/libaep.so +0 -0
  93. data/vendor/openssl/lib/engines/libatalla.so +0 -0
  94. data/vendor/openssl/lib/engines/libcapi.so +0 -0
  95. data/vendor/openssl/lib/engines/libchil.so +0 -0
  96. data/vendor/openssl/lib/engines/libcswift.so +0 -0
  97. data/vendor/openssl/lib/engines/libgmp.so +0 -0
  98. data/vendor/openssl/lib/engines/libgost.so +0 -0
  99. data/vendor/openssl/lib/engines/libnuron.so +0 -0
  100. data/vendor/openssl/lib/engines/libpadlock.so +0 -0
  101. data/vendor/openssl/lib/engines/libsureware.so +0 -0
  102. data/vendor/openssl/lib/engines/libubsec.so +0 -0
  103. data/vendor/openssl/lib/libcrypto.a +0 -0
  104. data/vendor/openssl/lib/libcrypto.so +0 -0
  105. data/vendor/openssl/lib/libcrypto.so.1.0.0 +0 -0
  106. data/vendor/openssl/lib/libssl.a +0 -0
  107. data/vendor/openssl/lib/libssl.so +0 -0
  108. data/vendor/openssl/lib/libssl.so.1.0.0 +0 -0
  109. data/vendor/openssl/lib/pkgconfig/libcrypto.pc +12 -0
  110. data/vendor/openssl/lib/pkgconfig/libssl.pc +12 -0
  111. data/vendor/openssl/lib/pkgconfig/openssl.pc +12 -0
  112. metadata +208 -0
@@ -0,0 +1,842 @@
1
+ /* openssl/engine.h */
2
+ /* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL
3
+ * project 2000.
4
+ */
5
+ /* ====================================================================
6
+ * Copyright (c) 1999-2004 The OpenSSL Project. All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions
10
+ * are met:
11
+ *
12
+ * 1. Redistributions of source code must retain the above copyright
13
+ * notice, this list of conditions and the following disclaimer.
14
+ *
15
+ * 2. Redistributions in binary form must reproduce the above copyright
16
+ * notice, this list of conditions and the following disclaimer in
17
+ * the documentation and/or other materials provided with the
18
+ * distribution.
19
+ *
20
+ * 3. All advertising materials mentioning features or use of this
21
+ * software must display the following acknowledgment:
22
+ * "This product includes software developed by the OpenSSL Project
23
+ * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24
+ *
25
+ * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26
+ * endorse or promote products derived from this software without
27
+ * prior written permission. For written permission, please contact
28
+ * licensing@OpenSSL.org.
29
+ *
30
+ * 5. Products derived from this software may not be called "OpenSSL"
31
+ * nor may "OpenSSL" appear in their names without prior written
32
+ * permission of the OpenSSL Project.
33
+ *
34
+ * 6. Redistributions of any form whatsoever must retain the following
35
+ * acknowledgment:
36
+ * "This product includes software developed by the OpenSSL Project
37
+ * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38
+ *
39
+ * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40
+ * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
43
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
51
+ * ====================================================================
52
+ *
53
+ * This product includes cryptographic software written by Eric Young
54
+ * (eay@cryptsoft.com). This product includes software written by Tim
55
+ * Hudson (tjh@cryptsoft.com).
56
+ *
57
+ */
58
+ /* ====================================================================
59
+ * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
60
+ * ECDH support in OpenSSL originally developed by
61
+ * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
62
+ */
63
+
64
+ #ifndef HEADER_ENGINE_H
65
+ #define HEADER_ENGINE_H
66
+
67
+ #include <openssl/opensslconf.h>
68
+
69
+ #ifdef OPENSSL_NO_ENGINE
70
+ #error ENGINE is disabled.
71
+ #endif
72
+
73
+ #ifndef OPENSSL_NO_DEPRECATED
74
+ #include <openssl/bn.h>
75
+ #ifndef OPENSSL_NO_RSA
76
+ #include <openssl/rsa.h>
77
+ #endif
78
+ #ifndef OPENSSL_NO_DSA
79
+ #include <openssl/dsa.h>
80
+ #endif
81
+ #ifndef OPENSSL_NO_DH
82
+ #include <openssl/dh.h>
83
+ #endif
84
+ #ifndef OPENSSL_NO_ECDH
85
+ #include <openssl/ecdh.h>
86
+ #endif
87
+ #ifndef OPENSSL_NO_ECDSA
88
+ #include <openssl/ecdsa.h>
89
+ #endif
90
+ #include <openssl/rand.h>
91
+ #include <openssl/ui.h>
92
+ #include <openssl/err.h>
93
+ #endif
94
+
95
+ #include <openssl/ossl_typ.h>
96
+ #include <openssl/symhacks.h>
97
+
98
+ #include <openssl/x509.h>
99
+
100
+ #ifdef __cplusplus
101
+ extern "C" {
102
+ #endif
103
+
104
+ /* These flags are used to control combinations of algorithm (methods)
105
+ * by bitwise "OR"ing. */
106
+ #define ENGINE_METHOD_RSA (unsigned int)0x0001
107
+ #define ENGINE_METHOD_DSA (unsigned int)0x0002
108
+ #define ENGINE_METHOD_DH (unsigned int)0x0004
109
+ #define ENGINE_METHOD_RAND (unsigned int)0x0008
110
+ #define ENGINE_METHOD_ECDH (unsigned int)0x0010
111
+ #define ENGINE_METHOD_ECDSA (unsigned int)0x0020
112
+ #define ENGINE_METHOD_CIPHERS (unsigned int)0x0040
113
+ #define ENGINE_METHOD_DIGESTS (unsigned int)0x0080
114
+ #define ENGINE_METHOD_STORE (unsigned int)0x0100
115
+ #define ENGINE_METHOD_PKEY_METHS (unsigned int)0x0200
116
+ #define ENGINE_METHOD_PKEY_ASN1_METHS (unsigned int)0x0400
117
+ /* Obvious all-or-nothing cases. */
118
+ #define ENGINE_METHOD_ALL (unsigned int)0xFFFF
119
+ #define ENGINE_METHOD_NONE (unsigned int)0x0000
120
+
121
+ /* This(ese) flag(s) controls behaviour of the ENGINE_TABLE mechanism used
122
+ * internally to control registration of ENGINE implementations, and can be set
123
+ * by ENGINE_set_table_flags(). The "NOINIT" flag prevents attempts to
124
+ * initialise registered ENGINEs if they are not already initialised. */
125
+ #define ENGINE_TABLE_FLAG_NOINIT (unsigned int)0x0001
126
+
127
+ /* ENGINE flags that can be set by ENGINE_set_flags(). */
128
+ /* #define ENGINE_FLAGS_MALLOCED 0x0001 */ /* Not used */
129
+
130
+ /* This flag is for ENGINEs that wish to handle the various 'CMD'-related
131
+ * control commands on their own. Without this flag, ENGINE_ctrl() handles these
132
+ * control commands on behalf of the ENGINE using their "cmd_defns" data. */
133
+ #define ENGINE_FLAGS_MANUAL_CMD_CTRL (int)0x0002
134
+
135
+ /* This flag is for ENGINEs who return new duplicate structures when found via
136
+ * "ENGINE_by_id()". When an ENGINE must store state (eg. if ENGINE_ctrl()
137
+ * commands are called in sequence as part of some stateful process like
138
+ * key-generation setup and execution), it can set this flag - then each attempt
139
+ * to obtain the ENGINE will result in it being copied into a new structure.
140
+ * Normally, ENGINEs don't declare this flag so ENGINE_by_id() just increments
141
+ * the existing ENGINE's structural reference count. */
142
+ #define ENGINE_FLAGS_BY_ID_COPY (int)0x0004
143
+
144
+ /* This flag if for an ENGINE that does not want its methods registered as
145
+ * part of ENGINE_register_all_complete() for example if the methods are
146
+ * not usable as default methods.
147
+ */
148
+
149
+ #define ENGINE_FLAGS_NO_REGISTER_ALL (int)0x0008
150
+
151
+ /* ENGINEs can support their own command types, and these flags are used in
152
+ * ENGINE_CTRL_GET_CMD_FLAGS to indicate to the caller what kind of input each
153
+ * command expects. Currently only numeric and string input is supported. If a
154
+ * control command supports none of the _NUMERIC, _STRING, or _NO_INPUT options,
155
+ * then it is regarded as an "internal" control command - and not for use in
156
+ * config setting situations. As such, they're not available to the
157
+ * ENGINE_ctrl_cmd_string() function, only raw ENGINE_ctrl() access. Changes to
158
+ * this list of 'command types' should be reflected carefully in
159
+ * ENGINE_cmd_is_executable() and ENGINE_ctrl_cmd_string(). */
160
+
161
+ /* accepts a 'long' input value (3rd parameter to ENGINE_ctrl) */
162
+ #define ENGINE_CMD_FLAG_NUMERIC (unsigned int)0x0001
163
+ /* accepts string input (cast from 'void*' to 'const char *', 4th parameter to
164
+ * ENGINE_ctrl) */
165
+ #define ENGINE_CMD_FLAG_STRING (unsigned int)0x0002
166
+ /* Indicates that the control command takes *no* input. Ie. the control command
167
+ * is unparameterised. */
168
+ #define ENGINE_CMD_FLAG_NO_INPUT (unsigned int)0x0004
169
+ /* Indicates that the control command is internal. This control command won't
170
+ * be shown in any output, and is only usable through the ENGINE_ctrl_cmd()
171
+ * function. */
172
+ #define ENGINE_CMD_FLAG_INTERNAL (unsigned int)0x0008
173
+
174
+ /* NB: These 3 control commands are deprecated and should not be used. ENGINEs
175
+ * relying on these commands should compile conditional support for
176
+ * compatibility (eg. if these symbols are defined) but should also migrate the
177
+ * same functionality to their own ENGINE-specific control functions that can be
178
+ * "discovered" by calling applications. The fact these control commands
179
+ * wouldn't be "executable" (ie. usable by text-based config) doesn't change the
180
+ * fact that application code can find and use them without requiring per-ENGINE
181
+ * hacking. */
182
+
183
+ /* These flags are used to tell the ctrl function what should be done.
184
+ * All command numbers are shared between all engines, even if some don't
185
+ * make sense to some engines. In such a case, they do nothing but return
186
+ * the error ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED. */
187
+ #define ENGINE_CTRL_SET_LOGSTREAM 1
188
+ #define ENGINE_CTRL_SET_PASSWORD_CALLBACK 2
189
+ #define ENGINE_CTRL_HUP 3 /* Close and reinitialise any
190
+ handles/connections etc. */
191
+ #define ENGINE_CTRL_SET_USER_INTERFACE 4 /* Alternative to callback */
192
+ #define ENGINE_CTRL_SET_CALLBACK_DATA 5 /* User-specific data, used
193
+ when calling the password
194
+ callback and the user
195
+ interface */
196
+ #define ENGINE_CTRL_LOAD_CONFIGURATION 6 /* Load a configuration, given
197
+ a string that represents a
198
+ file name or so */
199
+ #define ENGINE_CTRL_LOAD_SECTION 7 /* Load data from a given
200
+ section in the already loaded
201
+ configuration */
202
+
203
+ /* These control commands allow an application to deal with an arbitrary engine
204
+ * in a dynamic way. Warn: Negative return values indicate errors FOR THESE
205
+ * COMMANDS because zero is used to indicate 'end-of-list'. Other commands,
206
+ * including ENGINE-specific command types, return zero for an error.
207
+ *
208
+ * An ENGINE can choose to implement these ctrl functions, and can internally
209
+ * manage things however it chooses - it does so by setting the
210
+ * ENGINE_FLAGS_MANUAL_CMD_CTRL flag (using ENGINE_set_flags()). Otherwise the
211
+ * ENGINE_ctrl() code handles this on the ENGINE's behalf using the cmd_defns
212
+ * data (set using ENGINE_set_cmd_defns()). This means an ENGINE's ctrl()
213
+ * handler need only implement its own commands - the above "meta" commands will
214
+ * be taken care of. */
215
+
216
+ /* Returns non-zero if the supplied ENGINE has a ctrl() handler. If "not", then
217
+ * all the remaining control commands will return failure, so it is worth
218
+ * checking this first if the caller is trying to "discover" the engine's
219
+ * capabilities and doesn't want errors generated unnecessarily. */
220
+ #define ENGINE_CTRL_HAS_CTRL_FUNCTION 10
221
+ /* Returns a positive command number for the first command supported by the
222
+ * engine. Returns zero if no ctrl commands are supported. */
223
+ #define ENGINE_CTRL_GET_FIRST_CMD_TYPE 11
224
+ /* The 'long' argument specifies a command implemented by the engine, and the
225
+ * return value is the next command supported, or zero if there are no more. */
226
+ #define ENGINE_CTRL_GET_NEXT_CMD_TYPE 12
227
+ /* The 'void*' argument is a command name (cast from 'const char *'), and the
228
+ * return value is the command that corresponds to it. */
229
+ #define ENGINE_CTRL_GET_CMD_FROM_NAME 13
230
+ /* The next two allow a command to be converted into its corresponding string
231
+ * form. In each case, the 'long' argument supplies the command. In the NAME_LEN
232
+ * case, the return value is the length of the command name (not counting a
233
+ * trailing EOL). In the NAME case, the 'void*' argument must be a string buffer
234
+ * large enough, and it will be populated with the name of the command (WITH a
235
+ * trailing EOL). */
236
+ #define ENGINE_CTRL_GET_NAME_LEN_FROM_CMD 14
237
+ #define ENGINE_CTRL_GET_NAME_FROM_CMD 15
238
+ /* The next two are similar but give a "short description" of a command. */
239
+ #define ENGINE_CTRL_GET_DESC_LEN_FROM_CMD 16
240
+ #define ENGINE_CTRL_GET_DESC_FROM_CMD 17
241
+ /* With this command, the return value is the OR'd combination of
242
+ * ENGINE_CMD_FLAG_*** values that indicate what kind of input a given
243
+ * engine-specific ctrl command expects. */
244
+ #define ENGINE_CTRL_GET_CMD_FLAGS 18
245
+
246
+ /* ENGINE implementations should start the numbering of their own control
247
+ * commands from this value. (ie. ENGINE_CMD_BASE, ENGINE_CMD_BASE + 1, etc). */
248
+ #define ENGINE_CMD_BASE 200
249
+
250
+ /* NB: These 2 nCipher "chil" control commands are deprecated, and their
251
+ * functionality is now available through ENGINE-specific control commands
252
+ * (exposed through the above-mentioned 'CMD'-handling). Code using these 2
253
+ * commands should be migrated to the more general command handling before these
254
+ * are removed. */
255
+
256
+ /* Flags specific to the nCipher "chil" engine */
257
+ #define ENGINE_CTRL_CHIL_SET_FORKCHECK 100
258
+ /* Depending on the value of the (long)i argument, this sets or
259
+ * unsets the SimpleForkCheck flag in the CHIL API to enable or
260
+ * disable checking and workarounds for applications that fork().
261
+ */
262
+ #define ENGINE_CTRL_CHIL_NO_LOCKING 101
263
+ /* This prevents the initialisation function from providing mutex
264
+ * callbacks to the nCipher library. */
265
+
266
+ /* If an ENGINE supports its own specific control commands and wishes the
267
+ * framework to handle the above 'ENGINE_CMD_***'-manipulation commands on its
268
+ * behalf, it should supply a null-terminated array of ENGINE_CMD_DEFN entries
269
+ * to ENGINE_set_cmd_defns(). It should also implement a ctrl() handler that
270
+ * supports the stated commands (ie. the "cmd_num" entries as described by the
271
+ * array). NB: The array must be ordered in increasing order of cmd_num.
272
+ * "null-terminated" means that the last ENGINE_CMD_DEFN element has cmd_num set
273
+ * to zero and/or cmd_name set to NULL. */
274
+ typedef struct ENGINE_CMD_DEFN_st
275
+ {
276
+ unsigned int cmd_num; /* The command number */
277
+ const char *cmd_name; /* The command name itself */
278
+ const char *cmd_desc; /* A short description of the command */
279
+ unsigned int cmd_flags; /* The input the command expects */
280
+ } ENGINE_CMD_DEFN;
281
+
282
+ /* Generic function pointer */
283
+ typedef int (*ENGINE_GEN_FUNC_PTR)(void);
284
+ /* Generic function pointer taking no arguments */
285
+ typedef int (*ENGINE_GEN_INT_FUNC_PTR)(ENGINE *);
286
+ /* Specific control function pointer */
287
+ typedef int (*ENGINE_CTRL_FUNC_PTR)(ENGINE *, int, long, void *, void (*f)(void));
288
+ /* Generic load_key function pointer */
289
+ typedef EVP_PKEY * (*ENGINE_LOAD_KEY_PTR)(ENGINE *, const char *,
290
+ UI_METHOD *ui_method, void *callback_data);
291
+ typedef int (*ENGINE_SSL_CLIENT_CERT_PTR)(ENGINE *, SSL *ssl,
292
+ STACK_OF(X509_NAME) *ca_dn, X509 **pcert, EVP_PKEY **pkey,
293
+ STACK_OF(X509) **pother, UI_METHOD *ui_method, void *callback_data);
294
+ /* These callback types are for an ENGINE's handler for cipher and digest logic.
295
+ * These handlers have these prototypes;
296
+ * int foo(ENGINE *e, const EVP_CIPHER **cipher, const int **nids, int nid);
297
+ * int foo(ENGINE *e, const EVP_MD **digest, const int **nids, int nid);
298
+ * Looking at how to implement these handlers in the case of cipher support, if
299
+ * the framework wants the EVP_CIPHER for 'nid', it will call;
300
+ * foo(e, &p_evp_cipher, NULL, nid); (return zero for failure)
301
+ * If the framework wants a list of supported 'nid's, it will call;
302
+ * foo(e, NULL, &p_nids, 0); (returns number of 'nids' or -1 for error)
303
+ */
304
+ /* Returns to a pointer to the array of supported cipher 'nid's. If the second
305
+ * parameter is non-NULL it is set to the size of the returned array. */
306
+ typedef int (*ENGINE_CIPHERS_PTR)(ENGINE *, const EVP_CIPHER **, const int **, int);
307
+ typedef int (*ENGINE_DIGESTS_PTR)(ENGINE *, const EVP_MD **, const int **, int);
308
+ typedef int (*ENGINE_PKEY_METHS_PTR)(ENGINE *, EVP_PKEY_METHOD **, const int **, int);
309
+ typedef int (*ENGINE_PKEY_ASN1_METHS_PTR)(ENGINE *, EVP_PKEY_ASN1_METHOD **, const int **, int);
310
+ /* STRUCTURE functions ... all of these functions deal with pointers to ENGINE
311
+ * structures where the pointers have a "structural reference". This means that
312
+ * their reference is to allowed access to the structure but it does not imply
313
+ * that the structure is functional. To simply increment or decrement the
314
+ * structural reference count, use ENGINE_by_id and ENGINE_free. NB: This is not
315
+ * required when iterating using ENGINE_get_next as it will automatically
316
+ * decrement the structural reference count of the "current" ENGINE and
317
+ * increment the structural reference count of the ENGINE it returns (unless it
318
+ * is NULL). */
319
+
320
+ /* Get the first/last "ENGINE" type available. */
321
+ ENGINE *ENGINE_get_first(void);
322
+ ENGINE *ENGINE_get_last(void);
323
+ /* Iterate to the next/previous "ENGINE" type (NULL = end of the list). */
324
+ ENGINE *ENGINE_get_next(ENGINE *e);
325
+ ENGINE *ENGINE_get_prev(ENGINE *e);
326
+ /* Add another "ENGINE" type into the array. */
327
+ int ENGINE_add(ENGINE *e);
328
+ /* Remove an existing "ENGINE" type from the array. */
329
+ int ENGINE_remove(ENGINE *e);
330
+ /* Retrieve an engine from the list by its unique "id" value. */
331
+ ENGINE *ENGINE_by_id(const char *id);
332
+ /* Add all the built-in engines. */
333
+ void ENGINE_load_openssl(void);
334
+ void ENGINE_load_dynamic(void);
335
+ #ifndef OPENSSL_NO_STATIC_ENGINE
336
+ void ENGINE_load_4758cca(void);
337
+ void ENGINE_load_aep(void);
338
+ void ENGINE_load_atalla(void);
339
+ void ENGINE_load_chil(void);
340
+ void ENGINE_load_cswift(void);
341
+ void ENGINE_load_nuron(void);
342
+ void ENGINE_load_sureware(void);
343
+ void ENGINE_load_ubsec(void);
344
+ void ENGINE_load_padlock(void);
345
+ void ENGINE_load_capi(void);
346
+ #ifndef OPENSSL_NO_GMP
347
+ void ENGINE_load_gmp(void);
348
+ #endif
349
+ #ifndef OPENSSL_NO_GOST
350
+ void ENGINE_load_gost(void);
351
+ #endif
352
+ #endif
353
+ void ENGINE_load_cryptodev(void);
354
+ void ENGINE_load_rsax(void);
355
+ void ENGINE_load_rdrand(void);
356
+ void ENGINE_load_builtin_engines(void);
357
+
358
+ /* Get and set global flags (ENGINE_TABLE_FLAG_***) for the implementation
359
+ * "registry" handling. */
360
+ unsigned int ENGINE_get_table_flags(void);
361
+ void ENGINE_set_table_flags(unsigned int flags);
362
+
363
+ /* Manage registration of ENGINEs per "table". For each type, there are 3
364
+ * functions;
365
+ * ENGINE_register_***(e) - registers the implementation from 'e' (if it has one)
366
+ * ENGINE_unregister_***(e) - unregister the implementation from 'e'
367
+ * ENGINE_register_all_***() - call ENGINE_register_***() for each 'e' in the list
368
+ * Cleanup is automatically registered from each table when required, so
369
+ * ENGINE_cleanup() will reverse any "register" operations. */
370
+
371
+ int ENGINE_register_RSA(ENGINE *e);
372
+ void ENGINE_unregister_RSA(ENGINE *e);
373
+ void ENGINE_register_all_RSA(void);
374
+
375
+ int ENGINE_register_DSA(ENGINE *e);
376
+ void ENGINE_unregister_DSA(ENGINE *e);
377
+ void ENGINE_register_all_DSA(void);
378
+
379
+ int ENGINE_register_ECDH(ENGINE *e);
380
+ void ENGINE_unregister_ECDH(ENGINE *e);
381
+ void ENGINE_register_all_ECDH(void);
382
+
383
+ int ENGINE_register_ECDSA(ENGINE *e);
384
+ void ENGINE_unregister_ECDSA(ENGINE *e);
385
+ void ENGINE_register_all_ECDSA(void);
386
+
387
+ int ENGINE_register_DH(ENGINE *e);
388
+ void ENGINE_unregister_DH(ENGINE *e);
389
+ void ENGINE_register_all_DH(void);
390
+
391
+ int ENGINE_register_RAND(ENGINE *e);
392
+ void ENGINE_unregister_RAND(ENGINE *e);
393
+ void ENGINE_register_all_RAND(void);
394
+
395
+ int ENGINE_register_STORE(ENGINE *e);
396
+ void ENGINE_unregister_STORE(ENGINE *e);
397
+ void ENGINE_register_all_STORE(void);
398
+
399
+ int ENGINE_register_ciphers(ENGINE *e);
400
+ void ENGINE_unregister_ciphers(ENGINE *e);
401
+ void ENGINE_register_all_ciphers(void);
402
+
403
+ int ENGINE_register_digests(ENGINE *e);
404
+ void ENGINE_unregister_digests(ENGINE *e);
405
+ void ENGINE_register_all_digests(void);
406
+
407
+ int ENGINE_register_pkey_meths(ENGINE *e);
408
+ void ENGINE_unregister_pkey_meths(ENGINE *e);
409
+ void ENGINE_register_all_pkey_meths(void);
410
+
411
+ int ENGINE_register_pkey_asn1_meths(ENGINE *e);
412
+ void ENGINE_unregister_pkey_asn1_meths(ENGINE *e);
413
+ void ENGINE_register_all_pkey_asn1_meths(void);
414
+
415
+ /* These functions register all support from the above categories. Note, use of
416
+ * these functions can result in static linkage of code your application may not
417
+ * need. If you only need a subset of functionality, consider using more
418
+ * selective initialisation. */
419
+ int ENGINE_register_complete(ENGINE *e);
420
+ int ENGINE_register_all_complete(void);
421
+
422
+ /* Send parametrised control commands to the engine. The possibilities to send
423
+ * down an integer, a pointer to data or a function pointer are provided. Any of
424
+ * the parameters may or may not be NULL, depending on the command number. In
425
+ * actuality, this function only requires a structural (rather than functional)
426
+ * reference to an engine, but many control commands may require the engine be
427
+ * functional. The caller should be aware of trying commands that require an
428
+ * operational ENGINE, and only use functional references in such situations. */
429
+ int ENGINE_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)(void));
430
+
431
+ /* This function tests if an ENGINE-specific command is usable as a "setting".
432
+ * Eg. in an application's config file that gets processed through
433
+ * ENGINE_ctrl_cmd_string(). If this returns zero, it is not available to
434
+ * ENGINE_ctrl_cmd_string(), only ENGINE_ctrl(). */
435
+ int ENGINE_cmd_is_executable(ENGINE *e, int cmd);
436
+
437
+ /* This function works like ENGINE_ctrl() with the exception of taking a
438
+ * command name instead of a command number, and can handle optional commands.
439
+ * See the comment on ENGINE_ctrl_cmd_string() for an explanation on how to
440
+ * use the cmd_name and cmd_optional. */
441
+ int ENGINE_ctrl_cmd(ENGINE *e, const char *cmd_name,
442
+ long i, void *p, void (*f)(void), int cmd_optional);
443
+
444
+ /* This function passes a command-name and argument to an ENGINE. The cmd_name
445
+ * is converted to a command number and the control command is called using
446
+ * 'arg' as an argument (unless the ENGINE doesn't support such a command, in
447
+ * which case no control command is called). The command is checked for input
448
+ * flags, and if necessary the argument will be converted to a numeric value. If
449
+ * cmd_optional is non-zero, then if the ENGINE doesn't support the given
450
+ * cmd_name the return value will be success anyway. This function is intended
451
+ * for applications to use so that users (or config files) can supply
452
+ * engine-specific config data to the ENGINE at run-time to control behaviour of
453
+ * specific engines. As such, it shouldn't be used for calling ENGINE_ctrl()
454
+ * functions that return data, deal with binary data, or that are otherwise
455
+ * supposed to be used directly through ENGINE_ctrl() in application code. Any
456
+ * "return" data from an ENGINE_ctrl() operation in this function will be lost -
457
+ * the return value is interpreted as failure if the return value is zero,
458
+ * success otherwise, and this function returns a boolean value as a result. In
459
+ * other words, vendors of 'ENGINE'-enabled devices should write ENGINE
460
+ * implementations with parameterisations that work in this scheme, so that
461
+ * compliant ENGINE-based applications can work consistently with the same
462
+ * configuration for the same ENGINE-enabled devices, across applications. */
463
+ int ENGINE_ctrl_cmd_string(ENGINE *e, const char *cmd_name, const char *arg,
464
+ int cmd_optional);
465
+
466
+ /* These functions are useful for manufacturing new ENGINE structures. They
467
+ * don't address reference counting at all - one uses them to populate an ENGINE
468
+ * structure with personalised implementations of things prior to using it
469
+ * directly or adding it to the builtin ENGINE list in OpenSSL. These are also
470
+ * here so that the ENGINE structure doesn't have to be exposed and break binary
471
+ * compatibility! */
472
+ ENGINE *ENGINE_new(void);
473
+ int ENGINE_free(ENGINE *e);
474
+ int ENGINE_up_ref(ENGINE *e);
475
+ int ENGINE_set_id(ENGINE *e, const char *id);
476
+ int ENGINE_set_name(ENGINE *e, const char *name);
477
+ int ENGINE_set_RSA(ENGINE *e, const RSA_METHOD *rsa_meth);
478
+ int ENGINE_set_DSA(ENGINE *e, const DSA_METHOD *dsa_meth);
479
+ int ENGINE_set_ECDH(ENGINE *e, const ECDH_METHOD *ecdh_meth);
480
+ int ENGINE_set_ECDSA(ENGINE *e, const ECDSA_METHOD *ecdsa_meth);
481
+ int ENGINE_set_DH(ENGINE *e, const DH_METHOD *dh_meth);
482
+ int ENGINE_set_RAND(ENGINE *e, const RAND_METHOD *rand_meth);
483
+ int ENGINE_set_STORE(ENGINE *e, const STORE_METHOD *store_meth);
484
+ int ENGINE_set_destroy_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR destroy_f);
485
+ int ENGINE_set_init_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR init_f);
486
+ int ENGINE_set_finish_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR finish_f);
487
+ int ENGINE_set_ctrl_function(ENGINE *e, ENGINE_CTRL_FUNC_PTR ctrl_f);
488
+ int ENGINE_set_load_privkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpriv_f);
489
+ int ENGINE_set_load_pubkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpub_f);
490
+ int ENGINE_set_load_ssl_client_cert_function(ENGINE *e,
491
+ ENGINE_SSL_CLIENT_CERT_PTR loadssl_f);
492
+ int ENGINE_set_ciphers(ENGINE *e, ENGINE_CIPHERS_PTR f);
493
+ int ENGINE_set_digests(ENGINE *e, ENGINE_DIGESTS_PTR f);
494
+ int ENGINE_set_pkey_meths(ENGINE *e, ENGINE_PKEY_METHS_PTR f);
495
+ int ENGINE_set_pkey_asn1_meths(ENGINE *e, ENGINE_PKEY_ASN1_METHS_PTR f);
496
+ int ENGINE_set_flags(ENGINE *e, int flags);
497
+ int ENGINE_set_cmd_defns(ENGINE *e, const ENGINE_CMD_DEFN *defns);
498
+ /* These functions allow control over any per-structure ENGINE data. */
499
+ int ENGINE_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
500
+ CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
501
+ int ENGINE_set_ex_data(ENGINE *e, int idx, void *arg);
502
+ void *ENGINE_get_ex_data(const ENGINE *e, int idx);
503
+
504
+ /* This function cleans up anything that needs it. Eg. the ENGINE_add() function
505
+ * automatically ensures the list cleanup function is registered to be called
506
+ * from ENGINE_cleanup(). Similarly, all ENGINE_register_*** functions ensure
507
+ * ENGINE_cleanup() will clean up after them. */
508
+ void ENGINE_cleanup(void);
509
+
510
+ /* These return values from within the ENGINE structure. These can be useful
511
+ * with functional references as well as structural references - it depends
512
+ * which you obtained. Using the result for functional purposes if you only
513
+ * obtained a structural reference may be problematic! */
514
+ const char *ENGINE_get_id(const ENGINE *e);
515
+ const char *ENGINE_get_name(const ENGINE *e);
516
+ const RSA_METHOD *ENGINE_get_RSA(const ENGINE *e);
517
+ const DSA_METHOD *ENGINE_get_DSA(const ENGINE *e);
518
+ const ECDH_METHOD *ENGINE_get_ECDH(const ENGINE *e);
519
+ const ECDSA_METHOD *ENGINE_get_ECDSA(const ENGINE *e);
520
+ const DH_METHOD *ENGINE_get_DH(const ENGINE *e);
521
+ const RAND_METHOD *ENGINE_get_RAND(const ENGINE *e);
522
+ const STORE_METHOD *ENGINE_get_STORE(const ENGINE *e);
523
+ ENGINE_GEN_INT_FUNC_PTR ENGINE_get_destroy_function(const ENGINE *e);
524
+ ENGINE_GEN_INT_FUNC_PTR ENGINE_get_init_function(const ENGINE *e);
525
+ ENGINE_GEN_INT_FUNC_PTR ENGINE_get_finish_function(const ENGINE *e);
526
+ ENGINE_CTRL_FUNC_PTR ENGINE_get_ctrl_function(const ENGINE *e);
527
+ ENGINE_LOAD_KEY_PTR ENGINE_get_load_privkey_function(const ENGINE *e);
528
+ ENGINE_LOAD_KEY_PTR ENGINE_get_load_pubkey_function(const ENGINE *e);
529
+ ENGINE_SSL_CLIENT_CERT_PTR ENGINE_get_ssl_client_cert_function(const ENGINE *e);
530
+ ENGINE_CIPHERS_PTR ENGINE_get_ciphers(const ENGINE *e);
531
+ ENGINE_DIGESTS_PTR ENGINE_get_digests(const ENGINE *e);
532
+ ENGINE_PKEY_METHS_PTR ENGINE_get_pkey_meths(const ENGINE *e);
533
+ ENGINE_PKEY_ASN1_METHS_PTR ENGINE_get_pkey_asn1_meths(const ENGINE *e);
534
+ const EVP_CIPHER *ENGINE_get_cipher(ENGINE *e, int nid);
535
+ const EVP_MD *ENGINE_get_digest(ENGINE *e, int nid);
536
+ const EVP_PKEY_METHOD *ENGINE_get_pkey_meth(ENGINE *e, int nid);
537
+ const EVP_PKEY_ASN1_METHOD *ENGINE_get_pkey_asn1_meth(ENGINE *e, int nid);
538
+ const EVP_PKEY_ASN1_METHOD *ENGINE_get_pkey_asn1_meth_str(ENGINE *e,
539
+ const char *str, int len);
540
+ const EVP_PKEY_ASN1_METHOD *ENGINE_pkey_asn1_find_str(ENGINE **pe,
541
+ const char *str, int len);
542
+ const ENGINE_CMD_DEFN *ENGINE_get_cmd_defns(const ENGINE *e);
543
+ int ENGINE_get_flags(const ENGINE *e);
544
+
545
+ /* FUNCTIONAL functions. These functions deal with ENGINE structures
546
+ * that have (or will) be initialised for use. Broadly speaking, the
547
+ * structural functions are useful for iterating the list of available
548
+ * engine types, creating new engine types, and other "list" operations.
549
+ * These functions actually deal with ENGINEs that are to be used. As
550
+ * such these functions can fail (if applicable) when particular
551
+ * engines are unavailable - eg. if a hardware accelerator is not
552
+ * attached or not functioning correctly. Each ENGINE has 2 reference
553
+ * counts; structural and functional. Every time a functional reference
554
+ * is obtained or released, a corresponding structural reference is
555
+ * automatically obtained or released too. */
556
+
557
+ /* Initialise a engine type for use (or up its reference count if it's
558
+ * already in use). This will fail if the engine is not currently
559
+ * operational and cannot initialise. */
560
+ int ENGINE_init(ENGINE *e);
561
+ /* Free a functional reference to a engine type. This does not require
562
+ * a corresponding call to ENGINE_free as it also releases a structural
563
+ * reference. */
564
+ int ENGINE_finish(ENGINE *e);
565
+
566
+ /* The following functions handle keys that are stored in some secondary
567
+ * location, handled by the engine. The storage may be on a card or
568
+ * whatever. */
569
+ EVP_PKEY *ENGINE_load_private_key(ENGINE *e, const char *key_id,
570
+ UI_METHOD *ui_method, void *callback_data);
571
+ EVP_PKEY *ENGINE_load_public_key(ENGINE *e, const char *key_id,
572
+ UI_METHOD *ui_method, void *callback_data);
573
+ int ENGINE_load_ssl_client_cert(ENGINE *e, SSL *s,
574
+ STACK_OF(X509_NAME) *ca_dn, X509 **pcert, EVP_PKEY **ppkey,
575
+ STACK_OF(X509) **pother,
576
+ UI_METHOD *ui_method, void *callback_data);
577
+
578
+ /* This returns a pointer for the current ENGINE structure that
579
+ * is (by default) performing any RSA operations. The value returned
580
+ * is an incremented reference, so it should be free'd (ENGINE_finish)
581
+ * before it is discarded. */
582
+ ENGINE *ENGINE_get_default_RSA(void);
583
+ /* Same for the other "methods" */
584
+ ENGINE *ENGINE_get_default_DSA(void);
585
+ ENGINE *ENGINE_get_default_ECDH(void);
586
+ ENGINE *ENGINE_get_default_ECDSA(void);
587
+ ENGINE *ENGINE_get_default_DH(void);
588
+ ENGINE *ENGINE_get_default_RAND(void);
589
+ /* These functions can be used to get a functional reference to perform
590
+ * ciphering or digesting corresponding to "nid". */
591
+ ENGINE *ENGINE_get_cipher_engine(int nid);
592
+ ENGINE *ENGINE_get_digest_engine(int nid);
593
+ ENGINE *ENGINE_get_pkey_meth_engine(int nid);
594
+ ENGINE *ENGINE_get_pkey_asn1_meth_engine(int nid);
595
+
596
+ /* This sets a new default ENGINE structure for performing RSA
597
+ * operations. If the result is non-zero (success) then the ENGINE
598
+ * structure will have had its reference count up'd so the caller
599
+ * should still free their own reference 'e'. */
600
+ int ENGINE_set_default_RSA(ENGINE *e);
601
+ int ENGINE_set_default_string(ENGINE *e, const char *def_list);
602
+ /* Same for the other "methods" */
603
+ int ENGINE_set_default_DSA(ENGINE *e);
604
+ int ENGINE_set_default_ECDH(ENGINE *e);
605
+ int ENGINE_set_default_ECDSA(ENGINE *e);
606
+ int ENGINE_set_default_DH(ENGINE *e);
607
+ int ENGINE_set_default_RAND(ENGINE *e);
608
+ int ENGINE_set_default_ciphers(ENGINE *e);
609
+ int ENGINE_set_default_digests(ENGINE *e);
610
+ int ENGINE_set_default_pkey_meths(ENGINE *e);
611
+ int ENGINE_set_default_pkey_asn1_meths(ENGINE *e);
612
+
613
+ /* The combination "set" - the flags are bitwise "OR"d from the
614
+ * ENGINE_METHOD_*** defines above. As with the "ENGINE_register_complete()"
615
+ * function, this function can result in unnecessary static linkage. If your
616
+ * application requires only specific functionality, consider using more
617
+ * selective functions. */
618
+ int ENGINE_set_default(ENGINE *e, unsigned int flags);
619
+
620
+ void ENGINE_add_conf_module(void);
621
+
622
+ /* Deprecated functions ... */
623
+ /* int ENGINE_clear_defaults(void); */
624
+
625
+ /**************************/
626
+ /* DYNAMIC ENGINE SUPPORT */
627
+ /**************************/
628
+
629
+ /* Binary/behaviour compatibility levels */
630
+ #define OSSL_DYNAMIC_VERSION (unsigned long)0x00020000
631
+ /* Binary versions older than this are too old for us (whether we're a loader or
632
+ * a loadee) */
633
+ #define OSSL_DYNAMIC_OLDEST (unsigned long)0x00020000
634
+
635
+ /* When compiling an ENGINE entirely as an external shared library, loadable by
636
+ * the "dynamic" ENGINE, these types are needed. The 'dynamic_fns' structure
637
+ * type provides the calling application's (or library's) error functionality
638
+ * and memory management function pointers to the loaded library. These should
639
+ * be used/set in the loaded library code so that the loading application's
640
+ * 'state' will be used/changed in all operations. The 'static_state' pointer
641
+ * allows the loaded library to know if it shares the same static data as the
642
+ * calling application (or library), and thus whether these callbacks need to be
643
+ * set or not. */
644
+ typedef void *(*dyn_MEM_malloc_cb)(size_t);
645
+ typedef void *(*dyn_MEM_realloc_cb)(void *, size_t);
646
+ typedef void (*dyn_MEM_free_cb)(void *);
647
+ typedef struct st_dynamic_MEM_fns {
648
+ dyn_MEM_malloc_cb malloc_cb;
649
+ dyn_MEM_realloc_cb realloc_cb;
650
+ dyn_MEM_free_cb free_cb;
651
+ } dynamic_MEM_fns;
652
+ /* FIXME: Perhaps the memory and locking code (crypto.h) should declare and use
653
+ * these types so we (and any other dependant code) can simplify a bit?? */
654
+ typedef void (*dyn_lock_locking_cb)(int,int,const char *,int);
655
+ typedef int (*dyn_lock_add_lock_cb)(int*,int,int,const char *,int);
656
+ typedef struct CRYPTO_dynlock_value *(*dyn_dynlock_create_cb)(
657
+ const char *,int);
658
+ typedef void (*dyn_dynlock_lock_cb)(int,struct CRYPTO_dynlock_value *,
659
+ const char *,int);
660
+ typedef void (*dyn_dynlock_destroy_cb)(struct CRYPTO_dynlock_value *,
661
+ const char *,int);
662
+ typedef struct st_dynamic_LOCK_fns {
663
+ dyn_lock_locking_cb lock_locking_cb;
664
+ dyn_lock_add_lock_cb lock_add_lock_cb;
665
+ dyn_dynlock_create_cb dynlock_create_cb;
666
+ dyn_dynlock_lock_cb dynlock_lock_cb;
667
+ dyn_dynlock_destroy_cb dynlock_destroy_cb;
668
+ } dynamic_LOCK_fns;
669
+ /* The top-level structure */
670
+ typedef struct st_dynamic_fns {
671
+ void *static_state;
672
+ const ERR_FNS *err_fns;
673
+ const CRYPTO_EX_DATA_IMPL *ex_data_fns;
674
+ dynamic_MEM_fns mem_fns;
675
+ dynamic_LOCK_fns lock_fns;
676
+ } dynamic_fns;
677
+
678
+ /* The version checking function should be of this prototype. NB: The
679
+ * ossl_version value passed in is the OSSL_DYNAMIC_VERSION of the loading code.
680
+ * If this function returns zero, it indicates a (potential) version
681
+ * incompatibility and the loaded library doesn't believe it can proceed.
682
+ * Otherwise, the returned value is the (latest) version supported by the
683
+ * loading library. The loader may still decide that the loaded code's version
684
+ * is unsatisfactory and could veto the load. The function is expected to
685
+ * be implemented with the symbol name "v_check", and a default implementation
686
+ * can be fully instantiated with IMPLEMENT_DYNAMIC_CHECK_FN(). */
687
+ typedef unsigned long (*dynamic_v_check_fn)(unsigned long ossl_version);
688
+ #define IMPLEMENT_DYNAMIC_CHECK_FN() \
689
+ OPENSSL_EXPORT unsigned long v_check(unsigned long v); \
690
+ OPENSSL_EXPORT unsigned long v_check(unsigned long v) { \
691
+ if(v >= OSSL_DYNAMIC_OLDEST) return OSSL_DYNAMIC_VERSION; \
692
+ return 0; }
693
+
694
+ /* This function is passed the ENGINE structure to initialise with its own
695
+ * function and command settings. It should not adjust the structural or
696
+ * functional reference counts. If this function returns zero, (a) the load will
697
+ * be aborted, (b) the previous ENGINE state will be memcpy'd back onto the
698
+ * structure, and (c) the shared library will be unloaded. So implementations
699
+ * should do their own internal cleanup in failure circumstances otherwise they
700
+ * could leak. The 'id' parameter, if non-NULL, represents the ENGINE id that
701
+ * the loader is looking for. If this is NULL, the shared library can choose to
702
+ * return failure or to initialise a 'default' ENGINE. If non-NULL, the shared
703
+ * library must initialise only an ENGINE matching the passed 'id'. The function
704
+ * is expected to be implemented with the symbol name "bind_engine". A standard
705
+ * implementation can be instantiated with IMPLEMENT_DYNAMIC_BIND_FN(fn) where
706
+ * the parameter 'fn' is a callback function that populates the ENGINE structure
707
+ * and returns an int value (zero for failure). 'fn' should have prototype;
708
+ * [static] int fn(ENGINE *e, const char *id); */
709
+ typedef int (*dynamic_bind_engine)(ENGINE *e, const char *id,
710
+ const dynamic_fns *fns);
711
+ #define IMPLEMENT_DYNAMIC_BIND_FN(fn) \
712
+ OPENSSL_EXPORT \
713
+ int bind_engine(ENGINE *e, const char *id, const dynamic_fns *fns); \
714
+ OPENSSL_EXPORT \
715
+ int bind_engine(ENGINE *e, const char *id, const dynamic_fns *fns) { \
716
+ if(ENGINE_get_static_state() == fns->static_state) goto skip_cbs; \
717
+ if(!CRYPTO_set_mem_functions(fns->mem_fns.malloc_cb, \
718
+ fns->mem_fns.realloc_cb, fns->mem_fns.free_cb)) \
719
+ return 0; \
720
+ CRYPTO_set_locking_callback(fns->lock_fns.lock_locking_cb); \
721
+ CRYPTO_set_add_lock_callback(fns->lock_fns.lock_add_lock_cb); \
722
+ CRYPTO_set_dynlock_create_callback(fns->lock_fns.dynlock_create_cb); \
723
+ CRYPTO_set_dynlock_lock_callback(fns->lock_fns.dynlock_lock_cb); \
724
+ CRYPTO_set_dynlock_destroy_callback(fns->lock_fns.dynlock_destroy_cb); \
725
+ if(!CRYPTO_set_ex_data_implementation(fns->ex_data_fns)) \
726
+ return 0; \
727
+ if(!ERR_set_implementation(fns->err_fns)) return 0; \
728
+ skip_cbs: \
729
+ if(!fn(e,id)) return 0; \
730
+ return 1; }
731
+
732
+ /* If the loading application (or library) and the loaded ENGINE library share
733
+ * the same static data (eg. they're both dynamically linked to the same
734
+ * libcrypto.so) we need a way to avoid trying to set system callbacks - this
735
+ * would fail, and for the same reason that it's unnecessary to try. If the
736
+ * loaded ENGINE has (or gets from through the loader) its own copy of the
737
+ * libcrypto static data, we will need to set the callbacks. The easiest way to
738
+ * detect this is to have a function that returns a pointer to some static data
739
+ * and let the loading application and loaded ENGINE compare their respective
740
+ * values. */
741
+ void *ENGINE_get_static_state(void);
742
+
743
+ #if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(HAVE_CRYPTODEV)
744
+ void ENGINE_setup_bsd_cryptodev(void);
745
+ #endif
746
+
747
+ /* BEGIN ERROR CODES */
748
+ /* The following lines are auto generated by the script mkerr.pl. Any changes
749
+ * made after this point may be overwritten when the script is next run.
750
+ */
751
+ void ERR_load_ENGINE_strings(void);
752
+
753
+ /* Error codes for the ENGINE functions. */
754
+
755
+ /* Function codes. */
756
+ #define ENGINE_F_DYNAMIC_CTRL 180
757
+ #define ENGINE_F_DYNAMIC_GET_DATA_CTX 181
758
+ #define ENGINE_F_DYNAMIC_LOAD 182
759
+ #define ENGINE_F_DYNAMIC_SET_DATA_CTX 183
760
+ #define ENGINE_F_ENGINE_ADD 105
761
+ #define ENGINE_F_ENGINE_BY_ID 106
762
+ #define ENGINE_F_ENGINE_CMD_IS_EXECUTABLE 170
763
+ #define ENGINE_F_ENGINE_CTRL 142
764
+ #define ENGINE_F_ENGINE_CTRL_CMD 178
765
+ #define ENGINE_F_ENGINE_CTRL_CMD_STRING 171
766
+ #define ENGINE_F_ENGINE_FINISH 107
767
+ #define ENGINE_F_ENGINE_FREE_UTIL 108
768
+ #define ENGINE_F_ENGINE_GET_CIPHER 185
769
+ #define ENGINE_F_ENGINE_GET_DEFAULT_TYPE 177
770
+ #define ENGINE_F_ENGINE_GET_DIGEST 186
771
+ #define ENGINE_F_ENGINE_GET_NEXT 115
772
+ #define ENGINE_F_ENGINE_GET_PKEY_ASN1_METH 193
773
+ #define ENGINE_F_ENGINE_GET_PKEY_METH 192
774
+ #define ENGINE_F_ENGINE_GET_PREV 116
775
+ #define ENGINE_F_ENGINE_INIT 119
776
+ #define ENGINE_F_ENGINE_LIST_ADD 120
777
+ #define ENGINE_F_ENGINE_LIST_REMOVE 121
778
+ #define ENGINE_F_ENGINE_LOAD_PRIVATE_KEY 150
779
+ #define ENGINE_F_ENGINE_LOAD_PUBLIC_KEY 151
780
+ #define ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT 194
781
+ #define ENGINE_F_ENGINE_NEW 122
782
+ #define ENGINE_F_ENGINE_REMOVE 123
783
+ #define ENGINE_F_ENGINE_SET_DEFAULT_STRING 189
784
+ #define ENGINE_F_ENGINE_SET_DEFAULT_TYPE 126
785
+ #define ENGINE_F_ENGINE_SET_ID 129
786
+ #define ENGINE_F_ENGINE_SET_NAME 130
787
+ #define ENGINE_F_ENGINE_TABLE_REGISTER 184
788
+ #define ENGINE_F_ENGINE_UNLOAD_KEY 152
789
+ #define ENGINE_F_ENGINE_UNLOCKED_FINISH 191
790
+ #define ENGINE_F_ENGINE_UP_REF 190
791
+ #define ENGINE_F_INT_CTRL_HELPER 172
792
+ #define ENGINE_F_INT_ENGINE_CONFIGURE 188
793
+ #define ENGINE_F_INT_ENGINE_MODULE_INIT 187
794
+ #define ENGINE_F_LOG_MESSAGE 141
795
+
796
+ /* Reason codes. */
797
+ #define ENGINE_R_ALREADY_LOADED 100
798
+ #define ENGINE_R_ARGUMENT_IS_NOT_A_NUMBER 133
799
+ #define ENGINE_R_CMD_NOT_EXECUTABLE 134
800
+ #define ENGINE_R_COMMAND_TAKES_INPUT 135
801
+ #define ENGINE_R_COMMAND_TAKES_NO_INPUT 136
802
+ #define ENGINE_R_CONFLICTING_ENGINE_ID 103
803
+ #define ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED 119
804
+ #define ENGINE_R_DH_NOT_IMPLEMENTED 139
805
+ #define ENGINE_R_DSA_NOT_IMPLEMENTED 140
806
+ #define ENGINE_R_DSO_FAILURE 104
807
+ #define ENGINE_R_DSO_NOT_FOUND 132
808
+ #define ENGINE_R_ENGINES_SECTION_ERROR 148
809
+ #define ENGINE_R_ENGINE_CONFIGURATION_ERROR 102
810
+ #define ENGINE_R_ENGINE_IS_NOT_IN_LIST 105
811
+ #define ENGINE_R_ENGINE_SECTION_ERROR 149
812
+ #define ENGINE_R_FAILED_LOADING_PRIVATE_KEY 128
813
+ #define ENGINE_R_FAILED_LOADING_PUBLIC_KEY 129
814
+ #define ENGINE_R_FINISH_FAILED 106
815
+ #define ENGINE_R_GET_HANDLE_FAILED 107
816
+ #define ENGINE_R_ID_OR_NAME_MISSING 108
817
+ #define ENGINE_R_INIT_FAILED 109
818
+ #define ENGINE_R_INTERNAL_LIST_ERROR 110
819
+ #define ENGINE_R_INVALID_ARGUMENT 143
820
+ #define ENGINE_R_INVALID_CMD_NAME 137
821
+ #define ENGINE_R_INVALID_CMD_NUMBER 138
822
+ #define ENGINE_R_INVALID_INIT_VALUE 151
823
+ #define ENGINE_R_INVALID_STRING 150
824
+ #define ENGINE_R_NOT_INITIALISED 117
825
+ #define ENGINE_R_NOT_LOADED 112
826
+ #define ENGINE_R_NO_CONTROL_FUNCTION 120
827
+ #define ENGINE_R_NO_INDEX 144
828
+ #define ENGINE_R_NO_LOAD_FUNCTION 125
829
+ #define ENGINE_R_NO_REFERENCE 130
830
+ #define ENGINE_R_NO_SUCH_ENGINE 116
831
+ #define ENGINE_R_NO_UNLOAD_FUNCTION 126
832
+ #define ENGINE_R_PROVIDE_PARAMETERS 113
833
+ #define ENGINE_R_RSA_NOT_IMPLEMENTED 141
834
+ #define ENGINE_R_UNIMPLEMENTED_CIPHER 146
835
+ #define ENGINE_R_UNIMPLEMENTED_DIGEST 147
836
+ #define ENGINE_R_UNIMPLEMENTED_PUBLIC_KEY_METHOD 101
837
+ #define ENGINE_R_VERSION_INCOMPATIBILITY 145
838
+
839
+ #ifdef __cplusplus
840
+ }
841
+ #endif
842
+ #endif