| 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);
 | 
| +	}
 | 
| 
 |