提交 d3442bc7 编写于 作者: R Richard Levitte

Move the registration of callback functions to special functions

designed for that.  This removes the potential error to mix data and
function pointers.

Please note that I'm a little unsure how incorrect calls to the old
ctrl functions should be handled, in som cases.  I currently return 0
and that's it, but it may be more correct to generate a genuine error
in those cases.
上级 dab6f095
......@@ -69,6 +69,7 @@ static int buffer_gets(BIO *h,char *str,int size);
static long buffer_ctrl(BIO *h,int cmd,long arg1,char *arg2);
static int buffer_new(BIO *h);
static int buffer_free(BIO *data);
static long buffer_callback_ctrl(BIO *h,int cmd, void (*fp)());
#define DEFAULT_BUFFER_SIZE 1024
static BIO_METHOD methods_buffer=
......@@ -82,6 +83,7 @@ static BIO_METHOD methods_buffer=
buffer_ctrl,
buffer_new,
buffer_free,
buffer_callback_ctrl,
};
BIO_METHOD *BIO_f_buffer(void)
......@@ -284,6 +286,7 @@ static long buffer_ctrl(BIO *b, int cmd, long num, char *ptr)
ctx->ibuf_len=0;
ctx->obuf_off=0;
ctx->obuf_len=0;
if (b->next_bio == NULL) return(0);
ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
break;
case BIO_CTRL_INFO:
......@@ -300,12 +303,18 @@ static long buffer_ctrl(BIO *b, int cmd, long num, char *ptr)
case BIO_CTRL_WPENDING:
ret=(long)ctx->obuf_len;
if (ret == 0)
{
if (b->next_bio == NULL) return(0);
ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
}
break;
case BIO_CTRL_PENDING:
ret=(long)ctx->ibuf_len;
if (ret == 0)
{
if (b->next_bio == NULL) return(0);
ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
}
break;
case BIO_C_SET_BUFF_READ_DATA:
if (num > ctx->ibuf_size)
......@@ -374,12 +383,14 @@ static long buffer_ctrl(BIO *b, int cmd, long num, char *ptr)
}
break;
case BIO_C_DO_STATE_MACHINE:
if (b->next_bio == NULL) return(0);
BIO_clear_retry_flags(b);
ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
BIO_copy_next_retry(b);
break;
case BIO_CTRL_FLUSH:
if (b->next_bio == NULL) return(0);
if (ctx->obuf_len <= 0)
{
ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
......@@ -418,6 +429,7 @@ fprintf(stderr,"FLUSH [%3d] %3d -> %3d\n",ctx->obuf_off,ctx->obuf_len-ctx->obuf_
ret=0;
break;
default:
if (b->next_bio == NULL) return(0);
ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
break;
}
......@@ -427,6 +439,20 @@ malloc_error:
return(0);
}
static long buffer_callback_ctrl(BIO *b, int cmd, void (*fp)())
{
long ret=1;
if (b->next_bio == NULL) return(0);
switch (cmd)
{
default:
ret=BIO_callback_ctrl(b->next_bio,cmd,fp);
break;
}
return(ret);
}
static int buffer_gets(BIO *b, char *buf, int size)
{
BIO_F_BUFFER_CTX *ctx;
......
......@@ -73,6 +73,7 @@ static int nbiof_gets(BIO *h,char *str,int size);
static long nbiof_ctrl(BIO *h,int cmd,long arg1,char *arg2);
static int nbiof_new(BIO *h);
static int nbiof_free(BIO *data);
static long nbiof_callback_ctrl(BIO *h,int cmd,void (*fp)());
typedef struct nbio_test_st
{
/* only set if we sent a 'should retry' error */
......@@ -91,6 +92,7 @@ static BIO_METHOD methods_nbiof=
nbiof_ctrl,
nbiof_new,
nbiof_free,
nbiof_callback_ctrl,
};
BIO_METHOD *BIO_f_nbio_test(void)
......@@ -224,6 +226,20 @@ static long nbiof_ctrl(BIO *b, int cmd, long num, char *ptr)
return(ret);
}
static long nbiof_callback_ctrl(BIO *b, int cmd, void (*fp)())
{
long ret=1;
if (b->next_bio == NULL) return(0);
switch (cmd)
{
default:
ret=BIO_callback_ctrl(b->next_bio,cmd,fp);
break;
}
return(ret);
}
static int nbiof_gets(BIO *bp, char *buf, int size)
{
if (bp->next_bio == NULL) return(0);
......
......@@ -72,6 +72,7 @@ static int nullf_gets(BIO *h,char *str,int size);
static long nullf_ctrl(BIO *h,int cmd,long arg1,char *arg2);
static int nullf_new(BIO *h);
static int nullf_free(BIO *data);
static long nullf_callback_ctrl(BIO *h,int cmd,void (*fp)());
static BIO_METHOD methods_nullf=
{
BIO_TYPE_NULL_FILTER,
......@@ -83,6 +84,7 @@ static BIO_METHOD methods_nullf=
nullf_ctrl,
nullf_new,
nullf_free,
nullf_callback_ctrl,
};
BIO_METHOD *BIO_f_null(void)
......@@ -152,6 +154,20 @@ static long nullf_ctrl(BIO *b, int cmd, long num, char *ptr)
return(ret);
}
static long nullf_callback_ctrl(BIO *b, int cmd, void (*fp)())
{
long ret=1;
if (b->next_bio == NULL) return(0);
switch (cmd)
{
default:
ret=BIO_callback_ctrl(b->next_bio,cmd,fp);
break;
}
return(ret);
}
static int nullf_gets(BIO *bp, char *buf, int size)
{
if (bp->next_bio == NULL) return(0);
......
......@@ -219,6 +219,7 @@ typedef struct bio_method_st
long (*ctrl)();
int (*create)();
int (*destroy)();
long (*callback_ctrl)();
} BIO_METHOD;
#else
typedef struct bio_method_st
......@@ -232,6 +233,7 @@ typedef struct bio_method_st
long (_far *ctrl)();
int (_far *create)();
int (_far *destroy)();
long (_fat *callback_ctrl)();
} BIO_METHOD;
#endif
......@@ -373,7 +375,7 @@ typedef struct bio_f_buffer_ctx_struct
/* BIO_set_nbio(b,n) */
#define BIO_set_filter_bio(b,s) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,2,(char *)(s))
/* BIO *BIO_get_filter_bio(BIO *bio); */
#define BIO_set_proxy_cb(b,cb) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,3,(char *)(cb))
#define BIO_set_proxy_cb(b,cb) BIO_callback_ctrl(b,BIO_C_SET_PROXY_PARAM,3,(void *(*cb)()))
#define BIO_set_proxy_header(b,sk) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,4,(char *)sk)
#define BIO_set_no_connect_return(b,bool) BIO_int_ctrl(b,BIO_C_SET_PROXY_PARAM,5,bool)
......@@ -452,8 +454,8 @@ int BIO_read_filename(BIO *b,const char *name);
size_t BIO_ctrl_pending(BIO *b);
size_t BIO_ctrl_wpending(BIO *b);
#define BIO_flush(b) (int)BIO_ctrl(b,BIO_CTRL_FLUSH,0,NULL)
#define BIO_get_info_callback(b,cbp) (int)BIO_ctrl(b,BIO_CTRL_GET_CALLBACK,0,(char *)cbp)
#define BIO_set_info_callback(b,cb) (int)BIO_ctrl(b,BIO_CTRL_SET_CALLBACK,0,(char *)cb)
#define BIO_get_info_callback(b,cbp) (int)BIO_ctrl(b,BIO_CTRL_GET_CALLBACK,0,(void (**)())(cbp))
#define BIO_set_info_callback(b,cb) (int)BIO_callback_ctrl(b,BIO_CTRL_SET_CALLBACK,(void (*)())(cb))
/* For the BIO_f_buffer() type */
#define BIO_buffer_get_num_lines(b) BIO_ctrl(b,BIO_CTRL_GET,0,NULL)
......@@ -508,6 +510,7 @@ int BIO_gets(BIO *bp,char *buf, int size);
int BIO_write(BIO *b, const char *data, int len);
int BIO_puts(BIO *bp,const char *buf);
long BIO_ctrl(BIO *bp,int cmd,long larg,void *parg);
long BIO_callback_ctrl(BIO *bp,int cmd,void (*fp)());
char * BIO_ptr_ctrl(BIO *bp,int cmd,long larg);
long BIO_int_ctrl(BIO *bp,int cmd,long larg,int iarg);
BIO * BIO_push(BIO *b,BIO *append);
......
......@@ -317,16 +317,43 @@ long BIO_ctrl(BIO *b, int cmd, long larg, void *parg)
return(ret);
}
long BIO_callback_ctrl(BIO *b, int cmd, void (*fp)())
{
long ret;
long (*cb)();
if (b == NULL) return(0);
if ((b->method == NULL) || (b->method->callback_ctrl == NULL))
{
BIOerr(BIO_F_BIO_CTRL,BIO_R_UNSUPPORTED_METHOD);
return(-2);
}
cb=b->callback;
if ((cb != NULL) &&
((ret=cb(b,BIO_CB_CTRL,(void *)&fp,cmd,0,1L)) <= 0))
return(ret);
ret=b->method->callback_ctrl(b,cmd,fp);
if (cb != NULL)
ret=cb(b,BIO_CB_CTRL|BIO_CB_RETURN,(void *)&fp,cmd,
0,ret);
return(ret);
}
/* It is unfortunate to duplicate in functions what the BIO_(w)pending macros
* do; but those macros have inappropriate return type, and for interfacing
* from other programming languages, C macros aren't much of a help anyway. */
size_t BIO_ctrl_pending(BIO *bio)
{
{
return BIO_ctrl(bio, BIO_CTRL_PENDING, 0, NULL);
}
size_t BIO_ctrl_wpending(BIO *bio)
{
{
return BIO_ctrl(bio, BIO_CTRL_WPENDING, 0, NULL);
}
......
......@@ -118,6 +118,7 @@ static BIO_METHOD methods_acceptp=
acpt_ctrl,
acpt_new,
acpt_free,
NULL,
};
BIO_METHOD *BIO_s_accept(void)
......
......@@ -41,7 +41,8 @@ static BIO_METHOD methods_biop =
NULL /* no bio_gets */,
bio_ctrl,
bio_new,
bio_free
bio_free,
NULL /* no bio_callback_ctrl */
};
BIO_METHOD *BIO_s_bio(void)
......
......@@ -98,18 +98,13 @@ typedef struct bio_connect_st
int (*info_callback)();
} BIO_CONNECT;
union int_fn_to_char_u
{
char *char_p;
int (*fn_p)();
};
static int conn_write(BIO *h,char *buf,int num);
static int conn_read(BIO *h,char *buf,int size);
static int conn_puts(BIO *h,char *str);
static long conn_ctrl(BIO *h,int cmd,long arg1,char *arg2);
static int conn_new(BIO *h);
static int conn_free(BIO *data);
static long conn_callback_ctrl(BIO *h,int cmd,void *(*fp)());
static int conn_state(BIO *b, BIO_CONNECT *c);
static void conn_close_socket(BIO *data);
......@@ -127,6 +122,7 @@ static BIO_METHOD methods_connectp=
conn_ctrl,
conn_new,
conn_free,
conn_callback_ctrl,
};
static int conn_state(BIO *b, BIO_CONNECT *c)
......@@ -571,24 +567,23 @@ static long conn_ctrl(BIO *b, int cmd, long num, char *ptr)
break;
case BIO_CTRL_DUP:
{
union int_fn_to_char_u tmp_cb;
dbio=(BIO *)ptr;
if (data->param_port)
BIO_set_conn_port(dbio,data->param_port);
if (data->param_hostname)
BIO_set_conn_hostname(dbio,data->param_hostname);
BIO_set_nbio(dbio,data->nbio);
tmp_cb.fn_p=data->info_callback;
(void)BIO_set_info_callback(dbio,tmp_cb.char_p);
(void)BIO_set_info_callback(dbio,(void *(*)())(data->info_callback));
}
break;
case BIO_CTRL_SET_CALLBACK:
{
union int_fn_to_char_u tmp_cb;
tmp_cb.char_p=ptr;
data->info_callback=tmp_cb.fn_p;
#if 0 /* FIXME: Should this be used? -- Richard Levitte */
BIOerr(BIO_F_CONN_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
ret = -1;
#else
ret=0;
#endif
}
break;
case BIO_CTRL_GET_CALLBACK:
......@@ -606,6 +601,27 @@ static long conn_ctrl(BIO *b, int cmd, long num, char *ptr)
return(ret);
}
static long conn_callback_ctrl(BIO *b, int cmd, void *(*fp)())
{
long ret=1;
BIO_CONNECT *data;
data=(BIO_CONNECT *)b->ptr;
switch (cmd)
{
case BIO_CTRL_SET_CALLBACK:
{
data->info_callback=(int (*)())fp;
}
break;
default:
ret=0;
break;
}
return(ret);
}
static int conn_puts(BIO *bp, char *str)
{
int n,ret;
......
......@@ -91,6 +91,7 @@ static BIO_METHOD methods_filep=
file_ctrl,
file_new,
file_free,
NULL,
};
BIO *BIO_new_file(const char *filename, const char *mode)
......
......@@ -100,6 +100,7 @@ static BIO_METHOD methods_slg=
slg_ctrl,
slg_new,
slg_free,
NULL,
};
BIO_METHOD *BIO_s_log(void)
......
......@@ -79,6 +79,7 @@ static BIO_METHOD mem_method=
mem_ctrl,
mem_new,
mem_free,
NULL,
};
/* bio->num is used to hold the value to return on 'empty', if it is
......
......@@ -79,6 +79,7 @@ static BIO_METHOD null_method=
null_ctrl,
null_new,
null_free,
NULL,
};
BIO_METHOD *BIO_s_null(void)
......
......@@ -107,6 +107,7 @@ static BIO_METHOD rtcp_method=
rtcp_ctrl,
rtcp_new,
rtcp_free,
NULL,
};
BIO_METHOD *BIO_s_rtcp(void)
......
......@@ -95,6 +95,7 @@ static BIO_METHOD methods_sockp=
sock_ctrl,
sock_new,
sock_free,
NULL,
};
BIO_METHOD *BIO_s_socket(void)
......@@ -112,6 +113,7 @@ static BIO_METHOD methods_fdp=
fd_ctrl,
fd_new,
fd_free,
NULL,
};
BIO_METHOD *BIO_s_fd(void)
......
......@@ -17,6 +17,7 @@ typedef struct comp_method_st
int (*compress)();
int (*expand)();
long (*ctrl)();
long (*callback_ctrl)();
} COMP_METHOD;
typedef struct comp_ctx_st
......
......@@ -69,6 +69,7 @@ static int b64_read(BIO *h,char *buf,int size);
static long b64_ctrl(BIO *h,int cmd,long arg1,char *arg2);
static int b64_new(BIO *h);
static int b64_free(BIO *data);
static long b64_callback_ctrl(BIO *h,int cmd,void (*fp)());
#define B64_BLOCK_SIZE 1024
#define B64_BLOCK_SIZE2 768
#define B64_NONE 0
......@@ -100,6 +101,7 @@ static BIO_METHOD methods_b64=
b64_ctrl,
b64_new,
b64_free,
b64_callback_ctrl,
};
BIO_METHOD *BIO_f_base64(void)
......@@ -522,3 +524,17 @@ again:
return(ret);
}
static long b64_callback_ctrl(BIO *b, int cmd, void (*fp)())
{
long ret=1;
if (b->next_bio == NULL) return(0);
switch (cmd)
{
default:
ret=BIO_callback_ctrl(b->next_bio,cmd,fp);
break;
}
return(ret);
}
......@@ -69,6 +69,7 @@ static int enc_read(BIO *h,char *buf,int size);
static long enc_ctrl(BIO *h,int cmd,long arg1,char *arg2);
static int enc_new(BIO *h);
static int enc_free(BIO *data);
static long enc_callback_ctrl(BIO *h,int cmd,void (*fp)());
#define ENC_BLOCK_SIZE (1024*4)
typedef struct enc_struct
......@@ -92,6 +93,7 @@ static BIO_METHOD methods_enc=
enc_ctrl,
enc_new,
enc_free,
enc_callback_ctrl,
};
BIO_METHOD *BIO_f_cipher(void)
......@@ -368,6 +370,20 @@ again:
return(ret);
}
static long enc_callback_ctrl(BIO *b, int cmd, void (*fp)())
{
long ret=1;
if (b->next_bio == NULL) return(0);
switch (cmd)
{
default:
ret=BIO_callback_ctrl(b->next_bio,cmd,fp);
break;
}
return(ret);
}
/*
void BIO_set_cipher_ctx(b,c)
BIO *b;
......
......@@ -72,6 +72,8 @@ static int md_gets(BIO *h,char *str,int size);
static long md_ctrl(BIO *h,int cmd,long arg1,char *arg2);
static int md_new(BIO *h);
static int md_free(BIO *data);
static long md_callback_ctrl(BIO *h,int cmd,void (*fp)());
static BIO_METHOD methods_md=
{
BIO_TYPE_MD,"message digest",
......@@ -82,6 +84,7 @@ static BIO_METHOD methods_md=
md_ctrl,
md_new,
md_free,
md_callback_ctrl,
};
BIO_METHOD *BIO_f_md(void)
......@@ -220,6 +223,20 @@ static long md_ctrl(BIO *b, int cmd, long num, char *ptr)
return(ret);
}
static long md_callback_ctrl(BIO *b, int cmd, void (*fp)())
{
long ret=1;
if (b->next_bio == NULL) return(0);
switch (cmd)
{
default:
ret=BIO_callback_ctrl(b->next_bio,cmd,fp);
break;
}
return(ret);
}
static int md_gets(BIO *bp, char *buf, int size)
{
EVP_MD_CTX *ctx;
......
......@@ -130,6 +130,8 @@ static int ok_read(BIO *h,char *buf,int size);
static long ok_ctrl(BIO *h,int cmd,long arg1,char *arg2);
static int ok_new(BIO *h);
static int ok_free(BIO *data);
static long ok_callback_ctrl(BIO *h,int cmd,void (*fp)());
static void sig_out(BIO* b);
static void sig_in(BIO* b);
static void block_out(BIO* b);
......@@ -173,6 +175,7 @@ static BIO_METHOD methods_ok=
ok_ctrl,
ok_new,
ok_free,
ok_callback_ctrl,
};
BIO_METHOD *BIO_f_reliable(void)
......@@ -428,6 +431,20 @@ static long ok_ctrl(BIO *b, int cmd, long num, char *ptr)
return(ret);
}
static long ok_callback_ctrl(BIO *b, int cmd, void (*fp)())
{
long ret=1;
if (b->next_bio == NULL) return(0);
switch (cmd)
{
default:
ret=BIO_callback_ctrl(b->next_bio,cmd,fp);
break;
}
return(ret);
}
static void longswap(void *_ptr, int len)
{
#ifndef L_ENDIAN
......
......@@ -69,6 +69,7 @@ static int ber_read(BIO *h,char *buf,int size);
static long ber_ctrl(BIO *h,int cmd,long arg1,char *arg2);
static int ber_new(BIO *h);
static int ber_free(BIO *data);
static long ber_callback_ctrl(BIO *h,int cmd,void *(*fp)());
#define BER_BUF_SIZE (32)
/* This is used to hold the state of the BER objects being read. */
......@@ -115,6 +116,7 @@ static BIO_METHOD methods_ber=
ber_ctrl,
ber_new,
ber_free,
ber_callback_ctrl,
};
BIO_METHOD *BIO_f_ber(void)
......@@ -409,6 +411,20 @@ again:
return(ret);
}
static long ber_callback_ctrl(BIO *b, int cmd, void *(*fp)())
{
long ret=1;
if (b->next_bio == NULL) return(0);
switch (cmd)
{
default:
ret=BIO_callback_ctrl(b->next_bio,cmd,fp);
break;
}
return(ret);
}
/*
void BIO_set_cipher_ctx(b,c)
BIO *b;
......
......@@ -71,6 +71,7 @@ static int ssl_puts(BIO *h,char *str);
static long ssl_ctrl(BIO *h,int cmd,long arg1,char *arg2);
static int ssl_new(BIO *h);
static int ssl_free(BIO *data);
static long ssl_callback_ctrl(BIO *h,int cmd,void (*fp)());
typedef struct bio_ssl_st
{
SSL *ssl; /* The ssl handle :-) */
......@@ -92,12 +93,7 @@ static BIO_METHOD methods_sslp=
ssl_ctrl,
ssl_new,
ssl_free,
};
union void_fn_to_char_u
{
char *char_p;
void (*fn_p)();
ssl_callback_ctrl,
};
BIO_METHOD *BIO_f_ssl(void)
......@@ -451,10 +447,12 @@ static long ssl_ctrl(BIO *b, int cmd, long num, char *ptr)
break;
case BIO_CTRL_SET_CALLBACK:
{
union void_fn_to_char_u tmp_cb;
tmp_cb.char_p = ptr;
SSL_set_info_callback(ssl,tmp_cb.fn_p);
#if 0 /* FIXME: Should this be used? -- Richard Levitte */
BIOerr(SSL_F_SSL_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
ret = -1;
#else
ret=0;
#endif
}
break;
case BIO_CTRL_GET_CALLBACK:
......@@ -472,6 +470,28 @@ static long ssl_ctrl(BIO *b, int cmd, long num, char *ptr)
return(ret);
}
static long ssl_callback_ctrl(BIO *b, int cmd, void (*fp)())
{
SSL *ssl;
BIO_SSL *bs;
long ret=1;
bs=(BIO_SSL *)b->ptr;
ssl=bs->ssl;
switch (cmd)
{
case BIO_CTRL_SET_CALLBACK:
{
SSL_set_info_callback(ssl,fp);
}
break;
default:
ret=BIO_callback_ctrl(ssl->rbio,cmd,fp);
break;
}
return(ret);
}
static int ssl_puts(BIO *bp, char *str)
{
int n,ret;
......
......@@ -92,6 +92,9 @@ static SSL_METHOD SSLv23_data= {
ssl_bad_method,
ssl23_default_timeout,
&ssl3_undef_enc_method,
ssl_undefined_function,
ssl3_callback_ctrl,
ssl3_ctx_callback_ctrl,
};
static long ssl23_default_timeout(void)
......
......@@ -230,6 +230,9 @@ static SSL_METHOD SSLv2_data= {
ssl_bad_method,
ssl2_default_timeout,
&ssl3_undef_enc_method,
ssl_undefined_function,
ssl2_callback_ctrl, /* local */
ssl2_ctx_callback_ctrl, /* local */
};
static long ssl2_default_timeout(void)
......@@ -335,11 +338,21 @@ long ssl2_ctrl(SSL *s, int cmd, long larg, char *parg)
return(ret);
}
long ssl2_callback_ctrl(SSL *s, int cmd, void (*fp)())
{
return(0);
}
long ssl2_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, char *parg)
{
return(0);
}
long ssl2_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)())
{
return(0);
}
/* This function needs to check if the ciphers required are actually
* available */
SSL_CIPHER *ssl2_get_cipher_by_char(const unsigned char *p)
......
......@@ -608,18 +608,9 @@ static SSL_METHOD SSLv3_data= {
ssl_bad_method,
ssl3_default_timeout,
&SSLv3_enc_data,
};
union rsa_fn_to_char_u
{
char *char_p;
RSA *(*fn_p)(SSL *, int, int);
};
union dh_fn_to_char_u
{
char *char_p;
DH *(*fn_p)(SSL *, int, int);
ssl_undefined_function,
ssl3_callback_ctrl,
ssl3_ctx_callback_ctrl,
};
static long ssl3_default_timeout(void)
......@@ -792,10 +783,8 @@ long ssl3_ctrl(SSL *s, int cmd, long larg, char *parg)
break;
case SSL_CTRL_SET_TMP_RSA_CB:
{
union rsa_fn_to_char_u rsa_tmp_cb;
rsa_tmp_cb.char_p = parg;
s->cert->rsa_tmp_cb = rsa_tmp_cb.fn_p;
SSLerr(SSL_F_SSL3_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
return(ret);
}
break;
#endif
......@@ -824,10 +813,52 @@ long ssl3_ctrl(SSL *s, int cmd, long larg, char *parg)
break;
case SSL_CTRL_SET_TMP_DH_CB:
{
union dh_fn_to_char_u dh_tmp_cb;
SSLerr(SSL_F_SSL3_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
return(ret);
}
break;
#endif
default:
break;
}
return(ret);
}
dh_tmp_cb.char_p = parg;
s->cert->dh_tmp_cb = dh_tmp_cb.fn_p;
long ssl3_callback_ctrl(SSL *s, int cmd, void (*fp)())
{
int ret=0;
#if !defined(NO_DSA) || !defined(NO_RSA)
if (
#ifndef NO_RSA
cmd == SSL_CTRL_SET_TMP_RSA_CB ||
#endif
#ifndef NO_DSA
cmd == SSL_CTRL_SET_TMP_DH_CB ||
#endif
0)
{
if (!ssl_cert_inst(&s->cert))
{
SSLerr(SSL_F_SSL3_CTRL, ERR_R_MALLOC_FAILURE);
return(0);
}
}
#endif
switch (cmd)
{
#ifndef NO_RSA
case SSL_CTRL_SET_TMP_RSA_CB:
{
s->cert->rsa_tmp_cb = (RSA *(*)(SSL *, int, int))fp;
}
break;
#endif
#ifndef NO_DH
case SSL_CTRL_SET_TMP_DH_CB:
{
s->cert->dh_tmp_cb = (DH *(*)(SSL *, int, int))fp;
}
break;
#endif
......@@ -885,10 +916,8 @@ long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, char *parg)
/* break; */
case SSL_CTRL_SET_TMP_RSA_CB:
{
union rsa_fn_to_char_u rsa_tmp_cb;
rsa_tmp_cb.char_p = parg;
cert->rsa_tmp_cb = rsa_tmp_cb.fn_p;
SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
return(0);
}
break;
#endif
......@@ -917,10 +946,8 @@ long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, char *parg)
/*break; */
case SSL_CTRL_SET_TMP_DH_CB:
{
union dh_fn_to_char_u dh_tmp_cb;
dh_tmp_cb.char_p = parg;
cert->dh_tmp_cb = dh_tmp_cb.fn_p;
SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
return(0);
}
break;
#endif
......@@ -940,6 +967,34 @@ long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, char *parg)
return(1);
}
long ssl3_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)())
{
CERT *cert;
cert=ctx->cert;
switch (cmd)
{
#ifndef NO_RSA
case SSL_CTRL_SET_TMP_RSA_CB:
{
cert->rsa_tmp_cb = (RSA *(*)(SSL *, int, int))fp;
}
break;
#endif
#ifndef NO_DH
case SSL_CTRL_SET_TMP_DH_CB:
{
cert->dh_tmp_cb = (DH *(*)(SSL *, int, int))fp;
}
break;
#endif
default:
return(0);
}
return(1);
}
/* This function needs to check if the ciphers required are actually
* available */
SSL_CIPHER *ssl3_get_cipher_by_char(const unsigned char *p)
......
......@@ -210,6 +210,8 @@ typedef struct ssl_method_st
long (*get_timeout)(void);
struct ssl3_enc_method *ssl3_enc; /* Extra SSLv3/TLS stuff */
int (*ssl_version)();
long (*ssl_callback_ctrl)(SSL *s, int cb_id, void (*fp)());
long (*ssl_ctx_callback_ctrl)(SSL_CTX *s, int cb_id, void (*fp)());
} SSL_METHOD;
/* Lets make this into an ASN.1 type structure as follows
......
......@@ -794,6 +794,15 @@ long SSL_ctrl(SSL *s,int cmd,long larg,char *parg)
}
}
long SSL_callback_ctrl(SSL *s, int cmd, void (*fp)())
{
switch(cmd)
{
default:
return(s->method->ssl_callback_ctrl(s,cmd,fp));
}
}
long SSL_CTX_ctrl(SSL_CTX *ctx,int cmd,long larg,char *parg)
{
long l;
......@@ -853,6 +862,15 @@ long SSL_CTX_ctrl(SSL_CTX *ctx,int cmd,long larg,char *parg)
}
}
long SSL_CTX_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)())
{
switch(cmd)
{
default:
return(ctx->method->ssl_ctx_callback_ctrl(ctx,cmd,fp));
}
}
int ssl_cipher_id_cmp(SSL_CIPHER *a,SSL_CIPHER *b)
{
long l;
......@@ -1988,21 +2006,14 @@ void SSL_CTX_set_tmp_rsa_callback(SSL_CTX *ctx,RSA *(*cb)(SSL *ssl,
int is_export,
int keylength))
{
union rsa_fn_to_char_u rsa_tmp_cb;
rsa_tmp_cb.fn_p = cb;
SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_RSA_CB,0,rsa_tmp_cb.char_p);
SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TMP_RSA_CB,(void (*)())cb);
}
#endif
#ifndef NO_RSA
void SSL_set_tmp_rsa_callback(SSL *ssl,RSA *(*cb)(SSL *ssl,int is_export,
int keylength))
void SSL_set_tmp_rsa_callback(SSL *ssl,RSA *(*cb)(SSL *ssl,
int is_export,
int keylength))
{
union rsa_fn_to_char_u rsa_tmp_cb;
rsa_tmp_cb.fn_p = cb;
SSL_ctrl(ssl,SSL_CTRL_SET_TMP_RSA_CB,0,rsa_tmp_cb.char_p);
SSL_callback_ctrl(ssl,SSL_CTRL_SET_TMP_RSA_CB,(void (*)())cb);
}
#endif
......@@ -2031,19 +2042,13 @@ RSA *cb(SSL *ssl,int is_export,int keylength)
void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx,DH *(*dh)(SSL *ssl,int is_export,
int keylength))
{
union dh_fn_to_char_u dh_tmp_cb;
dh_tmp_cb.fn_p = dh;
SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_DH_CB,0,dh_tmp_cb.char_p);
SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TMP_DH_CB,(void (*)())dh);
}
void SSL_set_tmp_dh_callback(SSL *ssl,DH *(*dh)(SSL *ssl,int is_export,
int keylength))
int keylength))
{
union dh_fn_to_char_u dh_tmp_cb;
dh_tmp_cb.fn_p = dh;
SSL_ctrl(ssl,SSL_CTRL_SET_TMP_DH_CB,0,dh_tmp_cb.char_p);
SSL_callback_ctrl(ssl,SSL_CTRL_SET_TMP_DH_CB,(void (*)())dh);
}
#endif
......
......@@ -468,6 +468,8 @@ int ssl2_shutdown(SSL *s);
void ssl2_clear(SSL *s);
long ssl2_ctrl(SSL *s,int cmd, long larg, char *parg);
long ssl2_ctx_ctrl(SSL_CTX *s,int cmd, long larg, char *parg);
long ssl2_callback_ctrl(SSL *s,int cmd, void (*fp)());
long ssl2_ctx_callback_ctrl(SSL_CTX *s,int cmd, void (*fp)());
int ssl2_pending(SSL *s);
SSL_CIPHER *ssl3_get_cipher_by_char(const unsigned char *p);
......@@ -514,6 +516,8 @@ int ssl3_shutdown(SSL *s);
void ssl3_clear(SSL *s);
long ssl3_ctrl(SSL *s,int cmd, long larg, char *parg);
long ssl3_ctx_ctrl(SSL_CTX *s,int cmd, long larg, char *parg);
long ssl3_callback_ctrl(SSL *s,int cmd, void (*fp)());
long ssl3_ctx_callback_ctrl(SSL_CTX *s,int cmd, void (*fp)());
int ssl3_pending(SSL *s);
int ssl23_accept(SSL *s);
......@@ -525,6 +529,7 @@ int tls1_new(SSL *s);
void tls1_free(SSL *s);
void tls1_clear(SSL *s);
long tls1_ctrl(SSL *s,int cmd, long larg, char *parg);
long tls1_callback_ctrl(SSL *s,int cmd, void (*fp)());
SSL_METHOD *tlsv1_base_method(void );
int ssl_init_wbio_buffer(SSL *s, int push);
......
......@@ -101,6 +101,9 @@ static SSL_METHOD TLSv1_data= {
ssl_bad_method,
tls1_default_timeout,
&TLSv1_enc_data,
ssl_undefined_function,
ssl3_callback_ctrl,
ssl3_ctx_callback_ctrl,
};
static long tls1_default_timeout(void)
......@@ -138,4 +141,9 @@ long tls1_ctrl(SSL *s, int cmd, long larg, char *parg)
{
return(0);
}
long tls1_callback_ctrl(SSL *s, int cmd, void *(*fp)())
{
return(0);
}
#endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册