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

📄 s2_srvr.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 3 页
字号:
			s2n(0,p);		/* cert len */			s2n(0,p);		/* ciphers len */			}		else			{			/* EAY EAY */			/* put certificate type */			*(p++)=SSL2_CT_X509_CERTIFICATE;			s2n(s->version,p);	/* version */			n=i2d_X509(s->cert->pkeys[SSL_PKEY_RSA_ENC].x509,NULL);			s2n(n,p);		/* certificate length */			i2d_X509(s->cert->pkeys[SSL_PKEY_RSA_ENC].x509,&d);			n=0;						/* lets send out the ciphers we like in the			 * prefered order */			sk= s->session->ciphers;			n=ssl_cipher_list_to_bytes(s,s->session->ciphers,d,0);			d+=n;			s2n(n,p);		/* add cipher length */			}		/* make and send conn_id */		s2n(SSL2_CONNECTION_ID_LENGTH,p);	/* add conn_id length */		s->s2->conn_id_length=SSL2_CONNECTION_ID_LENGTH;		if (RAND_pseudo_bytes(s->s2->conn_id,(int)s->s2->conn_id_length) <= 0)			return -1;		memcpy(d,s->s2->conn_id,SSL2_CONNECTION_ID_LENGTH);		d+=SSL2_CONNECTION_ID_LENGTH;		s->state=SSL2_ST_SEND_SERVER_HELLO_B;		s->init_num=d-(unsigned char *)s->init_buf->data;		s->init_off=0;		}	/* SSL2_ST_SEND_SERVER_HELLO_B */ 	/* If we are using TCP/IP, the performance is bad if we do 2 	 * writes without a read between them.  This occurs when 	 * Session-id reuse is used, so I will put in a buffering module 	 */ 	if (s->hit) 		{		if (!ssl_init_wbio_buffer(s,1)) return(-1); 		} 	return(ssl2_do_write(s));	}static int get_client_finished(SSL *s)	{	unsigned char *p;	int i, n;	unsigned long len;	p=(unsigned char *)s->init_buf->data;	if (s->state == SSL2_ST_GET_CLIENT_FINISHED_A)		{		i=ssl2_read(s,(char *)&(p[s->init_num]),1-s->init_num);		if (i < 1-s->init_num)			return(ssl2_part_read(s,SSL_F_GET_CLIENT_FINISHED,i));		s->init_num += i;		if (*p != SSL2_MT_CLIENT_FINISHED)			{			if (*p != SSL2_MT_ERROR)				{				ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);				SSLerr(SSL_F_GET_CLIENT_FINISHED,SSL_R_READ_WRONG_PACKET_TYPE);				}			else				{				SSLerr(SSL_F_GET_CLIENT_FINISHED,SSL_R_PEER_ERROR);				/* try to read the error message */				i=ssl2_read(s,(char *)&(p[s->init_num]),3-s->init_num);				return ssl2_part_read(s,SSL_F_GET_SERVER_VERIFY,i);				}			return(-1);			}		s->state=SSL2_ST_GET_CLIENT_FINISHED_B;		}	/* SSL2_ST_GET_CLIENT_FINISHED_B */	if (s->s2->conn_id_length > sizeof s->s2->conn_id)		{		ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);		SSLerr(SSL_F_GET_CLIENT_FINISHED, ERR_R_INTERNAL_ERROR);		return -1;		}	len = 1 + (unsigned long)s->s2->conn_id_length;	n = (int)len - s->init_num;	i = ssl2_read(s,(char *)&(p[s->init_num]),n);	if (i < n)		{		return(ssl2_part_read(s,SSL_F_GET_CLIENT_FINISHED,i));		}	if (s->msg_callback)		s->msg_callback(0, s->version, 0, p, len, s, s->msg_callback_arg); /* CLIENT-FINISHED */	p += 1;	if (memcmp(p,s->s2->conn_id,s->s2->conn_id_length) != 0)		{		ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);		SSLerr(SSL_F_GET_CLIENT_FINISHED,SSL_R_CONNECTION_ID_IS_DIFFERENT);		return(-1);		}	return(1);	}static int server_verify(SSL *s)	{	unsigned char *p;	if (s->state == SSL2_ST_SEND_SERVER_VERIFY_A)		{		p=(unsigned char *)s->init_buf->data;		*(p++)=SSL2_MT_SERVER_VERIFY;		if (s->s2->challenge_length > sizeof s->s2->challenge)			{			SSLerr(SSL_F_SERVER_VERIFY, ERR_R_INTERNAL_ERROR);			return -1;			}		memcpy(p,s->s2->challenge,(unsigned int)s->s2->challenge_length);		/* p+=s->s2->challenge_length; */		s->state=SSL2_ST_SEND_SERVER_VERIFY_B;		s->init_num=s->s2->challenge_length+1;		s->init_off=0;		}	return(ssl2_do_write(s));	}static int server_finish(SSL *s)	{	unsigned char *p;	if (s->state == SSL2_ST_SEND_SERVER_FINISHED_A)		{		p=(unsigned char *)s->init_buf->data;		*(p++)=SSL2_MT_SERVER_FINISHED;		if (s->session->session_id_length > sizeof s->session->session_id)			{			SSLerr(SSL_F_SERVER_FINISH, ERR_R_INTERNAL_ERROR);			return -1;			}		memcpy(p,s->session->session_id, (unsigned int)s->session->session_id_length);		/* p+=s->session->session_id_length; */		s->state=SSL2_ST_SEND_SERVER_FINISHED_B;		s->init_num=s->session->session_id_length+1;		s->init_off=0;		}	/* SSL2_ST_SEND_SERVER_FINISHED_B */	return(ssl2_do_write(s));	}/* send the request and check the response */static int request_certificate(SSL *s)	{	const unsigned char *cp;	unsigned char *p,*p2,*buf2;	unsigned char *ccd;	int i,j,ctype,ret= -1;	unsigned long len;	X509 *x509=NULL;	STACK_OF(X509) *sk=NULL;	ccd=s->s2->tmp.ccl;	if (s->state == SSL2_ST_SEND_REQUEST_CERTIFICATE_A)		{		p=(unsigned char *)s->init_buf->data;		*(p++)=SSL2_MT_REQUEST_CERTIFICATE;		*(p++)=SSL2_AT_MD5_WITH_RSA_ENCRYPTION;		if (RAND_pseudo_bytes(ccd,SSL2_MIN_CERT_CHALLENGE_LENGTH) <= 0)			return -1;		memcpy(p,ccd,SSL2_MIN_CERT_CHALLENGE_LENGTH);		s->state=SSL2_ST_SEND_REQUEST_CERTIFICATE_B;		s->init_num=SSL2_MIN_CERT_CHALLENGE_LENGTH+2;		s->init_off=0;		}	if (s->state == SSL2_ST_SEND_REQUEST_CERTIFICATE_B)		{		i=ssl2_do_write(s);		if (i <= 0)			{			ret=i;			goto end;			}		s->init_num=0;		s->state=SSL2_ST_SEND_REQUEST_CERTIFICATE_C;		}	if (s->state == SSL2_ST_SEND_REQUEST_CERTIFICATE_C)		{		p=(unsigned char *)s->init_buf->data;		i=ssl2_read(s,(char *)&(p[s->init_num]),6-s->init_num); /* try to read 6 octets ... */		if (i < 3-s->init_num) /* ... but don't call ssl2_part_read now if we got at least 3		                        * (probably NO-CERTIFICATE-ERROR) */			{			ret=ssl2_part_read(s,SSL_F_REQUEST_CERTIFICATE,i);			goto end;			}		s->init_num += i;		if ((s->init_num >= 3) && (p[0] == SSL2_MT_ERROR))			{			n2s(p,i);			if (i != SSL2_PE_NO_CERTIFICATE)				{				/* not the error message we expected -- let ssl2_part_read handle it */				s->init_num -= 3;				ret = ssl2_part_read(s,SSL_F_REQUEST_CERTIFICATE, 3);				goto end;				}			if (s->msg_callback)				s->msg_callback(0, s->version, 0, p, 3, s, s->msg_callback_arg); /* ERROR */			/* this is the one place where we can recover from an SSL 2.0 error */			if (s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT)				{				ssl2_return_error(s,SSL2_PE_BAD_CERTIFICATE);				SSLerr(SSL_F_REQUEST_CERTIFICATE,SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);				goto end;				}			ret=1;			goto end;			}		if ((*(p++) != SSL2_MT_CLIENT_CERTIFICATE) || (s->init_num < 6))			{			ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);			SSLerr(SSL_F_REQUEST_CERTIFICATE,SSL_R_SHORT_READ);			goto end;			}		if (s->init_num != 6)			{			SSLerr(SSL_F_REQUEST_CERTIFICATE, ERR_R_INTERNAL_ERROR);			goto end;			}				/* ok we have a response */		/* certificate type, there is only one right now. */		ctype= *(p++);		if (ctype != SSL2_AT_MD5_WITH_RSA_ENCRYPTION)			{			ssl2_return_error(s,SSL2_PE_UNSUPPORTED_CERTIFICATE_TYPE);			SSLerr(SSL_F_REQUEST_CERTIFICATE,SSL_R_BAD_RESPONSE_ARGUMENT);			goto end;			}		n2s(p,i); s->s2->tmp.clen=i;		n2s(p,i); s->s2->tmp.rlen=i;		s->state=SSL2_ST_SEND_REQUEST_CERTIFICATE_D;		}	/* SSL2_ST_SEND_REQUEST_CERTIFICATE_D */	p=(unsigned char *)s->init_buf->data;	len = 6 + (unsigned long)s->s2->tmp.clen + (unsigned long)s->s2->tmp.rlen;	if (len > SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)		{		SSLerr(SSL_F_REQUEST_CERTIFICATE,SSL_R_MESSAGE_TOO_LONG);		goto end;		}	j = (int)len - s->init_num;	i = ssl2_read(s,(char *)&(p[s->init_num]),j);	if (i < j) 		{		ret=ssl2_part_read(s,SSL_F_REQUEST_CERTIFICATE,i);		goto end;		}	if (s->msg_callback)		s->msg_callback(0, s->version, 0, p, len, s, s->msg_callback_arg); /* CLIENT-CERTIFICATE */	p += 6;	cp = p;	x509=(X509 *)d2i_X509(NULL,&cp,(long)s->s2->tmp.clen);	if (x509 == NULL)		{		SSLerr(SSL_F_REQUEST_CERTIFICATE,ERR_R_X509_LIB);		goto msg_end;		}	if (((sk=sk_X509_new_null()) == NULL) || (!sk_X509_push(sk,x509)))		{		SSLerr(SSL_F_REQUEST_CERTIFICATE,ERR_R_MALLOC_FAILURE);		goto msg_end;		}	i=ssl_verify_cert_chain(s,sk);	if (i)	/* we like the packet, now check the chksum */		{		EVP_MD_CTX ctx;		EVP_PKEY *pkey=NULL;		EVP_MD_CTX_init(&ctx);		EVP_VerifyInit_ex(&ctx,s->ctx->rsa_md5, NULL);		EVP_VerifyUpdate(&ctx,s->s2->key_material,				 s->s2->key_material_length);		EVP_VerifyUpdate(&ctx,ccd,SSL2_MIN_CERT_CHALLENGE_LENGTH);		i=i2d_X509(s->cert->pkeys[SSL_PKEY_RSA_ENC].x509,NULL);		buf2=OPENSSL_malloc((unsigned int)i);		if (buf2 == NULL)			{			SSLerr(SSL_F_REQUEST_CERTIFICATE,ERR_R_MALLOC_FAILURE);			goto msg_end;			}		p2=buf2;		i=i2d_X509(s->cert->pkeys[SSL_PKEY_RSA_ENC].x509,&p2);		EVP_VerifyUpdate(&ctx,buf2,(unsigned int)i);		OPENSSL_free(buf2);		pkey=X509_get_pubkey(x509);		if (pkey == NULL) goto end;		i=EVP_VerifyFinal(&ctx,cp,s->s2->tmp.rlen,pkey);		EVP_PKEY_free(pkey);		EVP_MD_CTX_cleanup(&ctx);		if (i) 			{			if (s->session->peer != NULL)				X509_free(s->session->peer);			s->session->peer=x509;			CRYPTO_add(&x509->references,1,CRYPTO_LOCK_X509);			s->session->verify_result = s->verify_result;			ret=1;			goto end;			}		else			{			SSLerr(SSL_F_REQUEST_CERTIFICATE,SSL_R_BAD_CHECKSUM);			goto msg_end;			}		}	else		{msg_end:		ssl2_return_error(s,SSL2_PE_BAD_CERTIFICATE);		}end:	sk_X509_free(sk);	X509_free(x509);	return(ret);	}static int ssl_rsa_private_decrypt(CERT *c, int len, unsigned char *from,	     unsigned char *to, int padding)	{	RSA *rsa;	int i;	if ((c == NULL) || (c->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL))		{		SSLerr(SSL_F_SSL_RSA_PRIVATE_DECRYPT,SSL_R_NO_PRIVATEKEY);		return(-1);		}	if (c->pkeys[SSL_PKEY_RSA_ENC].privatekey->type != EVP_PKEY_RSA)		{		SSLerr(SSL_F_SSL_RSA_PRIVATE_DECRYPT,SSL_R_PUBLIC_KEY_IS_NOT_RSA);		return(-1);		}	rsa=c->pkeys[SSL_PKEY_RSA_ENC].privatekey->pkey.rsa;	/* we have the public key */	i=RSA_private_decrypt(len,from,to,rsa,padding);	if (i < 0)		SSLerr(SSL_F_SSL_RSA_PRIVATE_DECRYPT,ERR_R_RSA_LIB);	return(i);	}#else /* !OPENSSL_NO_SSL2 */# if PEDANTICstatic void *dummy=&dummy;# endif#endif

⌨️ 快捷键说明

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