⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ssl_lib.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 5 页
字号:
		}	if ((s->rbio != NULL) && (s->rbio != rbio))		BIO_free_all(s->rbio);	if ((s->wbio != NULL) && (s->wbio != wbio) && (s->rbio != s->wbio))		BIO_free_all(s->wbio);	s->rbio=rbio;	s->wbio=wbio;	}BIO *SSL_get_rbio(const SSL *s)	{ return(s->rbio); }BIO *SSL_get_wbio(const SSL *s)	{ return(s->wbio); }int SSL_get_fd(const SSL *s)	{	return(SSL_get_rfd(s));	}int SSL_get_rfd(const SSL *s)	{	int ret= -1;	BIO *b,*r;	b=SSL_get_rbio(s);	r=BIO_find_type(b,BIO_TYPE_DESCRIPTOR);	if (r != NULL)		BIO_get_fd(r,&ret);	return(ret);	}int SSL_get_wfd(const SSL *s)	{	int ret= -1;	BIO *b,*r;	b=SSL_get_wbio(s);	r=BIO_find_type(b,BIO_TYPE_DESCRIPTOR);	if (r != NULL)		BIO_get_fd(r,&ret);	return(ret);	}#ifndef OPENSSL_NO_SOCKint SSL_set_fd(SSL *s,int fd)	{	int ret=0;	BIO *bio=NULL;	bio=BIO_new(BIO_s_socket());	if (bio == NULL)		{		SSLerr(SSL_F_SSL_SET_FD,ERR_R_BUF_LIB);		goto err;		}	BIO_set_fd(bio,fd,BIO_NOCLOSE);	SSL_set_bio(s,bio,bio);	ret=1;err:	return(ret);	}int SSL_set_wfd(SSL *s,int fd)	{	int ret=0;	BIO *bio=NULL;	if ((s->rbio == NULL) || (BIO_method_type(s->rbio) != BIO_TYPE_SOCKET)		|| ((int)BIO_get_fd(s->rbio,NULL) != fd))		{		bio=BIO_new(BIO_s_socket());		if (bio == NULL)			{ SSLerr(SSL_F_SSL_SET_WFD,ERR_R_BUF_LIB); goto err; }		BIO_set_fd(bio,fd,BIO_NOCLOSE);		SSL_set_bio(s,SSL_get_rbio(s),bio);		}	else		SSL_set_bio(s,SSL_get_rbio(s),SSL_get_rbio(s));	ret=1;err:	return(ret);	}int SSL_set_rfd(SSL *s,int fd)	{	int ret=0;	BIO *bio=NULL;	if ((s->wbio == NULL) || (BIO_method_type(s->wbio) != BIO_TYPE_SOCKET)		|| ((int)BIO_get_fd(s->wbio,NULL) != fd))		{		bio=BIO_new(BIO_s_socket());		if (bio == NULL)			{			SSLerr(SSL_F_SSL_SET_RFD,ERR_R_BUF_LIB);			goto err;			}		BIO_set_fd(bio,fd,BIO_NOCLOSE);		SSL_set_bio(s,bio,SSL_get_wbio(s));		}	else		SSL_set_bio(s,SSL_get_wbio(s),SSL_get_wbio(s));	ret=1;err:	return(ret);	}#endif/* return length of latest Finished message we sent, copy to 'buf' */size_t SSL_get_finished(const SSL *s, void *buf, size_t count)	{	size_t ret = 0;		if (s->s3 != NULL)		{		ret = s->s3->tmp.finish_md_len;		if (count > ret)			count = ret;		memcpy(buf, s->s3->tmp.finish_md, count);		}	return ret;	}/* return length of latest Finished message we expected, copy to 'buf' */size_t SSL_get_peer_finished(const SSL *s, void *buf, size_t count)	{	size_t ret = 0;		if (s->s3 != NULL)		{		ret = s->s3->tmp.peer_finish_md_len;		if (count > ret)			count = ret;		memcpy(buf, s->s3->tmp.peer_finish_md, count);		}	return ret;	}int SSL_get_verify_mode(const SSL *s)	{	return(s->verify_mode);	}int SSL_get_verify_depth(const SSL *s)	{	return X509_VERIFY_PARAM_get_depth(s->param);	}int (*SSL_get_verify_callback(const SSL *s))(int,X509_STORE_CTX *)	{	return(s->verify_callback);	}int SSL_CTX_get_verify_mode(const SSL_CTX *ctx)	{	return(ctx->verify_mode);	}int SSL_CTX_get_verify_depth(const SSL_CTX *ctx)	{	return X509_VERIFY_PARAM_get_depth(ctx->param);	}int (*SSL_CTX_get_verify_callback(const SSL_CTX *ctx))(int,X509_STORE_CTX *)	{	return(ctx->default_verify_callback);	}void SSL_set_verify(SSL *s,int mode,		    int (*callback)(int ok,X509_STORE_CTX *ctx))	{	s->verify_mode=mode;	if (callback != NULL)		s->verify_callback=callback;	}void SSL_set_verify_depth(SSL *s,int depth)	{	X509_VERIFY_PARAM_set_depth(s->param, depth);	}void SSL_set_read_ahead(SSL *s,int yes)	{	s->read_ahead=yes;	}int SSL_get_read_ahead(const SSL *s)	{	return(s->read_ahead);	}int SSL_pending(const SSL *s)	{	/* SSL_pending cannot work properly if read-ahead is enabled	 * (SSL_[CTX_]ctrl(..., SSL_CTRL_SET_READ_AHEAD, 1, NULL)),	 * and it is impossible to fix since SSL_pending cannot report	 * errors that may be observed while scanning the new data.	 * (Note that SSL_pending() is often used as a boolean value,	 * so we'd better not return -1.)	 */	return(s->method->ssl_pending(s));	}X509 *SSL_get_peer_certificate(const SSL *s)	{	X509 *r;		if ((s == NULL) || (s->session == NULL))		r=NULL;	else		r=s->session->peer;	if (r == NULL) return(r);	CRYPTO_add(&r->references,1,CRYPTO_LOCK_X509);	return(r);	}STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *s)	{	STACK_OF(X509) *r;		if ((s == NULL) || (s->session == NULL) || (s->session->sess_cert == NULL))		r=NULL;	else		r=s->session->sess_cert->cert_chain;	/* If we are a client, cert_chain includes the peer's own	 * certificate; if we are a server, it does not. */		return(r);	}/* Now in theory, since the calling process own 't' it should be safe to * modify.  We need to be able to read f without being hassled */void SSL_copy_session_id(SSL *t,const SSL *f)	{	CERT *tmp;	/* Do we need to to SSL locking? */	SSL_set_session(t,SSL_get_session(f));	/* what if we are setup as SSLv2 but want to talk SSLv3 or	 * vice-versa */	if (t->method != f->method)		{		t->method->ssl_free(t);	/* cleanup current */		t->method=f->method;	/* change method */		t->method->ssl_new(t);	/* setup new */		}	tmp=t->cert;	if (f->cert != NULL)		{		CRYPTO_add(&f->cert->references,1,CRYPTO_LOCK_SSL_CERT);		t->cert=f->cert;		}	else		t->cert=NULL;	if (tmp != NULL) ssl_cert_free(tmp);	SSL_set_session_id_context(t,f->sid_ctx,f->sid_ctx_length);	}/* Fix this so it checks all the valid key/cert options */int SSL_CTX_check_private_key(const SSL_CTX *ctx)	{	if (	(ctx == NULL) ||		(ctx->cert == NULL) ||		(ctx->cert->key->x509 == NULL))		{		SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED);		return(0);		}	if 	(ctx->cert->key->privatekey == NULL)		{		SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,SSL_R_NO_PRIVATE_KEY_ASSIGNED);		return(0);		}	return(X509_check_private_key(ctx->cert->key->x509, ctx->cert->key->privatekey));	}/* Fix this function so that it takes an optional type parameter */int SSL_check_private_key(const SSL *ssl)	{	if (ssl == NULL)		{		SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,ERR_R_PASSED_NULL_PARAMETER);		return(0);		}	if (ssl->cert == NULL)		{                SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED);		return 0;		}	if (ssl->cert->key->x509 == NULL)		{		SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED);		return(0);		}	if (ssl->cert->key->privatekey == NULL)		{		SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_PRIVATE_KEY_ASSIGNED);		return(0);		}	return(X509_check_private_key(ssl->cert->key->x509,		ssl->cert->key->privatekey));	}int SSL_accept(SSL *s)	{	if (s->handshake_func == 0)		/* Not properly initialized yet */		SSL_set_accept_state(s);	return(s->method->ssl_accept(s));	}int SSL_connect(SSL *s)	{	if (s->handshake_func == 0)		/* Not properly initialized yet */		SSL_set_connect_state(s);	return(s->method->ssl_connect(s));	}long SSL_get_default_timeout(const SSL *s)	{	return(s->method->get_timeout());	}int SSL_read(SSL *s,void *buf,int num)	{	if (s->handshake_func == 0)		{		SSLerr(SSL_F_SSL_READ, SSL_R_UNINITIALIZED);		return -1;		}	if (s->shutdown & SSL_RECEIVED_SHUTDOWN)		{		s->rwstate=SSL_NOTHING;		return(0);		}	return(s->method->ssl_read(s,buf,num));	}int SSL_peek(SSL *s,void *buf,int num)	{	if (s->handshake_func == 0)		{		SSLerr(SSL_F_SSL_PEEK, SSL_R_UNINITIALIZED);		return -1;		}	if (s->shutdown & SSL_RECEIVED_SHUTDOWN)		{		return(0);		}	return(s->method->ssl_peek(s,buf,num));	}int SSL_write(SSL *s,const void *buf,int num)	{	if (s->handshake_func == 0)		{		SSLerr(SSL_F_SSL_WRITE, SSL_R_UNINITIALIZED);		return -1;		}	if (s->shutdown & SSL_SENT_SHUTDOWN)		{		s->rwstate=SSL_NOTHING;		SSLerr(SSL_F_SSL_WRITE,SSL_R_PROTOCOL_IS_SHUTDOWN);		return(-1);		}	return(s->method->ssl_write(s,buf,num));	}int SSL_shutdown(SSL *s)	{	/* Note that this function behaves differently from what one might	 * expect.  Return values are 0 for no success (yet),	 * 1 for success; but calling it once is usually not enough,	 * even if blocking I/O is used (see ssl3_shutdown).	 */	if (s->handshake_func == 0)		{		SSLerr(SSL_F_SSL_SHUTDOWN, SSL_R_UNINITIALIZED);		return -1;		}	if ((s != NULL) && !SSL_in_init(s))		return(s->method->ssl_shutdown(s));	else		return(1);	}int SSL_renegotiate(SSL *s)	{	if (s->new_session == 0)		{		s->new_session=1;		}	return(s->method->ssl_renegotiate(s));	}int SSL_renegotiate_pending(SSL *s)	{	/* becomes true when negotiation is requested;	 * false again once a handshake has finished */	return (s->new_session != 0);	}long SSL_ctrl(SSL *s,int cmd,long larg,void *parg)	{	long l;	switch (cmd)		{	case SSL_CTRL_GET_READ_AHEAD:		return(s->read_ahead);	case SSL_CTRL_SET_READ_AHEAD:		l=s->read_ahead;		s->read_ahead=larg;		return(l);	case SSL_CTRL_SET_MSG_CALLBACK_ARG:		s->msg_callback_arg = parg;		return 1;	case SSL_CTRL_OPTIONS:		return(s->options|=larg);	case SSL_CTRL_MODE:		return(s->mode|=larg);	case SSL_CTRL_GET_MAX_CERT_LIST:		return(s->max_cert_list);	case SSL_CTRL_SET_MAX_CERT_LIST:		l=s->max_cert_list;		s->max_cert_list=larg;		return(l);	case SSL_CTRL_SET_MTU:		if (SSL_version(s) == DTLS1_VERSION)			{			s->d1->mtu = larg;			return larg;			}		return 0;	default:		return(s->method->ssl_ctrl(s,cmd,larg,parg));		}	}long SSL_callback_ctrl(SSL *s, int cmd, void (*fp)(void))	{	switch(cmd)		{	case SSL_CTRL_SET_MSG_CALLBACK:		s->msg_callback = (void (*)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg))(fp);		return 1;			default:		return(s->method->ssl_callback_ctrl(s,cmd,fp));		}	}struct lhash_st *SSL_CTX_sessions(SSL_CTX *ctx)	{	return ctx->sessions;	}long SSL_CTX_ctrl(SSL_CTX *ctx,int cmd,long larg,void *parg)	{	long l;	switch (cmd)		{	case SSL_CTRL_GET_READ_AHEAD:		return(ctx->read_ahead);	case SSL_CTRL_SET_READ_AHEAD:		l=ctx->read_ahead;		ctx->read_ahead=larg;		return(l);			case SSL_CTRL_SET_MSG_CALLBACK_ARG:		ctx->msg_callback_arg = parg;		return 1;	case SSL_CTRL_GET_MAX_CERT_LIST:		return(ctx->max_cert_list);	case SSL_CTRL_SET_MAX_CERT_LIST:		l=ctx->max_cert_list;		ctx->max_cert_list=larg;		return(l);	case SSL_CTRL_SET_SESS_CACHE_SIZE:		l=ctx->session_cache_size;		ctx->session_cache_size=larg;		return(l);	case SSL_CTRL_GET_SESS_CACHE_SIZE:		return(ctx->session_cache_size);	case SSL_CTRL_SET_SESS_CACHE_MODE:		l=ctx->session_cache_mode;		ctx->session_cache_mode=larg;		return(l);	case SSL_CTRL_GET_SESS_CACHE_MODE:		return(ctx->session_cache_mode);	case SSL_CTRL_SESS_NUMBER:		return(ctx->sessions->num_items);	case SSL_CTRL_SESS_CONNECT:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -