ssl_lib.c

来自「一个用于点对点传输加密的工具包源码」· C语言 代码 · 共 2,062 行 · 第 1/4 页

C
2,062
字号
	return ret;	}int SSL_get_verify_mode(SSL *s)	{	return(s->verify_mode);	}int SSL_get_verify_depth(SSL *s)	{	return(s->verify_depth);	}int (*SSL_get_verify_callback(SSL *s))(int,X509_STORE_CTX *)	{	return(s->verify_callback);	}int SSL_CTX_get_verify_mode(SSL_CTX *ctx)	{	return(ctx->verify_mode);	}int SSL_CTX_get_verify_depth(SSL_CTX *ctx)	{	return(ctx->verify_depth);	}int (*SSL_CTX_get_verify_callback(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)	{	s->verify_depth=depth;	}void SSL_set_read_ahead(SSL *s,int yes)	{	s->read_ahead=yes;	}int SSL_get_read_ahead(SSL *s)	{	return(s->read_ahead);	}int SSL_pending(SSL *s)	{	return(s->method->ssl_pending(s));	}X509 *SSL_get_peer_certificate(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(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,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(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(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(SSL *s)	{	return(s->method->get_timeout());	}int SSL_read(SSL *s,char *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,char *buf,int num)	{	if (s->shutdown & SSL_RECEIVED_SHUTDOWN)		{		return(0);		}	return(s->method->ssl_peek(s,buf,num));	}int SSL_write(SSL *s,const char *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)	{	s->new_session=1;	return(s->method->ssl_renegotiate(s));	}long SSL_ctrl(SSL *s,int cmd,long larg,char *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_OPTIONS:		return(s->options|=larg);	case SSL_CTRL_MODE:		return(s->mode|=larg);	default:		return(s->method->ssl_ctrl(s,cmd,larg,parg));		}	}long SSL_callback_ctrl(SSL *s, int cmd, void (*fp)())	{	switch(cmd)		{	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,char *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_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:		return(ctx->stats.sess_connect);	case SSL_CTRL_SESS_CONNECT_GOOD:		return(ctx->stats.sess_connect_good);	case SSL_CTRL_SESS_CONNECT_RENEGOTIATE:		return(ctx->stats.sess_connect_renegotiate);	case SSL_CTRL_SESS_ACCEPT:		return(ctx->stats.sess_accept);	case SSL_CTRL_SESS_ACCEPT_GOOD:		return(ctx->stats.sess_accept_good);	case SSL_CTRL_SESS_ACCEPT_RENEGOTIATE:		return(ctx->stats.sess_accept_renegotiate);	case SSL_CTRL_SESS_HIT:		return(ctx->stats.sess_hit);	case SSL_CTRL_SESS_CB_HIT:		return(ctx->stats.sess_cb_hit);	case SSL_CTRL_SESS_MISSES:		return(ctx->stats.sess_miss);	case SSL_CTRL_SESS_TIMEOUTS:		return(ctx->stats.sess_timeout);	case SSL_CTRL_SESS_CACHE_FULL:		return(ctx->stats.sess_cache_full);	case SSL_CTRL_OPTIONS:		return(ctx->options|=larg);	case SSL_CTRL_MODE:		return(ctx->mode|=larg);	default:		return(ctx->method->ssl_ctx_ctrl(ctx,cmd,larg,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(const SSL_CIPHER *a, const SSL_CIPHER *b)	{	long l;	l=a->id-b->id;	if (l == 0L)		return(0);	else		return((l > 0)?1:-1);	}int ssl_cipher_ptr_id_cmp(const SSL_CIPHER * const *ap,			const SSL_CIPHER * const *bp)	{	long l;	l=(*ap)->id-(*bp)->id;	if (l == 0L)		return(0);	else		return((l > 0)?1:-1);	}/** return a STACK of the ciphers available for the SSL and in order of * preference */STACK_OF(SSL_CIPHER) *SSL_get_ciphers(SSL *s)	{	if ((s != NULL) && (s->cipher_list != NULL))		{		return(s->cipher_list);		}	else if ((s->ctx != NULL) &&		(s->ctx->cipher_list != NULL))		{		return(s->ctx->cipher_list);		}	return(NULL);	}/** return a STACK of the ciphers available for the SSL and in order of * algorithm id */STACK_OF(SSL_CIPHER) *ssl_get_ciphers_by_id(SSL *s)	{	if ((s != NULL) && (s->cipher_list_by_id != NULL))		{		return(s->cipher_list_by_id);		}	else if ((s != NULL) && (s->ctx != NULL) &&		(s->ctx->cipher_list_by_id != NULL))		{		return(s->ctx->cipher_list_by_id);		}	return(NULL);	}/** The old interface to get the same thing as SSL_get_ciphers() */const char *SSL_get_cipher_list(SSL *s,int n)	{	SSL_CIPHER *c;	STACK_OF(SSL_CIPHER) *sk;	if (s == NULL) return(NULL);	sk=SSL_get_ciphers(s);	if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= n))		return(NULL);	c=sk_SSL_CIPHER_value(sk,n);	if (c == NULL) return(NULL);	return(c->name);	}/** specify the ciphers to be used by default by the SSL_CTX */int SSL_CTX_set_cipher_list(SSL_CTX *ctx, const char *str)	{	STACK_OF(SSL_CIPHER) *sk;		sk=ssl_create_cipher_list(ctx->method,&ctx->cipher_list,		&ctx->cipher_list_by_id,str);/* XXXX */	return((sk == NULL)?0:1);	}/** specify the ciphers to be used by the SSL */int SSL_set_cipher_list(SSL *s,const char *str)	{	STACK_OF(SSL_CIPHER) *sk;		sk=ssl_create_cipher_list(s->ctx->method,&s->cipher_list,		&s->cipher_list_by_id,str);/* XXXX */	return((sk == NULL)?0:1);	}/* works well for SSLv2, not so good for SSLv3 */char *SSL_get_shared_ciphers(SSL *s,char *buf,int len)	{	char *p;	const char *cp;	STACK_OF(SSL_CIPHER) *sk;	SSL_CIPHER *c;	int i;	if ((s->session == NULL) || (s->session->ciphers == NULL) ||		(len < 2))		return(NULL);	p=buf;	sk=s->session->ciphers;	for (i=0; i<sk_SSL_CIPHER_num(sk); i++)		{		/* Decrement for either the ':' or a '\0' */		len--;		c=sk_SSL_CIPHER_value(sk,i);		for (cp=c->name; *cp; )			{			if (len-- == 0)				{				*p='\0';				return(buf);				}			else				*(p++)= *(cp++);			}		*(p++)=':';		}	p[-1]='\0';	return(buf);	}int ssl_cipher_list_to_bytes(SSL *s,STACK_OF(SSL_CIPHER) *sk,unsigned char *p)	{	int i,j=0;	SSL_CIPHER *c;	unsigned char *q;	if (sk == NULL) return(0);	q=p;	for (i=0; i<sk_SSL_CIPHER_num(sk); i++)		{		c=sk_SSL_CIPHER_value(sk,i);		j=ssl_put_cipher_by_char(s,c,p);		p+=j;		}	return(p-q);	}STACK_OF(SSL_CIPHER) *ssl_bytes_to_cipher_list(SSL *s,unsigned char *p,int num,					       STACK_OF(SSL_CIPHER) **skp)	{	SSL_CIPHER *c;	STACK_OF(SSL_CIPHER) *sk;	int i,n;	n=ssl_put_cipher_by_char(s,NULL,NULL);

⌨️ 快捷键说明

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