huangcm
2025-09-01 53d8e046ac1bf2ebe94f671983e3d3be059df91a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#ifndef HEADER_ENGINE_INT_H
#define HEADER_ENGINE_INT_H
 
#include "cryptlib.h"
/* Take public definitions from engine.h */
#include "engine.h"
 
#ifdef __cplusplus
extern "C" {
#endif
 
#ifdef ENGINE_REF_COUNT_DEBUG
 
#define engine_ref_debug(e, isfunct, diff)                                     \
   fprintf(stderr, "engine: %08x %s from %d to %d (%s:%d)\n",             \
       (unsigned int)(e), (isfunct ? "funct" : "struct"),             \
       ((isfunct) ? ((e)->funct_ref - (diff)) :                       \
                ((e)->struct_ref - (diff))),                      \
       ((isfunct) ? (e)->funct_ref : (e)->struct_ref), (__FILE__),    \
       (__LINE__));
 
#else
 
#define engine_ref_debug(e, isfunct, diff)
 
#endif
 
/* Any code that will need cleanup operations should use these functions to
 * register callbacks. ENGINE_cleanup() will call all registered callbacks in
 * order. NB: both the "add" functions assume CRYPTO_LOCK_ENGINE to already be
 * held (in "write" mode). */
typedef void(ENGINE_CLEANUP_CB)(void);
typedef struct st_engine_cleanup_item {
   ENGINE_CLEANUP_CB *cb;
} ENGINE_CLEANUP_ITEM;
DECLARE_STACK_OF(ENGINE_CLEANUP_ITEM)
void engine_cleanup_add_first(ENGINE_CLEANUP_CB *cb);
void engine_cleanup_add_last(ENGINE_CLEANUP_CB *cb);
 
/* We need stacks of ENGINEs for use in eng_table.c */
DECLARE_STACK_OF(ENGINE)
 
/* If this symbol is defined then engine_table_select(), the function that is
 * used by RSA, DSA (etc) code to select registered ENGINEs, cache defaults and
 * functional references (etc), will display debugging summaries to stderr. */
/* #define ENGINE_TABLE_DEBUG */
 
/* This represents an implementation table. Dependent code should instantiate it
 * as a (ENGINE_TABLE *) pointer value set initially to NULL. */
typedef struct st_engine_table ENGINE_TABLE;
int engine_table_register(ENGINE_TABLE **table, ENGINE_CLEANUP_CB *cleanup,
             ENGINE *e, const int *nids, int num_nids,
             int setdefault);
void engine_table_unregister(ENGINE_TABLE **table, ENGINE *e);
void engine_table_cleanup(ENGINE_TABLE **table);
#ifndef ENGINE_TABLE_DEBUG
ENGINE *engine_table_select(ENGINE_TABLE **table, int nid);
#else
ENGINE *engine_table_select_tmp(ENGINE_TABLE **table, int nid, const char *f,
               int l);
#define engine_table_select(t, n)                                              \
   engine_table_select_tmp(t, n, __FILE__, __LINE__)
#endif
 
/* Internal versions of API functions that have control over locking. These are
 * used between C files when functionality needs to be shared but the caller may
 * already be controlling of the CRYPTO_LOCK_ENGINE lock. */
int engine_unlocked_init(ENGINE *e);
int engine_unlocked_finish(ENGINE *e, int unlock_for_handlers);
int engine_free_util(ENGINE *e, int locked);
 
/* This function will reset all "set"able values in an ENGINE to NULL. This
 * won't touch reference counts or ex_data, but is equivalent to calling all the
 * ENGINE_set_***() functions with a NULL value. */
void engine_set_all_null(ENGINE *e);
 
/* NB: Bitwise OR-able values for the "flags" variable in ENGINE are now exposed
 * in engine.h. */
 
/* This is a structure for storing implementations of various crypto
 * algorithms and functions. */
struct engine_st {
   const char *id;
   const char *name;
   const RSA_METHOD *rsa_meth;
   const DSA_METHOD *dsa_meth;
   const DH_METHOD *dh_meth;
   const ECDH_METHOD *ecdh_meth;
   const ECDSA_METHOD *ecdsa_meth;
   const RAND_METHOD *rand_meth;
   const STORE_METHOD *store_meth;
   /* Cipher handling is via this callback */
   ENGINE_CIPHERS_PTR ciphers;
   /* Digest handling is via this callback */
   ENGINE_DIGESTS_PTR digests;
 
   ENGINE_GEN_INT_FUNC_PTR destroy;
 
   ENGINE_GEN_INT_FUNC_PTR init;
   ENGINE_GEN_INT_FUNC_PTR finish;
   ENGINE_CTRL_FUNC_PTR ctrl;
   ENGINE_LOAD_KEY_PTR load_privkey;
   ENGINE_LOAD_KEY_PTR load_pubkey;
 
   ENGINE_SSL_CLIENT_CERT_PTR load_ssl_client_cert;
 
   const ENGINE_CMD_DEFN *cmd_defns;
   int flags;
   /* reference count on the structure itself */
   int struct_ref;
   /* reference count on usability of the engine type. NB: This
    * controls the loading and initialisation of any functionlity
    * required by this engine, whereas the previous count is
    * simply to cope with (de)allocation of this structure. Hence,
    * running_ref <= struct_ref at all times. */
   int funct_ref;
   /* A place to store per-ENGINE data */
   CRYPTO_EX_DATA ex_data;
   /* Used to maintain the linked-list of engines. */
   struct engine_st *prev;
   struct engine_st *next;
};
 
#ifdef __cplusplus
}
#endif
 
#endif /* HEADER_ENGINE_INT_H */