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

📄 s3_clnt.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 4 页
字号:
int ssl3_get_server_hello(SSL *s)	{	STACK_OF(SSL_CIPHER) *sk;	SSL_CIPHER *c;	unsigned char *p,*d;	int i,al,ok;	unsigned int j;	long n;#ifndef OPENSSL_NO_COMP	SSL_COMP *comp;#endif	n=s->method->ssl_get_message(s,		SSL3_ST_CR_SRVR_HELLO_A,		SSL3_ST_CR_SRVR_HELLO_B,		-1,		300, /* ?? */		&ok);	if (!ok) return((int)n);	if ( SSL_version(s) == DTLS1_VERSION)		{		if ( s->s3->tmp.message_type == DTLS1_MT_HELLO_VERIFY_REQUEST)			{			if ( s->d1->send_cookie == 0)				{				s->s3->tmp.reuse_message = 1;				return 1;				}			else /* already sent a cookie */				{				al=SSL_AD_UNEXPECTED_MESSAGE;				SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_BAD_MESSAGE_TYPE);				goto f_err;				}			}		}		if ( s->s3->tmp.message_type != SSL3_MT_SERVER_HELLO)		{		al=SSL_AD_UNEXPECTED_MESSAGE;		SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_BAD_MESSAGE_TYPE);		goto f_err;		}	d=p=(unsigned char *)s->init_msg;	if ((p[0] != (s->version>>8)) || (p[1] != (s->version&0xff)))		{		SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_WRONG_SSL_VERSION);		s->version=(s->version&0xff00)|p[1];		al=SSL_AD_PROTOCOL_VERSION;		goto f_err;		}	p+=2;	/* load the server hello data */	/* load the server random */	memcpy(s->s3->server_random,p,SSL3_RANDOM_SIZE);	p+=SSL3_RANDOM_SIZE;	/* get the session-id */	j= *(p++);	if ((j > sizeof s->session->session_id) || (j > SSL3_SESSION_ID_SIZE))		{		al=SSL_AD_ILLEGAL_PARAMETER;		SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_SSL3_SESSION_ID_TOO_LONG);		goto f_err;		}	if (j != 0 && j == s->session->session_id_length	    && memcmp(p,s->session->session_id,j) == 0)	    {	    if(s->sid_ctx_length != s->session->sid_ctx_length	       || memcmp(s->session->sid_ctx,s->sid_ctx,s->sid_ctx_length))		{		/* actually a client application bug */		al=SSL_AD_ILLEGAL_PARAMETER;		SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT);		goto f_err;		}	    s->hit=1;	    }	else	/* a miss or crap from the other end */		{		/* If we were trying for session-id reuse, make a new		 * SSL_SESSION so we don't stuff up other people */		s->hit=0;		if (s->session->session_id_length > 0)			{			if (!ssl_get_new_session(s,0))				{				al=SSL_AD_INTERNAL_ERROR;				goto f_err;				}			}		s->session->session_id_length=j;		memcpy(s->session->session_id,p,j); /* j could be 0 */		}	p+=j;	c=ssl_get_cipher_by_char(s,p);	if (c == NULL)		{		/* unknown cipher */		al=SSL_AD_ILLEGAL_PARAMETER;		SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_UNKNOWN_CIPHER_RETURNED);		goto f_err;		}	p+=ssl_put_cipher_by_char(s,NULL,NULL);	sk=ssl_get_ciphers_by_id(s);	i=sk_SSL_CIPHER_find(sk,c);	if (i < 0)		{		/* we did not say we would use this cipher */		al=SSL_AD_ILLEGAL_PARAMETER;		SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_WRONG_CIPHER_RETURNED);		goto f_err;		}	/* Depending on the session caching (internal/external), the cipher	   and/or cipher_id values may not be set. Make sure that	   cipher_id is set and use it for comparison. */	if (s->session->cipher)		s->session->cipher_id = s->session->cipher->id;	if (s->hit && (s->session->cipher_id != c->id))		{		if (!(s->options &			SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG))			{			al=SSL_AD_ILLEGAL_PARAMETER;			SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED);			goto f_err;			}		}	s->s3->tmp.new_cipher=c;	/* lets get the compression algorithm */	/* COMPRESSION */#ifdef OPENSSL_NO_COMP	if (*(p++) != 0)		{		al=SSL_AD_ILLEGAL_PARAMETER;		SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM);		goto f_err;		}#else	j= *(p++);	if (j == 0)		comp=NULL;	else		comp=ssl3_comp_find(s->ctx->comp_methods,j);		if ((j != 0) && (comp == NULL))		{		al=SSL_AD_ILLEGAL_PARAMETER;		SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM);		goto f_err;		}	else		{		s->s3->tmp.new_compression=comp;		}#endif	if (p != (d+n))		{		/* wrong packet length */		al=SSL_AD_DECODE_ERROR;		SSLerr(SSL_F_SSL3_GET_SERVER_HELLO,SSL_R_BAD_PACKET_LENGTH);		goto err;		}	return(1);f_err:	ssl3_send_alert(s,SSL3_AL_FATAL,al);err:	return(-1);	}int ssl3_get_server_certificate(SSL *s)	{	int al,i,ok,ret= -1;	unsigned long n,nc,llen,l;	X509 *x=NULL;	const unsigned char *q,*p;	unsigned char *d;	STACK_OF(X509) *sk=NULL;	SESS_CERT *sc;	EVP_PKEY *pkey=NULL;	int need_cert = 1; /* VRS: 0=> will allow null cert if auth == KRB5 */	n=s->method->ssl_get_message(s,		SSL3_ST_CR_CERT_A,		SSL3_ST_CR_CERT_B,		-1,		s->max_cert_list,		&ok);	if (!ok) return((int)n);	if (s->s3->tmp.message_type == SSL3_MT_SERVER_KEY_EXCHANGE)		{		s->s3->tmp.reuse_message=1;		return(1);		}	if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE)		{		al=SSL_AD_UNEXPECTED_MESSAGE;		SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_BAD_MESSAGE_TYPE);		goto f_err;		}	p=d=(unsigned char *)s->init_msg;	if ((sk=sk_X509_new_null()) == NULL)		{		SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,ERR_R_MALLOC_FAILURE);		goto err;		}	n2l3(p,llen);	if (llen+3 != n)		{		al=SSL_AD_DECODE_ERROR;		SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_LENGTH_MISMATCH);		goto f_err;		}	for (nc=0; nc<llen; )		{		n2l3(p,l);		if ((l+nc+3) > llen)			{			al=SSL_AD_DECODE_ERROR;			SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH);			goto f_err;			}		q=p;		x=d2i_X509(NULL,&q,l);		if (x == NULL)			{			al=SSL_AD_BAD_CERTIFICATE;			SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,ERR_R_ASN1_LIB);			goto f_err;			}		if (q != (p+l))			{			al=SSL_AD_DECODE_ERROR;			SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_CERT_LENGTH_MISMATCH);			goto f_err;			}		if (!sk_X509_push(sk,x))			{			SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,ERR_R_MALLOC_FAILURE);			goto err;			}		x=NULL;		nc+=l+3;		p=q;		}	i=ssl_verify_cert_chain(s,sk);	if ((s->verify_mode != SSL_VERIFY_NONE) && (!i)#ifndef OPENSSL_NO_KRB5	        && (s->s3->tmp.new_cipher->algorithms & (SSL_MKEY_MASK|SSL_AUTH_MASK))	        != (SSL_aKRB5|SSL_kKRB5)#endif /* OPENSSL_NO_KRB5 */	        )		{		al=ssl_verify_alarm_type(s->verify_result);		SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,SSL_R_CERTIFICATE_VERIFY_FAILED);		goto f_err; 		}	ERR_clear_error(); /* but we keep s->verify_result */	sc=ssl_sess_cert_new();	if (sc == NULL) goto err;	if (s->session->sess_cert) ssl_sess_cert_free(s->session->sess_cert);	s->session->sess_cert=sc;	sc->cert_chain=sk;	/* Inconsistency alert: cert_chain does include the peer's	 * certificate, which we don't include in s3_srvr.c */	x=sk_X509_value(sk,0);	sk=NULL; 	/* VRS 19990621: possible memory leak; sk=null ==> !sk_pop_free() @end*/	pkey=X509_get_pubkey(x);	/* VRS: allow null cert if auth == KRB5 */	need_cert =	((s->s3->tmp.new_cipher->algorithms	                 & (SSL_MKEY_MASK|SSL_AUTH_MASK))	                 == (SSL_aKRB5|SSL_kKRB5))? 0: 1;#ifdef KSSL_DEBUG	printf("pkey,x = %p, %p\n", pkey,x);	printf("ssl_cert_type(x,pkey) = %d\n", ssl_cert_type(x,pkey));	printf("cipher, alg, nc = %s, %lx, %d\n", s->s3->tmp.new_cipher->name,	        s->s3->tmp.new_cipher->algorithms, need_cert);#endif    /* KSSL_DEBUG */	if (need_cert && ((pkey == NULL) || EVP_PKEY_missing_parameters(pkey)))		{		x=NULL;		al=SSL3_AL_FATAL;		SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,			SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS);		goto f_err;		}	i=ssl_cert_type(x,pkey);	if (need_cert && i < 0)		{		x=NULL;		al=SSL3_AL_FATAL;		SSLerr(SSL_F_SSL3_GET_SERVER_CERTIFICATE,			SSL_R_UNKNOWN_CERTIFICATE_TYPE);		goto f_err;		}	if (need_cert)		{		sc->peer_cert_type=i;		CRYPTO_add(&x->references,1,CRYPTO_LOCK_X509);		/* Why would the following ever happen?		 * We just created sc a couple of lines ago. */		if (sc->peer_pkeys[i].x509 != NULL)			X509_free(sc->peer_pkeys[i].x509);		sc->peer_pkeys[i].x509=x;		sc->peer_key= &(sc->peer_pkeys[i]);		if (s->session->peer != NULL)			X509_free(s->session->peer);		CRYPTO_add(&x->references,1,CRYPTO_LOCK_X509);		s->session->peer=x;		}	else		{		sc->peer_cert_type=i;		sc->peer_key= NULL;		if (s->session->peer != NULL)			X509_free(s->session->peer);		s->session->peer=NULL;		}	s->session->verify_result = s->verify_result;	x=NULL;	ret=1;	if (0)		{f_err:		ssl3_send_alert(s,SSL3_AL_FATAL,al);		}err:	EVP_PKEY_free(pkey);	X509_free(x);	sk_X509_pop_free(sk,X509_free);	return(ret);	}int ssl3_get_key_exchange(SSL *s)	{#ifndef OPENSSL_NO_RSA	unsigned char *q,md_buf[EVP_MAX_MD_SIZE*2];#endif	EVP_MD_CTX md_ctx;	unsigned char *param,*p;	int al,i,j,param_len,ok;	long n,alg;	EVP_PKEY *pkey=NULL;#ifndef OPENSSL_NO_RSA	RSA *rsa=NULL;#endif#ifndef OPENSSL_NO_DH	DH *dh=NULL;#endif#ifndef OPENSSL_NO_ECDH	EC_KEY *ecdh = NULL;	BN_CTX *bn_ctx = NULL;	EC_POINT *srvr_ecpoint = NULL;	int curve_nid = 0;	int encoded_pt_len = 0;#endif	/* use same message size as in ssl3_get_certificate_request()	 * as ServerKeyExchange message may be skipped */	n=s->method->ssl_get_message(s,		SSL3_ST_CR_KEY_EXCH_A,		SSL3_ST_CR_KEY_EXCH_B,		-1,		s->max_cert_list,		&ok);	if (!ok) return((int)n);	if (s->s3->tmp.message_type != SSL3_MT_SERVER_KEY_EXCHANGE)		{		s->s3->tmp.reuse_message=1;		return(1);		}	param=p=(unsigned char *)s->init_msg;	if (s->session->sess_cert != NULL)		{#ifndef OPENSSL_NO_RSA		if (s->session->sess_cert->peer_rsa_tmp != NULL)			{			RSA_free(s->session->sess_cert->peer_rsa_tmp);			s->session->sess_cert->peer_rsa_tmp=NULL;			}#endif#ifndef OPENSSL_NO_DH		if (s->session->sess_cert->peer_dh_tmp)			{			DH_free(s->session->sess_cert->peer_dh_tmp);			s->session->sess_cert->peer_dh_tmp=NULL;			}#endif#ifndef OPENSSL_NO_ECDH		if (s->session->sess_cert->peer_ecdh_tmp)			{			EC_KEY_free(s->session->sess_cert->peer_ecdh_tmp);			s->session->sess_cert->peer_ecdh_tmp=NULL;			}#endif		}	else		{		s->session->sess_cert=ssl_sess_cert_new();		}	param_len=0;	alg=s->s3->tmp.new_cipher->algorithms;	EVP_MD_CTX_init(&md_ctx);#ifndef OPENSSL_NO_RSA	if (alg & SSL_kRSA)		{		if ((rsa=RSA_new()) == NULL)			{			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);			goto err;			}		n2s(p,i);		param_len=i+2;		if (param_len > n)			{			al=SSL_AD_DECODE_ERROR;			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_RSA_MODULUS_LENGTH);			goto f_err;			}		if (!(rsa->n=BN_bin2bn(p,i,rsa->n)))			{			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);			goto err;			}		p+=i;		n2s(p,i);		param_len+=i+2;		if (param_len > n)			{			al=SSL_AD_DECODE_ERROR;			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_RSA_E_LENGTH);			goto f_err;			}		if (!(rsa->e=BN_bin2bn(p,i,rsa->e)))			{			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);			goto err;			}		p+=i;		n-=param_len;		/* this should be because we are using an export cipher */		if (alg & SSL_aRSA)			pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);		else			{			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);			goto err;			}		s->session->sess_cert->peer_rsa_tmp=rsa;		rsa=NULL;		}#else /* OPENSSL_NO_RSA */	if (0)		;#endif#ifndef OPENSSL_NO_DH	else if (alg & SSL_kEDH)		{		if ((dh=DH_new()) == NULL)			{			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_DH_LIB);			goto err;			}		n2s(p,i);		param_len=i+2;		if (param_len > n)			{			al=SSL_AD_DECODE_ERROR;			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_DH_P_LENGTH);			goto f_err;			}		if (!(dh->p=BN_bin2bn(p,i,NULL)))			{			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);			goto err;			}		p+=i;		n2s(p,i);		param_len+=i+2;		if (param_len > n)			{			al=SSL_AD_DECODE_ERROR;			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_DH_G_LENGTH);			goto f_err;			}		if (!(dh->g=BN_bin2bn(p,i,NULL)))			{			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);			goto err;			}		p+=i;		n2s(p,i);		param_len+=i+2;		if (param_len > n)			{			al=SSL_AD_DECODE_ERROR;			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_DH_PUB_KEY_LENGTH);			goto f_err;			}		if (!(dh->pub_key=BN_bin2bn(p,i,NULL)))			{			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_BN_LIB);			goto err;			}		p+=i;		n-=param_len;#ifndef OPENSSL_NO_RSA		if (alg & SSL_aRSA)			pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);#else		if (0)			;#endif#ifndef OPENSSL_NO_DSA		else if (alg & SSL_aDSS)			pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_DSA_SIGN].x509);#endif		/* else anonymous DH, so no certificate or pkey. */		s->session->sess_cert->peer_dh_tmp=dh;		dh=NULL;		}	else if ((alg & SSL_kDHr) || (alg & SSL_kDHd))		{		al=SSL_AD_ILLEGAL_PARAMETER;		SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER);		goto f_err;		}#endif /* !OPENSSL_NO_DH */#ifndef OPENSSL_NO_ECDH	else if (alg & SSL_kECDHE)		{		EC_GROUP *ngroup;		const EC_GROUP *group;		if ((ecdh=EC_KEY_new()) == NULL)			{			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);			goto err;			}		/* Extract elliptic curve parameters and the		 * server's ephemeral ECDH public key.		 * Keep accumulating lengths of various components in		 * param_len and make sure it never exceeds n.		 */		/* XXX: For now we only support named (not generic) curves		 * and the ECParameters in this case is just two bytes.		 */		param_len=2;		if ((param_len > n) ||		    (*p != NAMED_CURVE_TYPE) || 		    ((curve_nid = curve_id2nid(*(p + 1))) == 0)) 			{			al=SSL_AD_INTERNAL_ERROR;			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS);			goto f_err;			}		ngroup = EC_GROUP_new_by_curve_name(curve_nid);		if (ngroup == NULL)			{			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_EC_LIB);			goto err;			}		if (EC_KEY_set_group(ecdh, ngroup) == 0)			{			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_EC_LIB);			goto err;			}		EC_GROUP_free(ngroup);		group = EC_KEY_get0_group(ecdh);

⌨️ 快捷键说明

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