Index: openssl/crypto/evp/names.c |
=================================================================== |
--- openssl/crypto/evp/names.c (revision 105093) |
+++ openssl/crypto/evp/names.c (working copy) |
@@ -66,27 +66,23 @@ |
{ |
int r; |
-#ifdef OPENSSL_FIPS |
- OPENSSL_init(); |
-#endif |
- |
r=OBJ_NAME_add(OBJ_nid2sn(c->nid),OBJ_NAME_TYPE_CIPHER_METH,(const char *)c); |
if (r == 0) return(0); |
+ check_defer(c->nid); |
r=OBJ_NAME_add(OBJ_nid2ln(c->nid),OBJ_NAME_TYPE_CIPHER_METH,(const char *)c); |
return(r); |
} |
+ |
int EVP_add_digest(const EVP_MD *md) |
{ |
int r; |
const char *name; |
-#ifdef OPENSSL_FIPS |
- OPENSSL_init(); |
-#endif |
name=OBJ_nid2sn(md->type); |
r=OBJ_NAME_add(name,OBJ_NAME_TYPE_MD_METH,(const char *)md); |
if (r == 0) return(0); |
+ check_defer(md->type); |
r=OBJ_NAME_add(OBJ_nid2ln(md->type),OBJ_NAME_TYPE_MD_METH,(const char *)md); |
if (r == 0) return(0); |
@@ -95,6 +91,7 @@ |
r=OBJ_NAME_add(OBJ_nid2sn(md->pkey_type), |
OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS,name); |
if (r == 0) return(0); |
+ check_defer(md->pkey_type); |
r=OBJ_NAME_add(OBJ_nid2ln(md->pkey_type), |
OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS,name); |
} |
@@ -127,4 +124,78 @@ |
OBJ_NAME_cleanup(-1); |
EVP_PBE_cleanup(); |
+ if (obj_cleanup_defer == 2) |
+ { |
+ obj_cleanup_defer = 0; |
+ OBJ_cleanup(); |
+ } |
+ OBJ_sigid_free(); |
} |
+ |
+struct doall_cipher |
+ { |
+ void *arg; |
+ void (*fn)(const EVP_CIPHER *ciph, |
+ const char *from, const char *to, void *arg); |
+ }; |
+ |
+static void do_all_cipher_fn(const OBJ_NAME *nm, void *arg) |
+ { |
+ struct doall_cipher *dc = arg; |
+ if (nm->alias) |
+ dc->fn(NULL, nm->name, nm->data, dc->arg); |
+ else |
+ dc->fn((const EVP_CIPHER *)nm->data, nm->name, NULL, dc->arg); |
+ } |
+ |
+void EVP_CIPHER_do_all(void (*fn)(const EVP_CIPHER *ciph, |
+ const char *from, const char *to, void *x), void *arg) |
+ { |
+ struct doall_cipher dc; |
+ dc.fn = fn; |
+ dc.arg = arg; |
+ OBJ_NAME_do_all(OBJ_NAME_TYPE_CIPHER_METH, do_all_cipher_fn, &dc); |
+ } |
+ |
+void EVP_CIPHER_do_all_sorted(void (*fn)(const EVP_CIPHER *ciph, |
+ const char *from, const char *to, void *x), void *arg) |
+ { |
+ struct doall_cipher dc; |
+ dc.fn = fn; |
+ dc.arg = arg; |
+ OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_CIPHER_METH, do_all_cipher_fn,&dc); |
+ } |
+ |
+struct doall_md |
+ { |
+ void *arg; |
+ void (*fn)(const EVP_MD *ciph, |
+ const char *from, const char *to, void *arg); |
+ }; |
+ |
+static void do_all_md_fn(const OBJ_NAME *nm, void *arg) |
+ { |
+ struct doall_md *dc = arg; |
+ if (nm->alias) |
+ dc->fn(NULL, nm->name, nm->data, dc->arg); |
+ else |
+ dc->fn((const EVP_MD *)nm->data, nm->name, NULL, dc->arg); |
+ } |
+ |
+void EVP_MD_do_all(void (*fn)(const EVP_MD *md, |
+ const char *from, const char *to, void *x), void *arg) |
+ { |
+ struct doall_md dc; |
+ dc.fn = fn; |
+ dc.arg = arg; |
+ OBJ_NAME_do_all(OBJ_NAME_TYPE_MD_METH, do_all_md_fn, &dc); |
+ } |
+ |
+void EVP_MD_do_all_sorted(void (*fn)(const EVP_MD *md, |
+ const char *from, const char *to, void *x), void *arg) |
+ { |
+ struct doall_md dc; |
+ dc.fn = fn; |
+ dc.arg = arg; |
+ OBJ_NAME_do_all_sorted(OBJ_NAME_TYPE_MD_METH, do_all_md_fn, &dc); |
+ } |