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

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

?? sslserversocket.cpp

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

#include "stdafx.h"
#include "UsbKey.h"
#include "SslServerSocket.h"
#include <openssl/err.h>

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

CSslServerSocket::CSslServerSocket()
{
	m_Ctx=NULL;
	m_Ssl=NULL;
	m_pSocket=NULL;
	m_pList=NULL;
	m_type=0;//www
	m_pObSock=NULL;
}

CSslServerSocket::CSslServerSocket(int type)
{
	m_Ctx=NULL;
	m_Ssl=NULL;
	m_pSocket=NULL;
	m_pList=NULL;
	m_type=1;//ra
	m_pObSock=NULL;
}

CSslServerSocket::~CSslServerSocket()
{
}


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

/////////////////////////////////////////////////////////////////////////////
// CSslServerSocket member functions
X509 * CSslServerSocket::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 * CSslServerSocket::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 * CSslServerSocket::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 * CSslServerSocket::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;
}

int CSslServerSocket::Rand(const char *file,int dont_warn,char * outMsg)
{
	int consider_randfile = (file == NULL);
	char buffer[200];
	
#ifdef WINDOWS
//	BIO_flush(bio_e);
	RAND_screen();
#endif
	
	if (file == NULL)
		file = RAND_file_name(buffer, sizeof buffer);
	else if (RAND_egd(file) > 0)
	{
	/* we try if the given filename is an EGD socket.
		if it is, we don't write anything back to the file. */
		return 1;
	}
	if (file == NULL || !RAND_load_file(file, -1))
	{
		if (RAND_status() == 0 && !dont_warn)
		{
			sprintf(outMsg,"unable to load 'random state'\n");
			sprintf(outMsg,"This means that the random number generator has not been seeded\n");
			if (consider_randfile) /* explanation does not apply when a file is explicitly named */
			{
				sprintf(outMsg,"Consider setting the RANDFILE environment variable to point at a file that\n");
				sprintf(outMsg,"'random' data can be kept in (the file will be overwritten).\n");
			}
		}
		return 0;
	}
	return 1;
}

BOOL CSslServerSocket::GetPeerInfo(SSL * ssl,stuCLIENTINFO * stu)
{
	
	X509 *peer;
	BIO *bio=BIO_new(BIO_s_mem());
	const char *str=NULL;
	
	SSL_SESSION_print(bio,SSL_get_session(ssl));
	
	peer=SSL_get_peer_certificate(ssl);
	if (peer != NULL)
	{
		PEM_write_bio_X509(bio,peer);
		BIO_read(bio,stu->Cert,4*BUFSIZ);
		BIO_flush(bio);
		X509_NAME_oneline(X509_get_subject_name(peer),stu->peerCert.sub,BUFSIZ);
		X509_NAME_oneline(X509_get_issuer_name(peer),stu->peerCert.iss,BUFSIZ);
		X509_free(peer);
	}
	
	if (SSL_get_shared_ciphers(ssl,stu->Shared_ciphers,BUFSIZ) != NULL)
	{
		int bits2=0;
		SSL_CIPHER *sc=SSL_get_current_cipher(ssl);
		if(ssl==NULL) strcpy(stu->Current_cipher,"No current cipher?\n");
		else
		{
			int bits=SSL_CIPHER_get_bits(sc, &bits2);
			sprintf(stu->Current_cipher,"Version=%s Cipher=%s Bits=%d\n", SSL_get_version(ssl),
				SSL_CIPHER_get_name(sc), bits);
		}
	}
	if(strlen(stu->Cert))
		m_pList->AddMsg(stu->Cert);
	if(strlen(stu->Current_cipher))
		m_pList->AddMsg(stu->Current_cipher);
	if(strlen(stu->peerCert.iss))
		m_pList->AddMsg(stu->peerCert.iss);
	if(strlen(stu->peerCert.sub))
		m_pList->AddMsg(stu->peerCert.sub);
	if(strlen((char *)stu->Session))
		m_pList->AddMsg(stu->Session);
	if(strlen(stu->Shared_ciphers))
		m_pList->AddMsg(stu->Shared_ciphers);

	return TRUE;
	/*	if (s->hit) BIO_printf(bio,"Reused session-id\n");
	if (SSL_ctrl(s,SSL_CTRL_GET_FLAGS,0,NULL) &
	TLS1_FLAGS_TLS_PADDING_BUG)
	BIO_printf(bio,"Peer has incorrect TLSv1 block padding\n");*/
}

SSL_CTX * CSslServerSocket::InitCtx(SSL_METHOD *meth,char *certfile,int certlen,
									char *keyfile,int keylen,char * cafile, char * capath,
									int VerType/*對于客戶端驗證模式*/,CColorListBox * plist,
									CObList	* pObSock/*連接列表*/,
									_ConnectionPtr pConnection/*數據庫連接*/,char * out)
{
	EVP_PKEY *pkey=NULL;
	X509 *x509=NULL;
	OpenSSL_add_ssl_algorithms();
	SSL_load_error_strings();
	
	m_pList=plist;/////////////////////
	m_pConnection=pConnection;/////////
	m_pObSock=pObSock;
    m_Ctx=SSL_CTX_new(meth);
	if (m_Ctx == NULL)
	{
		strcpy(out,"Create ctx error");
		return NULL;
	}
	
	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));
	switch(VerType)
	{
	case 1:
		SSL_CTX_set_verify(m_Ctx,SSL_VERIFY_PEER,Verify);//要求對方證書
		break;
	case 2:
		SSL_CTX_set_verify(m_Ctx,SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT,Verify);
		break;
	case 3:
		SSL_CTX_set_verify(m_Ctx,SSL_VERIFY_PEER|SSL_VERIFY_CLIENT_ONCE,Verify);
		break;
	default:
		SSL_CTX_set_verify(m_Ctx,SSL_VERIFY_NONE,Verify);//不要求對方證書
		break;
	}

    /* Load randomness */
	Rand(NULL,1,out);
err:
	EVP_PKEY_free(pkey);
	X509_free(x509);
    return m_Ctx;
}

BOOL CSslServerSocket::CreateLisenSock(UINT nSocketPort, long lEvent)
{
	int sock;
	char out[100]={0};
	struct sockaddr_in sin;
	int val=1;
	memset(&sin,0,sizeof(sin));
	sin.sin_addr.s_addr=INADDR_ANY;
	sin.sin_family=AF_INET;
	sin.sin_port=htons(nSocketPort);
	
	if((sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))<0)
	{
		GetSockError(GetLastError(),out);
		return FALSE;
	}
	val=setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val));
	if (val < 0)
	{
		GetSockError(GetLastError(),out);
		return FALSE;
	}
	
	if(bind(sock,(struct sockaddr *)&sin,sizeof(sin))<0)//If no error occurs, bind returns zero
	{
		GetSockError(GetLastError(),out);
		return FALSE;
	}
	if(listen(sock,5))//return 0 no error
	{
		GetSockError(GetLastError(),out);
		return FALSE;
	}
	
	Attach(sock,lEvent);
	return TRUE;
}

void CSslServerSocket::OnAccept(int nErrorCode) //只有偵聽sock執行
{
	// TODO: Add your specialized code here and/or call the base class
	BIO * sbio=NULL;
	int err;
	char out[100]={0};

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产视频一区在线播放| 7777精品久久久大香线蕉| 美女视频免费一区| 亚洲午夜电影在线| 亚洲影院理伦片| 亚洲国产精品一区二区www在线 | 亚洲女人的天堂| 一区精品在线播放| 国产精品久线在线观看| 成人欧美一区二区三区白人| 国产精品国产自产拍在线| 亚洲色图清纯唯美| 一区二区久久久| 性欧美疯狂xxxxbbbb| 日本伊人色综合网| 精品中文字幕一区二区| 国产成人午夜精品影院观看视频 | av一区二区三区黑人| 97se狠狠狠综合亚洲狠狠| 色综合天天综合给合国产| 在线免费av一区| 欧美一区二区视频免费观看| 日韩一级片在线播放| 久久精品在线免费观看| 一区二区在线观看免费视频播放| 亚洲亚洲精品在线观看| 韩国一区二区视频| 99re这里都是精品| 制服丝袜成人动漫| 亚洲国产成人私人影院tom| 亚洲三级电影网站| 久久精品99久久久| 99re这里只有精品首页| 7777精品伊人久久久大香线蕉 | 色综合中文字幕国产| 91女厕偷拍女厕偷拍高清| 在线播放日韩导航| 国产精品久久久久影视| 日日夜夜精品视频免费| 国产suv精品一区二区三区| 91九色最新地址| 久久色中文字幕| 亚洲一区二区精品3399| 国产福利视频一区二区三区| 欧美色偷偷大香| 国产精品久久久爽爽爽麻豆色哟哟| 亚洲一卡二卡三卡四卡| 顶级嫩模精品视频在线看| 欧美丰满少妇xxxbbb| 日韩一区欧美小说| 久久精品国产精品亚洲精品| 色av一区二区| 欧美经典三级视频一区二区三区| 五月天一区二区三区| 91色视频在线| 日本一区二区动态图| 久久国产精品露脸对白| 欧美猛男超大videosgay| 亚洲私人黄色宅男| 成人三级伦理片| 久久九九久精品国产免费直播| 日本va欧美va精品发布| 欧美综合一区二区三区| 日韩一区在线看| 成人高清视频在线| 国产日韩成人精品| 国产精品一区二区三区四区| 日韩欧美一区二区视频| 日韩高清不卡一区| 欧美日韩不卡在线| 石原莉奈在线亚洲三区| 欧美日韩中字一区| 亚洲成av人**亚洲成av**| 欧美亚男人的天堂| 亚洲自拍偷拍图区| 91精品办公室少妇高潮对白| 亚洲柠檬福利资源导航| 一本一本久久a久久精品综合麻豆| 亚洲国产精品av| jlzzjlzz欧美大全| 中文字幕在线播放不卡一区| 99久久免费国产| 一区二区三区四区视频精品免费 | 亚洲欧洲成人精品av97| 97se亚洲国产综合自在线不卡| 国产精品动漫网站| www.欧美.com| 亚洲影视在线播放| 91麻豆精品国产| 国内国产精品久久| 国产午夜亚洲精品不卡| 成人aa视频在线观看| 亚洲欧洲精品成人久久奇米网| 95精品视频在线| 午夜影院久久久| 欧美成人vr18sexvr| 国产一区二区精品在线观看| 国产精品美女久久久久久久久| 色婷婷综合中文久久一本| 亚洲小少妇裸体bbw| 精品国产伦一区二区三区观看方式| 国产在线视频一区二区三区| 亚洲欧洲韩国日本视频| 51精品国自产在线| 成人一级片网址| 亚洲小说春色综合另类电影| www激情久久| 91色视频在线| 韩国女主播一区| 亚洲欧洲综合另类| 精品国产一区二区精华| 91丨porny丨首页| 免费黄网站欧美| 亚洲丝袜另类动漫二区| 日韩一区二区视频在线观看| 99久久综合色| 久久er99精品| 亚洲另类一区二区| 精品99一区二区三区| 91久久免费观看| 成人免费福利片| 蜜臀精品一区二区三区在线观看 | 国产福利91精品一区| 亚洲国产精品嫩草影院| 国产午夜亚洲精品羞羞网站| 制服.丝袜.亚洲.中文.综合| 色综合欧美在线| 国产成人精品一区二区三区网站观看| 亚洲一区二区精品视频| 一区在线中文字幕| 久久综合丝袜日本网| 777午夜精品视频在线播放| 欧美一区二区三区免费在线看| 国产精品88av| 欧美aa在线视频| 天堂成人国产精品一区| 亚洲精品成a人| 日本一区二区三区四区| 欧美mv和日韩mv的网站| 欧美一区二区三区色| 欧美高清视频一二三区 | 欧美日本在线看| 一本久久综合亚洲鲁鲁五月天| 国产麻豆精品视频| 精品一区二区久久| 另类欧美日韩国产在线| 日韩成人av影视| 青青草97国产精品免费观看| 亚洲v中文字幕| 午夜精品久久久久久久99樱桃| 亚洲自拍偷拍九九九| 一区二区三区蜜桃网| 一区二区三区国产精品| 一区二区三区日韩欧美精品 | 亚洲电影激情视频网站| 一区二区不卡在线播放| 亚洲精品一卡二卡| 亚洲地区一二三色| 亚洲成人av一区二区| 五月天一区二区三区| 热久久国产精品| 久久99精品网久久| 国产一二精品视频| 成人一区二区三区视频在线观看| 福利电影一区二区三区| av高清不卡在线| 日本高清免费不卡视频| 91精品国产综合久久久久久漫画| 欧美日韩国产美| 精品国产髙清在线看国产毛片 | 国产精品18久久久久久久久| 国产永久精品大片wwwapp| 国产精品99久久久久久久女警| 成a人片亚洲日本久久| 91激情在线视频| 91精品国产综合久久久久久久久久 | 亚洲午夜久久久久久久久电影院 | 精品理论电影在线| 国产人久久人人人人爽| 成人免费在线视频| 亚洲国产一区二区在线播放| 久久99精品国产.久久久久久| 国产不卡在线一区| 欧美丝袜丝交足nylons图片| 日韩亚洲欧美高清| 国产精品久久久久久久裸模 | 精品欧美一区二区久久| 国产精品欧美一级免费| 日本中文一区二区三区| 国产精品一二三在| 欧美日韩久久一区| 欧美经典一区二区| 亚洲第一精品在线| 国产成人午夜高潮毛片| 欧美影院一区二区| 久久精品欧美一区二区三区不卡 | 国产一区二区三区高清播放| 91视频xxxx| 国产日韩视频一区二区三区| 亚洲国产一区二区三区|