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

📄 s3_clnt.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 4 页
字号:
		if (SSL_C_IS_EXPORT(s->s3->tmp.new_cipher) &&		    (EC_GROUP_get_degree(group) > 163))			{			al=SSL_AD_EXPORT_RESTRICTION;			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_ECGROUP_TOO_LARGE_FOR_CIPHER);			goto f_err;			}		p+=2;		/* Next, get the encoded ECPoint */		if (((srvr_ecpoint = EC_POINT_new(group)) == NULL) ||		    ((bn_ctx = BN_CTX_new()) == NULL))			{			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_MALLOC_FAILURE);			goto err;			}		encoded_pt_len = *p;  /* length of encoded point */		p+=1;		param_len += (1 + encoded_pt_len);		if ((param_len > n) ||		    (EC_POINT_oct2point(group, srvr_ecpoint, 			p, encoded_pt_len, bn_ctx) == 0))			{			al=SSL_AD_DECODE_ERROR;			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_ECPOINT);			goto f_err;			}		n-=param_len;		p+=encoded_pt_len;		/* The ECC/TLS specification does not mention		 * the use of DSA to sign ECParameters in the server		 * key exchange message. We do support RSA and ECDSA.		 */		if (0) ;#ifndef OPENSSL_NO_RSA		else if (alg & SSL_aRSA)			pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);#endif#ifndef OPENSSL_NO_ECDSA		else if (alg & SSL_aECDSA)			pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_ECC].x509);#endif		/* else anonymous ECDH, so no certificate or pkey. */		EC_KEY_set_public_key(ecdh, srvr_ecpoint);		s->session->sess_cert->peer_ecdh_tmp=ecdh;		ecdh=NULL;		BN_CTX_free(bn_ctx);		EC_POINT_free(srvr_ecpoint);		srvr_ecpoint = NULL;		}	else if (alg & SSL_kECDH)		{		al=SSL_AD_UNEXPECTED_MESSAGE;		SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_UNEXPECTED_MESSAGE);		goto f_err;		}#endif /* !OPENSSL_NO_ECDH */	if (alg & SSL_aFZA)		{		al=SSL_AD_HANDSHAKE_FAILURE;		SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER);		goto f_err;		}	/* p points to the next byte, there are 'n' bytes left */	/* if it was signed, check the signature */	if (pkey != NULL)		{		n2s(p,i);		n-=2;		j=EVP_PKEY_size(pkey);		if ((i != n) || (n > j) || (n <= 0))			{			/* wrong packet length */			al=SSL_AD_DECODE_ERROR;			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_WRONG_SIGNATURE_LENGTH);			goto f_err;			}#ifndef OPENSSL_NO_RSA		if (pkey->type == EVP_PKEY_RSA)			{			int num;			j=0;			q=md_buf;			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,param,param_len);				EVP_DigestFinal_ex(&md_ctx,q,(unsigned int *)&i);				q+=i;				j+=i;				}			i=RSA_verify(NID_md5_sha1, md_buf, j, p, n,								pkey->pkey.rsa);			if (i < 0)				{				al=SSL_AD_DECRYPT_ERROR;				SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_RSA_DECRYPT);				goto f_err;				}			if (i == 0)				{				/* bad signature */				al=SSL_AD_DECRYPT_ERROR;				SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_SIGNATURE);				goto f_err;				}			}		else#endif#ifndef OPENSSL_NO_DSA			if (pkey->type == EVP_PKEY_DSA)			{			/* lets do DSS */			EVP_VerifyInit_ex(&md_ctx,EVP_dss1(), NULL);			EVP_VerifyUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);			EVP_VerifyUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);			EVP_VerifyUpdate(&md_ctx,param,param_len);			if (!EVP_VerifyFinal(&md_ctx,p,(int)n,pkey))				{				/* bad signature */				al=SSL_AD_DECRYPT_ERROR;				SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_SIGNATURE);				goto f_err;				}			}		else#endif#ifndef OPENSSL_NO_ECDSA			if (pkey->type == EVP_PKEY_EC)			{			/* let's do ECDSA */			EVP_VerifyInit_ex(&md_ctx,EVP_ecdsa(), NULL);			EVP_VerifyUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);			EVP_VerifyUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);			EVP_VerifyUpdate(&md_ctx,param,param_len);			if (!EVP_VerifyFinal(&md_ctx,p,(int)n,pkey))				{				/* bad signature */				al=SSL_AD_DECRYPT_ERROR;				SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_BAD_SIGNATURE);				goto f_err;				}			}		else#endif			{			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);			goto err;			}		}	else		{		/* still data left over */		if (!(alg & SSL_aNULL))			{			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);			goto err;			}		if (n != 0)			{			al=SSL_AD_DECODE_ERROR;			SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,SSL_R_EXTRA_DATA_IN_MESSAGE);			goto f_err;			}		}	EVP_PKEY_free(pkey);	EVP_MD_CTX_cleanup(&md_ctx);	return(1);f_err:	ssl3_send_alert(s,SSL3_AL_FATAL,al);err:	EVP_PKEY_free(pkey);#ifndef OPENSSL_NO_RSA	if (rsa != NULL)		RSA_free(rsa);#endif#ifndef OPENSSL_NO_DH	if (dh != NULL)		DH_free(dh);#endif#ifndef OPENSSL_NO_ECDH	BN_CTX_free(bn_ctx);	EC_POINT_free(srvr_ecpoint);	if (ecdh != NULL)		EC_KEY_free(ecdh);#endif	EVP_MD_CTX_cleanup(&md_ctx);	return(-1);	}int ssl3_get_certificate_request(SSL *s)	{	int ok,ret=0;	unsigned long n,nc,l;	unsigned int llen,ctype_num,i;	X509_NAME *xn=NULL;	const unsigned char *p,*q;	unsigned char *d;	STACK_OF(X509_NAME) *ca_sk=NULL;	n=s->method->ssl_get_message(s,		SSL3_ST_CR_CERT_REQ_A,		SSL3_ST_CR_CERT_REQ_B,		-1,		s->max_cert_list,		&ok);	if (!ok) return((int)n);	s->s3->tmp.cert_req=0;	if (s->s3->tmp.message_type == SSL3_MT_SERVER_DONE)		{		s->s3->tmp.reuse_message=1;		return(1);		}	if (s->s3->tmp.message_type != SSL3_MT_CERTIFICATE_REQUEST)		{		ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_UNEXPECTED_MESSAGE);		SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_WRONG_MESSAGE_TYPE);		goto err;		}	/* TLS does not like anon-DH with client cert */	if (s->version > SSL3_VERSION)		{		l=s->s3->tmp.new_cipher->algorithms;		if (l & SSL_aNULL)			{			ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_UNEXPECTED_MESSAGE);			SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER);			goto err;			}		}	p=d=(unsigned char *)s->init_msg;	if ((ca_sk=sk_X509_NAME_new(ca_dn_cmp)) == NULL)		{		SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,ERR_R_MALLOC_FAILURE);		goto err;		}	/* get the certificate types */	ctype_num= *(p++);	if (ctype_num > SSL3_CT_NUMBER)		ctype_num=SSL3_CT_NUMBER;	for (i=0; i<ctype_num; i++)		s->s3->tmp.ctype[i]= p[i];	p+=ctype_num;	/* get the CA RDNs */	n2s(p,llen);#if 0{FILE *out;out=fopen("/tmp/vsign.der","w");fwrite(p,1,llen,out);fclose(out);}#endif	if ((llen+ctype_num+2+1) != n)		{		ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);		SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_LENGTH_MISMATCH);		goto err;		}	for (nc=0; nc<llen; )		{		n2s(p,l);		if ((l+nc+2) > llen)			{			if ((s->options & SSL_OP_NETSCAPE_CA_DN_BUG))				goto cont; /* netscape bugs */			ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);			SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_CA_DN_TOO_LONG);			goto err;			}		q=p;		if ((xn=d2i_X509_NAME(NULL,&q,l)) == NULL)			{			/* If netscape tolerance is on, ignore errors */			if (s->options & SSL_OP_NETSCAPE_CA_DN_BUG)				goto cont;			else				{				ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);				SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,ERR_R_ASN1_LIB);				goto err;				}			}		if (q != (p+l))			{			ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);			SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,SSL_R_CA_DN_LENGTH_MISMATCH);			goto err;			}		if (!sk_X509_NAME_push(ca_sk,xn))			{			SSLerr(SSL_F_SSL3_GET_CERTIFICATE_REQUEST,ERR_R_MALLOC_FAILURE);			goto err;			}		p+=l;		nc+=l+2;		}	if (0)		{cont:		ERR_clear_error();		}	/* we should setup a certificate to return.... */	s->s3->tmp.cert_req=1;	s->s3->tmp.ctype_num=ctype_num;	if (s->s3->tmp.ca_names != NULL)		sk_X509_NAME_pop_free(s->s3->tmp.ca_names,X509_NAME_free);	s->s3->tmp.ca_names=ca_sk;	ca_sk=NULL;	ret=1;err:	if (ca_sk != NULL) sk_X509_NAME_pop_free(ca_sk,X509_NAME_free);	return(ret);	}static int ca_dn_cmp(const X509_NAME * const *a, const X509_NAME * const *b)	{	return(X509_NAME_cmp(*a,*b));	}int ssl3_get_server_done(SSL *s)	{	int ok,ret=0;	long n;	n=s->method->ssl_get_message(s,		SSL3_ST_CR_SRVR_DONE_A,		SSL3_ST_CR_SRVR_DONE_B,		SSL3_MT_SERVER_DONE,		30, /* should be very small, like 0 :-) */		&ok);	if (!ok) return((int)n);	if (n > 0)		{		/* should contain no data */		ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_DECODE_ERROR);		SSLerr(SSL_F_SSL3_GET_SERVER_DONE,SSL_R_LENGTH_MISMATCH);		return -1;		}	ret=1;	return(ret);	}#ifndef OPENSSL_NO_ECDHstatic const int KDF1_SHA1_len = 20;static void *KDF1_SHA1(const void *in, size_t inlen, void *out, size_t *outlen)	{#ifndef OPENSSL_NO_SHA	if (*outlen < SHA_DIGEST_LENGTH)		return NULL;	else		*outlen = SHA_DIGEST_LENGTH;	return SHA1(in, inlen, out);#else	return NULL;#endif	/* OPENSSL_NO_SHA */	}#endif	/* OPENSSL_NO_ECDH */int ssl3_send_client_key_exchange(SSL *s)	{	unsigned char *p,*d;	int n;	unsigned long l;#ifndef OPENSSL_NO_RSA	unsigned char *q;	EVP_PKEY *pkey=NULL;#endif#ifndef OPENSSL_NO_KRB5	KSSL_ERR kssl_err;#endif /* OPENSSL_NO_KRB5 */#ifndef OPENSSL_NO_ECDH	EC_KEY *clnt_ecdh = NULL;	const EC_POINT *srvr_ecpoint = NULL;	EVP_PKEY *srvr_pub_pkey = NULL;	unsigned char *encodedPoint = NULL;	int encoded_pt_len = 0;	BN_CTX * bn_ctx = NULL;#endif	if (s->state == SSL3_ST_CW_KEY_EXCH_A)		{		d=(unsigned char *)s->init_buf->data;		p= &(d[4]);		l=s->s3->tmp.new_cipher->algorithms;		/* Fool emacs indentation */		if (0) {}#ifndef OPENSSL_NO_RSA		else if (l & SSL_kRSA)			{			RSA *rsa;			unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH];			if (s->session->sess_cert->peer_rsa_tmp != NULL)				rsa=s->session->sess_cert->peer_rsa_tmp;			else				{				pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);				if ((pkey == NULL) ||					(pkey->type != EVP_PKEY_RSA) ||					(pkey->pkey.rsa == NULL))					{					SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);					goto err;					}				rsa=pkey->pkey.rsa;				EVP_PKEY_free(pkey);				}							tmp_buf[0]=s->client_version>>8;			tmp_buf[1]=s->client_version&0xff;			if (RAND_bytes(&(tmp_buf[2]),sizeof tmp_buf-2) <= 0)					goto err;			s->session->master_key_length=sizeof tmp_buf;			q=p;			/* Fix buf for TLS and beyond */			if (s->version > SSL3_VERSION)				p+=2;			n=RSA_public_encrypt(sizeof tmp_buf,				tmp_buf,p,rsa,RSA_PKCS1_PADDING);#ifdef PKCS1_CHECK			if (s->options & SSL_OP_PKCS1_CHECK_1) p[1]++;			if (s->options & SSL_OP_PKCS1_CHECK_2) tmp_buf[0]=0x70;#endif			if (n <= 0)				{				SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_ENCRYPT);				goto err;				}			/* Fix buf for TLS and beyond */			if (s->version > SSL3_VERSION)				{				s2n(n,q);				n+=2;				}			s->session->master_key_length=				s->method->ssl3_enc->generate_master_secret(s,					s->session->master_key,					tmp_buf,sizeof tmp_buf);			OPENSSL_cleanse(tmp_buf,sizeof tmp_buf);			}#endif#ifndef OPENSSL_NO_KRB5		else if (l & SSL_kKRB5)			{			krb5_error_code	krb5rc;			KSSL_CTX	*kssl_ctx = s->kssl_ctx;			/*  krb5_data	krb5_ap_req;  */			krb5_data	*enc_ticket;			krb5_data	authenticator, *authp = NULL;			EVP_CIPHER_CTX	ciph_ctx;			EVP_CIPHER	*enc = NULL;			unsigned char	iv[EVP_MAX_IV_LENGTH];			unsigned char	tmp_buf[SSL_MAX_MASTER_KEY_LENGTH];			unsigned char	epms[SSL_MAX_MASTER_KEY_LENGTH 						+ EVP_MAX_IV_LENGTH];			int 		padl, outl = sizeof(epms);			EVP_CIPHER_CTX_init(&ciph_ctx);#ifdef KSSL_DEBUG			printf("ssl3_send_client_key_exchange(%lx & %lx)\n",			        l, SSL_kKRB5);#endif	/* KSSL_DEBUG */			authp = NULL;#ifdef KRB5SENDAUTH			if (KRB5SENDAUTH)  authp = &authenticator;#endif	/* KRB5SENDAUTH */			krb5rc = kssl_cget_tkt(kssl_ctx, &enc_ticket, authp,				&kssl_err);			enc = kssl_map_enc(kssl_ctx->enctype);			if (enc == NULL)			    goto err;#ifdef KSSL_DEBUG			{			printf("kssl_cget_tkt rtn %d\n", krb5rc);			if (krb5rc && kssl_err.text)			  printf("kssl_cget_tkt kssl_err=%s\n", kssl_err.text);			}#endif	/* KSSL_DEBUG */			if (krb5rc)				{				ssl3_send_alert(s,SSL3_AL_FATAL,						SSL_AD_HANDSHAKE_FAILURE);				SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,						kssl_err.reason);				goto err;				}			/*  20010406 VRS - Earlier versions used KRB5 AP_REQ			**  in place of RFC 2712 KerberosWrapper, as in:			**			**  Send ticket (copy to *p, set n = length)			**  n = krb5_ap_req.length;			**  memcpy(p, krb5_ap_req.data, krb5_ap_req.length);			**  if (krb5_ap_req.data)  			**    kssl_krb5_free_data_contents(NULL,&krb5_ap_req);			**			**  Now using real RFC 2712 KerberosWrapper			**  (Thanks to Simon Wilkinson <sxw@sxw.org.uk>)			**  Note: 2712 "opaque" types are here replaced			**  with a 2-byte length followed by the value.			**  Example:			**  KerberosWrapper= xx xx asn1ticket 0 0 xx xx encpms			**  Where "xx xx" = length bytes.  Shown here with			**  optional authenticator omitted.			*/			/*  KerberosWrapper.Ticket		*/			s2n(enc_ticket->length,p);			memcpy(p, enc_ticket->data, enc_ticket->length);			p+= enc_ticket->length;			n = enc_ticket->length + 2;			/*  KerberosWrapper.Authenticator	*/			if (authp  &&  authp->length)  				{				s2n(authp->length,p);				memcpy(p, authp->data, authp->length);				p+= authp->length;				n+= authp->length + 2;								free(authp->data);				authp->data = NULL;				authp->length = 0;				}			else				{				s2n(0,p);/*  null authenticator length	*/				n+=2;				} 			if (RAND_bytes(tmp_buf,sizeof tmp_buf) <= 0)			    goto err;			/*  20010420 VRS.  Tried it this way; failed.			**	EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,NULL);			**	EVP_CIPHER_CTX_set_key_length(&ciph_ctx,			**				kssl_ctx->length);			**	EVP_EncryptInit_ex(&ciph_ctx,NULL, key,iv);			*/			memset(iv, 0, sizeof iv);  /* per RFC 1510 */			EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,				kssl_ctx->key,iv);			EVP_EncryptUpdate(&ciph_ctx,epms,&outl,tmp_buf,				sizeof tmp_buf);			EVP_EncryptFinal_ex(&ciph_ctx,&(epms[outl]),&padl);			outl += padl;			if (outl > sizeof epms)				{				SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);				goto err;				}			EVP_CIPHER_CTX_cleanup(&ciph_ctx);			/*  KerberosWrapper.EncryptedPreMasterSecret	*/			s2n(outl,p);			memcpy(p, epms, outl);			p+=outl;			n+=outl + 2;			s->session->master_key_length=			        s->method->ssl3_enc->generate_master_secret(s,					s->session->master_key,					tmp_buf, sizeof tmp_buf);			OPENSSL_cleanse(tmp_buf, sizeof tmp_buf);			OPENSSL_cleanse(epms, outl);			}#endif#ifndef OPENSSL_NO_DH		else if (l & (SSL_kEDH|SSL_kDHr|SSL_kDHd))			{			DH *dh_srvr,*dh_clnt;			if (s->session->sess_cert->peer_dh_tmp != NULL)				dh_srvr=s->session->sess_cert->peer_dh_tmp;

⌨️ 快捷键说明

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