亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sslclientsocket.cpp

?? 實現了數字證書的制作、SSL安全通訊、加解密操作等功能
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// SslClientSocket.cpp : implementation file
//

#include "stdafx.h"
#include "Raclient.h"
#include "SslClientSocket.h"
#include "MainFrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSslClientSocket

CSslClientSocket::CSslClientSocket()
{
	m_Ctx=NULL;
	m_Ssl=NULL;
	m_AuditList=NULL;
	m_MadeList=NULL;
	m_RevokeList=NULL;
	m_ifCert=false;
	m_ifCrl=false;
	m_MaxCount=0;
}

CSslClientSocket::~CSslClientSocket()
{
}


// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CSslClientSocket, CAsyncSocket)
	//{{AFX_MSG_MAP(CSslClientSocket)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif	// 0

/////////////////////////////////////////////////////////////////////////////
// CSslClientSocket member functions
X509 * CSslClientSocket::load_cert(BIO *cert/*輸入BIO*/, int format/*格式*/,char * pwd,/*P12密碼*/char * outMsg)
{
	ASN1_HEADER *ah=NULL;
	BUF_MEM *buf=NULL;
	X509 *x=NULL;

	if 	(format == DER)
		x=d2i_X509_bio(cert,NULL);
	else if (format == PEM)
		x=PEM_read_bio_X509(cert,NULL,NULL,NULL);//PEM_read_bio_X509_AUX
	else if (format == P12)
	{
		PKCS12 *p12 = d2i_PKCS12_bio(cert, NULL);
		PKCS12_parse(p12, pwd, NULL, &x, NULL);
		PKCS12_free(p12);
		p12 = NULL;
	}
	else
	{
		sprintf(outMsg,"bad input format specified for input cert\n");
		goto end;
	}
end:
	if (x == NULL)
	{
		sprintf(outMsg,"unable to load certificate\n");
	}
	if (ah != NULL) ASN1_HEADER_free(ah);
	if (buf != NULL) BUF_MEM_free(buf);
	return(x);
}

X509 * CSslClientSocket::LoadCert(char * cert,int certlen,char * outMsg)//枚舉DER/PEM格式
{
	BIO * in=NULL;
	X509 * x509=NULL;

	if(certlen==0)//輸入為磁盤文件
	{
		if((in=BIO_new_file(cert, "r")) == NULL)
		{
			sprintf(outMsg,"open CA certificate file error");
			return NULL;
		}
	}
	else//輸入為內存中文件
	{
		if((in=BIO_new_mem_buf(cert,certlen))== NULL)//只讀類型
		{
			sprintf(outMsg,"Make Mem Bio Error");
			return NULL;
		}
	}
	if((x509=load_cert(in,DER,NULL,outMsg))==NULL)//嘗試DER
	{
		BIO_reset(in);//恢復bio
		x509=load_cert(in,PEM,NULL,outMsg);//嘗試PEM
	}
	if (in != NULL) BIO_free(in);
	return x509;
}

EVP_PKEY * CSslClientSocket::load_key(BIO *bio, int format, char *pass,char * outMsg)
{
	EVP_PKEY *pkey=NULL;

	if (format == DER)
	{
		pkey=d2i_PrivateKey_bio(bio, NULL);
	}
	else if (format == PEM)
	{
		pkey=PEM_read_bio_PrivateKey(bio,NULL,NULL,pass);
	}
	else if (format == P12)
	{
		PKCS12 *p12 = d2i_PKCS12_bio(bio, NULL);
		PKCS12_parse(p12, pass, &pkey, NULL, NULL);
		PKCS12_free(p12);
		p12 = NULL;
	}
	else
	{
		sprintf(outMsg,"bad input format specified for key\n");
		goto end;
	}
end:
	if (pkey == NULL)
		sprintf(outMsg,"unable to load Private Key\n");
	return(pkey);
}

EVP_PKEY * CSslClientSocket::LoadKey(char * key,int keylen,char * pass,char * outMsg)
{
	EVP_PKEY *pkey=NULL;
	BIO * in=NULL;

	if(keylen==0)//輸入為磁盤文件
	{
		if((in=BIO_new_file(key, "r")) == NULL)
		{
			sprintf(outMsg,"open CA certificate file error");
			return NULL;
		}
	}
	else//輸入為內存中文件
	{
		if((in=BIO_new_mem_buf(key,keylen))== NULL)//只讀類型
		{
			sprintf(outMsg,"Make Mem Bio Error");
			return NULL;
		}
	}

	if((pkey=load_key(in,DER,pass,outMsg))==NULL)//嘗試DER
	{
		BIO_reset(in);//BIO是可讀寫的,那么該BIO所有數據都會被清空;
						//如果該BIO是只讀的,那么該操作只會簡單將指
						//針指向原始位置,里面的數據可以再讀.
		pkey=load_key(in,PEM,pass,outMsg);//嘗試PEM
	}
	if (in != NULL) BIO_free(in);
	return pkey;
}

BOOL CSslClientSocket::SockConnect(SSL_METHOD *meth,char *certfile,int certlen, char *keyfile,int keylen,
		char * cafile, char * capath,LPCTSTR lpszHostAddress, UINT nHostPort,char * out)
{
	EVP_PKEY *pkey=NULL;
	X509 *x509=NULL;
	CString str;
	unsigned long l=1;
	BIO * sbio=NULL;
	struct hostent *hp;
    struct sockaddr_in addr;
    int sock,i=0;

//	m_pList=plist;/////////////////////

	OpenSSL_add_ssl_algorithms();

    m_Ctx=SSL_CTX_new(meth);
	if (m_Ctx == NULL)
	{
		strcpy(out,"Create ctx error");
		return FALSE;
	}
	SSL_CTX_set_options(m_Ctx,SSL_OP_ALL);
	
	pkey=LoadKey(keyfile,keylen,NULL,out);
	
	if (pkey == NULL)
	{
		sprintf(out,"unable to load CA private key\n");
		m_Ctx=NULL;
		goto err;
	}
	
    if(!(SSL_CTX_use_PrivateKey(m_Ctx,pkey)))
	{
		strcpy(out,"adds private key to ctx error");
		SSL_CTX_free(m_Ctx);
		m_Ctx=NULL;
		goto err;
	}
	
	x509=LoadCert(certfile,certlen,out);
	if (x509 == NULL)
	{
		sprintf(out,"unable to load CA certificate\n");
		SSL_CTX_free(m_Ctx);
		m_Ctx=NULL;
		goto err;
	}
	
    if(!(SSL_CTX_use_certificate(m_Ctx,x509)))
	{
		strcpy(out,"loads certificate into ctx error");
		SSL_CTX_free(m_Ctx);
		m_Ctx=NULL;
		goto err;
	}
	
	if (!SSL_CTX_check_private_key(m_Ctx))
	{
		strcpy(out,"Private key does not match the certificate public key");
		SSL_CTX_free(m_Ctx);
		m_Ctx=NULL;
		goto err;
	}
	
    /* Load the CAs we trust*/
   if(!(SSL_CTX_load_verify_locations(m_Ctx,cafile,/*capath*/NULL)))
	{
		strcpy(out,"Couldn't read CA list");
		SSL_CTX_free(m_Ctx);
		m_Ctx=NULL;
		goto err;
	}
	SSL_CTX_set_verify_depth(m_Ctx,1);
    SSL_CTX_set_client_CA_list(m_Ctx,SSL_load_client_CA_file(cafile));
    m_Ssl=SSL_new(m_Ctx);
	if(m_Ssl==NULL)
	{
		strcpy(out,"Make SSL Error");
		goto err;
	}
    /* Load randomness */
//	Rand(NULL,1,out);

	/*連接服務器*/

    if(!(hp=gethostbyname(lpszHostAddress)))
	{
		strcpy(out,"Couldn't resolve host");
		return FALSE;
	}
    memset(&addr,0,sizeof(addr));
    addr.sin_addr=*(struct in_addr*)hp->h_addr_list[0];
    addr.sin_family=AF_INET;
    addr.sin_port=htons(nHostPort);
	
	sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	if (sock == INVALID_SOCKET) 
	{
		strcpy(out,"create socket error"); 
		return FALSE;
	}
	
	i=setsockopt(sock,SOL_SOCKET,SO_KEEPALIVE,(char *)&i,sizeof(i));
	if (i < 0)
	{
		strcpy(out,"setsockopt error"); 
		return FALSE;
	}
	
	if (connect(sock,(struct sockaddr *)&addr,sizeof(addr)) == -1)
	{
		shutdown(sock,2);
		closesocket(sock);
		strcpy(out,"connect error"); 
		return FALSE; 
	}

    /* Connect the SSL socket */
	if (BIO_socket_ioctl(sock,FIONBIO,&l) < 0)
	{
		strcpy(out,"io set error");
		shutdown(sock,2);
		closesocket(sock);
		SSlShouDown();
		return FALSE;
	}
	
    sbio=BIO_new_socket(sock,BIO_NOCLOSE);
    SSL_set_bio(m_Ssl,sbio,sbio);
	SSL_set_connect_state(m_Ssl);
	Attach(sock, FD_CLOSE);
	str.Format("%d接入服務器%s,等待握手....",m_hSocket,inet_ntoa(addr.sin_addr));
//	m_pList->AddMsg(str,M_WARING);
    return TRUE;

err:
	EVP_PKEY_free(pkey);
	X509_free(x509);
	SSlShouDown();
	return FALSE;
}

int CSslClientSocket::SSlConnect(char * out)
{
	if(m_Ssl==NULL)
	{
		strcpy("SSL沒有正確初始化",out);
		return -1;
	}
	int err=0;
	if ((err = SSL_connect(m_Ssl)) <= 0)
	{
		if (BIO_sock_should_retry(err))
		{
			return 0;//重試
		}
		else 
		{
			strcpy(out,"SSL連接失敗");//ERR_clear_error
			return -1;
		}
	}
	return 1;
}

void CSslClientSocket::SSlShouDown()
{
	if(m_Ctx!=NULL)
	{
		SSL_CTX_free(m_Ctx);
		m_Ctx=NULL;
	}
	if(m_Ssl!=NULL)
	{
		SSL_shutdown(m_Ssl);
		SSL_free(m_Ssl);
		m_Ssl=NULL;
	}
	stuLIST * LIST=NULL;
	for(;!m_ComList.IsEmpty();)
	{
		LIST=(stuLIST *)m_ComList.RemoveHead();
		delete LIST;
	}
	ShutDown(2);
	Close();
}

int CSslClientSocket::SSlSend(char *buf, int len)
{
	if(m_Ssl==NULL)
		return -1;
	int k=0;//接收數量
	int offect=0;//偏移
	for(;0!=len;)//maximum record size of 16kB for SSLv3/TLSv1
	{
		k = SSL_write(m_Ssl,buf+offect,len);
		if (k <= 0)
		{
			if (BIO_sock_should_retry(k))
			{
				((CMainFrame *)AfxGetMainWnd())->AddDialogBarInfo(0,"SSlSend",M_WARING);
				Sleep(100);
				continue;
			}
		}
		offect+=k;//接收到數據
		len-=k;
	}
	AsyncSelect(FD_READ|FD_CLOSE);//選擇讀(發送一條處理一條)
	return offect;
}

int CSslClientSocket::SSlReceive(char * buf, int len)
{
	int k=0;
	do
	{
		for(;;)
		{
			k = SSL_read(m_Ssl,buf,len);
			if (k <=0)
			{
				if (BIO_sock_should_retry(k))
				{
					((CMainFrame *)AfxGetMainWnd())->AddDialogBarInfo(0,"SSlReceive",M_WARING);
					Sleep(100);
					continue;//重試
				}
				return k;//錯誤退出
			}
			break;//成功
		}
	}while (SSL_pending(m_Ssl));
	return k;
	/*如果對方一次性發送〉16k(16384),最大只能收到16k,SSL_pending返回0,
	   如果接收len<16k,則SSL_pending返回(16k-len)*/
}

void CSslClientSocket::InsertList(CListCtrl * pList,stuRA * pRa)
{
	if(pList==NULL)
	{
		AfxMessageBox("InsertList Error");
		return;
	}
	CString item;
	char buf[48]={0};//最大長度48
	item.Format("%d",pRa->ID);
	LVFINDINFO Info;
	Info.flags=LVFI_STRING;
	Info.psz=item;
	if(pList->FindItem(&Info,-1)!=-1)//存在
		return;
	pList->InsertItem(0,item);//ID
	strncpy(buf,(char *)pRa->SUBJECT.CN,sizeof(pRa->SUBJECT.CN));
	pList->SetItemText(0,1,buf);
	ZeroMemory(buf,48);
	strncpy(buf,(char *)pRa->SUBJECT.C,sizeof(pRa->SUBJECT.C));
	pList->SetItemText(0,2,buf);
	ZeroMemory(buf,48);
	strncpy(buf,(char *)pRa->SUBJECT.ST,sizeof(pRa->SUBJECT.ST));

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
高清视频一区二区| 精品一区二区免费在线观看| 99精品欧美一区二区三区小说 | 91丨国产丨九色丨pron| 亚洲国产精品激情在线观看| 国产成人在线观看免费网站| 国产色一区二区| 99久久99久久精品免费观看| 亚洲六月丁香色婷婷综合久久| 在线观看成人小视频| 亚洲第一久久影院| 欧美电影免费观看高清完整版在| 国产乱子伦一区二区三区国色天香| 久久嫩草精品久久久精品一| 99久久综合狠狠综合久久| 伊人婷婷欧美激情| 日韩欧美www| 99视频有精品| 午夜欧美大尺度福利影院在线看| 日韩午夜在线观看| 国产成人欧美日韩在线电影| 久88久久88久久久| 国产欧美日韩视频在线观看| 91视频www| 日本女人一区二区三区| 久久久噜噜噜久久人人看| 色狠狠综合天天综合综合| 日韩二区三区在线观看| 国产亚洲一区字幕| 欧美丝袜丝交足nylons图片| 激情深爱一区二区| 一区二区三区成人在线视频| 2019国产精品| 欧美自拍偷拍一区| 国产在线不卡一区| 亚洲午夜在线视频| 国产日韩av一区| 欧美日韩国产首页| 成人一道本在线| 日本中文在线一区| 亚洲欧美成人一区二区三区| www激情久久| 欧美日韩一区二区在线观看| 国产成人av电影在线播放| 亚洲成av人片在www色猫咪| 国产精品天干天干在观线| 91精品视频网| 色婷婷av一区二区三区软件 | 国产麻豆精品一区二区| 一区二区三区视频在线看| 久久婷婷成人综合色| 91精品一区二区三区久久久久久| 色综合一个色综合亚洲| 国产一区二区在线观看免费| 日韩精品免费专区| 亚洲一区二区三区四区中文字幕 | 91精品国产91久久久久久最新毛片| av不卡免费在线观看| 国产毛片一区二区| 紧缚奴在线一区二区三区| 亚洲成a人片在线观看中文| 亚洲视频一区在线| 国产精品视频九色porn| 久久久久9999亚洲精品| 久久久久久久久久久99999| 91精品国产黑色紧身裤美女| 欧美日精品一区视频| 91免费国产在线| www.欧美精品一二区| 丁香五精品蜜臀久久久久99网站| 久久99精品久久久久婷婷| 日韩福利电影在线观看| 视频一区二区欧美| 五月婷婷久久综合| 亚洲高清视频中文字幕| 亚洲国产人成综合网站| 亚洲国产一区二区三区| 亚洲国产综合人成综合网站| 亚洲国产成人av| 亚洲va欧美va人人爽午夜| 亚洲制服欧美中文字幕中文字幕| 亚洲精品欧美综合四区| 亚洲国产精品久久一线不卡| 亚洲一线二线三线久久久| 夜夜嗨av一区二区三区中文字幕| 亚洲男人的天堂网| 一区二区三区在线视频免费| 亚洲一级二级三级| 午夜成人免费视频| 免费xxxx性欧美18vr| 老司机精品视频在线| 国产精品538一区二区在线| 国产福利一区二区三区视频| 成人av资源下载| 色婷婷香蕉在线一区二区| 色激情天天射综合网| 欧美日韩成人一区二区| 日韩午夜在线播放| 欧美激情在线一区二区三区| 亚洲另类一区二区| 日韩精品电影在线| 国产成人精品免费网站| 91麻豆免费看片| 91精品婷婷国产综合久久| 久久久久九九视频| 亚洲人成人一区二区在线观看| 一二三区精品福利视频| 蜜桃久久久久久| 99麻豆久久久国产精品免费| 欧美日本一道本在线视频| 精品欧美乱码久久久久久| 中文字幕av一区二区三区| 亚洲在线免费播放| 久草在线在线精品观看| 色婷婷激情一区二区三区| 日韩欧美一区二区免费| 国产精品国产三级国产普通话三级| 亚洲男人的天堂在线aⅴ视频| 麻豆专区一区二区三区四区五区| 国产91露脸合集magnet| 欧美精品少妇一区二区三区| 久久精品欧美一区二区三区不卡| 一区二区在线看| 国产一本一道久久香蕉| 91久久精品一区二区三| 精品久久久久香蕉网| 亚洲女与黑人做爰| 国模冰冰炮一区二区| 91福利在线看| 国产三级三级三级精品8ⅰ区| 亚洲影院久久精品| 成人午夜电影久久影院| 欧美一区二区视频在线观看2020| 国产精品高清亚洲| 精品亚洲porn| 欧美日韩和欧美的一区二区| 国产精品萝li| 国产一区二区三区美女| 欧美少妇bbb| 亚洲欧洲制服丝袜| 国产精品综合一区二区三区| 欧美精品日韩精品| 亚洲精品乱码久久久久久| 成人小视频免费观看| 日韩午夜在线观看视频| 午夜不卡在线视频| 91豆麻精品91久久久久久| 国产亚洲成av人在线观看导航 | 一区二区三区中文免费| 丰满放荡岳乱妇91ww| 亚洲精品一线二线三线| 日本色综合中文字幕| 欧美色视频一区| 亚洲精品久久嫩草网站秘色| 不卡电影一区二区三区| 久久久国际精品| 国产一区二区电影| 精品国产亚洲在线| 久久激情五月婷婷| 日韩一级免费观看| 日本欧美久久久久免费播放网| 在线国产电影不卡| 亚洲最新视频在线播放| 色哟哟精品一区| 一区二区三区四区不卡视频| 一本大道久久a久久综合婷婷| 成人欧美一区二区三区黑人麻豆 | 亚洲精品国产一区二区三区四区在线| 成人午夜碰碰视频| 国产精品网站导航| av欧美精品.com| 亚洲欧美视频一区| 欧美自拍偷拍一区| 亚洲第一久久影院| 日韩一区二区三区视频| 免费人成精品欧美精品| 日韩欧美色电影| 国产乱子伦视频一区二区三区| 久久综合九色综合97婷婷女人| 精品一区二区三区视频在线观看| 久久综合国产精品| 粗大黑人巨茎大战欧美成人| 亚洲欧洲精品一区二区三区| 91麻豆.com| 亚洲午夜私人影院| 日韩欧美国产一区二区在线播放| 国产做a爰片久久毛片| 国产丝袜欧美中文另类| jlzzjlzz亚洲女人18| 亚洲伊人色欲综合网| 欧美一区二区三区视频免费| 国内精品久久久久影院色| 国产欧美日韩在线视频| 91色.com| 日韩电影在线免费观看| 久久九九99视频| 91成人免费电影| 蜜桃视频在线观看一区二区| 欧美激情在线一区二区| 精品视频免费看|