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

📄 d1_srvr.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 2 页
字号:
				if ((ret=BIO_flush(s->wbio)) <= 0)					goto end;				}			if ((cb != NULL) && (s->state != state))				{				new_state=s->state;				s->state=state;				cb(s,SSL_CB_ACCEPT_LOOP,1);				s->state=new_state;				}			}		skip=0;		}end:	/* BIO_flush(s->wbio); */	s->in_handshake--;	if (cb != NULL)		cb(s,SSL_CB_ACCEPT_EXIT,ret);	return(ret);	}int dtls1_send_hello_request(SSL *s)	{	unsigned char *p;	if (s->state == SSL3_ST_SW_HELLO_REQ_A)		{		p=(unsigned char *)s->init_buf->data;		p = dtls1_set_message_header(s, p, SSL3_MT_HELLO_REQUEST, 0, 0, 0);		s->state=SSL3_ST_SW_HELLO_REQ_B;		/* number of bytes to write */		s->init_num=DTLS1_HM_HEADER_LENGTH;		s->init_off=0;		/* no need to buffer this message, since there are no retransmit 		 * requests for it */		}	/* SSL3_ST_SW_HELLO_REQ_B */	return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));	}int dtls1_send_hello_verify_request(SSL *s)	{	unsigned int msg_len;	unsigned char *msg, *buf, *p;	if (s->state == DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A)		{		buf = (unsigned char *)s->init_buf->data;		msg = p = &(buf[DTLS1_HM_HEADER_LENGTH]);		*(p++) = s->version >> 8;		*(p++) = s->version & 0xFF;		*(p++) = (unsigned char) s->d1->cookie_len;        if ( s->ctx->app_gen_cookie_cb != NULL &&            s->ctx->app_gen_cookie_cb(s, s->d1->cookie,                 &(s->d1->cookie_len)) == 0)            {			SSLerr(SSL_F_DTLS1_SEND_HELLO_VERIFY_REQUEST,ERR_R_INTERNAL_ERROR);            return 0;            }        /* else the cookie is assumed to have          * been initialized by the application */		memcpy(p, s->d1->cookie, s->d1->cookie_len);		p += s->d1->cookie_len;		msg_len = p - msg;		dtls1_set_message_header(s, buf,			DTLS1_MT_HELLO_VERIFY_REQUEST, msg_len, 0, msg_len);		s->state=DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B;		/* number of bytes to write */		s->init_num=p-buf;		s->init_off=0;		/* buffer the message to handle re-xmits */		dtls1_buffer_message(s, 0);		}	/* s->state = DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B */	return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));	}int dtls1_send_server_hello(SSL *s)	{	unsigned char *buf;	unsigned char *p,*d;	int i;	unsigned int sl;	unsigned long l,Time;	if (s->state == SSL3_ST_SW_SRVR_HELLO_A)		{		buf=(unsigned char *)s->init_buf->data;		p=s->s3->server_random;		Time=(unsigned long)time(NULL);			/* Time */		l2n(Time,p);		RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE-sizeof(Time));		/* Do the message type and length last */		d=p= &(buf[DTLS1_HM_HEADER_LENGTH]);		*(p++)=s->version>>8;		*(p++)=s->version&0xff;		/* Random stuff */		memcpy(p,s->s3->server_random,SSL3_RANDOM_SIZE);		p+=SSL3_RANDOM_SIZE;		/* now in theory we have 3 options to sending back the		 * session id.  If it is a re-use, we send back the		 * old session-id, if it is a new session, we send		 * back the new session-id or we send back a 0 length		 * session-id if we want it to be single use.		 * Currently I will not implement the '0' length session-id		 * 12-Jan-98 - I'll now support the '0' length stuff.		 */		if (!(s->ctx->session_cache_mode & SSL_SESS_CACHE_SERVER))			s->session->session_id_length=0;		sl=s->session->session_id_length;		if (sl > sizeof s->session->session_id)			{			SSLerr(SSL_F_DTLS1_SEND_SERVER_HELLO, ERR_R_INTERNAL_ERROR);			return -1;			}		*(p++)=sl;		memcpy(p,s->session->session_id,sl);		p+=sl;		/* put the cipher */		i=ssl3_put_cipher_by_char(s->s3->tmp.new_cipher,p);		p+=i;		/* put the compression method */#ifdef OPENSSL_NO_COMP		*(p++)=0;#else		if (s->s3->tmp.new_compression == NULL)			*(p++)=0;		else			*(p++)=s->s3->tmp.new_compression->id;#endif		/* do the header */		l=(p-d);		d=buf;		d = dtls1_set_message_header(s, d, SSL3_MT_SERVER_HELLO, l, 0, l);		s->state=SSL3_ST_CW_CLNT_HELLO_B;		/* number of bytes to write */		s->init_num=p-buf;		s->init_off=0;		/* buffer the message to handle re-xmits */		dtls1_buffer_message(s, 0);		}	/* SSL3_ST_CW_CLNT_HELLO_B */	return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));	}int dtls1_send_server_done(SSL *s)	{	unsigned char *p;	if (s->state == SSL3_ST_SW_SRVR_DONE_A)		{		p=(unsigned char *)s->init_buf->data;		/* do the header */		p = dtls1_set_message_header(s, p, SSL3_MT_SERVER_DONE, 0, 0, 0);		s->state=SSL3_ST_SW_SRVR_DONE_B;		/* number of bytes to write */		s->init_num=DTLS1_HM_HEADER_LENGTH;		s->init_off=0;		/* buffer the message to handle re-xmits */		dtls1_buffer_message(s, 0);		}	/* SSL3_ST_CW_CLNT_HELLO_B */	return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));	}int dtls1_send_server_key_exchange(SSL *s)	{#ifndef OPENSSL_NO_RSA	unsigned char *q;	int j,num;	RSA *rsa;	unsigned char md_buf[MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH];	unsigned int u;#endif#ifndef OPENSSL_NO_DH	DH *dh=NULL,*dhp;#endif	EVP_PKEY *pkey;	unsigned char *p,*d;	int al,i;	unsigned long type;	int n;	CERT *cert;	BIGNUM *r[4];	int nr[4],kn;	BUF_MEM *buf;	EVP_MD_CTX md_ctx;	EVP_MD_CTX_init(&md_ctx);	if (s->state == SSL3_ST_SW_KEY_EXCH_A)		{		type=s->s3->tmp.new_cipher->algorithms & SSL_MKEY_MASK;		cert=s->cert;		buf=s->init_buf;		r[0]=r[1]=r[2]=r[3]=NULL;		n=0;#ifndef OPENSSL_NO_RSA		if (type & SSL_kRSA)			{			rsa=cert->rsa_tmp;			if ((rsa == NULL) && (s->cert->rsa_tmp_cb != NULL))				{				rsa=s->cert->rsa_tmp_cb(s,				      SSL_C_IS_EXPORT(s->s3->tmp.new_cipher),				      SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher));				if(rsa == NULL)				{					al=SSL_AD_HANDSHAKE_FAILURE;					SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,SSL_R_ERROR_GENERATING_TMP_RSA_KEY);					goto f_err;				}				RSA_up_ref(rsa);				cert->rsa_tmp=rsa;				}			if (rsa == NULL)				{				al=SSL_AD_HANDSHAKE_FAILURE;				SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,SSL_R_MISSING_TMP_RSA_KEY);				goto f_err;				}			r[0]=rsa->n;			r[1]=rsa->e;			s->s3->tmp.use_rsa_tmp=1;			}		else#endif#ifndef OPENSSL_NO_DH			if (type & SSL_kEDH)			{			dhp=cert->dh_tmp;			if ((dhp == NULL) && (s->cert->dh_tmp_cb != NULL))				dhp=s->cert->dh_tmp_cb(s,				      SSL_C_IS_EXPORT(s->s3->tmp.new_cipher),				      SSL_C_EXPORT_PKEYLENGTH(s->s3->tmp.new_cipher));			if (dhp == NULL)				{				al=SSL_AD_HANDSHAKE_FAILURE;				SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,SSL_R_MISSING_TMP_DH_KEY);				goto f_err;				}			if (s->s3->tmp.dh != NULL)				{				DH_free(dh);				SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);				goto err;				}			if ((dh=DHparams_dup(dhp)) == NULL)				{				SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_R_DH_LIB);				goto err;				}			s->s3->tmp.dh=dh;			if ((dhp->pub_key == NULL ||			     dhp->priv_key == NULL ||			     (s->options & SSL_OP_SINGLE_DH_USE)))				{				if(!DH_generate_key(dh))				    {				    SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,					   ERR_R_DH_LIB);				    goto err;				    }				}			else				{				dh->pub_key=BN_dup(dhp->pub_key);				dh->priv_key=BN_dup(dhp->priv_key);				if ((dh->pub_key == NULL) ||					(dh->priv_key == NULL))					{					SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_R_DH_LIB);					goto err;					}				}			r[0]=dh->p;			r[1]=dh->g;			r[2]=dh->pub_key;			}		else #endif			{			al=SSL_AD_HANDSHAKE_FAILURE;			SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE);			goto f_err;			}		for (i=0; r[i] != NULL; i++)			{			nr[i]=BN_num_bytes(r[i]);			n+=2+nr[i];			}		if (!(s->s3->tmp.new_cipher->algorithms & SSL_aNULL))			{			if ((pkey=ssl_get_sign_pkey(s,s->s3->tmp.new_cipher))				== NULL)				{				al=SSL_AD_DECODE_ERROR;				goto f_err;				}			kn=EVP_PKEY_size(pkey);			}		else			{			pkey=NULL;			kn=0;			}		if (!BUF_MEM_grow_clean(buf,n+DTLS1_HM_HEADER_LENGTH+kn))			{			SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_BUF);			goto err;			}		d=(unsigned char *)s->init_buf->data;		p= &(d[DTLS1_HM_HEADER_LENGTH]);		for (i=0; r[i] != NULL; i++)			{			s2n(nr[i],p);			BN_bn2bin(r[i],p);			p+=nr[i];			}		/* not anonymous */		if (pkey != NULL)			{			/* n is the length of the params, they start at			 * &(d[DTLS1_HM_HEADER_LENGTH]) and p points to the space			 * at the end. */#ifndef OPENSSL_NO_RSA			if (pkey->type == EVP_PKEY_RSA)				{				q=md_buf;				j=0;				for (num=2; num > 0; num--)					{					EVP_DigestInit_ex(&md_ctx,(num == 2)						?s->ctx->md5:s->ctx->sha1, NULL);					EVP_DigestUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);					EVP_DigestUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);					EVP_DigestUpdate(&md_ctx,&(d[DTLS1_HM_HEADER_LENGTH]),n);					EVP_DigestFinal_ex(&md_ctx,q,						(unsigned int *)&i);					q+=i;					j+=i;					}				if (RSA_sign(NID_md5_sha1, md_buf, j,					&(p[2]), &u, pkey->pkey.rsa) <= 0)					{					SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_RSA);					goto err;					}				s2n(u,p);				n+=u+2;				}			else#endif#if !defined(OPENSSL_NO_DSA)				if (pkey->type == EVP_PKEY_DSA)				{				/* lets do DSS */				EVP_SignInit_ex(&md_ctx,EVP_dss1(), NULL);				EVP_SignUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);				EVP_SignUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);				EVP_SignUpdate(&md_ctx,&(d[DTLS1_HM_HEADER_LENGTH]),n);				if (!EVP_SignFinal(&md_ctx,&(p[2]),					(unsigned int *)&i,pkey))					{					SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,ERR_LIB_DSA);					goto err;					}				s2n(i,p);				n+=i+2;				}			else#endif				{				/* Is this error check actually needed? */				al=SSL_AD_HANDSHAKE_FAILURE;				SSLerr(SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE,SSL_R_UNKNOWN_PKEY_TYPE);				goto f_err;				}			}		d = dtls1_set_message_header(s, d,			SSL3_MT_SERVER_KEY_EXCHANGE, n, 0, n);		/* we should now have things packed up, so lets send		 * it off */		s->init_num=n+DTLS1_HM_HEADER_LENGTH;		s->init_off=0;		/* buffer the message to handle re-xmits */		dtls1_buffer_message(s, 0);		}	s->state = SSL3_ST_SW_KEY_EXCH_B;	EVP_MD_CTX_cleanup(&md_ctx);	return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));f_err:	ssl3_send_alert(s,SSL3_AL_FATAL,al);err:	EVP_MD_CTX_cleanup(&md_ctx);	return(-1);	}int dtls1_send_certificate_request(SSL *s)	{	unsigned char *p,*d;	int i,j,nl,off,n;	STACK_OF(X509_NAME) *sk=NULL;	X509_NAME *name;	BUF_MEM *buf;	if (s->state == SSL3_ST_SW_CERT_REQ_A)		{		buf=s->init_buf;		d=p=(unsigned char *)&(buf->data[DTLS1_HM_HEADER_LENGTH]);		/* get the list of acceptable cert types */		p++;		n=ssl3_get_req_cert_type(s,p);		d[0]=n;		p+=n;		n++;		off=n;		p+=2;		n+=2;		sk=SSL_get_client_CA_list(s);		nl=0;		if (sk != NULL)			{			for (i=0; i<sk_X509_NAME_num(sk); i++)				{				name=sk_X509_NAME_value(sk,i);				j=i2d_X509_NAME(name,NULL);				if (!BUF_MEM_grow_clean(buf,DTLS1_HM_HEADER_LENGTH+n+j+2))					{					SSLerr(SSL_F_DTLS1_SEND_CERTIFICATE_REQUEST,ERR_R_BUF_LIB);					goto err;					}				p=(unsigned char *)&(buf->data[DTLS1_HM_HEADER_LENGTH+n]);				if (!(s->options & SSL_OP_NETSCAPE_CA_DN_BUG))					{					s2n(j,p);					i2d_X509_NAME(name,&p);					n+=2+j;					nl+=2+j;					}				else					{					d=p;					i2d_X509_NAME(name,&p);					j-=2; s2n(j,d); j+=2;					n+=j;					nl+=j;					}				}			}		/* else no CA names */		p=(unsigned char *)&(buf->data[DTLS1_HM_HEADER_LENGTH+off]);		s2n(nl,p);		d=(unsigned char *)buf->data;		*(d++)=SSL3_MT_CERTIFICATE_REQUEST;		l2n3(n,d);		s2n(s->d1->handshake_write_seq,d);		s->d1->handshake_write_seq++;		/* we should now have things packed up, so lets send		 * it off */		s->init_num=n+DTLS1_HM_HEADER_LENGTH;		s->init_off=0;#ifdef NETSCAPE_HANG_BUG/* XXX: what to do about this? */		p=(unsigned char *)s->init_buf->data + s->init_num;		/* do the header */		*(p++)=SSL3_MT_SERVER_DONE;		*(p++)=0;		*(p++)=0;		*(p++)=0;		s->init_num += 4;#endif		/* XDTLS:  set message header ? */		/* buffer the message to handle re-xmits */		dtls1_buffer_message(s, 0);		s->state = SSL3_ST_SW_CERT_REQ_B;		}	/* SSL3_ST_SW_CERT_REQ_B */	return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));err:	return(-1);	}int dtls1_send_server_certificate(SSL *s)	{	unsigned long l;	X509 *x;	if (s->state == SSL3_ST_SW_CERT_A)		{		x=ssl_get_server_send_cert(s);		if (x == NULL &&                        /* VRS: allow null cert if auth == KRB5 */                        (s->s3->tmp.new_cipher->algorithms                                & (SSL_MKEY_MASK|SSL_AUTH_MASK))                        != (SSL_aKRB5|SSL_kKRB5))			{			SSLerr(SSL_F_DTLS1_SEND_SERVER_CERTIFICATE,ERR_R_INTERNAL_ERROR);			return(0);			}		l=dtls1_output_cert_chain(s,x);		s->state=SSL3_ST_SW_CERT_B;		s->init_num=(int)l;		s->init_off=0;		/* buffer the message to handle re-xmits */		dtls1_buffer_message(s, 0);		}	/* SSL3_ST_SW_CERT_B */	return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));	}

⌨️ 快捷键说明

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