More evil cast removal.
diff --git a/CHANGES b/CHANGES
index 1786aef..83e4ee4 100644
--- a/CHANGES
+++ b/CHANGES
@@ -5,6 +5,9 @@
 
  Changes between 0.9.3a and 0.9.4
 
+  *) Make callbacks for key generation use void * instead of char *.
+     [Ben Laurie]
+
   *) Make S/MIME samples compile (not yet tested).
      [Ben Laurie]
 
diff --git a/apps/gendh.c b/apps/gendh.c
index b3c1958..e5cb646 100644
--- a/apps/gendh.c
+++ b/apps/gendh.c
@@ -74,7 +74,7 @@
 #undef PROG
 #define PROG gendh_main
 
-static void MS_CALLBACK dh_cb(int p, int n, char *arg);
+static void MS_CALLBACK dh_cb(int p, int n, void *arg);
 static long dh_load_rand(char *names);
 int MAIN(int argc, char **argv)
 	{
@@ -164,7 +164,7 @@
 
 	BIO_printf(bio_err,"Generating DH parameters, %d bit long strong prime, generator of %d\n",num,g);
 	BIO_printf(bio_err,"This is going to take a long time\n");
-	dh=DH_generate_parameters(num,g,dh_cb,(char *)bio_err);
+	dh=DH_generate_parameters(num,g,dh_cb,bio_err);
 		
 	if (dh == NULL) goto end;
 
@@ -184,7 +184,7 @@
 	EXIT(ret);
 	}
 
-static void MS_CALLBACK dh_cb(int p, int n, char *arg)
+static void MS_CALLBACK dh_cb(int p, int n, void *arg)
 	{
 	char c='*';
 
diff --git a/apps/genrsa.c b/apps/genrsa.c
index 1cba9f5..9dfeb75 100644
--- a/apps/genrsa.c
+++ b/apps/genrsa.c
@@ -75,7 +75,7 @@
 #undef PROG
 #define PROG genrsa_main
 
-static void MS_CALLBACK genrsa_cb(int p, int n, char *arg);
+static void MS_CALLBACK genrsa_cb(int p, int n, void *arg);
 static long gr_load_rand(char *names);
 int MAIN(int argc, char **argv)
 	{
@@ -194,7 +194,7 @@
 
 	BIO_printf(bio_err,"Generating RSA private key, %d bit long modulus\n",
 		num);
-	rsa=RSA_generate_key(num,f4,genrsa_cb,(char *)bio_err);
+	rsa=RSA_generate_key(num,f4,genrsa_cb,bio_err);
 		
 	if (randfile == NULL)
 		BIO_printf(bio_err,"unable to write 'random state'\n");
@@ -227,7 +227,7 @@
 	EXIT(ret);
 	}
 
-static void MS_CALLBACK genrsa_cb(int p, int n, char *arg)
+static void MS_CALLBACK genrsa_cb(int p, int n, void *arg)
 	{
 	char c='*';
 
diff --git a/apps/req.c b/apps/req.c
index 052cae9..dff16a6 100644
--- a/apps/req.c
+++ b/apps/req.c
@@ -113,7 +113,7 @@
 				int max);
 static int add_DN_object(X509_NAME *n, char *text, char *def, char *value,
 	int nid,int min,int max);
-static void MS_CALLBACK req_cb(int p,int n,char *arg);
+static void MS_CALLBACK req_cb(int p,int n,void *arg);
 static int req_fix_data(int nid,int *type,int len,int min,int max);
 static int check_end(char *str, char *end);
 static int add_oid_section(LHASH *conf);
@@ -513,7 +513,7 @@
 			{
 			if (!EVP_PKEY_assign_RSA(pkey,
 				RSA_generate_key(newkey,0x10001,
-					req_cb,(char *)bio_err)))
+					req_cb,bio_err)))
 				goto end;
 			}
 		else
@@ -1111,7 +1111,7 @@
 	return(0);
 	}
 
-static void MS_CALLBACK req_cb(int p, int n, char *arg)
+static void MS_CALLBACK req_cb(int p, int n, void *arg)
 	{
 	char c='*';
 
diff --git a/crypto/bn/bn.h b/crypto/bn/bn.h
index 230a591..4acd017 100644
--- a/crypto/bn/bn.h
+++ b/crypto/bn/bn.h
@@ -381,9 +381,9 @@
 int	BN_gcd(BIGNUM *r,BIGNUM *in_a,BIGNUM *in_b,BN_CTX *ctx);
 BIGNUM *BN_mod_inverse(BIGNUM *ret,BIGNUM *a, BIGNUM *n,BN_CTX *ctx);
 BIGNUM *BN_generate_prime(BIGNUM *ret,int bits,int strong,BIGNUM *add,
-		BIGNUM *rem,void (*callback)(int,int,char *),char *cb_arg);
-int	BN_is_prime(BIGNUM *p,int nchecks,void (*callback)(int,int,char *),
-		BN_CTX *ctx,char *cb_arg);
+		BIGNUM *rem,void (*callback)(int,int,void *),void *cb_arg);
+int	BN_is_prime(BIGNUM *p,int nchecks,void (*callback)(int,int,void *),
+		BN_CTX *ctx,void *cb_arg);
 void	ERR_load_BN_strings(void );
 
 BN_ULONG bn_mul_add_words(BN_ULONG *rp, BN_ULONG *ap, int num, BN_ULONG w);
diff --git a/crypto/bn/bn_prime.c b/crypto/bn/bn_prime.c
index 118eb35..6fa0f9b 100644
--- a/crypto/bn/bn_prime.c
+++ b/crypto/bn/bn_prime.c
@@ -76,7 +76,7 @@
 static int probable_prime_dh_strong(BIGNUM *rnd, int bits,
 	BIGNUM *add, BIGNUM *rem, BN_CTX *ctx);
 BIGNUM *BN_generate_prime(BIGNUM *ret, int bits, int strong, BIGNUM *add,
-	     BIGNUM *rem, void (*callback)(int,int,char *), char *cb_arg)
+	     BIGNUM *rem, void (*callback)(int,int,void *), void *cb_arg)
 	{
 	BIGNUM *rnd=NULL;
 	BIGNUM t;
@@ -151,8 +151,8 @@
 	return(ret);
 	}
 
-int BN_is_prime(BIGNUM *a, int checks, void (*callback)(int,int,char *),
-	     BN_CTX *ctx_passed, char *cb_arg)
+int BN_is_prime(BIGNUM *a, int checks, void (*callback)(int,int,void *),
+	     BN_CTX *ctx_passed, void *cb_arg)
 	{
 	int i,j,c2=0,ret= -1;
 	BIGNUM *check;
diff --git a/crypto/dh/dh.h b/crypto/dh/dh.h
index 6a0a186..affafd2 100644
--- a/crypto/dh/dh.h
+++ b/crypto/dh/dh.h
@@ -112,7 +112,7 @@
 void	DH_free(DH *dh);
 int	DH_size(DH *dh);
 DH *	DH_generate_parameters(int prime_len,int generator,
-		void (*callback)(int,int,char *),char *cb_arg);
+		void (*callback)(int,int,void *),void *cb_arg);
 int	DH_check(DH *dh,int *codes);
 int	DH_generate_key(DH *dh);
 int	DH_compute_key(unsigned char *key,BIGNUM *pub_key,DH *dh);
diff --git a/crypto/dh/dh_gen.c b/crypto/dh/dh_gen.c
index 4d4aa69..7534ec4 100644
--- a/crypto/dh/dh_gen.c
+++ b/crypto/dh/dh_gen.c
@@ -84,7 +84,7 @@
  */
 
 DH *DH_generate_parameters(int prime_len, int generator,
-	     void (*callback)(int,int,char *), char *cb_arg)
+	     void (*callback)(int,int,void *), void *cb_arg)
 	{
 	BIGNUM *p=NULL,*t1,*t2;
 	DH *ret=NULL;
diff --git a/crypto/dh/dhtest.c b/crypto/dh/dhtest.c
index 370784b..a3f4692 100644
--- a/crypto/dh/dhtest.c
+++ b/crypto/dh/dhtest.c
@@ -81,7 +81,7 @@
 #define MS_CALLBACK
 #endif
 
-static void MS_CALLBACK cb(int p, int n, char *arg);
+static void MS_CALLBACK cb(int p, int n, void *arg);
 #ifdef NO_STDIO
 #define APPS_WIN16
 #include "bss_file.c"
@@ -104,7 +104,7 @@
 	if (out == NULL) exit(1);
 	BIO_set_fp(out,stdout,BIO_NOCLOSE);
 
-	a=DH_generate_parameters(64,DH_GENERATOR_5,cb,(char *)out);
+	a=DH_generate_parameters(64,DH_GENERATOR_5,cb,out);
 	if (a == NULL) goto err;
 
 	BIO_puts(out,"\np    =");
@@ -171,7 +171,7 @@
 	return(ret);
 	}
 
-static void MS_CALLBACK cb(int p, int n, char *arg)
+static void MS_CALLBACK cb(int p, int n, void *arg)
 	{
 	char c='*';
 
diff --git a/crypto/rsa/rsa.h b/crypto/rsa/rsa.h
index 2f53ff0..d38d7f9 100644
--- a/crypto/rsa/rsa.h
+++ b/crypto/rsa/rsa.h
@@ -145,7 +145,7 @@
 RSA *	RSA_new_method(RSA_METHOD *method);
 int	RSA_size(RSA *);
 RSA *	RSA_generate_key(int bits, unsigned long e,void
-		(*callback)(int,int,char *),char *cb_arg);
+		(*callback)(int,int,void *),void *cb_arg);
 	/* next 4 return -1 on error */
 int	RSA_public_encrypt(int flen, unsigned char *from,
 		unsigned char *to, RSA *rsa,int padding);
diff --git a/crypto/rsa/rsa_gen.c b/crypto/rsa/rsa_gen.c
index 8f3279e..89e2f2e 100644
--- a/crypto/rsa/rsa_gen.c
+++ b/crypto/rsa/rsa_gen.c
@@ -63,7 +63,7 @@
 #include <openssl/rsa.h>
 
 RSA *RSA_generate_key(int bits, unsigned long e_value,
-	     void (*callback)(int,int,char *), char *cb_arg)
+	     void (*callback)(int,int,void *), void *cb_arg)
 	{
 	RSA *rsa=NULL;
 	BIGNUM *r0=NULL,*r1=NULL,*r2=NULL,*r3=NULL,*tmp;