diff options
-rw-r--r-- | src/lib/libcrypto/evp/evp_names.c | 162 | ||||
-rw-r--r-- | src/lib/libcrypto/evp/names.c | 93 | ||||
-rw-r--r-- | src/lib/libcrypto/objects/o_names.c | 81 |
3 files changed, 161 insertions, 175 deletions
diff --git a/src/lib/libcrypto/evp/evp_names.c b/src/lib/libcrypto/evp/evp_names.c index fbd84711f5..b5d3b95b45 100644 --- a/src/lib/libcrypto/evp/evp_names.c +++ b/src/lib/libcrypto/evp/evp_names.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: evp_names.c,v 1.2 2024/01/13 11:00:09 tb Exp $ */ | 1 | /* $OpenBSD: evp_names.c,v 1.3 2024/01/13 11:08:39 tb Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2023 Theo Buehler <tb@openbsd.org> | 3 | * Copyright (c) 2023 Theo Buehler <tb@openbsd.org> |
4 | * | 4 | * |
@@ -41,7 +41,7 @@ struct digest_name { | |||
41 | * regress/lib/libcrypto/evp/evp_test.c checks that. | 41 | * regress/lib/libcrypto/evp/evp_test.c checks that. |
42 | */ | 42 | */ |
43 | 43 | ||
44 | const struct cipher_name cipher_names[] = { | 44 | static const struct cipher_name cipher_names[] = { |
45 | #ifndef OPENSSL_NO_AES | 45 | #ifndef OPENSSL_NO_AES |
46 | { | 46 | { |
47 | .name = SN_aes_128_cbc, | 47 | .name = SN_aes_128_cbc, |
@@ -1099,7 +1099,7 @@ const struct cipher_name cipher_names[] = { | |||
1099 | * regresss/lib/libcrypto/evp/evp_test.c checks that. | 1099 | * regresss/lib/libcrypto/evp/evp_test.c checks that. |
1100 | */ | 1100 | */ |
1101 | 1101 | ||
1102 | const struct digest_name digest_names[] = { | 1102 | static const struct digest_name digest_names[] = { |
1103 | #ifndef OPENSSL_NO_GOST | 1103 | #ifndef OPENSSL_NO_GOST |
1104 | { | 1104 | { |
1105 | .name = LN_id_Gost28147_89_MAC, | 1105 | .name = LN_id_Gost28147_89_MAC, |
@@ -1559,3 +1559,159 @@ const struct digest_name digest_names[] = { | |||
1559 | }; | 1559 | }; |
1560 | 1560 | ||
1561 | #define N_DIGEST_NAMES (sizeof(digest_names) / sizeof(digest_names[0])) | 1561 | #define N_DIGEST_NAMES (sizeof(digest_names) / sizeof(digest_names[0])) |
1562 | |||
1563 | void | ||
1564 | EVP_CIPHER_do_all_sorted(void (*fn)(const EVP_CIPHER *, const char *, | ||
1565 | const char *, void *), void *arg) | ||
1566 | { | ||
1567 | size_t i; | ||
1568 | |||
1569 | /* Prayer and clean living lets you ignore errors, OpenSSL style. */ | ||
1570 | (void)OPENSSL_init_crypto(0, NULL); | ||
1571 | |||
1572 | for (i = 0; i < N_CIPHER_NAMES; i++) { | ||
1573 | const struct cipher_name *cipher = &cipher_names[i]; | ||
1574 | const EVP_CIPHER *evp_cipher; | ||
1575 | |||
1576 | if ((evp_cipher = cipher->cipher()) == NULL) | ||
1577 | continue; | ||
1578 | |||
1579 | if (cipher->alias != NULL) | ||
1580 | fn(NULL, cipher->name, cipher->alias, arg); | ||
1581 | else | ||
1582 | fn(evp_cipher, cipher->name, NULL, arg); | ||
1583 | } | ||
1584 | } | ||
1585 | |||
1586 | void | ||
1587 | EVP_CIPHER_do_all(void (*fn)(const EVP_CIPHER *, const char *, const char *, | ||
1588 | void *), void *arg) | ||
1589 | { | ||
1590 | EVP_CIPHER_do_all_sorted(fn, arg); | ||
1591 | } | ||
1592 | |||
1593 | void | ||
1594 | EVP_MD_do_all_sorted(void (*fn)(const EVP_MD *, const char *, const char *, | ||
1595 | void *), void *arg) | ||
1596 | { | ||
1597 | size_t i; | ||
1598 | |||
1599 | /* Prayer and clean living lets you ignore errors, OpenSSL style. */ | ||
1600 | (void)OPENSSL_init_crypto(0, NULL); | ||
1601 | |||
1602 | for (i = 0; i < N_DIGEST_NAMES; i++) { | ||
1603 | const struct digest_name *digest = &digest_names[i]; | ||
1604 | const EVP_MD *evp_md; | ||
1605 | |||
1606 | if ((evp_md = digest->digest()) == NULL) | ||
1607 | continue; | ||
1608 | |||
1609 | if (digest->alias != NULL) | ||
1610 | fn(NULL, digest->name, digest->alias, arg); | ||
1611 | else | ||
1612 | fn(evp_md, digest->name, NULL, arg); | ||
1613 | } | ||
1614 | } | ||
1615 | |||
1616 | void | ||
1617 | EVP_MD_do_all(void (*fn)(const EVP_MD *, const char *, const char *, void *), | ||
1618 | void *arg) | ||
1619 | { | ||
1620 | EVP_MD_do_all_sorted(fn, arg); | ||
1621 | } | ||
1622 | |||
1623 | /* | ||
1624 | * The OBJ_NAME API is completely misnamed. It has little to do with objects | ||
1625 | * and a lot to do with EVP. Therefore we implement a saner replacement for | ||
1626 | * the part of the old madness that we need to keep in the evp directory. | ||
1627 | */ | ||
1628 | |||
1629 | static int | ||
1630 | OBJ_NAME_from_cipher_name(OBJ_NAME *obj_name, const struct cipher_name *cipher) | ||
1631 | { | ||
1632 | const EVP_CIPHER *evp_cipher; | ||
1633 | |||
1634 | if ((evp_cipher = cipher->cipher()) == NULL) | ||
1635 | return 0; | ||
1636 | |||
1637 | obj_name->type = OBJ_NAME_TYPE_CIPHER_METH; | ||
1638 | obj_name->name = cipher->name; | ||
1639 | if (cipher->alias != NULL) { | ||
1640 | obj_name->alias = OBJ_NAME_ALIAS; | ||
1641 | obj_name->data = cipher->alias; | ||
1642 | } else { | ||
1643 | obj_name->alias = 0; | ||
1644 | obj_name->data = (const char *)evp_cipher; | ||
1645 | } | ||
1646 | |||
1647 | return 1; | ||
1648 | } | ||
1649 | |||
1650 | static void | ||
1651 | OBJ_NAME_do_all_ciphers(void (*fn)(const OBJ_NAME *, void *), void *arg) | ||
1652 | { | ||
1653 | size_t i; | ||
1654 | |||
1655 | for (i = 0; i < N_CIPHER_NAMES; i++) { | ||
1656 | const struct cipher_name *cipher = &cipher_names[i]; | ||
1657 | OBJ_NAME name; | ||
1658 | |||
1659 | if (OBJ_NAME_from_cipher_name(&name, cipher)) | ||
1660 | fn(&name, arg); | ||
1661 | } | ||
1662 | } | ||
1663 | |||
1664 | static int | ||
1665 | OBJ_NAME_from_digest_name(OBJ_NAME *obj_name, const struct digest_name *digest) | ||
1666 | { | ||
1667 | const EVP_MD *evp_md; | ||
1668 | |||
1669 | if ((evp_md = digest->digest()) == NULL) | ||
1670 | return 0; | ||
1671 | |||
1672 | obj_name->type = OBJ_NAME_TYPE_MD_METH; | ||
1673 | obj_name->name = digest->name; | ||
1674 | if (digest->alias != NULL) { | ||
1675 | obj_name->alias = OBJ_NAME_ALIAS; | ||
1676 | obj_name->data = digest->alias; | ||
1677 | } else { | ||
1678 | obj_name->alias = 0; | ||
1679 | obj_name->data = (const char *)evp_md; | ||
1680 | } | ||
1681 | |||
1682 | return 1; | ||
1683 | } | ||
1684 | |||
1685 | static void | ||
1686 | OBJ_NAME_do_all_digests(void (*fn)(const OBJ_NAME *, void *), void *arg) | ||
1687 | { | ||
1688 | size_t i; | ||
1689 | |||
1690 | for (i = 0; i < N_DIGEST_NAMES; i++) { | ||
1691 | const struct digest_name *digest = &digest_names[i]; | ||
1692 | OBJ_NAME name; | ||
1693 | |||
1694 | if (OBJ_NAME_from_digest_name(&name, digest)) | ||
1695 | fn(&name, arg); | ||
1696 | } | ||
1697 | } | ||
1698 | |||
1699 | void | ||
1700 | OBJ_NAME_do_all_sorted(int type, void (*fn)(const OBJ_NAME *, void *), void *arg) | ||
1701 | { | ||
1702 | /* Prayer and clean living lets you ignore errors, OpenSSL style. */ | ||
1703 | (void)OPENSSL_init_crypto(0, NULL); | ||
1704 | |||
1705 | if (type == OBJ_NAME_TYPE_CIPHER_METH) | ||
1706 | OBJ_NAME_do_all_ciphers(fn, arg); | ||
1707 | if (type == OBJ_NAME_TYPE_MD_METH) | ||
1708 | OBJ_NAME_do_all_digests(fn, arg); | ||
1709 | } | ||
1710 | LCRYPTO_ALIAS(OBJ_NAME_do_all_sorted); | ||
1711 | |||
1712 | void | ||
1713 | OBJ_NAME_do_all(int type, void (*fn)(const OBJ_NAME *, void *), void *arg) | ||
1714 | { | ||
1715 | OBJ_NAME_do_all_sorted(type, fn, arg); | ||
1716 | } | ||
1717 | LCRYPTO_ALIAS(OBJ_NAME_do_all); | ||
diff --git a/src/lib/libcrypto/evp/names.c b/src/lib/libcrypto/evp/names.c index a96301ed56..7f5b455088 100644 --- a/src/lib/libcrypto/evp/names.c +++ b/src/lib/libcrypto/evp/names.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: names.c,v 1.22 2023/12/15 14:22:10 tb Exp $ */ | 1 | /* $OpenBSD: names.c,v 1.23 2024/01/13 11:08:39 tb Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -146,94 +146,3 @@ EVP_cleanup(void) | |||
146 | OBJ_cleanup(); | 146 | OBJ_cleanup(); |
147 | } | 147 | } |
148 | } | 148 | } |
149 | |||
150 | struct doall_cipher { | ||
151 | void *arg; | ||
152 | void (*fn)(const EVP_CIPHER *ciph, const char *from, const char *to, | ||
153 | void *arg); | ||
154 | }; | ||
155 | |||
156 | static void | ||
157 | do_all_cipher_fn(const OBJ_NAME *nm, void *arg) | ||
158 | { | ||
159 | struct doall_cipher *dc = arg; | ||
160 | |||
161 | if (nm->alias) | ||
162 | dc->fn(NULL, nm->name, nm->data, dc->arg); | ||
163 | else | ||
164 | dc->fn((const EVP_CIPHER *)nm->data, nm->name, NULL, dc->arg); | ||
165 | } | ||
166 | |||
167 | void | ||
168 | EVP_CIPHER_do_all(void (*fn)(const EVP_CIPHER *ciph, const char *from, | ||
169 | const char *to, void *x), void *arg) | ||
170 | { | ||
171 | struct doall_cipher dc; | ||
172 | |||
173 | /* Prayer and clean living lets you ignore errors, OpenSSL style */ | ||
174 | (void) OPENSSL_init_crypto(0, NULL); | ||
175 | |||
176 | dc.fn = fn; | ||
177 | dc.arg = arg; | ||
178 | OBJ_NAME_do_all(OBJ_NAME_TYPE_CIPHER_METH, do_all_cipher_fn, &dc); | ||
179 | } | ||
180 | |||
181 | void | ||
182 | EVP_CIPHER_do_all_sorted(void (*fn)(const EVP_CIPHER *ciph, const char *from, | ||
183 | const char *to, void *x), void *arg) | ||
184 | { | ||
185 | struct doall_cipher dc; | ||
186 | |||
187 | /* Prayer and clean living lets you ignore errors, OpenSSL style */ | ||
188 | (void) OPENSSL_init_crypto(0, NULL); | ||
189 | |||
190 | dc.fn = fn; | ||
191 | dc.arg = arg; | ||
192 | OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_CIPHER_METH, | ||
193 | do_all_cipher_fn, &dc); | ||
194 | } | ||
195 | |||
196 | struct doall_md { | ||
197 | void *arg; | ||
198 | void (*fn)(const EVP_MD *ciph, const char *from, const char *to, | ||
199 | void *arg); | ||
200 | }; | ||
201 | |||
202 | static void | ||
203 | do_all_md_fn(const OBJ_NAME *nm, void *arg) | ||
204 | { | ||
205 | struct doall_md *dc = arg; | ||
206 | |||
207 | if (nm->alias) | ||
208 | dc->fn(NULL, nm->name, nm->data, dc->arg); | ||
209 | else | ||
210 | dc->fn((const EVP_MD *)nm->data, nm->name, NULL, dc->arg); | ||
211 | } | ||
212 | |||
213 | void | ||
214 | EVP_MD_do_all(void (*fn)(const EVP_MD *md, const char *from, const char *to, | ||
215 | void *x), void *arg) | ||
216 | { | ||
217 | struct doall_md dc; | ||
218 | |||
219 | /* Prayer and clean living lets you ignore errors, OpenSSL style */ | ||
220 | (void) OPENSSL_init_crypto(0, NULL); | ||
221 | |||
222 | dc.fn = fn; | ||
223 | dc.arg = arg; | ||
224 | OBJ_NAME_do_all(OBJ_NAME_TYPE_MD_METH, do_all_md_fn, &dc); | ||
225 | } | ||
226 | |||
227 | void | ||
228 | EVP_MD_do_all_sorted(void (*fn)(const EVP_MD *md, | ||
229 | const char *from, const char *to, void *x), void *arg) | ||
230 | { | ||
231 | struct doall_md dc; | ||
232 | |||
233 | /* Prayer and clean living lets you ignore errors, OpenSSL style */ | ||
234 | (void) OPENSSL_init_crypto(0, NULL); | ||
235 | |||
236 | dc.fn = fn; | ||
237 | dc.arg = arg; | ||
238 | OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_MD_METH, do_all_md_fn, &dc); | ||
239 | } | ||
diff --git a/src/lib/libcrypto/objects/o_names.c b/src/lib/libcrypto/objects/o_names.c index 48b95d6767..1007c5e23a 100644 --- a/src/lib/libcrypto/objects/o_names.c +++ b/src/lib/libcrypto/objects/o_names.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: o_names.c,v 1.24 2023/07/08 12:27:51 beck Exp $ */ | 1 | /* $OpenBSD: o_names.c,v 1.25 2024/01/13 11:08:39 tb Exp $ */ |
2 | #include <stdio.h> | 2 | #include <stdio.h> |
3 | #include <stdlib.h> | 3 | #include <stdlib.h> |
4 | #include <string.h> | 4 | #include <string.h> |
@@ -240,85 +240,6 @@ OBJ_NAME_remove(const char *name, int type) | |||
240 | } | 240 | } |
241 | LCRYPTO_ALIAS(OBJ_NAME_remove); | 241 | LCRYPTO_ALIAS(OBJ_NAME_remove); |
242 | 242 | ||
243 | struct doall { | ||
244 | int type; | ||
245 | void (*fn)(const OBJ_NAME *, void *arg); | ||
246 | void *arg; | ||
247 | }; | ||
248 | |||
249 | static void | ||
250 | do_all_fn_doall_arg(const OBJ_NAME *name, struct doall *d) | ||
251 | { | ||
252 | if (name->type == d->type) | ||
253 | d->fn(name, d->arg); | ||
254 | } | ||
255 | |||
256 | static IMPLEMENT_LHASH_DOALL_ARG_FN(do_all_fn, const OBJ_NAME, struct doall) | ||
257 | |||
258 | void | ||
259 | OBJ_NAME_do_all(int type, void (*fn)(const OBJ_NAME *, void *arg), void *arg) | ||
260 | { | ||
261 | struct doall d; | ||
262 | |||
263 | d.type = type; | ||
264 | d.fn = fn; | ||
265 | d.arg = arg; | ||
266 | |||
267 | lh_OBJ_NAME_doall_arg(names_lh, LHASH_DOALL_ARG_FN(do_all_fn), | ||
268 | struct doall, &d); | ||
269 | } | ||
270 | LCRYPTO_ALIAS(OBJ_NAME_do_all); | ||
271 | |||
272 | struct doall_sorted { | ||
273 | int type; | ||
274 | int n; | ||
275 | const OBJ_NAME **names; | ||
276 | }; | ||
277 | |||
278 | static void | ||
279 | do_all_sorted_fn(const OBJ_NAME *name, void *d_) | ||
280 | { | ||
281 | struct doall_sorted *d = d_; | ||
282 | |||
283 | if (name->type != d->type) | ||
284 | return; | ||
285 | |||
286 | d->names[d->n++] = name; | ||
287 | } | ||
288 | |||
289 | static int | ||
290 | do_all_sorted_cmp(const void *n1_, const void *n2_) | ||
291 | { | ||
292 | const OBJ_NAME * const *n1 = n1_; | ||
293 | const OBJ_NAME * const *n2 = n2_; | ||
294 | |||
295 | return strcmp((*n1)->name, (*n2)->name); | ||
296 | } | ||
297 | |||
298 | void | ||
299 | OBJ_NAME_do_all_sorted(int type, void (*fn)(const OBJ_NAME *, void *arg), | ||
300 | void *arg) | ||
301 | { | ||
302 | struct doall_sorted d; | ||
303 | int n; | ||
304 | |||
305 | d.type = type; | ||
306 | d.names = reallocarray(NULL, lh_OBJ_NAME_num_items(names_lh), | ||
307 | sizeof *d.names); | ||
308 | d.n = 0; | ||
309 | if (d.names != NULL) { | ||
310 | OBJ_NAME_do_all(type, do_all_sorted_fn, &d); | ||
311 | |||
312 | qsort((void *)d.names, d.n, sizeof *d.names, do_all_sorted_cmp); | ||
313 | |||
314 | for (n = 0; n < d.n; ++n) | ||
315 | fn(d.names[n], arg); | ||
316 | |||
317 | free(d.names); | ||
318 | } | ||
319 | } | ||
320 | LCRYPTO_ALIAS(OBJ_NAME_do_all_sorted); | ||
321 | |||
322 | static int free_type; | 243 | static int free_type; |
323 | 244 | ||
324 | static void | 245 | static void |