diff options
Diffstat (limited to 'src/lib/libcrypto/evp/names.c')
-rw-r--r-- | src/lib/libcrypto/evp/names.c | 87 |
1 files changed, 79 insertions, 8 deletions
diff --git a/src/lib/libcrypto/evp/names.c b/src/lib/libcrypto/evp/names.c index e2e04c3570..f2869f5c78 100644 --- a/src/lib/libcrypto/evp/names.c +++ b/src/lib/libcrypto/evp/names.c | |||
@@ -66,35 +66,32 @@ int EVP_add_cipher(const EVP_CIPHER *c) | |||
66 | { | 66 | { |
67 | int r; | 67 | int r; |
68 | 68 | ||
69 | #ifdef OPENSSL_FIPS | ||
70 | OPENSSL_init(); | ||
71 | #endif | ||
72 | |||
73 | r=OBJ_NAME_add(OBJ_nid2sn(c->nid),OBJ_NAME_TYPE_CIPHER_METH,(const char *)c); | 69 | r=OBJ_NAME_add(OBJ_nid2sn(c->nid),OBJ_NAME_TYPE_CIPHER_METH,(const char *)c); |
74 | if (r == 0) return(0); | 70 | if (r == 0) return(0); |
71 | check_defer(c->nid); | ||
75 | r=OBJ_NAME_add(OBJ_nid2ln(c->nid),OBJ_NAME_TYPE_CIPHER_METH,(const char *)c); | 72 | r=OBJ_NAME_add(OBJ_nid2ln(c->nid),OBJ_NAME_TYPE_CIPHER_METH,(const char *)c); |
76 | return(r); | 73 | return(r); |
77 | } | 74 | } |
78 | 75 | ||
76 | |||
79 | int EVP_add_digest(const EVP_MD *md) | 77 | int EVP_add_digest(const EVP_MD *md) |
80 | { | 78 | { |
81 | int r; | 79 | int r; |
82 | const char *name; | 80 | const char *name; |
83 | 81 | ||
84 | #ifdef OPENSSL_FIPS | ||
85 | OPENSSL_init(); | ||
86 | #endif | ||
87 | name=OBJ_nid2sn(md->type); | 82 | name=OBJ_nid2sn(md->type); |
88 | r=OBJ_NAME_add(name,OBJ_NAME_TYPE_MD_METH,(const char *)md); | 83 | r=OBJ_NAME_add(name,OBJ_NAME_TYPE_MD_METH,(const char *)md); |
89 | if (r == 0) return(0); | 84 | if (r == 0) return(0); |
85 | check_defer(md->type); | ||
90 | r=OBJ_NAME_add(OBJ_nid2ln(md->type),OBJ_NAME_TYPE_MD_METH,(const char *)md); | 86 | r=OBJ_NAME_add(OBJ_nid2ln(md->type),OBJ_NAME_TYPE_MD_METH,(const char *)md); |
91 | if (r == 0) return(0); | 87 | if (r == 0) return(0); |
92 | 88 | ||
93 | if (md->type != md->pkey_type) | 89 | if (md->pkey_type && md->type != md->pkey_type) |
94 | { | 90 | { |
95 | r=OBJ_NAME_add(OBJ_nid2sn(md->pkey_type), | 91 | r=OBJ_NAME_add(OBJ_nid2sn(md->pkey_type), |
96 | OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS,name); | 92 | OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS,name); |
97 | if (r == 0) return(0); | 93 | if (r == 0) return(0); |
94 | check_defer(md->pkey_type); | ||
98 | r=OBJ_NAME_add(OBJ_nid2ln(md->pkey_type), | 95 | r=OBJ_NAME_add(OBJ_nid2ln(md->pkey_type), |
99 | OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS,name); | 96 | OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS,name); |
100 | } | 97 | } |
@@ -127,4 +124,78 @@ void EVP_cleanup(void) | |||
127 | OBJ_NAME_cleanup(-1); | 124 | OBJ_NAME_cleanup(-1); |
128 | 125 | ||
129 | EVP_PBE_cleanup(); | 126 | EVP_PBE_cleanup(); |
127 | if (obj_cleanup_defer == 2) | ||
128 | { | ||
129 | obj_cleanup_defer = 0; | ||
130 | OBJ_cleanup(); | ||
131 | } | ||
132 | OBJ_sigid_free(); | ||
133 | } | ||
134 | |||
135 | struct doall_cipher | ||
136 | { | ||
137 | void *arg; | ||
138 | void (*fn)(const EVP_CIPHER *ciph, | ||
139 | const char *from, const char *to, void *arg); | ||
140 | }; | ||
141 | |||
142 | static void do_all_cipher_fn(const OBJ_NAME *nm, void *arg) | ||
143 | { | ||
144 | struct doall_cipher *dc = arg; | ||
145 | if (nm->alias) | ||
146 | dc->fn(NULL, nm->name, nm->data, dc->arg); | ||
147 | else | ||
148 | dc->fn((const EVP_CIPHER *)nm->data, nm->name, NULL, dc->arg); | ||
149 | } | ||
150 | |||
151 | void EVP_CIPHER_do_all(void (*fn)(const EVP_CIPHER *ciph, | ||
152 | const char *from, const char *to, void *x), void *arg) | ||
153 | { | ||
154 | struct doall_cipher dc; | ||
155 | dc.fn = fn; | ||
156 | dc.arg = arg; | ||
157 | OBJ_NAME_do_all(OBJ_NAME_TYPE_CIPHER_METH, do_all_cipher_fn, &dc); | ||
158 | } | ||
159 | |||
160 | void EVP_CIPHER_do_all_sorted(void (*fn)(const EVP_CIPHER *ciph, | ||
161 | const char *from, const char *to, void *x), void *arg) | ||
162 | { | ||
163 | struct doall_cipher dc; | ||
164 | dc.fn = fn; | ||
165 | dc.arg = arg; | ||
166 | OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_CIPHER_METH, do_all_cipher_fn,&dc); | ||
167 | } | ||
168 | |||
169 | struct doall_md | ||
170 | { | ||
171 | void *arg; | ||
172 | void (*fn)(const EVP_MD *ciph, | ||
173 | const char *from, const char *to, void *arg); | ||
174 | }; | ||
175 | |||
176 | static void do_all_md_fn(const OBJ_NAME *nm, void *arg) | ||
177 | { | ||
178 | struct doall_md *dc = arg; | ||
179 | if (nm->alias) | ||
180 | dc->fn(NULL, nm->name, nm->data, dc->arg); | ||
181 | else | ||
182 | dc->fn((const EVP_MD *)nm->data, nm->name, NULL, dc->arg); | ||
183 | } | ||
184 | |||
185 | void EVP_MD_do_all(void (*fn)(const EVP_MD *md, | ||
186 | const char *from, const char *to, void *x), void *arg) | ||
187 | { | ||
188 | struct doall_md dc; | ||
189 | dc.fn = fn; | ||
190 | dc.arg = arg; | ||
191 | OBJ_NAME_do_all(OBJ_NAME_TYPE_MD_METH, do_all_md_fn, &dc); | ||
192 | } | ||
193 | |||
194 | void EVP_MD_do_all_sorted(void (*fn)(const EVP_MD *md, | ||
195 | const char *from, const char *to, void *x), void *arg) | ||
196 | { | ||
197 | struct doall_md dc; | ||
198 | dc.fn = fn; | ||
199 | dc.arg = arg; | ||
200 | OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_MD_METH, do_all_md_fn, &dc); | ||
130 | } | 201 | } |